ZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTliYWYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InRlc3QgcGx1Z2luIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0idGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgb3V0cHV0PSJ0ZXN0X3N1cHBvcnRfYmluIiBraW5kPSJzcmMiIHBhdGg9InRlc3Qgc3VwcG9ydCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLmN2c2lnbm9yZSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ4NDk1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1iaW4KLWxpYgotdGVzdF9zdXBwb3J0X2JpbgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQW50IFRlc3QgU3VwcG9ydCBMaWIgQnVpbGRlci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGIwZDQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5leHRlcm5hbFRvb2xCdWlsZGVycy9BbnQgVGVzdCBTdXBwb3J0IExpYiBCdWlsZGVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5hbnQuQW50QnVpbGRlckxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcudWkuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuREVGQVVMVF9DTEFTU1BBVEgiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0JVSUxEX1NDT1BFIiB2YWx1ZT0iJHt3b3JraW5nX3NldDombHQ7P3htbCB2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyBlbmNvZGluZz0mcXVvdDtVVEYtOCZxdW90Oz8mZ3Q7JiMxMDsmbHQ7bGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQgZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtpbmdTZXRGYWN0b3J5JnF1b3Q7IG5hbWU9JnF1b3Q7d29ya2luZ1NldCZxdW90OyBlZGl0UGFnZUlkPSZxdW90O29yZy5lY2xpcHNlLnVpLnJlc291cmNlV29ya2luZ1NldFBhZ2UmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwmcXVvdDsgdHlwZT0mcXVvdDsxJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0bywiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsmZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlJnF1b3Q7IHR5cGU9JnF1b3Q7NCZxdW90Oy8mZ3Q7JiMxMDsmbHQ7L2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0Jmd0OyYjMTA7fSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9MT0NBVElPTiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvYzovb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWx9Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfUlVOX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDM1MTAuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+QW50IFRlc3QgU3VwcG9ydCBMaWIgQnVpbGRlci5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMWEzNzQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBNYXkgMjcgMTQ6NDg6NDMgUERUIDIwMDQNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0X3N1cHBvcnRfYmluDQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3YjQzMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4xNnRoIE9jdG9iZXIsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODA0YzMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0JCQkgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RidWlsZGZpbGVzLyxcCi0gICAgICAgICAgICAgICB0ZXN0cmVzb3VyY2VzLyxcCi0gICAgICAgICAgICAgICB0ZXN0bGliLyxcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIGxpYi8qLmphcixcCi0gICAgICAgICAgICAgICAqLmphcgotICAgICAgICAgICAgICAgCi1zb3VyY2UuYW50dGVzdHNjb3JlLmphciA9IHRlc3QgcGx1Z2luLyxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMvLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGZpbGVzLwotc291cmNlLmxpYi9hbnRUZXN0c1N1cHBvcnQuamFyID0gdGVzdCBzdXBwb3J0LwotamFycy5jb21waWxlLm9yZGVyPWFudHRlc3RzY29yZS5qYXIsbGliL2FudFRlc3RzU3VwcG9ydC5qYXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9idWlsZGZpbGVzL2J1aWxkQW50VGVzdHNTdXBwb3J0SkFSLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2MjYyOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGQgdGVzdHMgc3VwcG9ydCBqYXIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IlJlbW92ZXMgYWxsIGJ1aWxkIGFydGlmYWN0cywgcmVjcmVhdGVzIHRoZSBzdXBwb3J0IGphciwgYW5kIHJlZnJlc2hlcyB0aGlzIHBsdWdpbidzIHJlc291cmNlcyIgZGVwZW5kcz0iY2xlYW4sIGxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIi8+Ci0KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5zdWZmaXgiIHZhbHVlPSJfMy4wLjAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImFudF92ZXJzaW9uLnN1ZmZpeCIgdmFsdWU9Il8xLjYuMSIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0gIkJ1aWxkcyB0aGUgc3VwcG9ydCBKQVIiPgotCQk8cHJvcGVydHkgbmFtZT0iZGVzdGRpciIgdmFsdWU9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFRlc3RzU3VwcG9ydC5qYXIuYmluIi8+Ci0JCTxta2RpciBkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8IS0tIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIC0tPgotCQk8amF2YWMgdGFyZ2V0PSIxLjEiIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9Im9uIiBpbmNsdWRlQW50UnVudGltZT0ieWVzIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiAKLQkJCWNsYXNzcGF0aD0iJHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvYmluOwotCQkJJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lJHt2ZXJzaW9uLnN1ZmZpeH0vcnVudGltZS5qYXI7Ci0JCQkke2Jhc2VkaXJ9L2JpbjsKLQkJCSR7ZWNsaXBzZS5ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5jb3JlJHt2ZXJzaW9uLnN1ZmZpeH0vYW50c3VwcG9ydC5qYXI7Ci0JCQkke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmFudC5jb3JlL2JpbiI+Ci0JCQk8c3JjIHBhdGg9InRlc3Qgc3VwcG9ydC8iLz4KLQkJPC9qYXZhYz4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9ImNsZWFuIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGRlbGV0ZSBmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRUZXN0c1N1cHBvcnQuamFyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2xpYi8uY3ZzaWdub3JlIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQwYjYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9saWIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWFudFRlc3RzU3VwcG9ydC5qYXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxNTI5NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBDb3JlIFRlc3QgUGx1Z2luCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS9wbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYWI3NDcuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0UGx1Z2luIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJhbnR0ZXN0c2NvcmUuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5leHRyYUNsYXNzcGF0aEVudHJpZXMiPgotICAgICAgPGV4dHJhQ2xhc3NwYXRoRW50cnkKLSAgICAgICAgICAgIGxpYnJhcnk9ImxpYi9hbnRUZXN0c1N1cHBvcnQuamFyIj4KLSAgICAgIDwvZXh0cmFDbGFzc3BhdGhFbnRyeT4KLSAgIDwvZXh0ZW5zaW9uPgotICAgCi0gICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUYXNrcyI+Ci0JICAgIDxhbnRUYXNrIAotCSAgICAJbmFtZT0iY29vbFRhc2siIAotCSAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2siCi0JICAgIAlsaWJyYXJ5PSJsaWIvYW50VGVzdHNTdXBwb3J0LmphciIKLQkgICAgCWhlYWRsZXNzPSJmYWxzZSI+Ci0JICAgIDwvYW50VGFzaz4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VHlwZXMiPgotCSAgICA8YW50VHlwZSAKLQkgICAgCW5hbWU9ImNvb2xUeXBlIiAKLQkgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnR5cGVzLkFudFRlc3RQYXRoIgotCSAgICAJbGlicmFyeT0ibGliL2FudFRlc3RzU3VwcG9ydC5qYXIiCi0JICAgIAloZWFkbGVzcz0iZmFsc2UiPgotCSAgICA8L2FudFR5cGU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFByb3BlcnRpZXMiPgotICAgICAgPGFudFByb3BlcnR5Ci0gICAgICAgICAgICBuYW1lPSJwcm9wZXJ0eS50ZXN0aW5nIgotICAgICAgICAgICAgdmFsdWU9InRydWUiPgotICAgICAgPC9hbnRQcm9wZXJ0eT4KLSAgICAgICA8YW50UHJvcGVydHkKLSAgICAgICAgICAgIG5hbWU9InByb3BlcnR5LnRlc3RpbmcyIgotICAgICAgICAgICAgdmFsdWU9ImhleSIKLSAgICAgICAgICAgIGNsYXNzPSAib3JnLmVjbGlwc2UuZG9lcy5ub3QuZXhpc3QiPgotICAgICAgPC9hbnRQcm9wZXJ0eT4KLSAgICAgIDxhbnRQcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0icHJvcGVydHkudGVzdGluZzMiCi0gICAgICAgICAgICBjbGFzcz0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlciI+Ci0gICAgICA8L2FudFByb3BlcnR5PgotICAgICAgIDxhbnRQcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0icHJvcGVydHkuaGVhZGxlc3MiCi0gICAgICAgICAgICB2YWx1ZT0iaGVhZGxlc3MiCi0gICAgICAgICAgICBoZWFkbGVzcz0gImZhbHNlIj4KLSAgICAgIDwvYW50UHJvcGVydHk+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRGaWxlUnVubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTgyMTYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50RmlsZVJ1bm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBydW5uaW5nIHRlc3QgYW50IGJ1aWxkIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgQW50RmlsZVJ1bm5lciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfRElSX1BSRUZJWCA9ICItRGJhc2VkaXI9IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgcnVuKElGaWxlIGJ1aWxkRmlsZSwgU3RyaW5nW10gdGFyZ2V0cywgU3RyaW5nW10gYXJncywgU3RyaW5nIGJhc2VEaXIsIGJvb2xlYW4gY2FwdHVyZU91dHB1dCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCi0JCVN0cmluZ1tdIHJ1bm5lckFyZ3MgPSBhcmdzOwotCi0JCWlmIChiYXNlRGlyLmxlbmd0aCgpID4gMCkgewotCQkJLy8gQW50IHJlcXVpcmVzIHRoZSB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSBzcGVjaWZpZWQKLQkJCS8vIGFzIG9uZSBvZiB0aGUgYXJndW1lbnRzLCBzbyBpdCBuZWVkcyB0byBiZSBhcHBlbmRlZC4KLQkJCWludCBsZW5ndGggPSAxOwotCQkJaWYgKGFyZ3MgIT0gbnVsbCkgewotCQkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoICsgMTsKLQkJCX0gCi0JCQkKLQkJCXJ1bm5lckFyZ3MgPSBuZXcgU3RyaW5nW2xlbmd0aF07Ci0JCQlpZiAoYXJncyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQl9Ci0JCQlydW5uZXJBcmdzW2xlbmd0aCAtIDFdID0gQkFTRV9ESVJfUFJFRklYICsgYmFzZURpcjsKLQkJfQotCQlydW5uZXIuc2V0QXJndW1lbnRzKHJ1bm5lckFyZ3MpOwotCi0JCWlmIChidWlsZEZpbGUgIT0gbnVsbCkgewotCQkJcnVubmVyLnNldEJ1aWxkRmlsZUxvY2F0aW9uKGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWlmICh0YXJnZXRzICE9IG51bGwgJiYgdGFyZ2V0cy5sZW5ndGggPiAwKSB7Ci0JCQlydW5uZXIuc2V0RXhlY3V0aW9uVGFyZ2V0cyh0YXJnZXRzKTsKLQkJfQotCQlpZiAoY2FwdHVyZU91dHB1dCkgewotCQkJcnVubmVyLmFkZEJ1aWxkTG9nZ2VyKEFic3RyYWN0QW50VGVzdC5BTlRfVEVTVF9CVUlMRF9MT0dHRVIpOwotCQl9Ci0KLQkJcnVubmVyLnJ1bihudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MsIFN0cmluZyBiYXNlRGlyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJQW50UnVubmVyIHJ1bm5lciA9IG5ldyBBbnRSdW5uZXIoKTsKLQotCQlTdHJpbmdbXSBydW5uZXJBcmdzID0gYXJnczsKLQotCQlpZiAoYmFzZURpci5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIEFudCByZXF1aXJlcyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gYmUgc3BlY2lmaWVkCi0JCQkvLyBhcyBvbmUgb2YgdGhlIGFyZ3VtZW50cywgc28gaXQgbmVlZHMgdG8gYmUgYXBwZW5kZWQuCi0JCQlydW5uZXJBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBydW5uZXJBcmdzLCAwLCBhcmdzLmxlbmd0aCk7Ci0JCQlydW5uZXJBcmdzW2FyZ3MubGVuZ3RoXSA9IEJBU0VfRElSX1BSRUZJWCArIGJhc2VEaXI7Ci0JCX0KLQkJcnVubmVyLnNldEFyZ3VtZW50cyhydW5uZXJBcmdzKTsKLQotCQlydW5uZXIucnVuKGFyZ3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0Q2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M1ODE2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0Q2hlY2tlciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdENoZWNrZXIgZGVmbHQ9IG51bGw7Ci0JCi0JcHJpdmF0ZSBpbnQgdGFza1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXNrRmluaXNoZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCB0YXJnZXRzU3RhcnRlZENvdW50OwotCQotCXByaXZhdGUgaW50IHRhcmdldHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgaW50IGJ1aWxkc1N0YXJ0ZWRDb3VudDsKLQkKLQlwcml2YXRlIGludCBidWlsZHNGaW5pc2hlZENvdW50OwotCQotCXByaXZhdGUgTGlzdCBtZXNzYWdlcz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgTGlzdCB0YXJnZXRzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBMaXN0IHByb2plY3RzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCi0JcHJpdmF0ZSBIYXNodGFibGUgdXNlclByb3BlcnRpZXM7Ci0JCi0JcHJpdmF0ZSBMaXN0IG5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCQotCXByaXZhdGUgQW50VGVzdENoZWNrZXIoKSAgewotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gQW50VGVzdENoZWNrZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFudFRlc3RDaGVja2VyIGdldERlZmF1bHQoKSB7Ci0JCWlmIChkZWZsdCA9PSBudWxsKSB7Ci0JCQlkZWZsdD0gbmV3IEFudFRlc3RDaGVja2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQkvKioKLQkgKiBSZXNldHMgdGhlIHNpbmdsZXRvbiBBbnRUZXN0Q2hlY2tlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKLQkJaWYgKGRlZmx0ICE9IG51bGwpIHsKLQkJCWRlZmx0LnJlc2V0U3RhdGUoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoKSB7Ci0JCWJ1aWxkc0ZpbmlzaGVkQ291bnQrKzsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCBidWlsZFN0YXJ0ZWQoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCWJ1aWxkc1N0YXJ0ZWRDb3VudCsrOwotCQlwcm9qZWN0cy5hZGQocHJvamVjdE5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKCkgewotCQl0YXJnZXRzRmluaXNoZWRDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFyZ2V0U3RhcnRlZChTdHJpbmcgdGFyZ2V0TmFtZSkgewotCQl0YXJnZXRzU3RhcnRlZENvdW50Kys7Ci0JCXRhcmdldHMuYWRkKHRhcmdldE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoKSB7Ci0JCXRhc2tGaW5pc2hlZENvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCXRhc2tTdGFydGVkQ291bnQrKzsKLQkJdGFza3MuYWRkKHRhc2tOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRzRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QnVpbGRzRmluaXNoZWRDb3VudCgpIHsKLQkJcmV0dXJuIGJ1aWxkc0ZpbmlzaGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRzU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRCdWlsZHNTdGFydGVkQ291bnQoKSB7Ci0JCXJldHVybiBidWlsZHNTdGFydGVkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWVzc2FnZXNMb2dnZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpIHsKLQkJcmV0dXJuIG1lc3NhZ2VzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFyZ2V0c0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiB0YXJnZXRzRmluaXNoZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXJnZXRzU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUYXJnZXRzU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gdGFyZ2V0c1N0YXJ0ZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrRmluaXNoZWRDb3VudC4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFza0ZpbmlzaGVkQ291bnQoKSB7Ci0JCXJldHVybiB0YXNrRmluaXNoZWRDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YXNrU3RhcnRlZENvdW50LgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUYXNrU3RhcnRlZENvdW50KCkgewotCQlyZXR1cm4gdGFza1N0YXJ0ZWRDb3VudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRTdGF0ZSgpIHsKLQkJdGFza1N0YXJ0ZWRDb3VudD0gMDsKLQkJdGFza0ZpbmlzaGVkQ291bnQ9IDA7Ci0JCXRhcmdldHNTdGFydGVkQ291bnQ9IDA7Ci0JCXRhcmdldHNGaW5pc2hlZENvdW50PSAwOwotCQlidWlsZHNTdGFydGVkQ291bnQ9IDA7Ci0JCWJ1aWxkc0ZpbmlzaGVkQ291bnQ9IDA7Ci0JCW1lc3NhZ2VzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhc2tzPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRhcmdldHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvamVjdHM9IG5ldyBBcnJheUxpc3QoKTsKLQkJdXNlclByb3BlcnRpZXM9IG51bGw7Ci0JCW5hbWVPZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQkKLQkvKioKLSAgICAgKiBSZXR1cm4gdGhlIG1lc3NhZ2UgbiBmcm9tIHRoZSBsYXN0OgotICAgICAqIGUuZy4gZ2V0TG9nZ2VkTWVzc2FnZSgwKSByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBtZXNzYWdlCi0gICAgICogCi0JICogQHBhcmFtIG4gbWVzc2FnZSBpbmRleAotCSAqIEByZXR1cm4gdGhlIG50aCBsYXN0IG1lc3NhZ2UKLQkgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldExvZ2dlZE1lc3NhZ2UoaW50IG4pIHsKLSAgICAgICAgbiA9IG1lc3NhZ2VzLnNpemUoKSAtIChuICsgMSk7Ci0gICAgICAgIGlmICgobiA8IDApIHx8IChuID49IG1lc3NhZ2VzLnNpemUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBtZXNzYWdlcy5nZXQobik7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKLSAgICAgICAgcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7Ci0gICAgfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJQcm9wZXJ0aWVzKEhhc2h0YWJsZSB1c2VyUHJvcGVydGllcykgewotCQl0aGlzLnVzZXJQcm9wZXJ0aWVzPSB1c2VyUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFN0cmluZyl1c2VyUHJvcGVydGllcy5nZXQobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQlyZXR1cm4gbWVzc2FnZXM7Ci0JfQotCQotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJcmV0dXJuIG5hbWVPZkxpc3RlbmVyczsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiAoU3RyaW5nKW5hbWVPZkxpc3RlbmVycy5nZXQobmFtZU9mTGlzdGVuZXJzLnNpemUoKSAtIDEpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTmFtZU9mTGlzdGVuZXIoU3RyaW5nIG5hbWVPZkxpc3RlbmVyKSB7Ci0JCXRoaXMubmFtZU9mTGlzdGVuZXJzLmFkZChuYW1lT2ZMaXN0ZW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFBsdWdpbi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RwbHVnaW4vQW50VGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjJhYTcyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLXB1YmxpYyBjbGFzcyBBbnRUZXN0UGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgQW50VGVzdFBsdWdpbiBkZWZsdDsKLQkKLQlwdWJsaWMgQW50VGVzdFBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJZGVmbHQ9IHRoaXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgQW50VGVzdFBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmbHQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVBdXRvYnVpbGQoYm9vbGVhbiBlbmFibGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gZGlzYWJsZSBhdXRvIGJ1aWxkCi0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlPSBBbnRUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYz0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7Ci0JCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluUGx1Z2luKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsKLQkJCVVSTCBsb2NhbFVSTD0gUGxhdGZvcm0uYXNMb2NhbFVSTChpbnN0YWxsVVJMKTsKLQkJCXJldHVybiBuZXcgRmlsZShsb2NhbFVSTC5nZXRGaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL0FudFRlc3RQcm9wZXJ0eVZhbHVlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5YWM4OC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9BbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5JQW50UHJvcGVydHlWYWx1ZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgQW50VGVzdFByb3BlcnR5VmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIElBbnRQcm9wZXJ0eVZhbHVlUHJvdmlkZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudFByb3BlcnR5VmFsdWVQcm92aWRlciNnZXRBbnRQcm9wZXJ0eVZhbHVlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBbnRQcm9wZXJ0eVZhbHVlKFN0cmluZyBhbnRQcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cGx1Z2luL1Byb2plY3RIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYmJlZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci4qOwotCi0vKioKLSAqIEhlbHBlciBtZXRob2RzIHRvIHNldCB1cCBhbiBJUHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RIZWxwZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9CVUlMREZJTEVTX0RJUj0gbmV3IFBhdGgoInRlc3RidWlsZGZpbGVzIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJUGF0aCBURVNUX1JFU09VUkNFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0cmVzb3VyY2VzIik7CQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9MSUJfRElSPSBuZXcgUGF0aCgidGVzdGxpYiIpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBJUHJvamVjdC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0PSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIGFuIElQcm9qZWN0LgotCSAqLwkJCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogQWRkcyBhIGZvbGRlciB0byBhbiBJUHJvamVjdC4KLQkgKi8JCQotCXB1YmxpYyBzdGF0aWMgSUZvbGRlciBhZGRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGNvbnRhaW5lck5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCQlJRm9sZGVyIGZvbGRlcj0gcHJvamVjdC5nZXRGb2xkZXIoY29udGFpbmVyTmFtZSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWZvbGRlci5jcmVhdGUoZmFsc2UsIHRydWUsIG51bGwpOwotCQkJfQotCQkKLQkJcmV0dXJuIGZvbGRlcjsKLQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbXBvcnRGaWxlc0Zyb21EaXJlY3RvcnkoRmlsZSByb290RGlyLCBJUGF0aCBkZXN0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewkJCi0JCUlJbXBvcnRTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IEZpbGVTeXN0ZW1TdHJ1Y3R1cmVQcm92aWRlci5JTlNUQU5DRTsKLQkJTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoMTAwKTsKLQkJYWRkRmlsZXMocm9vdERpciwgZmlsZXMpOwotCQl0cnkgewotCQkJSW1wb3J0T3BlcmF0aW9uIG9wPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGRlc3RQYXRoLCByb290RGlyLCBzdHJ1Y3R1cmVQcm92aWRlciwgbmV3IEltcG9ydE92ZXJ3cml0ZVF1ZXJ5KCksIGZpbGVzKTsKLQkJCW9wLnNldENyZWF0ZUNvbnRhaW5lclN0cnVjdHVyZShmYWxzZSk7Ci0JCQlvcC5ydW4obW9uaXRvcik7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuCi0JCX0KLQl9CQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRmlsZXMoRmlsZSBkaXIsIExpc3QgY29sbGVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVtdIGZpbGVzID0gZGlyLmxpc3RGaWxlcygpOwotCQlMaXN0IHN1YkRpcnMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkpIHsKLQkJCQljb2xsZWN0aW9uLmFkZChmaWxlc1tpXSk7Ci0JCQl9IGVsc2UgaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlzdWJEaXJzLmFkZChmaWxlc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJSXRlcmF0b3IgaXRlciA9IHN1YkRpcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlIHN1YkRpciA9IChGaWxlKWl0ZXIubmV4dCgpOwotCQkJYWRkRmlsZXMoc3ViRGlyLCBjb2xsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbXBvcnRPdmVyd3JpdGVRdWVyeSBpbXBsZW1lbnRzIElPdmVyd3JpdGVRdWVyeSB7Ci0JCXB1YmxpYyBTdHJpbmcgcXVlcnlPdmVyd3JpdGUoU3RyaW5nIGZpbGUpIHsKLQkJCXJldHVybiBBTEw7Ci0JCX0JCi0JfQkJCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC9pbnB1dEhhbmRsZXJzL0FudFRlc3RJbnB1dEhhbmRsZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC9pbnB1dEhhbmRsZXJzL0FudFRlc3RJbnB1dEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMzM2Zi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvaW5wdXRIYW5kbGVycy9BbnRUZXN0SW5wdXRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQuaW5wdXRIYW5kbGVyczsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dFJlcXVlc3Q7Ci0KLS8qKgotICogQSB0ZXN0IGlucHV0IGhhbmRsZXIgd2hlbiB1c2luZyBBbnQgd2l0aGluIEVjbGlwc2UuCi0gKiBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHdpbGwgcmVzcG9uZCB0byA8aW5wdXQ+IHJlcXVlc3RzIGZyb20KLSAqIHdpdGhpbiBhbiBBbnQgYnVpbGQgZmlsZS4KLSAqIElmIHRoZSBidWlsZCBpcyBvY2N1cnJpbmcgaW4gQW50IDEuNi4wIGFuZCB0aGUgLW5vaW5wdXQgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZAotICogdGhpcyBpbnB1dCBoYW5kbGVyIHdpbGwgZmFpbC4KLSAqLwotcHVibGljIGNsYXNzIEFudFRlc3RJbnB1dEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SW5wdXRIYW5kbGVyIHsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIjaGFuZGxlSW5wdXQob3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuSW5wdXRSZXF1ZXN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUlucHV0KElucHV0UmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgQnVpbGRFeGNlcHRpb24gewotCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLmFudC5ub0lucHV0IikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byByZXNwb25kIHRvIGlucHV0IHJlcXVlc3QgbGlrZWx5IGFzIGEgcmVzdWx0IG9mIHNwZWNpZnlpbmcgdGhlIC1ub2lucHV0IGNvbW1hbmQiKTsKLQkJfQotCQlyZXF1ZXN0LnNldElucHV0KCJ0ZXN0aW5nIGhhbmRsaW5nIGlucHV0IHJlcXVlc3RzIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzczYzgzNi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWRkZGM3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50YXNrczsKLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrMiBleHRlbmRzIFRhc2sgewotCQotCXB1YmxpYyBBbnRUZXN0VGFzazIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRWNobyBlY2hvPSBuZXcgRWNobygpOwotCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpOwotCQllY2hvLmV4ZWN1dGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTGlzdGVuZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGQ0ZGRmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzOwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50OwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLQotCi1wdWJsaWMgY2xhc3MgVGVzdEJ1aWxkTGlzdGVuZXIgaW1wbGVtZW50cyBCdWlsZExpc3RlbmVyIHsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciNidWlsZEZpbmlzaGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgYnVpbGRGaW5pc2hlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5hZGROYW1lT2ZMaXN0ZW5lcih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0U3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhc2tTdGFydGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMb2dnZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90ZXN0bG9nZ2Vycy9UZXN0QnVpbGRMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkYzc2Ni4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGVzdGxvZ2dlcnMvVGVzdEJ1aWxkTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzOwotCi0KLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRTZWN1cml0eUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RCdWlsZExvZ2dlciBpbXBsZW1lbnRzIEJ1aWxkTG9nZ2VyIHsKLQotCXByaXZhdGUgaW50IG1lc3NhZ2VPdXRwdXRMZXZlbCA9UHJvamVjdC5NU0dfSU5GTzsKLQlwcml2YXRlIFByaW50U3RyZWFtIGZFcnI9IG51bGw7Ci0JcHJpdmF0ZSBQcmludFN0cmVhbSBmT3V0PSBudWxsOwotCQotCS8qKgotCSAqIEFuIGV4Y2VwdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgotCSAqLwotCXByaXZhdGUgVGhyb3dhYmxlIGZIYW5kbGVkRXhjZXB0aW9uPSBudWxsOwotCQotCQotCXB1YmxpYyBUZXN0QnVpbGRMb2dnZXIoKSB7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0TWVzc2FnZU91dHB1dExldmVsKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlT3V0cHV0TGV2ZWwoaW50IGxldmVsKSB7Ci0JCW1lc3NhZ2VPdXRwdXRMZXZlbD0gbGV2ZWw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgZ2V0TWVzc2FnZU91dHB1dExldmVsKCkgewotCQlyZXR1cm4gbWVzc2FnZU91dHB1dExldmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMb2dnZXIjc2V0RW1hY3NNb2RlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1hY3NNb2RlKGJvb2xlYW4gZW1hY3NNb2RlKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI2J1aWxkU3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkU3RhcnRlZChCdWlsZEV2ZW50IGV2ZW50KSB7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5idWlsZFN0YXJ0ZWQoZXZlbnQuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSk7Ci0JCUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5zZXRVc2VyUHJvcGVydGllcyhldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjYnVpbGRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGJ1aWxkRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOwotCQlmSGFuZGxlZEV4Y2VwdGlvbj0gbnVsbDsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmJ1aWxkRmluaXNoZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTGlzdGVuZXIjdGFyZ2V0U3RhcnRlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldFN0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFyZ2V0U3RhcnRlZChldmVudC5nZXRUYXJnZXQoKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXJnZXRGaW5pc2hlZChvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHRhcmdldEZpbmlzaGVkKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJaGFuZGxlRXhjZXB0aW9uKGV2ZW50KTsKLQkJQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLnRhcmdldEZpbmlzaGVkKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyI3Rhc2tTdGFydGVkKG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdGFza1N0YXJ0ZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFza1N0YXJ0ZWQoZXZlbnQuZ2V0VGFzaygpLmdldFRhc2tOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRMaXN0ZW5lciN0YXNrRmluaXNoZWQob3JnLmFwYWNoZS50b29scy5hbnQuQnVpbGRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0YXNrRmluaXNoZWQoQnVpbGRFdmVudCBldmVudCkgewotCQloYW5kbGVFeGNlcHRpb24oZXZlbnQpOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkudGFyZ2V0RmluaXNoZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEJ1aWxkTGlzdGVuZXIjbWVzc2FnZUxvZ2dlZChCdWlsZEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG1lc3NhZ2VMb2dnZWQoQnVpbGRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0UHJpb3JpdHkoKSA+IGdldE1lc3NhZ2VPdXRwdXRMZXZlbCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbG9nTWVzc2FnZShldmVudC5nZXRNZXNzYWdlKCksIGV2ZW50LmdldFByaW9yaXR5KCkpOwotCQlBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkubWVzc2FnZUxvZ2dlZChldmVudC5nZXRNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcmludFN0cmVhbSBnZXRFcnJvclByaW50U3RyZWFtKCkgewotCQlyZXR1cm4gZkVycjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByaW50U3RyZWFtIGdldE91dHB1dFByaW50U3RyZWFtKCkgewotCQlyZXR1cm4gZk91dDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExvZ2dlciNzZXRFcnJvclByaW50U3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3JQcmludFN0cmVhbShQcmludFN0cmVhbSBlcnIpIHsKLQkJLy90aGlzIGJ1aWxkIGxvZ2dlciBsb2dzIHRvICJudWxsIiB1bmxlc3MKLQkJLy90aGUgdXNlciBoYXMgZXhwbGljaXRseSBzZXQgYSBsb2dmaWxlIHRvIHVzZQotCQlpZiAoZXJyID09IFN5c3RlbS5lcnIpIHsKLQkJCWZFcnI9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlmRXJyPSBlcnI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkTG9nZ2VyI3NldE91dHB1dFByaW50U3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0pCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0cHV0UHJpbnRTdHJlYW0oUHJpbnRTdHJlYW0gb3V0cHV0KSB7Ci0JCS8vdGhpcyBidWlsZCBsb2dnZXIgbG9ncyB0byAibnVsbCIgdW5sZXNzCi0JCS8vdGhlIHVzZXIgaGFzIGV4cGxpY2l0bHkgc2V0IGEgbG9nZmlsZSB0byB1c2UKLQkJaWYgKG91dHB1dCA9PSBTeXN0ZW0ub3V0KSB7Ci0JCQlmT3V0PSBudWxsOwotCQl9IGVsc2UgewotCQkJZk91dD0gb3V0cHV0OwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxvZ01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBwcmlvcml0eSkgewotCQlpZiAocHJpb3JpdHkgPiBnZXRNZXNzYWdlT3V0cHV0TGV2ZWwoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAocHJpb3JpdHkgPT0gUHJvamVjdC5NU0dfRVJSKSB7Ci0JCQlpZiAoZ2V0RXJyb3JQcmludFN0cmVhbSgpICE9IG51bGwgJiYgZ2V0RXJyb3JQcmludFN0cmVhbSgpICE9IFN5c3RlbS5lcnIpIHsKLQkJCQkvL3VzZXIgaGFzIGRlc2lnbmF0ZWQgdG8gbG9nIHRvIGEgbG9nZmlsZQotCQkJCWdldEVycm9yUHJpbnRTdHJlYW0oKS5wcmludGxuKG1lc3NhZ2UpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGdldE91dHB1dFByaW50U3RyZWFtKCkgIT0gbnVsbCAmJiBnZXRPdXRwdXRQcmludFN0cmVhbSgpICE9IFN5c3RlbS5vdXQpIHsKLQkJCQkvL3VzZXIgaGFzIGRlc2lnbmF0ZWQgdG8gbG9nIHRvIGEgbG9nZmlsZQotCQkJCWdldE91dHB1dFByaW50U3RyZWFtKCkucHJpbnRsbihtZXNzYWdlKTsKLQkJCX0gCi0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEJ1aWxkRXZlbnQgZXZlbnQpIHsKLQkJVGhyb3dhYmxlIGV4Y2VwdGlvbiA9IGV2ZW50LmdldEV4Y2VwdGlvbigpOwotCQlpZiAoZXhjZXB0aW9uID09IG51bGwgfHwgZXhjZXB0aW9uID09IGZIYW5kbGVkRXhjZXB0aW9uCi0JCXx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uCi0JCXx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIEFudFNlY3VyaXR5RXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZkhhbmRsZWRFeGNlcHRpb249IGV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdHlwZXMvQW50VGVzdFBhdGguamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDhhYzRhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnR5cGVzOwotCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuUGF0aDsKLQotcHVibGljIGNsYXNzIEFudFRlc3RQYXRoIGV4dGVuZHMgUGF0aCB7Ci0JCi0JU3RyaW5nIG1lc3NhZ2U7Ci0JCi0JcHVibGljIEFudFRlc3RQYXRoKFByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcihwcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLm1lc3NhZ2U9IG1lc3NhZ2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWIxZTRmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9XC4uXC4uIi8+Ci08cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqZHQtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIAotICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BdXRvbWF0ZWRTdWl0ZSIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzI1NTEueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzMyNTUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0Mzk5Ny4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnMzI1NTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iYnVnIiBkZWZhdWx0PSJhbGwiPgotIDxwYXRoIGlkPSJteWNsYXNzcGF0aCI+Ci0gCTxmaWxlc2V0IGRpcj0iLi5cbGliIj4KLSAgCQk8aW5jbHVkZSBuYW1lPSJhbnRUZXN0c1N1cHBvcnQuamFyIiAvPiAKLSAgCTwvZmlsZXNldD4KLSAgPC9wYXRoPgotICAKLSA8dGFza2RlZiBuYW1lPSJoZWxsbyIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIj4KLSAgCTxjbGFzc3BhdGggcmVmaWQ9Im15Y2xhc3NwYXRoIiAvPiAKLSAgPC90YXNrZGVmPgotICAKLSA8dGFyZ2V0IG5hbWU9ImFsbCI+Ci0gIAk8aGVsbG8gLz4gCi0gIDwvdGFyZ2V0PgotICA8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9CdWczNDY2My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTAzZjEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzM0NjYzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPHByb2plY3QgbmFtZT0iMzQ2NjMueG1sIiBkZWZhdWx0PSJlY2hvUCI+Ci0KLTx0YXNrZGVmIGZpbGU9IiR7Uk9PVERJUn0vdGFza2RlZnMucHJvcGVydGllcyIgLz4KLSAKLSA8dGFyZ2V0IG5hbWU9ImVjaG9QIj4KLSAJPGVjaG9Qcm9wZXJ0aWVzLz4KLSA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNDI5MjYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0J1ZzQyOTI2LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiODZhMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQnVnNDI5MjYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iYWxsIj4KLQk8cGF0aCBpZD0ic29tZWNsYXNzcGF0aCI+Ci0JCTxmaWxlc2V0IGRpcj0iJHthbnQuaG9tZX0vbGliIiBpbmNsdWRlcz0ic29tZXRhc2suamFyIi8+Ci0JPC9wYXRoPgotCi0JPHRhc2tkZWYgbmFtZT0ic29tZXRhc2siIGNsYXNzbmFtZT0iY29tLmZvby5Tb21lVGFzayIKLWNsYXNzcGF0aHJlZj0ic29tZWNsYXNzcGF0aCIvPgotCi0JPHRhcmdldCBuYW1lPSJhbGwiPgotCQk8ZWNobz5IZWxsbyAke2FudC5ob21lfTwvZWNobz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0NsYXNzcGF0aE9yZGVyaW5nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5YjY1ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ2xhc3NwYXRoT3JkZXJpbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJDbGFzc3BhdGhPcmRlcmluZyIgZGVmYXVsdD0ib3JkZXJlZCIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJvcmRlcmVkIj4KLQkJPGphdmEgY2xhc3NuYW1lPSAiQ2xhc3NwYXRoT3JkZXJpbmciLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UYXNrLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UYXNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1MjVjOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvQ3VzdG9tVGFzay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJDdXN0b20gVGFzayIgZGVmYXVsdD0iQ3VzdG9tIFRhc2siIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJDdXN0b20gVGFzayIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0YXNrIiBkZXBlbmRzPSJpbml0Ij4KLQkJPEFudFRlc3RUYXNrLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9IkN1c3RvbSBUYXNrIGZyb20gRW50cnkiIGRlc2NyaXB0aW9uPSAiVGVzdCBhZGRpbmcgYSBjdXN0b20gdGFzayI+Ci0JCTxBbnRUZXN0VGFzazIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0N1c3RvbVR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWUxZWY1Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9DdXN0b21UeXBlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkN1c3RvbSBUeXBlIiBkZWZhdWx0PSJDdXN0b20gVHlwZSIgYmFzZWRpcj0iLiI+Ci0KLQk8YW50dGVzdHBhdGggaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0ibGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2FudHRlc3RwYXRoPgotICAgIAotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJDdXN0b20gVHlwZSIgZGVzY3JpcHRpb249ICJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGVjaG8gbWVzc2FnZT0iVGVzdCBhZGRpbmcgYSBjdXN0b20gdHlwZSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL0V4dGVuc2lvblBvaW50VGFzay54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMzE0MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFRhc2siIGRlZmF1bHQ9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dGVuc2lvbiBwb2ludCBkZWZpbmVkIHRhc2sgaXMgcHJlc2VudCI+Ci0JCTxjb29sVGFzay8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvRXh0ZW5zaW9uUG9pbnRUeXBlLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmFhYWVjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9FeHRlbnNpb25Qb2ludFR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGRlZmF1bHQ9IkV4dGVuc2lvbiBQb2ludCBUeXBlIiBiYXNlZGlyPSIuIj4KLQotCTxjb29sVHlwZSBpZD0iY29tcGlsZS5jbGFzc3BhdGgiPgotICAgICAgPGZpbGVzZXQgZGlyPSJsaWIiPgotICAgICAgICA8aW5jbHVkZSBuYW1lPSIqKi8qLmphciIvPgotICAgICAgPC9maWxlc2V0PgotICAgIDwvY29vbFR5cGU+Ci0gICAgCi0JPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiPgotCQk8ZWNobyBtZXNzYWdlPSJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9Ob0RlZmF1bHQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWQ3ZTkuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL05vRGVmYXVsdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ICJUZXN0aW5nIiBkZWZhdWx0PSJidWlsZCI+Ci0KLQk8dGFyZ2V0IG5hbWU9ICJ0ZXN0Ij4KLQkJPGVjaG8gbWVzc2FnZT0idGVzdGluZyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9UZXN0Rm9yRWNoby54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvVGVzdEZvckVjaG8ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjEzZTVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9UZXN0Rm9yRWNoby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hvIFRlc3QiIGRlZmF1bHQ9IlRlc3QgZm9yIEVjaG8iIGJhc2VkaXI9Ii4iPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJUZXN0IGZvciBFY2hvIiBkZXNjcmlwdGlvbj0gIkNhbGxzIG90aGVyIGVjaG9zIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudCBhbnRmaWxlPSJidWlsZGZpbGVzL2VjaG9pbmcueG1sIiBkaXI9Ii4uLy4uL0FudFRlc3RzIiB0YXJnZXQ9ImVjaG8xIi8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGRmaWxlcy9lY2hvaW5nLnhtbCIgZGlyPSIuLi8uLi9BbnRUZXN0cyIgdGFyZ2V0PSJlY2hvMiIvPgotCQk8YW50IGFudGZpbGU9ImJ1aWxkZmlsZXMvZWNob2luZy54bWwiIGRpcj0iLi4vLi4vQW50VGVzdHMiIHRhcmdldD0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM4YTUzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hpbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZGQ2NGQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNob2luZyIgZGVmYXVsdD0iZWNobzEiIGJhc2VkaXI9Ii4uIj4KLQotCTx0YXJnZXQgbmFtZT0iZWNobzEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0YnVpbGRmaWxlcy9mYWlsaW5nVGFyZ2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ0MThlMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvZmFpbGluZ1RhcmdldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImFsbCI+Ci0JPHRhcmdldCBuYW1lPSJhbGwiIGRlcGVuZHM9ImZhaWxzLCBlY2hvcyIvPgotCTx0YXJnZXQgbmFtZT0iZmFpbHMiPgotCQk8amFyIGphcmZpbGU9ImphcjE2LmphciIgYmFzZWRpcj0iZG9lc05vdEV4aXN0Ii8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJlY2hvcyI+Ci0JCTxlY2hvPlN0aWxsIGVjaG8gb24gZmFpbHVyZTwvZWNobz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvaW5wdXQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2lucHV0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3MGFiNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvaW5wdXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08cHJvamVjdCBuYW1lPSJpbnB1dCB0ZXN0aW5nIiBkZWZhdWx0PSAiaW5wdXQgdGVzdCI+Ci0JPHRhcmdldCBuYW1lPSJpbnB1dCB0ZXN0Ij4KLQkJPGlucHV0IG1lc3NhZ2U9IkVudGVyIGZvciBlY2hvIiBhZGRwcm9wZXJ0eT0gImlucHV0VGVzdCI+Ci0JCTwvaW5wdXQ+Ci0JCTxlY2hvIG1lc3NhZ2U9IiR7aW5wdXRUZXN0fSIvPgotCTwvdGFyZ2V0PgkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmMDIyNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmFudC5jb3JlIiBkZWZhdWx0PSJidWlsZCIgYmFzZWRpcj0iLi4iPgotCi0JCi0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9IkFudFRlc3RzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0idXNlLmVjbGlwc2UuSkRUQ29tcGlsZXIiPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImJ1aWxkIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2phdmFjLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9qYXZhYy5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIGRlc3RkaXI9IiR7dGVtcC5mb2xkZXJ9L2phdmFjLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9Im9uIiBpbmNsdWRlQW50UnVudGltZT0ieWVzIj4KLQkJCTxzcmMgcGF0aD0icmVzb3VyY2VzIi8+Ci0JCTwvamF2YWM+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJyZWZyZXNoIiBkZXBlbmRzPSJpbml0IiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPGVjbGlwc2UucmVmcmVzaExvY2FsIHJlc291cmNlPSIke3BsdWdpbn0iIGRlcHRoPSJpbmZpbml0ZSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvY2xhc3NwYXRoT3JkZXJpbmcxLmphciBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMGNiN2YuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvY2xhc3NwYXRoT3JkZXJpbmcxLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMi5qYXIgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi9jbGFzc3BhdGhPcmRlcmluZzIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODE2NzQxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0bGliL2NsYXNzcGF0aE9yZGVyaW5nMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi90YXNrRm9sZGVyL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmNsYXNzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RsaWIvdGFza0ZvbGRlci9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrMi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzN2ViNS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdGxpYi90YXNrRm9sZGVyL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvQW50VGVzdFRhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL0FudFRlc3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNGY2MDIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGFza2RlZnMucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rhc2tkZWZzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMDQ5ZmYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGFza2RlZnMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWVjaG9Qcm9wZXJ0aWVzPW9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLkVjaG9Qcm9wZXJ0aWVzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RyZXNvdXJjZXMvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWFjZDNhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cmVzb3VyY2VzL3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BbnRUZXN0cz10ZXN0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlCi1lY2xpcHNlLmlzLmNvb2w9WWVwCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvQWJzdHJhY3RBbnRUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvQWJzdHJhY3RBbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYTNmY2UuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0Fic3RyYWN0QW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50UnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXJnZXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlRhc2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudEZpbGVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLSAKLS8qKgotICogVGVzdHMgZm9yIEFudCBjb3JlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVJTERfU1VDQ0VTU0ZVTD0gIkJVSUxEIFNVQ0NFU1NGVUwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOVF9URVNUX0JVSUxEX0xPR0dFUiA9ICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRlc3Rsb2dnZXJzLlRlc3RCdWlsZExvZ2dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUj0gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQudGVzdGxvZ2dlcnMuVGVzdEJ1aWxkTGlzdGVuZXIiOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRUZXN0cycgcHJvamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXN0IHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCgiQW50VGVzdHMiKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBwcm9qZWN0OwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEFudFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBidWlsZCBmaWxlIG5hbWVkOiAiICsgYnVpbGRGaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUZvbGRlciBnZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyB3b3JraW5nRGlyZWN0b3J5TmFtZSkgewotCQlJRm9sZGVyIGZvbGRlciA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIod29ya2luZ0RpcmVjdG9yeU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgbmFtZWQ6ICIgKyB3b3JraW5nRGlyZWN0b3J5TmFtZSwgZm9sZGVyLmV4aXN0cygpKTsKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGaWxlIGNoZWNrRmlsZUV4aXN0cyhTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG51bGwpOwotCQlJRmlsZSBmaWxlID0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYnVpbGRmaWxlcyIpLmdldEZpbGUoZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBmaWxlIG5hbWVkOiAiICsgZmlsZU5hbWUsIGZpbGUuZXhpc3RzKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBudWxsLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bihidWlsZEZpbGVOYW1lLCBhcmdzLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmdbXSBhcmdzLCBib29sZWFuIHJldHJpZXZlVGFyZ2V0cykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oYnVpbGRGaWxlTmFtZSwgYXJncywgcmV0cmlldmVUYXJnZXRzLCAiIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nW10gYXJncywgYm9vbGVhbiByZXRyaWV2ZVRhcmdldHMsIFN0cmluZyB3b3JraW5nRGlyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudFRlc3RDaGVja2VyLnJlc2V0KCk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gbnVsbDsKLQkJaWYgKGJ1aWxkRmlsZU5hbWUgIT0gbnVsbCkgewotCQkJYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7Ci0JCX0KLQkJQW50RmlsZVJ1bm5lciBydW5uZXI9IG5ldyBBbnRGaWxlUnVubmVyKCk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IG51bGw7Ci0JCWlmIChyZXRyaWV2ZVRhcmdldHMpIHsKLQkJCXRhcmdldHM9IGdldFRhcmdldE5hbWVzKGJ1aWxkRmlsZU5hbWUpOwotCQl9Ci0JCWlmICh3b3JraW5nRGlyLmxlbmd0aCgpID4gMCkgewotCQkJd29ya2luZ0Rpcj0gZ2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQl9IAotCQlydW5uZXIucnVuKGJ1aWxkRmlsZSwgdGFyZ2V0cywgYXJncywgd29ya2luZ0RpciwgdHJ1ZSk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHN0YXJ0cyBkaWQgbm90IGVxdWFsIGJ1aWxkIGZpbmlzaGVzIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldEJ1aWxkc1N0YXJ0ZWRDb3VudCgpID09IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRCdWlsZHNGaW5pc2hlZENvdW50KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFyZ2V0SW5mb1tdIGdldFRhcmdldHMoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZpbGUgYnVpbGRGaWxlPSBnZXRCdWlsZEZpbGUoYnVpbGRGaWxlTmFtZSk7Ci0JCQotCQlBbnRSdW5uZXIgcnVubmVyID0gbmV3IEFudFJ1bm5lcigpOwotCQlydW5uZXIuc2V0QnVpbGRGaWxlTG9jYXRpb24oYnVpbGRGaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCSAJcmV0dXJuIHJ1bm5lci5nZXRBdmFpbGFibGVUYXJnZXRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRUYXJnZXROYW1lcyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7Ci0JCVN0cmluZ1tdIG5hbWVzPSBuZXcgU3RyaW5nW2luZm9zLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCVRhcmdldEluZm8gaW5mbyA9IGluZm9zW2ldOwotCQkJbmFtZXNbaV09IGluZm8uZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFRhcmdldERlc2NyaXB0aW9ucyhTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gaW5mb3M9IGdldFRhcmdldHMoYnVpbGRGaWxlTmFtZSk7Ci0JCVN0cmluZ1tdIGRlc2NyaXB0aW9ucz0gbmV3IFN0cmluZ1tpbmZvcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYXJnZXRJbmZvIGluZm8gPSBpbmZvc1tpXTsKLQkJCWRlc2NyaXB0aW9uc1tpXT0gaW5mby5nZXREZXNjcmlwdGlvbigpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb2plY3QgY29udGFpbmluZyB0aGUgZ2l2ZW4gdGFyZ2V0IGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gcHJvamVjdCBuYW1lIGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gYnVpbGQgZmlsZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHN1Y2ggdGFyZ2V0IGNhbiBiZSBmb3VuZC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVwZW5kZW5jaWVzKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgdGFyZ2V0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvIGluZm89IGdldFRhcmdldChidWlsZEZpbGVOYW1lLCB0YXJnZXROYW1lKTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8uZ2V0RGVwZW5kZW5jaWVzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhcmdldCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiBidWlsZCBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gc3VjaCB0YXJnZXQgY2FuIGJlIGZvdW5kLgotCSAqLwotCXByb3RlY3RlZCBUYXJnZXRJbmZvIGdldFRhcmdldChTdHJpbmcgYnVpbGRGaWxlTmFtZSwgU3RyaW5nIHRhcmdldE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFyZ2V0SW5mb1tdIGluZm9zPSBnZXRUYXJnZXRzKGJ1aWxkRmlsZU5hbWUpOwotCQlmb3IgKGludCBpPSAwLCBudW1UYXJnZXRzPSBpbmZvcy5sZW5ndGg7IGkgPCBudW1UYXJnZXRzOyBpKyspIHsKLQkJCWlmIChpbmZvc1tpXS5nZXROYW1lKCkuZXF1YWxzKHRhcmdldE5hbWUpKSB7Ci0JCQkJcmV0dXJuIGluZm9zW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxvZyBtZXNzYWdlIG4gZnJvbSB0aGUgbGFzdDoKLSAgICAgKiBlLmcuIGdldExvZ2dlZE1lc3NhZ2UoMCkgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgbWVzc2FnZQotICAgICAqIAotICAgICAqIEBwYXJhbSBuIG1lc3NhZ2UgaW5kZXgKLSAgICAgKiBAcmV0dXJuIHRoZSBudGggbGFzdCBtZXNzYWdlCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRMb2dnZWRNZXNzYWdlKGludCBuKSB7Ci0gICAgICAgIHJldHVybiBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VkTWVzc2FnZShuKTsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpIHsKLQkJcmV0dXJuIGdldExvZ2dlZE1lc3NhZ2UoMCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFN1Y2Nlc3NmdWwoKSB7Ci0JCUxpc3QgbWVzc2FnZXM9IEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpOwotCQlTdHJpbmcgc3VjY2Vzcz0gKFN0cmluZyltZXNzYWdlcy5nZXQobWVzc2FnZXMuc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHdhcyBub3QgZmxhZ2dlZCBhcyBzdWNjZXNzZnVsOiAiICsgc3VjY2VzcywgQlVJTERfU1VDQ0VTU0ZVTC5lcXVhbHMoc3VjY2VzcykpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJyZXNvdXJjZXMiKS5nZXRGaWxlKCJ0ZXN0LnByb3BlcnRpZXMiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IHRvb2xzRW50cnk9IHByZWZzLmdldFRvb2xzSmFyRW50cnkoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5W10gYWRkaXRpb25hbEVudHJpZXM7Ci0JCWlmICh0b29sc0VudHJ5ID09IG51bGwpIHsKLQkJCWFkZGl0aW9uYWxFbnRyaWVzPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W117fTsKLQkJfSBlbHNlIHsKLQkJCWFkZGl0aW9uYWxFbnRyaWVzPSBuZXcgSUFudENsYXNzcGF0aEVudHJ5W10ge3Rvb2xzRW50cnl9OwotCQl9Ci0JCXByZWZzLnNldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKGFkZGl0aW9uYWxFbnRyaWVzKTsKLQkJcHJlZnMuc2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWVFbnRyaWVzKCkpOwotCQlwcmVmcy5zZXRDdXN0b21UYXNrcyhuZXcgVGFza1tde30pOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde30pOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKG5ldyBTdHJpbmdbXXt9KTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydGllcyhuZXcgUHJvcGVydHlbXXt9KTsKLQkJcHJlZnMuc2V0QW50SG9tZShwcmVmcy5nZXREZWZhdWx0QW50SG9tZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbnRIb21lKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5W10gZW50cmllcz0gcHJlZnMuZ2V0QW50SG9tZUNsYXNzcGF0aEVudHJpZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IGFudGphcj0gZW50cmllc1swXTsKLQkJSVBhdGggYW50SG9tZVBhdGg9IG5ldyBQYXRoKGFudGphci5nZXRFbnRyeVVSTCgpLmdldEZpbGUoKSk7Ci0JCWFudEhvbWVQYXRoPSBhbnRIb21lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCXJldHVybiBhbnRIb21lUGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9BdXRvbWF0ZWRTdWl0ZS5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0F1dG9tYXRlZFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3OWJhYmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL0F1dG9tYXRlZFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlOwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHMuKjsKLQotLyoqCi0gKiBUZXN0IGFsbCBhcmVhcyBvZiBBbnQuCi0gKiAKLSAqIFRvIHJ1biB0aGlzIHRlc3Qgc3VpdGU6Ci0gKiA8b2w+Ci0gKiA8bGk+Q3JlYXRlIGEgbmV3IEpVbml0IHBsdWdpbiB0ZXN0IGxhdW5jaCBjb25maWd1cmF0aW9uPC9saT4KLSAqIDxsaT5TZXQgdGhlIFRlc3QgY2xhc3MgdG8gIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkF1dG9tYXRlZFN1aXRlIjwvbGk+Ci0gKiA8bGk+U2V0IHRoZSBQcm9qZWN0IHRvICJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZSI8L2xpPgotICogPGxpPlJ1biB0aGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24uIE91dHB1dCBmcm9tIHRoZSB0ZXN0cyB3aWxsIGJlIGRpc3BsYXllZCBpbiBhIEpVbml0IHZpZXc8L2xpPgotICogPC9vbD4KLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRlZFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQkKLQkvKioKLQkgKiBGbGFnIHRoYXQgaW5kaWNhdGVzIHRlc3QgYXJlIGluIHByb2dyZXNzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGVzdGluZyA9IHRydWU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWl0ZS4gIFRoaXMgaXMgcmVxdWlyZWQgdG8KLQkgKiB1c2UgdGhlIEpVbml0IExhdW5jaGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBBdXRvbWF0ZWRTdWl0ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgdGVzdCBzdWl0ZS4KLQkgKi8KLQlwdWJsaWMgQXV0b21hdGVkU3VpdGUoKSB7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuY2xhc3MpKTsKLQkJYWRkVGVzdChuZXcgVGVzdFN1aXRlKEZyYW1ld29ya1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUYXJnZXRUZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvamVjdFRlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShPcHRpb25UZXN0cy5jbGFzcykpOwotCQlhZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGFza1Rlc3RzLmNsYXNzKSk7Ci0JCWFkZFRlc3QobmV3IFRlc3RTdWl0ZShUeXBlVGVzdHMuY2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSB0ZXN0cyBhbmQgY29sbGVjdHMgdGhlaXIgcmVzdWx0IGluIGEgVGVzdFJlc3VsdCB3aXRob3V0IGJsb2NraW5nLgotCSAqIHRoZSBVSSB0aHJlYWQuIE5vdCBub3JtYWxseSBuZWVkZWQgYnV0IG5pY2UgdG8gaGF2ZSB0byBjaGVjayBvbiB0aGUgc3RhdGUgb2YKLQkgKiBlbnZpcm9ubWVudCBkdXJpbmcgYSB0ZXN0IHJ1bi4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBUZXN0UmVzdWx0IHJlc3VsdCkgewotLy8JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotLy8JCVRocmVhZCB0aHJlYWQgPSBudWxsOwotLy8JCXRyeSB7Ci0vLwkJCVJ1bm5hYmxlIHIgPSBuZXcgUnVubmFibGUoKSB7Ci0vLwkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJZm9yIChFbnVtZXJhdGlvbiBlPSB0ZXN0cygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKLS8vCQkJCSAgCQlpZiAocmVzdWx0LnNob3VsZFN0b3AoKSApCi0vLwkJCQkgIAkJCWJyZWFrOwotLy8JCQkJCQlUZXN0IHRlc3Q9IChUZXN0KWUubmV4dEVsZW1lbnQoKTsKLS8vCQkJCQkJcnVuVGVzdCh0ZXN0LCByZXN1bHQpOwotLy8JCQkJCX0JCQkJCQotLy8JCQkJCXRlc3RpbmcgPSBmYWxzZTsKLS8vCQkJCQlkaXNwbGF5Lndha2UoKTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCQkJdGhyZWFkID0gbmV3IFRocmVhZChyKTsKLS8vCQkJdGhyZWFkLnN0YXJ0KCk7Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQl9Ci0vLwkJCQkKLS8vCQl3aGlsZSAodGVzdGluZykgewotLy8JCQl0cnkgewotLy8JCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotLy8JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLS8vCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLS8vCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0vLwkJCX0JCQkKLS8vCQl9CQkKLS8vCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVkNjRlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS9Qcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdFBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLlByb2plY3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuKjsKLQotLyoqCi0gKiBUZXN0IHRvIGNsb3NlIHRoZSB3b3JrYmVuY2gsIHNpbmNlIGRlYnVnIHRlc3RzIGRvIG5vdCBydW4gaW4gdGhlIFVJCi0gKiB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q3JlYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gZGVsZXRlIGFueSBwcmUtZXhpc3RpbmcgcHJvamVjdAotCQlJUHJvamVjdCBwcm8gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QoIkFudFRlc3RzIik7Ci0JCWlmIChwcm8uZXhpc3RzKCkpIHsKLQkJCXByby5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCX0KLQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZGZpbGVzIGFuZCBzdXBwb3J0IGZpbGVzCi0JCXByb2plY3QgPSBQcm9qZWN0SGVscGVyLmNyZWF0ZVByb2plY3QoIkFudFRlc3RzIik7Ci0JCUlGb2xkZXIgZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgImJ1aWxkZmlsZXMiKTsKLQkJRmlsZSByb290ID0gQW50VGVzdFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RmlsZUluUGx1Z2luKFByb2plY3RIZWxwZXIuVEVTVF9CVUlMREZJTEVTX0RJUik7Ci0JCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCi0JCWZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJyZXNvdXJjZXMiKTsKLQkJcm9vdCA9IEFudFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfUkVTT1VSQ0VTX0RJUik7Ci0JCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCi0JCWZvbGRlciA9IFByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJsaWIiKTsKLQkJcm9vdCA9IEFudFRlc3RQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEZpbGVJblBsdWdpbihQcm9qZWN0SGVscGVyLlRFU1RfTElCX0RJUik7Ci0JCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvRnJhbWV3b3JrVGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9GcmFtZXdvcmtUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGJkN2E0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9GcmFtZXdvcmtUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuSUFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRnJhbWV3b3JrVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBGcmFtZXdvcmtUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRoZSBkZXByZWNhdGVkIG1lYW5zIG9mIHNldHRpbmcgdGhlIGNsYXNzcGF0aCBzdGlsbCB3b3JrcyBjb3JyZWN0bHkKLQkgKiBEbyBub3QgZml4IGRlcHJlY2F0aW9ucyB1bmxlc3MgdGhlIGRlcHJlY2F0ZWQgbWV0aG9kcyBhcmUgYmVpbmcgcmVtb3ZlZC4KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc3BhdGhPcmRlcmluZ0RlcHJlY2F0ZWQoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmcgcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGliIikuZ2V0RmlsZSgiY2xhc3NwYXRoT3JkZXJpbmcxLmphciIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVVSTCB1cmw9IG5ldyBVUkwoImZpbGU6IiArIHBhdGgpOwotCQkKLQkJcGF0aD0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigibGliIikuZ2V0RmlsZSgiY2xhc3NwYXRoT3JkZXJpbmcyLmphciIpLmdldExvY2F0aW9uKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCVVSTCB1cmwyPSBuZXcgVVJMKCJmaWxlOiIgKyBwYXRoKTsKLQkJCi0JCVVSTCB1cmxzW10gPSBwcmVmcy5nZXRDdXN0b21VUkxzKCk7Ci0JCVVSTCBuZXdVcmxzW10gPSBuZXcgVVJMW3VybHMubGVuZ3RoICsgMl07Ci0JCVN5c3RlbS5hcnJheWNvcHkodXJscywgMCwgbmV3VXJscywgMCwgdXJscy5sZW5ndGgpOwotCQluZXdVcmxzW3VybHMubGVuZ3RoXSA9IHVybDsKLQkJbmV3VXJsc1t1cmxzLmxlbmd0aCArIDFdID0gdXJsMjsKLQkJcHJlZnMuc2V0Q3VzdG9tVVJMcyhuZXdVcmxzKTsKLQkJCi0JCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlydW4oIkNsYXNzcGF0aE9yZGVyaW5nLnhtbCIpOwotCQlTdHJpbmcgbXNnPSAoU3RyaW5nKUFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlcygpLmdldCgxKTsKLQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csIG1zZy5lcXVhbHMoImNsYXNzcGF0aE9yZGVyaW5nMSIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQkKLQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQkKLQkJdXJscyA9IHByZWZzLmdldEN1c3RvbVVSTHMoKTsKLQkJbmV3VXJscyA9IG5ldyBVUkxbdXJscy5sZW5ndGggKyAyXTsKLQkJU3lzdGVtLmFycmF5Y29weSh1cmxzLCAwLCBuZXdVcmxzLCAwLCB1cmxzLmxlbmd0aCk7Ci0JCW5ld1VybHNbdXJscy5sZW5ndGhdID0gdXJsMjsKLQkJbmV3VXJsc1t1cmxzLmxlbmd0aCArIDFdID0gdXJsOwotCQlwcmVmcy5zZXRDdXN0b21VUkxzKG5ld1VybHMpOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ2xhc3NwYXRoT3JkZXJpbmcueG1sIik7Ci0JCW1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJjbGFzc3BhdGhPcmRlcmluZzIiKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NwYXRoT3JkZXJpbmcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkKLQkJU3RyaW5nIHBhdGg9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImxpYiIpLmdldEZpbGUoImNsYXNzcGF0aE9yZGVyaW5nMS5qYXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cnk9IG5ldyBBbnRDbGFzc3BhdGhFbnRyeShwYXRoKTsKLQkJCi0JCXBhdGg9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImxpYiIpLmdldEZpbGUoImNsYXNzcGF0aE9yZGVyaW5nMi5qYXIiKS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cnkyPSBuZXcgQW50Q2xhc3NwYXRoRW50cnkocGF0aCk7Ci0JCQotCQlJQW50Q2xhc3NwYXRoRW50cnkgZW50cmllc1tdID0gcHJlZnMuZ2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMoKTsKLQkJSUFudENsYXNzcGF0aEVudHJ5IG5ld0VudHJpZXNbXSA9IG5ldyBJQW50Q2xhc3NwYXRoRW50cnlbZW50cmllcy5sZW5ndGggKyAyXTsKLQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBlbnRyaWVzLmxlbmd0aCk7Ci0JCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGhdID0gZW50cnk7Ci0JCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGggKyAxXSA9IGVudHJ5MjsKLQkJcHJlZnMuc2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMobmV3RW50cmllcyk7Ci0JCQotCQlwcmVmcy51cGRhdGVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJcnVuKCJDbGFzc3BhdGhPcmRlcmluZy54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJjbGFzc3BhdGhPcmRlcmluZzEiKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJCi0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJCi0JCWVudHJpZXMgPSBwcmVmcy5nZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcygpOwotCQluZXdFbnRyaWVzID0gbmV3IElBbnRDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLmxlbmd0aCArIDJdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG5ld0VudHJpZXMsIDAsIGVudHJpZXMubGVuZ3RoKTsKLQkJbmV3RW50cmllc1tlbnRyaWVzLmxlbmd0aF0gPSBlbnRyeTI7Ci0JCW5ld0VudHJpZXNbZW50cmllcy5sZW5ndGggKyAxXSA9IGVudHJ5OwotCQlwcmVmcy5zZXRBZGRpdGlvbmFsQ2xhc3NwYXRoRW50cmllcyhuZXdFbnRyaWVzKTsKLQkJCi0JCXByZWZzLnVwZGF0ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQotCQlydW4oIkNsYXNzcGF0aE9yZGVyaW5nLnhtbCIpOwotCQltc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiY2xhc3NwYXRoT3JkZXJpbmcyIikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5vRGVmYXVsdFRhcmdldCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiTm9EZWZhdWx0LnhtbCIsIG5ldyBTdHJpbmdbXXsidGVzdCJ9LCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZz0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiRGVmYXVsdCB0YXJnZXQgJ2J1aWxkJyBkb2VzIG5vdCBleGlzdCBpbiB0aGlzIHByb2plY3QiKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQnVpbGQgZmlsZXMgd2l0aCBubyBkZWZhdWx0IHRhcmdldHMgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRhc2tzIGxpa2UgamF2YWMgd29yayB3aGVuIGluY2x1ZGVBbnRSdW50aW1lIGlzIHNwZWNpZmllZAotCSAqIGJ1ZyAyMDg1Ny4KLQkgKiBUaGlzIHRlc3Qgd2lsbCBqdXN0IHJldHVybiBpZiB0aGUgdGVzdHMgYXJlIGNvbmR1Y3RlZCBvbiBhIEpSRSAobm8gdG9vbHMuamFyKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZUFudFJ1bnRpbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlBbnRDbGFzc3BhdGhFbnRyeSB0b29sc0VudHJ5PSBBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCkuZ2V0VG9vbHNKYXJFbnRyeSgpOwotCQlpZiAodG9vbHNFbnRyeSA9PSBudWxsKSB7Ci0JCQkvL3J1bm5pbmcgb24gYSBKUkUgd2hlcmUgdG9vbHMuamFyIGNvdWxkIG5vdCBiZSBmb3VuZAotCQkJcmV0dXJuOwotCQl9Ci0JCXJ1bigiamF2YWMueG1sIiwgbmV3IFN0cmluZ1tdeyJidWlsZCIsInJlZnJlc2gifSwgZmFsc2UpOyAvL3N0YW5kYXJkIGNvbXBpbGVyCi0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJSUZpbGUgY2xhc3NGaWxlPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJ0ZW1wLmZvbGRlciIpLmdldEZvbGRlcigiamF2YWMuYmluIikuZ2V0RmlsZSgiQW50VGVzdFRhc2suY2xhc3MiKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2xhc3MgZmlsZSB3YXMgbm90IGdlbmVyYXRlZCIsIGNsYXNzRmlsZS5leGlzdHMoKSk7Ci0JCXJ1bigiamF2YWMueG1sIiwgbmV3IFN0cmluZ1tdeyItRHVzZS5lY2xpcHNlLmNvbXBpbGVyPXRydWUiLCAiY2xlYW4iLCAiYnVpbGQiLCAicmVmcmVzaCJ9LCBmYWxzZSk7IC8vSkRUQ29tcGlsZXIKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQljbGFzc0ZpbGU9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoInRlbXAuZm9sZGVyIikuZ2V0Rm9sZGVyKCJqYXZhYy5iaW4iKS5nZXRGaWxlKCJBbnRUZXN0VGFzay5jbGFzcyIpOwotCQlhc3NlcnRUcnVlKCJDbGFzcyBmaWxlIHdhcyBub3QgZ2VuZXJhdGVkIiwgY2xhc3NGaWxlLmV4aXN0cygpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHByb3BlcnRpZXMgYWRkZWQgdXNpbmcgYSBnbG9iYWwgcHJvcGVydHkgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQcm9wZXJ0eUZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZyBwYXRoPSBnZXRQcm9wZXJ0eUZpbGVOYW1lKCk7Ci0JCXByZWZzLnNldEN1c3RvbVByb3BlcnR5RmlsZXMobmV3IFN0cmluZ1tde3BhdGh9KTsKLQkJCi0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tde30pOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBZZXAiLCAiWWVwIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5pcy5jb29sIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiQW50VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0ZXN0aW5nIiwgInRlc3RpbmcgZnJvbSBwcm9wZXJ0aWVzIGZpbGUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJBbnRUZXN0cyIpKSk7Ci0JCWFzc2VydE51bGwoIm15Lm5hbWUgd2FzIG5vdCBzZXQgYW5kIHNob3VsZCBiZSBudWxsIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgibXkubmFtZSIpKTsKLQkJCi0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlIHByb3BlcnRpZXMgYWRkZWQgdXNpbmcgYSBnbG9iYWwgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsUHJvcGVydHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tUHJvcGVydGllcyhuZXcgUHJvcGVydHlbXXtuZXcgUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIsICJZZXAiKSwgbmV3IFByb3BlcnR5KCJKVW5pdFRlc3QiLCAidHJ1ZSIpfSk7Ci0JCQotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXt9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgWWVwIiwgIlllcCIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkpVbml0VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJKVW5pdFRlc3QiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCQotCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQcm9wZXJ0eUZpbGVXaXRoTWludXNEVGFraW5nUHJlY2VkZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCQotCQlTdHJpbmcgcGF0aD0gZ2V0UHJvcGVydHlGaWxlTmFtZSgpOwotCQlwcmVmcy5zZXRDdXN0b21Qcm9wZXJ0eUZpbGVzKG5ldyBTdHJpbmdbXXtwYXRofSk7Ci0JCQotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhhdCB0aGUgZGVmYXVsdCBBTlRfSE9NRSBpcyBzZXQgYW5kIHRoYXQgaXQgY2FuIGJlIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0dGluZ0FudEhvbWUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnM9IEFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCXJ1bigiZWNob2luZy54bWwiKTsKLQkJCWFzc2VydFRydWUoIkFOVF9IT01FIG5vdCBzZXQgY29ycmVjdGx5IiwgcHJlZnMuZ2V0RGVmYXVsdEFudEhvbWUoKS5lcXVhbHMoU3lzdGVtLmdldFByb3BlcnR5KCJhbnQuaG9tZSIpKSk7Ci0JCQlGaWxlIGFudExpYkRpcj0gbmV3IEZpbGUocHJlZnMuZ2V0RGVmYXVsdEFudEhvbWUoKSwgImxpYiIpOyAvLyROT04tTkxTLTEkCi0JCQlhc3NlcnRUcnVlKCJhbnQubGlicmFyeS5kaXIgbm90IHNldCBjb3JyZWN0bHkiLCBhbnRMaWJEaXIuZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmxpYnJhcnkuZGlyIikpKTsKLQkJCXByZWZzLnNldEFudEhvbWUoIiIpOwotCQkJcnVuKCJlY2hvaW5nLnhtbCIpOwotCQkJYXNzZXJ0VHJ1ZSgiQU5UX0hPTUUgbm90IHNldCBjb3JyZWN0bHkiLCBudWxsID09IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmhvbWUiKSk7Ci0JCQlhc3NlcnRUcnVlKCJhbnQubGlicmFyeS5kaXIgbm90IHNldCBjb3JyZWN0bHkiLCBudWxsID09IFN5c3RlbS5nZXRQcm9wZXJ0eSgiYW50LmxpYnJhcnkuZGlyIikpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQl9CQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9PcHRpb25UZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL09wdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjE1NWMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL09wdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0czsKLQotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5BYnN0cmFjdEFudFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHBsdWdpbi5BbnRUZXN0Q2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE9wdGlvblRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRUZXN0IHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0FSRz0gIlVua25vd24gYXJndW1lbnQ6ICI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfT0ZfSEVMUD0gImFudCBbb3B0aW9uc10gW3RhcmdldCBbdGFyZ2V0MiBbdGFyZ2V0M10gLi4uXV0iOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT049ICJBcGFjaGUgQW50IHZlcnNpb24gMS42LjEgY29tcGlsZWQgb24gRmVicnVhcnkgMTIgMjAwNCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1ZFUlNJT049ICJvcmcuYXBhY2hlLmFudF8xLjYuMSI7Ci0JIAotCXB1YmxpYyBPcHRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItaGVscCIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEhlbHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaGVscCJ9KTsKLQkJYXNzZXJ0VHJ1ZSgiT25lIG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDEpOwotCQlhc3NlcnRUcnVlKCJIZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgIT0gbnVsbCAmJiBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoU1RBUlRfT0ZfSEVMUCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1oIiBvcHRpb24gKGhlbHApCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzSCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1oIn0pOwotCQlhc3NlcnRUcnVlKCJPbmUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZCwgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDEpOwotCQlhc3NlcnRUcnVlKCJIZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkgIT0gbnVsbCAmJiBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoU1RBUlRfT0ZfSEVMUCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi12ZXJzaW9uIiBvcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii12ZXJzaW9uIn0pOwotCQlhc3NlcnRUcnVlKCJPbmUgbWVzc2FnZSBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoIlZlcnNpb24gaXMgaW5jb3JyZWN0IiwgVkVSU0lPTi5lcXVhbHMoZ2V0TGFzdE1lc3NhZ2VMb2dnZWQoKSkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1wcm9qZWN0aGVscCIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RoZWxwKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb2plY3RoZWxwIn0pOwotCQlhc3NlcnRUcnVlKCI1IG1lc3NhZ2VzIHNob3VsZCBoYXZlIGJlZW4gbG9nZ2VkOyB3YXMgIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gNSk7Ci0JCWFzc2VydFRydWUoIlByb2plY3QgaGVscCBpcyBpbmNvcnJlY3QiLCBnZXRMYXN0TWVzc2FnZUxvZ2dlZCgpLnN0YXJ0c1dpdGgoIlN1YnRhcmdldHM6IikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1wIiBvcHRpb24gKHByb2plY3QgaGVscCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNQKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXAifSk7Ci0JCWFzc2VydFRydWUoIjUgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA1KTsKLQkJYXNzZXJ0VHJ1ZSgiUHJvamVjdCBoZWxwIGlzIGluY29ycmVjdCIsIGdldExhc3RNZXNzYWdlTG9nZ2VkKCkuc3RhcnRzV2l0aCgiU3VidGFyZ2V0czoiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLXByb2plY3RoZWxwIiBvcHRpb24gd2hlbiBpdCB3aWxsIG5vdCBzaG93IChxdWl0ZSBtb2RlKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0aGVscFF1aWV0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb2plY3RoZWxwIiwgIi1xIn0pOwotCQlhc3NlcnRUcnVlKCJubyBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZDsgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDApOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1saXN0ZW5lciIgb3B0aW9uIHdpdGggYSBsaXN0ZW5lciB0aGF0IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBCdWlsZExpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyQmFkKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsICJqYXZhLmxhbmcuU3RyaW5nIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5lcXVhbHMoImphdmEubGFuZy5TdHJpbmcgd2hpY2ggd2FzIHNwZWNpZmllZCB0byBiZSBhIGJ1aWxkIGxpc3RlbmVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZExpc3RlbmVyLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBIGNvcmUgZXhjZXB0aW9uIHNob3VsZCBoYXZlIG9jY3VycmVkIHdyYXBwZXJpbmcgYSBjbGFzcyBjYXN0IGV4Y2VwdGlvbiIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcGFzc2luZyBhbiB1bnJlY29nbml6ZWQgYXJndW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkFyZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbGlzdGVuciJ9KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5yZWNvZ25pemVkIG9wdGlvbiBtZXNzYWdlIHNob3VsZCBoYXZlIGJlZW4gbG9nZ2VkIGJlZm9yZSBzdWNjZXNzZnVsIGJ1aWxkIiwKLQkJCQkJKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gNikKLQkJCQkJICYmIChnZXRMb2dnZWRNZXNzYWdlKDUpLnN0YXJ0c1dpdGgoVU5LTk9XTl9BUkcpKQotICAgICAgICAgICAgICAgICAgICAgJiYgKGdldExhc3RNZXNzYWdlTG9nZ2VkKCkuc3RhcnRzV2l0aChCVUlMRF9TVUNDRVNTRlVMKSkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRoZSAtbG9nZmlsZSB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMb2dGaWxlV2l0aE5vQXJnKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiWW91IG11c3Qgc3BlY2lmeSBhIGxvZyBmaWxlIHdoZW4gdXNpbmcgdGhlIC1sb2cgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1sb2dmaWxlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExvZ0ZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxvZ2ZpbGUiLCAiVGVzdExvZ0ZpbGUudHh0In0pOwotCQlJRmlsZSBmaWxlPSBjaGVja0ZpbGVFeGlzdHMoIlRlc3RMb2dGaWxlLnR4dCIpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPWZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCi0JCUlucHV0U3RyZWFtUmVhZGVyIGluPSBudWxsOwotCQl0cnkgewkJCi0JCQlpbj0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSkpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlcj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJY2hhcltdIHJlYWRCdWZmZXI9IG5ldyBjaGFyWzIwNDhdOwotCQkJaW50IG49IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW49IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlhc3NlcnRUcnVlKCJGaWxlIHNob3VsZCBoYXZlIHN0YXJ0ZWQgd2l0aCBCdWlsZGZpbGUiLCBidWZmZXIudG9TdHJpbmcoKS5zdGFydHNXaXRoKCJCdWlsZGZpbGUiKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbi5jbG9zZSgpOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQkJCi0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1sb2dnZXIgd2l0aCBubyBhcmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyV2l0aE5vQXJnKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dnZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1sb2dnZXIgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWxvZ2dlciIgb3B0aW9uIHdpdGggYSBsb2dnZXIgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgQnVpbGRMb2dnZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TG9nZ2VyQmFkKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dnZXIiLCAiamF2YS5sYW5nLlN0cmluZyJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkEgY29yZSBleGNlcHRpb24gc2hvdWxkIGhhdmUgb2NjdXJyZWQgd3JhcHBlcmluZyBhIGNsYXNzIGNhc3QgZXhjZXB0aW9uIiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1sb2dnZXIiIG9wdGlvbiB3aXRoIHR3byBsb2dnZXJzIHNwZWNpZmllZC4uLm9ubHkgb25lIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VHdvTG9nZ2VycygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbG9nZ2VyIiwgImphdmEubGFuZy5TdHJpbmciLCAiLXEiLCAiLWxvZ2dlciIsICJqYXZhLmxhbmcuU3RyaW5nIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQXMgb25seSBvbmUgbG9nZ2VyIGNhbiBiZSBzcGVjaWZpZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1saXN0ZW5lciB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcldpdGhOb0FyZygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItbGlzdGVuZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdGVuZXJzIHdoZW4gdXNpbmcgdGhlIC1saXN0ZW5lciBhcmd1bWVudCAiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1saXN0ZW5lciB3aXRoIGEgY2xhc3MgdGhhdCB3aWxsIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lckNsYXNzTm90Rm91bmQoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxpc3RlbmVyIiwgIlRlc3RCdWlsZExpc3RlbmVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIlNob3VsZCBiZSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIiwgImphdmEubGFuZy5DbGFzc05vdEZvdW5kRXhjZXB0aW9uOiBUZXN0QnVpbGRMaXN0ZW5lciIuZXF1YWxzKG1lc3NhZ2UpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJBIENvcmVFeGNlcHRpb24gc2hvdWxkIGhhdmUgb2NjdXJyZWQgYXMgdGhlIGxpc3RlbmVyIGNsYXNzIHdpbGwgbm90IGJlIGZvdW5kIiwgZmFsc2UpOwotCQkKLQl9Ci0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWxpc3RlbmVyIG9wdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSfSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiQSBsaXN0ZW5lciBzaG91bGQgaGF2ZSBiZWVuIGFkZGVkIG5hbWVkOiAiICsgQU5UX1RFU1RfQlVJTERfTElTVEVORVIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TGFzdExpc3RlbmVyKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWxpc3RlbmVyIG9wdGlvbiBtdWx0aXBsZSB0aW1lcy4uLndoaWNoIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNdWx0aXBsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1saXN0ZW5lciIsIEFOVF9URVNUX0JVSUxEX0xJU1RFTkVSLCAiLWxpc3RlbmVyIiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVJ9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJBIGxpc3RlbmVyIHNob3VsZCBoYXZlIGJlZW4gYWRkZWQgbmFtZWQ6ICIgKyBBTlRfVEVTVF9CVUlMRF9MSVNURU5FUiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMYXN0TGlzdGVuZXIoKSkpOwotCQlhc3NlcnRUcnVlKCJUd28gbGlzdGVuZXJzIHNob3VsZCBoYXZlIGJlZW4gYWRkZWQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TGlzdGVuZXJzKCkuc2l6ZSgpID09IDIpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRoZSAtbGlzdGVuZXIgb3B0aW9uIG11bHRpcGxlIHRpbWVzLCB3aXRoIG9uZSBtaXNzaW5nIHRoZSBhcmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNdWx0aXBsZVdpdGhCYWQoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxpc3RlbmVyIiwgQU5UX1RFU1RfQlVJTERfTElTVEVORVIsICItcSIsICItbGlzdGVuZXIiLCAiLXZlcmJvc2UifSk7Ci0JCX0gY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1lvdSBtdXN0IHNwZWNpZnkgYSBsaXN0ZW5lciBmb3IgYWxsIC1saXN0ZW5lciBhcmd1bWVudHMKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgbGlzdGVuZXIgZm9yIGFsbCAtbGlzdGVuZXIgYXJndW1lbnRzICIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyB0aGUgLWJ1aWxkZmlsZSB3aXRoIG5vIGFyZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEZpbGVXaXRoTm9BcmcoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWJ1aWxkZmlsZSJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy9Zb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgYnVpbGRmaWxlIHdoZW4gdXNpbmcgdGhlIC1idWlsZGZpbGUgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgdGhlIC1idWlsZGZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0gZ2V0UHJvamVjdCgpLmdldEZvbGRlcigiYnVpbGRmaWxlcyIpLmdldEZpbGUoImVjaG9pbmcueG1sIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1idWlsZGZpbGUiLCBidWlsZEZpbGVOYW1lfSwgZmFsc2UsICJidWlsZGZpbGVzIik7Ci0JCQotCQlhc3NlcnRUcnVlKCJTaG91bGQgaGF2ZSBiZWVuIDEgdGFza3MsIHdhczogIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRUYXNrU3RhcnRlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRUYXNrU3RhcnRlZENvdW50KCkgPT0gMSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgYSB0YXJnZXQgYXQgdGhlIGNvbW1hbmQgbGluZSB0aGF0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZ5QmFkVGFyZ2V0QXNBcmcoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiZWNobzIifSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiQSBjb3JlIGV4Y2VwdGlvbiBzaG91bGQgaGF2ZSBvY2N1cnJlZCBhcyB0aGUgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmeVRhcmdldEFzQXJnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjMgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSAzKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgd2l0aCBvdGhlciBvcHRpb25zCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZnlUYXJnZXRBc0FyZ1dpdGhPdGhlck9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIiwgIlRlc3RMb2dGaWxlLnR4dCIsICJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjQgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA0KTsKLQkJTGlzdCBtZXNzYWdlcz0gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCk7Ci0JCS8vZW5zdXJlIHRoYXQgZWNobzMgdGFyZ2V0IGV4ZWN1dGVkIGFuZCBvbmx5IHRoYXQgdGFyZ2V0Ci0JCWFzc2VydFRydWUoImVjaG8zIHRhcmdldCBub3QgZXhlY3V0ZWQiLCBtZXNzYWdlcy5nZXQoMikuZXF1YWxzKCJlY2hvMyIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHRhcmdldHMgYXQgdGhlIGNvbW1hbmQgbGluZSB3aXRoIG90aGVyIG9wdGlvbnMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmeVRhcmdldHNBc0FyZ1dpdGhPdGhlck9wdGlvbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1sb2dmaWxlIiwgIlRlc3RMb2dGaWxlLnR4dCIsICJlY2hvMiIsICJlY2hvMyJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjUgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSA1KTsKLQkJTGlzdCBtZXNzYWdlcz0gQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCk7Ci0JCS8vZW5zdXJlIHRoYXQgZWNobzIgdGFyZ2V0IGV4ZWN1dGVkCi0JCWFzc2VydFRydWUoImVjaG8yIHRhcmdldCBub3QgZXhlY3V0ZWQiLCBtZXNzYWdlcy5nZXQoMikuZXF1YWxzKCJlY2hvMiIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIGEgdGFyZ2V0IGF0IHRoZSBjb21tYW5kIGxpbmUgYW5kIHF1aWV0IHJlcG9ydGluZwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZ5VGFyZ2V0QXNBcmdBbmRRdWlldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWxvZ2ZpbGUiLCAiVGVzdExvZ0ZpbGUudHh0IiwgImVjaG8zIiwgIi1xdWlldCJ9LCBmYWxzZSk7Ci0JCWFzc2VydFRydWUoIjIgbWVzc2FnZXMgc2hvdWxkIGhhdmUgYmVlbiBsb2dnZWQ7IHdhcyAiICsgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzTG9nZ2VkQ291bnQoKSA9PSAyKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcHJvcGVydGllcyB1c2luZyAiLUQiCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzRCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLURBbnRUZXN0cz10ZXN0aW5nIiwgIi1EZWNsaXBzZS5pcy5jb29sPXRydWUifSwgZmFsc2UpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmlzLmNvb2wiKSkpOwotCQlhc3NlcnRUcnVlKCJBbnRUZXN0cyBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIHRlc3RpbmciLCAidGVzdGluZyIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIkFudFRlc3RzIikpKTsKLQkJYXNzZXJ0TnVsbCgibXkubmFtZSB3YXMgbm90IHNldCBhbmQgc2hvdWxkIGJlIG51bGwiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJteS5uYW1lIikpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgcHJvcGVydGllcyB1c2luZyAiLUQiIGFuZCAiLWQiIHRvIHNwZWNpZnkgZGVidWcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNETWludXNkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItZCIsICItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNaW51c0RBbmRHbG9iYWxQcm9wZXJ0aWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItREFudFRlc3RzPXRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5ydW5uaW5nIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UucnVubmluZyIpKSk7Ci0JCWFzc2VydE5vdE51bGwoImVjbGlwc2UuaG9tZSBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaG9tZSIpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgc3BlY2lmeWluZyBhIHByb3BlcnR5IHN1Y2ggYXMgIi1EPWVtcHR5U3RyaW5nSXNNeU5hbWUKLQkgKiBCdWcgMzcwMDcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWludXNERW1wdHkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1EPWVtcHR5U3RyaW5nSXNNeU5hbWUiLCAiLURlY2xpcHNlLmlzLmNvb2w9dHJ1ZSJ9LCBmYWxzZSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIlwiXCIgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiBlbXB0eVN0cmluZ0lzTXlOYW1lIiwgImVtcHR5U3RyaW5nSXNNeU5hbWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCIiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHNwZWNpZnlpbmcgcHJvcGVydGllcyB0aGF0IGNvbnRhaW4gc3BhY2VzCi0JICogQnVnIDM3MDk0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzRFdpdGhTcGFjZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiZWNob2luZy54bWwiLCBuZXcgU3RyaW5nW117Ii1EQW50VGVzdHM9IHRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9ICAgIHRydWUifSwgZmFsc2UpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCWFzc2VydFRydWUoImVjbGlwc2UuaXMuY29vbCBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmlzLmNvb2wiKSkpOwotCQlhc3NlcnRUcnVlKCJBbnRUZXN0cyBzaG91bGQgaGF2ZSBhIHZhbHVlIG9mIHRlc3RpbmciLCAidGVzdGluZyIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIkFudFRlc3RzIikpKTsKLQkJYXNzZXJ0TnVsbCgibXkubmFtZSB3YXMgbm90IHNldCBhbmQgc2hvdWxkIGJlIG51bGwiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJteS5uYW1lIikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBzcGVjaWZ5aW5nIHByb3BlcnRpZXMgd2hlbiB0aGUgdXNlciBoYXMgaW5jb3JyZWN0bHkgc3BlY2lmaWVkICItRGVidWciCi0JICogQnVnIDQwOTM1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNXaXRoTWludXNEZWJ1ZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLURlYnVnIiwgIi1EQW50VGVzdHM9IHRlc3RpbmciLCAiLURlY2xpcHNlLmlzLmNvb2w9ICAgIHRydWUifSwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKCJcIi1EZWJ1Z1wiIHNob3VsZCBiZSBmbGFnZ2VkIGFzIGFuIHVua25vd24gYXJndW1lbnQiLCAiVW5rbm93biBhcmd1bWVudDogLURlYnVnIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJYXNzZXJ0VHJ1ZSgiZWNsaXBzZS5pcy5jb29sIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIHRydWUiLCAidHJ1ZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHdoZW4gdGhlIHVzZXIgaGFzIGluY29ycmVjdGx5IHNwZWNpZmllZCAiLURlYnVnIgotCSAqIEJ1ZyA0MDkzNQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RNaW51c0RlYnVnKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oImVjaG9pbmcueG1sIiwgbmV3IFN0cmluZ1tdeyItRGVidWcifSk7Ci0JCWFzc2VydFRydWUoIlwiLURlYnVnXCIgc2hvdWxkIGJlIGZsYWdnZWQgYXMgYW4gdW5rbm93biBhcmd1bWVudCIsICJVbmtub3duIGFyZ3VtZW50OiAtRGVidWciLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMCkpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlGaWxlV2l0aE5vQXJnKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1wcm9wZXJ0eWZpbGUifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3QhOiAiICsgbXNnLCBtc2cuZXF1YWxzKCJZb3UgbXVzdCBzcGVjaWZ5IGEgcHJvcGVydHkgZmlsZW5hbWUgd2hlbiB1c2luZyB0aGUgLXByb3BlcnR5ZmlsZSBhcmd1bWVudCIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgcHJvcGVydHkgZmlsZW5hbWUgd2hlbiB1c2luZyB0aGUgLXByb3BlcnR5ZmlsZSBhcmd1bWVudCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQSBidWlsZCBzaG91bGQgc3VjY2VlZCB3aGVuIGEgcHJvcGVydHkgZmlsZSBpcyBub3QgZm91bmQuCi0JICogVGhlIGVycm9yIGlzIHJlcG9ydGVkIGFuZCB0aGUgYnVpbGQgY29udGludWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUZpbGVGaWxlTm90Rm91bmQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb3BlcnR5ZmlsZSIsICJxcS50eHQifSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLnN0YXJ0c1dpdGgoIkNvdWxkIG5vdCBsb2FkIHByb3BlcnR5IGZpbGUgcXEudHh0OiIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1wcm9wZXJ0eWZpbGUiLCBnZXRQcm9wZXJ0eUZpbGVOYW1lKCl9KTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgWWVwIiwgIlllcCIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImVjbGlwc2UuaXMuY29vbCIpKSk7Ci0JCWFzc2VydFRydWUoIkFudFRlc3RzIHNob3VsZCBoYXZlIGEgdmFsdWUgb2YgdGVzdGluZyIsICJ0ZXN0aW5nIGZyb20gcHJvcGVydGllcyBmaWxlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiQW50VGVzdHMiKSkpOwotCQlhc3NlcnROdWxsKCJteS5uYW1lIHdhcyBub3Qgc2V0IGFuZCBzaG91bGQgYmUgbnVsbCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoIm15Lm5hbWUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUZpbGVXaXRoTWludXNEVGFraW5nUHJlY2VkZW5jZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJlY2hvaW5nLnhtbCIsIG5ldyBTdHJpbmdbXXsiLXByb3BlcnR5ZmlsZSIsIGdldFByb3BlcnR5RmlsZU5hbWUoKSwgIi1EQW50VGVzdHM9dGVzdGluZyIsICItRGVjbGlwc2UuaXMuY29vbD10cnVlIn0sIGZhbHNlKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLmlzLmNvb2wgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5pcy5jb29sIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiQW50VGVzdHMgc2hvdWxkIGhhdmUgYSB2YWx1ZSBvZiB0ZXN0aW5nIiwgInRlc3RpbmciLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJBbnRUZXN0cyIpKSk7Ci0JCWFzc2VydE51bGwoIm15Lm5hbWUgd2FzIG5vdCBzZXQgYW5kIHNob3VsZCBiZSBudWxsIiwgQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgibXkubmFtZSIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlcldpdGhOb0FyZygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIn0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdHJpbmcgbXNnPSBjZS5nZXRNZXNzYWdlKCk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdCE6ICIgKyBtc2csIG1zZy5lcXVhbHMoIllvdSBtdXN0IHNwZWNpZnkgYSBjbGFzc25hbWUgd2hlbiB1c2luZyB0aGUgLWlucHV0aGFuZGxlciBhcmd1bWVudCIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJZb3UgbXVzdCBzcGVjaWZ5IGEgY2xhc3NuYW1lIHdoZW4gdXNpbmcgdGhlIC1pbnB1dGhhbmRsZXIgYXJndW1lbnQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggdHdvIGhhbmRsZXJzIHNwZWNpZmllZC4uLm9ubHkgb25lIGlzIGFsbG93ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRIYW5kbGVyTXVsdGlwbGUoKSB7Ci0JCXRyeSB7Ci0JCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIsIG5ldyBTdHJpbmdbXXsiLWlucHV0aGFuZGxlciIsICJvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5EZWZhdWx0SW5wdXRIYW5kbGVyIiwgIi1xIiwgIi1pbnB1dGhhbmRsZXIiLCAib3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQuRGVmYXVsdElucHV0SGFuZGxlciJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJU3RyaW5nIG1zZz0gY2UuZ2V0TWVzc2FnZSgpOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3QhOiAiICsgbXNnLCBtc2cuZXF1YWxzKCJPbmx5IG9uZSBpbnB1dCBoYW5kbGVyIGNsYXNzIG1heSBiZSBzcGVjaWZpZWQuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkFzIG9ubHkgb25lIGlucHV0IGhhbmRsZXIgY2FuIGJlIHNwZWNpZmllZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItaW5wdXRoYW5kbGVyIiBvcHRpb24gd2l0aCBhIGlucHV0IGhhbmRsZXIgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgSW5wdXRIYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlckJhZCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgImphdmEubGFuZy5TdHJpbmdCdWZmZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IGNlLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLmVxdWFscygiVGhlIHNwZWNpZmllZCBpbnB1dCBoYW5kbGVyIGNsYXNzIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcmcuYXBhY2hlLnRvb2xzLmFudC5pbnB1dC5JbnB1dEhhbmRsZXIgaW50ZXJmYWNlIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBpbnB1dGhhbmRsZXIiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggYSBpbnB1dCBoYW5kbGVyIHRoYXQgaXMgbm90IGEgZGVmaW5lZCBjbGFzcwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnB1dEhhbmRsZXJCYWQyKCkgewotCQl0cnkgewotCQkJcnVuKCJUZXN0Rm9yRWNoby54bWwiLCBuZXcgU3RyaW5nW117Ii1pbnB1dGhhbmRsZXIiLCAiamEubGFuZy5TdHJpbmdCdWZmZXIifSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCVN0cmluZyBtc2c9IGNlLmdldE1lc3NhZ2UoKTsKLQkJCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0ITogIiArIG1zZywgbXNnLnN0YXJ0c1dpdGgoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBzcGVjaWZpZWQgaW5wdXQgaGFuZGxlciBjbGFzcyBqYS5sYW5nLlN0cmluZ0J1ZmZlciIpKTsKLQkJCXJldHVybjsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgaW5wdXRoYW5kbGVyIiwgZmFsc2UpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1pbnB1dGhhbmRsZXIiIG9wdGlvbiB3aXRoIGEgdGVzdCBpbnB1dCBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdElucHV0SGFuZGxlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQuaW5wdXRIYW5kbGVycy5BbnRUZXN0SW5wdXRIYW5kbGVyIn0pOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygidGVzdGluZyBoYW5kbGluZyBpbnB1dCByZXF1ZXN0cyIpKTsKLQkJCi0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWlucHV0aGFuZGxlciIgb3B0aW9uIHdpdGggYSB0ZXN0IGlucHV0IGhhbmRsZXIgYW5kIHRoZSAtbm9pbnB1dCBvcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5wdXRIYW5kbGVyV2l0aE1pbnVzTm9JbnB1dCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItaW5wdXRoYW5kbGVyIiwgIm9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnN1cHBvcnQuaW5wdXRIYW5kbGVycy5BbnRUZXN0SW5wdXRIYW5kbGVyIiwgIi1ub2lucHV0In0pOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIGNlLmdldE1lc3NhZ2UoKSwgY2UuZ2V0TWVzc2FnZSgpLmVuZHNXaXRoKCJVbmFibGUgdG8gcmVzcG9uZCB0byBpbnB1dCByZXF1ZXN0IGxpa2VseSBhcyBhIHJlc3VsdCBvZiBzcGVjaWZ5aW5nIHRoZSAtbm9pbnB1dCBjb21tYW5kIikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAtbm9pbnB1dCBvcHRpb24gd2l0aCB0aGUgZGVmYXVsdCBpbnB1dCBoYW5kbGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzTm9JbnB1dCgpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiaW5wdXQueG1sIiwgbmV3IFN0cmluZ1tdeyItbm9pbnB1dCJ9KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBjZS5nZXRNZXNzYWdlKCksIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiRmFpbGVkIHRvIHJlYWQgaW5wdXQgZnJvbSBDb25zb2xlLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQlhc3NlcnRUcnVlKCJCdWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoZSAiLWRpYWdub3N0aWNzIiBvcHRpb24gd2l0aCBubyBBTlRfSE9NRSBzZXQKLQkgKiBidWcgMjU2OTMKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGlhZ25vc3RpY3NXaXRoTm9BbnRIb21lKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpLnNldEFudEhvbWUobnVsbCk7Ci0JCQlydW4oImlucHV0LnhtbCIsIG5ldyBTdHJpbmdbXXsiLWRpYWdub3N0aWNzIn0pOwotCQkKLQkJCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDApOwotCQkJYXNzZXJ0VHJ1ZSgiTWVzc2FnZSBpbmNvcnJlY3Q6ICIgKyBtc2csIG1zZy5lcXVhbHMoIi0tLS0tLS0gQW50IGRpYWdub3N0aWNzIHJlcG9ydCAtLS0tLS0tIikpOwotCQl9IGZpbmFsbHkgewotCQkJcmVzdG9yZVByZWZlcmVuY2VEZWZhdWx0cygpOwotCQl9Ci0JfQotCQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1kaWFnbm9zdGljcyIgb3B0aW9uIHdpdGggQU5UX0hPTUUgc2V0Ci0JICogYnVnIDI1NjkzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERpYWdub3N0aWNzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQotCQl0cnkgewotCQkJcnVuKCJpbnB1dC54bWwiLCBuZXcgU3RyaW5nW117Ii1kaWFnbm9zdGljcyJ9KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCQkKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMTIpOwotCQkvL21zZyBkZXBlbmRzIG9uIHdoZXRoZXIgc2VsZiBob3N0aW5nIHRlc3Rpbmcgb3IgYnVpbGQgdGVzdGluZwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVuZHNXaXRoKCJvcmcuYXBhY2hlLmFudCIpIHx8IG1zZy5lbmRzV2l0aChQTFVHSU5fVkVSU0lPTikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyB0aGUgIi1xdWlldCIgc3RpbGwgcmVwb3J0cyBidWlsZCBzdWNjZXNzZnVsCi0JICogYnVnIDM0NDg4Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzUXVpZXQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJ1bigiVGVzdEZvckVjaG8ueG1sIiwgbmV3IFN0cmluZ1tdeyItcXVpZXQifSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsJCi0JfQotCi0JLyoqCi0JICogVGVzdHMgdGhlICIta2VlcC1nb2luZyIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzS2VlcEdvaW5nKCkgewotCQl0cnkgewotCQkJcnVuKCJmYWlsaW5nVGFyZ2V0LnhtbCIsIG5ldyBTdHJpbmdbXXsiLWtlZXAtZ29pbmcifSwgZmFsc2UpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGJlKSB7Ci0JCQlhc3NlcnRUcnVlKCI0IG1lc3NhZ2VzIHNob3VsZCBoYXZlIGJlZW4gbG9nZ2VkOyB3YXMgIiArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCksIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRNZXNzYWdlc0xvZ2dlZENvdW50KCkgPT0gNCk7Ci0JCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbWVzc2FnZToiICArIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMb2dnZWRNZXNzYWdlKDEpLCAiU3RpbGwgZWNobyBvbiBmYWlsdXJlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldExvZ2dlZE1lc3NhZ2UoMSkpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCIsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgdGhlICItayIgb3B0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1pbnVzSygpIHsKLQkJdHJ5IHsKLQkJCXJ1bigiZmFpbGluZ1RhcmdldC54bWwiLCBuZXcgU3RyaW5nW117Ii1rZWVwLWdvaW5nIn0sIGZhbHNlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBiZSkgewotCQkJYXNzZXJ0VHJ1ZSgiNCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBiZWVuIGxvZ2dlZDsgd2FzICIgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXNMb2dnZWRDb3VudCgpID09IDQpOwotCQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2U6IiAgKyBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TG9nZ2VkTWVzc2FnZSgxKSwgIlN0aWxsIGVjaG8gb24gZmFpbHVyZSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRMb2dnZWRNZXNzYWdlKDEpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoIlRoZSBidWlsZCBzaG91bGQgaGF2ZSBmYWlsZWQiLCBmYWxzZSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9Qcm9qZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3N2ViNC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5BbnRDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0VGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCQotCXB1YmxpYyBQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIHRoYXQgdGhlIHRocmVlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYWx3YXlzIGJlIHNldCBhcmUgY29ycmVjdAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCYXNlUHJvcGVydGllc1NldCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQlydW4oYnVpbGRGaWxlTmFtZSk7Ci0JCUlGaWxlIGJ1aWxkRmlsZT0gZ2V0QnVpbGRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlTdHJpbmcgZnVsbE5hbWU9IGJ1aWxkRmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQlhc3NlcnRUcnVlKCJlY2xpcHNlLnJ1bm5pbmcgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdHJ1ZSIsICJ0cnVlIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgiZWNsaXBzZS5ydW5uaW5nIikpKTsKLQkJYXNzZXJ0VHJ1ZSgiYW50LmZpbGUgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgdGhlIGJ1aWxkIGZpbGUgbmFtZSIsIGZ1bGxOYW1lLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuZmlsZSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoImFudC5qYXZhLnZlcnNpb24gc2hvdWxkIGhhdmUgYmVlbiBzZXQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJhbnQuamF2YS52ZXJzaW9uIikpOwotCQlhc3NlcnROb3ROdWxsKCJhbnQudmVyc2lvbiBzaG91bGQgaGF2ZSBiZWVuIHNldCIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoImFudC52ZXJzaW9uIikpOwotCQlhc3NlcnROb3ROdWxsKCJlY2xpcHNlLmhvbWUgc2hvdWxkIGhhdmUgYmVlbiBzZXQiLCBBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJlY2xpcHNlLmhvbWUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkudGVzdGluZyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyB0cnVlIiwgInRydWUiLmVxdWFscyhBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0VXNlclByb3BlcnR5KCJwcm9wZXJ0eS50ZXN0aW5nIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVXaXRoQ2xhc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgYnVpbGRGaWxlTmFtZT0iVGVzdEZvckVjaG8ueG1sIjsgCi0JCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgicHJvcGVydHkudGVzdGluZzIgc2hvdWxkIGhhdmUgYmVlbiBzZXQgYXMgaGV5IiwgImhleSIuZXF1YWxzKEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LnRlc3RpbmcyIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKLQkJcnVuKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJwcm9wZXJ0eS50ZXN0aW5nMyBzaG91bGQgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsICJBbnRUZXN0UHJvcGVydHlWYWx1ZVByb3ZpZGVyIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkudGVzdGluZzMiKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGVhZGxlc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyh0cnVlKTsKLQkJCVN0cmluZyBidWlsZEZpbGVOYW1lPSJUZXN0Rm9yRWNoby54bWwiOyAKLQkJCXJ1bihidWlsZEZpbGVOYW1lKTsKLQkJCWFzc2VydE51bGwoInByb3BlcnR5LmhlYWRsZXNzIHNob3VsZCBub3QgaGF2ZSBiZWVuIHNldCBhcyBBbnRUZXN0UHJvcGVydHlQcm92aWRlciIsIEFudFRlc3RDaGVja2VyLmdldERlZmF1bHQoKS5nZXRVc2VyUHJvcGVydHkoInByb3BlcnR5LmhlYWRsZXNzIikpOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb3RIZWFkbGVzcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGJ1aWxkRmlsZU5hbWU9IlRlc3RGb3JFY2hvLnhtbCI7IAotCQlydW4oYnVpbGRGaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoInByb3BlcnR5LmhlYWRsZXNzIHNob3VsZCBoYXZlIGJlZW4gc2V0IGFzIEFudFRlc3RQcm9wZXJ0eVByb3ZpZGVyIiwgImhlYWRsZXNzIi5lcXVhbHMoQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldFVzZXJQcm9wZXJ0eSgicHJvcGVydHkuaGVhZGxlc3MiKSkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1RhcmdldFRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFyZ2V0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkZjcyYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUvdGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL2NvcmUvdGVzdHMvVGFyZ2V0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXJnZXRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBUYXJnZXRUZXN0cyBleHRlbmRzIEFic3RyYWN0QW50VGVzdCB7Ci0JCi0JcHVibGljIFRhcmdldFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYSBkZWZhdWx0IHRhcmdldCBpcyBmb3VuZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gdGFyZ2V0cz0gZ2V0VGFyZ2V0cygiVGVzdEZvckVjaG8ueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0d28gdGFyZ2V0cyBpbiBUZXN0Rm9yRWNoby54bWwiLCB0YXJnZXRzLmxlbmd0aCA9PSAyKTsKLQkJYXNzZXJ0VHJ1ZSgiVGVzdCBmb3IgRWNobyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdGFyZ2V0IiwgdGFyZ2V0c1sxXS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXRzIGFyZSBmb3VuZCBpbiBhIGJ1aWxkIGZpbGUgd2l0aCBkYXRhIHR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldHNXaXRoRGF0YVR5cGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlUYXJnZXRJbmZvW10gdGFyZ2V0cz0gZ2V0VGFyZ2V0cygiQnVnMzI1NTEueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBvbmUgdGFyZ2V0cyBpbiBCdWczMjU1MS54bWwiLCB0YXJnZXRzLmxlbmd0aCA9PSAxKTsKLQl9Ci0JCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IHRhcmdldHMgYXJlIGZvdW5kIGluIGEgYnVpbGRmaWxlIHdpdGggYSBmaWxlc2V0IGJhc2VkIG9uIGFudF9ob21lCi0JICogKHRoYXQgYW50X2hvbWUgaXMgc2V0IGF0IHBhcnNlIHRpbWUpCi0JICogQnVnIDQyOTI2LgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRzV2l0aEFudEhvbWUoKSB7Ci0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKCJhbnQuaG9tZSIpOwotCQl0cnkgewotCQkJZ2V0VGFyZ2V0cygiQnVnNDI5MjYueG1sIik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vY2xhc3NwYXRocmVmIHdhcyBzdWNjZXNzZnVsIGJ1dCB0aGUgdGFzayBpcyBub3QgZGVmaW5lZAotCQkJY2UuZ2V0TWVzc2FnZSgpLmVxdWFscygiZmlsZTpjOi9ydW50aW1lLXRlc3Qtd29ya3NwYWNlL0FudFRlc3RzL2J1aWxkZmlsZXMvQnVnNDI5MjYueG1sOjc6IHRhc2tkZWYgY2xhc3MgY29tLmZvby5Tb21lVGFzayBjYW5ub3QgYmUgZm91bmQiKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0IG5hbWVzIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0TmFtZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIHRhcmdldE5hbWVzPSBnZXRUYXJnZXROYW1lcygiVGVzdEZvckVjaG8ueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0d28gdGFyZ2V0cyBpbiBUZXN0Rm9yRWNoby54bWwiLCB0YXJnZXROYW1lcy5sZW5ndGggPT0gMik7Ci0JCWFzc2VydFRydWUoIkZpcnN0IG5hbWUgc2hvdWxkIGJlIGluaXQiLCB0YXJnZXROYW1lc1swXS5lcXVhbHMoImluaXQiKSk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCBuYW1lIHNob3VsZCBiZSBUZXN0IGZvciBFY2hvIiwgdGFyZ2V0TmFtZXNbMV0uZXF1YWxzKCJUZXN0IGZvciBFY2hvIikpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0IGRlc2NyaXB0aW9ucyBhcmUgcmV0cmlldmVkIHByb3Blcmx5Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdbXSB0YXJnZXREZXNjcmlwdGlvbnM9IGdldFRhcmdldERlc2NyaXB0aW9ucygiVGVzdEZvckVjaG8ueG1sIik7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSB0d28gdGFyZ2V0cyBpbiBUZXN0Rm9yRWNoby54bWwiLCB0YXJnZXREZXNjcmlwdGlvbnMubGVuZ3RoID09IDIpOwotCQlhc3NlcnROdWxsKCJGaXJzdCBkZXNjcmlwdGlvbiBzaG91bGQgYmUgbnVsbCIsIHRhcmdldERlc2NyaXB0aW9uc1swXSk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCBkZXNjcmlwdGlvbiBzaG91bGQgYmUgQ2FsbHMgb3RoZXIgdGFyZ2V0cyIsIHRhcmdldERlc2NyaXB0aW9uc1sxXS5lcXVhbHMoIkNhbGxzIG90aGVyIGVjaG9zIikpOwotCX0KLQkKLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgdGFyZ2V0IHByb2plY3RzIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0UHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRhcmdldFByb2plY3Q9IGdldFByb2plY3ROYW1lKCJUZXN0Rm9yRWNoby54bWwiLCAiVGVzdCBmb3IgRWNobyIpOwotCQlhc3NlcnRUcnVlKCJQcm9qZWN0IG5hbWUgc2hvdWxkIGJlIEVjaG8gVGVzdCIsICJFY2hvIFRlc3QiLmVxdWFscyh0YXJnZXRQcm9qZWN0KSk7Ci0JfQotCQotCS8qKgotCSAqIEVuc3VyZXMgdGhhdCB0YXJnZXQgZGVwZW5kZW5jaWVzIGFyZSByZXRyaWV2ZWQgcHJvcGVybHkKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RGVwZW5kZW5jaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmdbXSBkZXBlbmRlbmNpZXM9IGdldERlcGVuZGVuY2llcygiVGVzdEZvckVjaG8ueG1sIiwgIlRlc3QgZm9yIEVjaG8iKTsKLQkJYXNzZXJ0Tm90TnVsbCgiRGVwZW5kZW5jaWVzIHNob3VsZCBub3QgYmUgbnVsbCIsIGRlcGVuZGVuY2llcyk7Ci0JCWFzc2VydFRydWUoIlNob3VsZCBiZSBvbmUgZGVwZW5kZW5jeSBpbiBUZXN0IGZvciBFY2hvIiwgZGVwZW5kZW5jaWVzLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgZGVwZW5kZW5jeSBzaG91bGQgYmUgaW5pdCIsICJpbml0Ii5lcXVhbHMoZGVwZW5kZW5jaWVzWzBdKSk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgYW4gQW50IGJ1aWxkIGFuZCBlbnN1cmUgdGhhdCB0aGUgYnVpbGQgZmlsZSBsb2NhdGlvbiBpcyBsb2dnZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UnVuU2NyaXB0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIlRlc3RGb3JFY2hvLnhtbCIpOwotCQlTdHJpbmcgbWVzc2FnZT0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMCk7Ci0JCWFzc2VydFRydWUoIkJ1aWxkIGZpbGUgbG9jYXRpb24gc2hvdWxkIGJlIGxvZ2dlZCBhcyB0aGUgZmlyc3QgbWVzc2FnZSIsIG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmVuZHNXaXRoKCJBbnRUZXN0cyIgKyBGaWxlLnNlcGFyYXRvciArICJidWlsZGZpbGVzIiArIEZpbGUuc2VwYXJhdG9yICsgIlRlc3RGb3JFY2hvLnhtbCIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1Rhc2tUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ5Y2ZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UYXNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLklBbnRDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuY29yZS5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC5jb3JlLkFudENsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLkFic3RyYWN0QW50VGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS50ZXN0cGx1Z2luLkFudFRlc3RDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGFza1Rlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRUZXN0IHsKLQotCQotCXB1YmxpYyBUYXNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RpbmcgdGhlIG9sZCBkZXByZWNhdGVkIEFQSQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYXNrU2V0dGluZ0xpYnJhcnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlVUkxbXSB1cmxzPSBwcmVmcy5nZXRFeHRyYUNsYXNzcGF0aFVSTHMoKTsKLQkJVGFzayBuZXdUYXNrPSBuZXcgVGFzaygpOwotCQluZXdUYXNrLnNldExpYnJhcnkodXJsc1swXSk7Ci0JCW5ld1Rhc2suc2V0VGFza05hbWUoIkFudFRlc3RUYXNrIik7Ci0JCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nWzBdLCBmYWxzZSk7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKSk7Ci0JCWFzc2VydFN1Y2Nlc3NmdWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhc2tTZXR0aW5nTGlicmFyeUVudHJ5KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJVVJMW10gdXJscz0gcHJlZnMuZ2V0RXh0cmFDbGFzc3BhdGhVUkxzKCk7Ci0JCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJbmV3VGFzay5zZXRMaWJyYXJ5RW50cnkobmV3IEFudENsYXNzcGF0aEVudHJ5KHVybHNbMF0pKTsKLQkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2syIik7Ci0JCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIik7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117bmV3VGFza30pOwotCQkKLQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCXJ1bigiQ3VzdG9tVGFzay54bWwiLCBuZXcgU3RyaW5nW10geyJDdXN0b20gVGFzayBmcm9tIEVudHJ5In0sIGZhbHNlKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFzaygpIHsKLQkJQW50Q29yZVByZWZlcmVuY2VzIHByZWZzID1BbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLmdldFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldEN1c3RvbVRhc2tzKG5ldyBUYXNrW117fSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkN1c3RvbVRhc2sueG1sIik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWFzc2VydFRydWUoIkV4Y2VwdGlvbiBmcm9tIHVuZGVmaW5lZCB0YXNrIGlzIGluY29ycmVjdCIsIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiYXMgdGhpcyBpcyBub3QgYW4gQW50IGJ1Zy4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7CQotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0YXNrIG5vIGxvbmdlciBkZWZpbmVkIiwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFza0Zyb21Gb2xkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJCVRhc2sgbmV3VGFzaz0gbmV3IFRhc2soKTsKLQkJCVN0cmluZyBwYXRoPSBnZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsaWIiKS5nZXRGaWxlKCJ0YXNrRm9sZGVyIikuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCUlBbnRDbGFzc3BhdGhFbnRyeSBlbnRyeT0gbmV3IEFudENsYXNzcGF0aEVudHJ5KHBhdGggKyBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQkJSUFudENsYXNzcGF0aEVudHJ5IGVudHJpZXNbXSA9IHByZWZzLmdldEFkZGl0aW9uYWxDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQlJQW50Q2xhc3NwYXRoRW50cnkgbmV3RW50cmllc1tdID0gbmV3IElBbnRDbGFzc3BhdGhFbnRyeVtlbnRyaWVzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShlbnRyaWVzLCAwLCBuZXdFbnRyaWVzLCAwLCBlbnRyaWVzLmxlbmd0aCk7Ci0JCQluZXdFbnRyaWVzW2VudHJpZXMubGVuZ3RoXSA9IGVudHJ5OwotCQkJcHJlZnMuc2V0QWRkaXRpb25hbENsYXNzcGF0aEVudHJpZXMobmV3RW50cmllcyk7Ci0JCQotCQkJbmV3VGFzay5zZXRMaWJyYXJ5RW50cnkoZW50cnkpOwotCQkJbmV3VGFzay5zZXRUYXNrTmFtZSgiQW50VGVzdFRhc2siKTsKLQkJCW5ld1Rhc2suc2V0Q2xhc3NOYW1lKCJvcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrMiIpOwotCQkJcHJlZnMuc2V0Q3VzdG9tVGFza3MobmV3IFRhc2tbXXtuZXdUYXNrfSk7Ci0JCQotCQkJcHJlZnMudXBkYXRlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCQlydW4oIkN1c3RvbVRhc2sueG1sIiwgbmV3IFN0cmluZ1swXSwgZmFsc2UpOwotCQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKSk7Ci0JCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RUYXNrc0RlZmluZWRJblByb3BlcnR5RmlsZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQkJUHJvcGVydHkgbmV3UHJvcD0gbmV3IFByb3BlcnR5KCJST09URElSIiwgIi4uLy9yZXNvdXJjZXMiKTsKLQkJCXByZWZzLnNldEN1c3RvbVByb3BlcnRpZXMobmV3IFByb3BlcnR5W117bmV3UHJvcH0pOwotCQkJcnVuKCJCdWczNDY2My54bWwiKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3RvcmVQcmVmZXJlbmNlRGVmYXVsdHMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFza0RlZmluZWRJbkV4dGVuc2lvblBvaW50KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlydW4oIkV4dGVuc2lvblBvaW50VGFzay54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzayIpKTsKLQkJYXNzZXJ0U3VjY2Vzc2Z1bCgpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFRhc2tEZWZpbmVkSW5FeHRlbnNpb25Qb2ludEhlYWRsZXNzKCkgewotCQlBbnRDb3JlUGx1Z2luLmdldFBsdWdpbigpLnNldFJ1bm5pbmdIZWFkbGVzcyh0cnVlKTsKLQkJdHJ5IHsKLQkJCXJ1bigiRXh0ZW5zaW9uUG9pbnRUYXNrLnhtbCIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlhc3NlcnRUcnVlKCJFeGNlcHRpb24gZnJvbSB1bmRlZmluZWQgdGFzayBpcyBpbmNvcnJlY3QiLCBjZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoImFzIHRoaXMgaXMgbm90IGFuIEFudCBidWcuIikpOwotCQkJcmV0dXJuOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0YXNrIHdhcyBub3QgZGVmaW5lZCB0byBydW4gaW4gaGVhZGxlc3MiLCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1R5cGVUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlL3Rlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy9jb3JlL3Rlc3RzL1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzIxMDJjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMuY29yZS90ZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvY29yZS90ZXN0cy9UeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUudGVzdHM7Ci0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLkFudENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmNvcmUuQW50Q29yZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5jb3JlLlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLmNvcmUuQW50Q2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuQWJzdHJhY3RBbnRUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy5jb3JlLnRlc3RwbHVnaW4uQW50VGVzdENoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUeXBlVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFRlc3QgewotCi0JcHVibGljIFR5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFudENvcmVQcmVmZXJlbmNlcyBwcmVmcyA9QW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5nZXRQcmVmZXJlbmNlcygpOwotCQlVUkxbXSB1cmxzPSBwcmVmcy5nZXRFeHRyYUNsYXNzcGF0aFVSTHMoKTsKLQkJVHlwZSBuZXdUeXBlPSBuZXcgVHlwZSgpOwotCQluZXdUeXBlLnNldExpYnJhcnlFbnRyeShuZXcgQW50Q2xhc3NwYXRoRW50cnkodXJsc1swXSkpOwotCQluZXdUeXBlLnNldFR5cGVOYW1lKCJhbnR0ZXN0cGF0aCIpOwotCQluZXdUeXBlLnNldENsYXNzTmFtZSgib3JnLmVjbGlwc2UuYW50LnRlc3RzLmNvcmUuc3VwcG9ydC50eXBlcy5BbnRUZXN0UGF0aCIpOwotCQlwcmVmcy5zZXRDdXN0b21UeXBlcyhuZXcgVHlwZVtde25ld1R5cGV9KTsKLQkJCi0JCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKLQkJU3RyaW5nIG1zZz0gKFN0cmluZylBbnRUZXN0Q2hlY2tlci5nZXREZWZhdWx0KCkuZ2V0TWVzc2FnZXMoKS5nZXQoMSk7Ci0JCWFzc2VydFRydWUoIk1lc3NhZ2UgaW5jb3JyZWN0OiAiICsgbXNnLCBtc2cuZXF1YWxzKCJUZXN0IGFkZGluZyBhIGN1c3RvbSB0eXBlIikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUeXBlKCkgewotCQlBbnRDb3JlUHJlZmVyZW5jZXMgcHJlZnMgPUFudENvcmVQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0UHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0Q3VzdG9tVHlwZXMobmV3IFR5cGVbXXt9KTsKLQkJdHJ5IHsKLQkJCXJ1bigiQ3VzdG9tVHlwZS54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHR5cGUgaXMgaW5jb3JyZWN0OiAiKyBjZS5nZXRNZXNzYWdlKCksIGNlLmdldE1lc3NhZ2UoKS5lbmRzV2l0aCgiYXMgdGhpcyBpcyBub3QgYW4gQW50IGJ1Zy4iKSk7Ci0JCQlyZXR1cm47Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN0b3JlUHJlZmVyZW5jZURlZmF1bHRzKCk7CQotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0eXBlIG5vIGxvbmdlciBkZWZpbmVkIiwgZmFsc2UpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGVEZWZpbmVkSW5FeHRlbnNpb25Qb2ludCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcnVuKCJFeHRlbnNpb25Qb2ludFR5cGUueG1sIik7Ci0JCVN0cmluZyBtc2c9IChTdHJpbmcpQW50VGVzdENoZWNrZXIuZ2V0RGVmYXVsdCgpLmdldE1lc3NhZ2VzKCkuZ2V0KDEpOwotCQlhc3NlcnRUcnVlKCJNZXNzYWdlIGluY29ycmVjdDogIiArIG1zZywgbXNnLmVxdWFscygiRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSBpcyBwcmVzZW50IikpOwotCQlhc3NlcnRTdWNjZXNzZnVsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlRGVmaW5lZEluRXh0ZW5zaW9uUG9pbnRIZWFkbGVzcygpIHsKLQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3ModHJ1ZSk7Ci0JCXRyeSB7Ci0JCQlydW4oIkV4dGVuc2lvblBvaW50VHlwZS54bWwiKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJYXNzZXJ0VHJ1ZSgiRXhjZXB0aW9uIGZyb20gdW5kZWZpbmVkIHR5cGUgaXMgaW5jb3JyZWN0OiAiICsgY2UuZ2V0TWVzc2FnZSgpLCBjZS5nZXRNZXNzYWdlKCkuZW5kc1dpdGgoImFzIHRoaXMgaXMgbm90IGFuIEFudCBidWcuIikpOwotCQkJcmV0dXJuOwotCQl9IGZpbmFsbHkgewotCQkJQW50Q29yZVBsdWdpbi5nZXRQbHVnaW4oKS5zZXRSdW5uaW5nSGVhZGxlc3MoZmFsc2UpOwotCQl9Ci0JCWFzc2VydFRydWUoIkJ1aWxkIHNob3VsZCBoYXZlIGZhaWxlZCBhcyB0eXBlIHdhcyBub3QgZGVmaW5lZCB0byBydW4gaW4gaGVhZGxlc3MiLCBmYWxzZSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTNiMDRjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBFZGl0b3IgVGVzdHMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJ0ZXN0IHBsdWdpbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkFudCBUZXN0cyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9IkV4dGVybmFsIFRvb2xzIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IG91dHB1dD0idGVzdF9zdXBwb3J0X2JpbiIga2luZD0ic3JjIiBwYXRoPSJ0ZXN0IHN1cHBvcnQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY3ZzaWdub3JlIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTNiMGYwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi10ZXN0X3N1cHBvcnRfYmluCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBUZXN0IFN1cHBvcnQgSkFSLmxhdW5jaCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFRlc3QgU3VwcG9ydCBKQVIubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGI2MzVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFRlc3QgU3VwcG9ydCBKQVIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5ERUZBVUxUX0NMQVNTUEFUSCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERfU0NPUEUiIHZhbHVlPSIke3dvcmtpbmdfc2V0OiZsdDs/eG1sIHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVuY29kaW5nPSZxdW90O1VURi04JnF1b3Q7PyZndDsmIzEwOyZsdDtsYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ1NldCBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuV29ya2luZ1NldEZhY3RvcnkmcXVvdDsgbmFtZT0mcXVvdDt3b3JraW5nU2V0JnF1b3Q7IGVkaXRQYWdlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkucmVzb3VyY2VXb3JraW5nU2V0UGFnZSZxdW90OyZndDsmIzEwOyZsdDtpdGVtIGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5tb2RlbC5SZXNvdXJjZUZhY3RvcnkmcXVvdDsgcGF0aD0mcXVvdDsvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sJnF1b3Q7IHR5cGU9JnF1b3Q7MSZxdW90Oy8mZ3Q7JiMxMDsmbHQ7aXRlbSBmYWN0b3J5SUQ9JnF1b3Q7b3JnLmVjbGlwc2UudWkuaW50ZXJuYWwubW9kZWwuUmVzb3VyY2VGYWN0b3J5JnF1b3Q7IHBhdGg9JnF1b3Q7L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQmcXVvdDsgdHlwZT0mcXVvdDsyJnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsYXV0bywiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkFUVFJfUkVGUkVTSF9TQ09QRSIgdmFsdWU9IiR7d29ya2luZ19zZXQ6Jmx0Oz94bWwgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsgZW5jb2Rpbmc9JnF1b3Q7VVRGLTgmcXVvdDs/Jmd0OyYjMTA7Jmx0O2xhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nU2V0IGZhY3RvcnlJRD0mcXVvdDtvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5Xb3JraW5nU2V0RmFjdG9yeSZxdW90OyBuYW1lPSZxdW90O3dvcmtpbmdTZXQmcXVvdDsgZWRpdFBhZ2VJZD0mcXVvdDtvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVdvcmtpbmdTZXRQYWdlJnF1b3Q7Jmd0OyYjMTA7Jmx0O2l0ZW0gZmFjdG9yeUlEPSZxdW90O29yZy5lY2xpcHNlLnVpLmludGVybmFsLm1vZGVsLlJlc291cmNlRmFjdG9yeSZxdW90OyBwYXRoPSZxdW90Oy9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkmcXVvdDsgdHlwZT0mcXVvdDs0JnF1b3Q7LyZndDsmIzEwOyZsdDsvbGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdTZXQmZ3Q7JiMxMDt9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX0xPQ0FUSU9OIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jOi9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5DTEFTU1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWM4NTMwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5hbnQudGVzdHMudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkV4dGVybmFsVG9vbEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJCTxkaWN0aW9uYXJ5PgotCQkJCQk8a2V5PkxhdW5jaENvbmZpZ0hhbmRsZTwva2V5PgotCQkJCQk8dmFsdWU+QnVpbGQgVGVzdCBTdXBwb3J0IEpBUi5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY2NTRjZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1RodSBNYXkgMjcgMTQ6NDg6MzggUERUIDIwMDQNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLXNlbGZob3N0aW5nLmJpbkV4Y2x1ZGVzPS9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdF9zdXBwb3J0X2Jpbg0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZHRkL2R1bXBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kdGQvZHVtcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZGM0ODYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9kdGQvZHVtcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBPYmplY3QgRmFjdG9yeSBJbmMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT2JqZWN0IEZhY3RvcnkgSW5jLiAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5kdGQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklEZm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5JRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZHRkLklTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmR0ZC5QYXJzZUVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5kdGQuUGFyc2VyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGhlbmNlIHRoZQotICogdW5jYXBpdGFsaXplZCBjbGFzcyBuYW1lKS4KLSAqIEBhdXRob3IgQm9iIEZvc3RlcgotICovCi1wdWJsaWMgY2xhc3MgZHVtcGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IG1haW4oU3RyaW5nW10gYXJncykgewotCi0JCWlmIChhcmdzLmxlbmd0aCA8PSAwKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIERURE1lcmdlciBVUkwiKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCVN0cmluZyBkb2N1bWVudCA9IGFyZ3NbMF07Ci0KLQkJUGFyc2VyIHBhcnNlciA9IG5ldyBQYXJzZXIoKTsKLQkJCi0JCUlTY2hlbWEgc2NoZW1hOwotCQl0cnkgewotCQkJc2NoZW1hID0gcGFyc2VyLnBhcnNlKGRvY3VtZW50KTsKLQkJfSBjYXRjaCAoUGFyc2VFcnJvciBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiAxOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEVEQgc3VjY2Vzc2Z1bGx5IHBhcnNlZCIpOwotCQlkdW1wU2NoZW1hKHNjaGVtYSk7Ci0JCXJldHVybiAwOwotCX0KLQkKLQkvKioKLQkgKiBXcml0ZSBzY2hlbWEgY29udGVudHMgdG8gc3RhbmRhcmQgb3V0cHV0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcFNjaGVtYShJU2NoZW1hIHNjaGVtYSkgewotCQlJRWxlbWVudFtdIGVsZW1lbnRzID0gc2NoZW1hLmdldEVsZW1lbnRzKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiIitlbGVtZW50cy5sZW5ndGgrIiBlbGVtZW50cyBkZWZpbmVkIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCUlFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCUlNb2RlbCBtb2RlbCA9IGVsZW1lbnQuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVMRU1FTlQgIitlbGVtZW50LmdldE5hbWUoKQotCQkJCSsnIicrbW9kZWwuc3RyaW5nUmVwKCkrJyInKTsKLQkJCWR1bXBEZm0oZWxlbWVudC5nZXREZm0oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEdW1wIGRmbSBhcyBhIHNlcmllcyBvZiBzdGF0ZXMuCi0JICogPHByZT4KLQkgKiBTMCAgYT0+UzEgYj0+UzIgCi0JICogUzEgIGM9PlMyCi0JICogUzIqIGQ9PlMyCi0JICogPC9wcmU+Ci0JICogV2hlcmUgKiBpbmRpY2F0ZXMgYWNjZXB0aW5nIHN0YXRlLgotCSAqIEBwYXJhbSBkZm0gdG8gZHVtcAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZHVtcERmbShJRGZtIGRmbSkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWR1bXBEZm0oZGZtLCBtYXAsIDApOwotCQlMaW5rZWRMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCWxpc3QuYWRkKG5ldyBTdGF0ZSgoSURmbSllbnRyeS5nZXRLZXkoKSwgKEludGVnZXIpZW50cnkuZ2V0VmFsdWUoKSkpOwotCQl9Ci0JCVN0YXRlW10gc3RhdGVzID0gKFN0YXRlW10pIGxpc3QudG9BcnJheShuZXcgU3RhdGVbbGlzdC5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoc3RhdGVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXByaW50KHN0YXRlc1tpXSwgbWFwKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnQoU3RhdGUgc3RhdGUsIEhhc2hNYXAgbWFwKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQoIiAgUyIrc3RhdGUubi5pbnRWYWx1ZSgpCi0JCQkrKHN0YXRlLmRmbS5pc0FjY2VwdGluZygpID8gIiogICIgOiAiICAiKSk7Ci0JCVN0cmluZ1tdIGFjY2VwdHMgPSBzdGF0ZS5kZm0uZ2V0QWNjZXB0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhY2NlcHQgPSBhY2NlcHRzW2ldOwotCQkJSURmbSBuZXh0ID0gc3RhdGUuZGZtLmFkdmFuY2UoYWNjZXB0KTsKLQkJCWludCBuID0gKChJbnRlZ2VyKW1hcC5nZXQobmV4dCkpLmludFZhbHVlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIgIithY2NlcHQrIj0+UyIrbik7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBkdW1wRGZtKElEZm0gZGZtLCBIYXNoTWFwIG1hcCwgaW50IG51bSkgewotCQlpZiAoIW1hcC5jb250YWluc0tleShkZm0pKSB7Ci0JCQltYXAucHV0KGRmbSwgbmV3IEludGVnZXIobnVtKyspKTsKLQkJCVN0cmluZ1tdIGFjY2VwdHMgPSBkZm0uZ2V0QWNjZXB0cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURmbSBuZXh0ID0gZGZtLmFkdmFuY2UoYWNjZXB0c1tpXSk7Ci0JCQkJbnVtID0gZHVtcERmbShuZXh0LCBtYXAsIG51bSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKLQkJcHVibGljIElEZm0gZGZtOwotCQlwdWJsaWMgSW50ZWdlciBuOwotCQlwdWJsaWMgU3RhdGUoSURmbSBkZm0sIEludGVnZXIgbikgewotCQkJdGhpcy5kZm0gPSBkZm07Ci0JCQl0aGlzLm4gPSBuOwotCQl9Ci0JCS8qKgotCQkgKiBAc2VlIGphdmEubGFuZy5Db21wYXJhYmxlI2NvbXBhcmVUbyhqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCVN0YXRlIG90aGVyID0gKFN0YXRlKSBvOwotCQkJcmV0dXJuIG4uaW50VmFsdWUoKSA8IG90aGVyLm4uaW50VmFsdWUoKQotCQkJCT8gLTEgCi0JCQkJOiAobi5pbnRWYWx1ZSgpID09IG90aGVyLm4uaW50VmFsdWUoKSAKLQkJCQkJPyAwIAotCQkJCQk6IDEpOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9BbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9BbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTE0ZDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvQW50RWRpdG9yQ29udGVudE91dGxpbmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nCi0gKiB1bmQgSW5mb3JtYXRpay1UZWNobm9sb2dpZW4gbWJILCAKLSAqIEJlcmxpbiwgRHVlc3NlbGRvcmYsIEZyYW5rZnVydCAoR2VybWFueSkgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqIAkgICBJQk0gQ29ycG9yYXRpb24gLSBhZGRpdGlvbmFsIHRlc3RzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkFudE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IubW9kZWwuQW50RWxlbWVudE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgY29ycmVjdCBjcmVhdGlvbiBvZiB0aGUgb3V0bGluZSBmb3IgYW4geG1sIGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0gICAgCi0gICAgcHVibGljIEFudEVkaXRvckNvbnRlbnRPdXRsaW5lVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNyZWF0aW9uIG9mIHRoZSBBbnRFbGVtZW50Tm9kZSwgdGhhdCBpbmNsdWRlcyBwYXJzaW5nIGEgZmlsZQotICAgICAqIGFuZCBkZXRlcm1pbmluZyB0aGUgY29ycmVjdCBsb2NhdGlvbiBvZiB0aGUgdGFncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25PZk91dGxpbmVUcmVlKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJQW50TW9kZWwgbW9kZWw9IGdldEFudE1vZGVsKCJidWlsZHRlc3QxLnhtbCIpOwotICAgICAgICAKLQkJQW50RWxlbWVudE5vZGVbXSByb290cyA9IG1vZGVsLmdldFJvb3RFbGVtZW50cygpOwotCQlhc3NlcnROb3ROdWxsKHJvb3RzKTsKLQkJQW50RWxlbWVudE5vZGUgcm9vdFByb2plY3Q9IHJvb3RzWzBdOwotICAgICAgIAotICAgICAgICBhc3NlcnROb3ROdWxsKHJvb3RQcm9qZWN0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIEdldCB0aGUgY29udGVudCBhcyBzdHJpbmcKLSAgICAgICAgU3RyaW5nIHdob2xlRG9jdW1lbnRTdHJpbmcgPSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIDxwcm9qZWN0PgotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZ2V0U3RhcnRpbmdSb3cocm9vdFByb2plY3QpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGdldFN0YXJ0aW5nQ29sdW1uKHJvb3RQcm9qZWN0KSk7Ci0gICAgICAgIGludCBvZmZzZXQgPSB3aG9sZURvY3VtZW50U3RyaW5nLmluZGV4T2YoInByb2plY3QiKTsKLQkgICAgYXNzZXJ0RXF1YWxzKG9mZnNldCwgcm9vdFByb2plY3QuZ2V0T2Zmc2V0KCkpOwotICAgICAgICAKLSAgICAgICAgTGlzdCBjaGlsZHJlbiA9IHJvb3RQcm9qZWN0LmdldENoaWxkTm9kZXMoKTsKLQkJCi0JCS8vIDxwcm9wZXJ0eSBuYW1lPSJwcm9wRCI+Ci0JCUFudEVsZW1lbnROb2RlIGVsZW1lbnQgPSAoQW50RWxlbWVudE5vZGUpY2hpbGRyZW4uZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0U3RhcnRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOyAvLyB3aXRoIHRhYiBpbiBmaWxlCi0JCWFzc2VydEVxdWFscygzLCBnZXRFbmRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoMzksIGdldEVuZGluZ0NvbHVtbihlbGVtZW50KSk7ICAvLyB3aXRoIHRhYiBpbiBmaWxlCi0KLSAgICAgICAgb2Zmc2V0ID0gd2hvbGVEb2N1bWVudFN0cmluZy5pbmRleE9mKCJwcm9wZXJ0eSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCBlbGVtZW50LmdldE9mZnNldCgpKTsKLSAgICAgICAgaW50IGxlbmd0aCA9ICI8cHJvcGVydHkgbmFtZT1cInByb3BEXCIgdmFsdWU9XCJ2YWxEXCIgLz4iLmxlbmd0aCgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGVuZ3RoLSAxLCBlbGVtZW50LmdldExlbmd0aCgpKTsgLy93ZSBkbyBub3QgaW5jbHVkZSB0aGUgZmlyc3QgJzwnCi0JCQotCQkvLyA8cHJvcGVydHkgZmlsZT0iYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIj4KLQkJZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSljaGlsZHJlbi5nZXQoMSk7Ci0JCWFzc2VydEVxdWFscyg0LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscyg2LCBnZXRTdGFydGluZ0NvbHVtbihlbGVtZW50KSk7IC8vIG5vIHRhYgotCQlhc3NlcnRFcXVhbHMoNCwgZ2V0RW5kaW5nUm93KGVsZW1lbnQpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ1LCBnZXRFbmRpbmdDb2x1bW4oZWxlbWVudCkpOwotCi0JCS8vIDxwcm9wZXJ0eSBuYW1lPSJwcm9wViI+Ci0JCWVsZW1lbnQgPSAoQW50RWxlbWVudE5vZGUpY2hpbGRyZW4uZ2V0KDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgZ2V0U3RhcnRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZ2V0RW5kaW5nUm93KGVsZW1lbnQpKTsKLQkJYXNzZXJ0RXF1YWxzKDQyLCBnZXRFbmRpbmdDb2x1bW4oZWxlbWVudCkpOwotCQkKLQkJLy8gPHRhcmdldCBuYW1lPSJtYWluIj4KLQkJZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSljaGlsZHJlbi5nZXQoMyk7Ci0JCWFzc2VydEVxdWFscyg2LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscyg2LCBnZXRTdGFydGluZ0NvbHVtbihlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscyg5LCBnZXRFbmRpbmdSb3coZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoMTMsIGdldEVuZGluZ0NvbHVtbihlbGVtZW50KSk7Ci0JCQotCQkvLyA8cHJvcGVydHkgbmFtZT0icHJvcGVydHlfaW5fdGFyZ2V0Ij4KLQkJZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSllbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyg3LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscygxMCwgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZ2V0RW5kaW5nUm93KGVsZW1lbnQpKTsKLQkJYXNzZXJ0RXF1YWxzKDU3LCBnZXRFbmRpbmdDb2x1bW4oZWxlbWVudCkpOwotICAgICAgICBvZmZzZXQgPSB3aG9sZURvY3VtZW50U3RyaW5nLmluZGV4T2YoInByb3BlcnR5IG5hbWU9XCJwcm9wZXJ0eV9pbl90YXJnZXRcIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCBlbGVtZW50LmdldE9mZnNldCgpKTsKLQkJCi0gICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0RW5kaW5nUm93KHJvb3RQcm9qZWN0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxMCwgZ2V0RW5kaW5nQ29sdW1uKHJvb3RQcm9qZWN0KSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldENvbHVtbihpbnQgb2Zmc2V0LCBpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJcmV0dXJuIG9mZnNldCAtIGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZSAtIDEpICsgMTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3RhcnRpbmdSb3coQW50RWxlbWVudE5vZGUgZWxlbWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJcmV0dXJuIGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChlbGVtZW50LmdldE9mZnNldCgpKSArIDE7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IGdldEVuZGluZ1JvdyhBbnRFbGVtZW50Tm9kZSBlbGVtZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgIAlyZXR1cm4gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mT2Zmc2V0KGVsZW1lbnQuZ2V0T2Zmc2V0KCkgKyBlbGVtZW50LmdldExlbmd0aCgpIC0gMSkgKyAxOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRTdGFydGluZ0NvbHVtbihBbnRFbGVtZW50Tm9kZSBlbGVtZW50KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgIAlyZXR1cm4gZ2V0Q29sdW1uKGVsZW1lbnQuZ2V0T2Zmc2V0KCksIGdldFN0YXJ0aW5nUm93KGVsZW1lbnQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RW5kaW5nQ29sdW1uKEFudEVsZW1lbnROb2RlIGVsZW1lbnQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCXJldHVybiBnZXRDb2x1bW4oZWxlbWVudC5nZXRPZmZzZXQoKSArIGVsZW1lbnQuZ2V0TGVuZ3RoKCkgLSAxLCBnZXRFbmRpbmdSb3coZWxlbWVudCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjcmVhdGlvbiBvZiB0aGUgQW50RWxlbWVudE5vZGUsIHRoYXQgaW5jbHVkZXMgcGFyc2luZyBhIG5vbi12YWxpZCAKLSAgICAgKiBmaWxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzaW5nT2ZOb25WYWxpZEZpbGUoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlBbnRNb2RlbCBtb2RlbD0gZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDIueG1sIik7Ci0gICAgICAgIAotCQlBbnRFbGVtZW50Tm9kZVtdIHJvb3RzID0gbW9kZWwuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwocm9vdHMpOwotCQlBbnRFbGVtZW50Tm9kZSByb290PSByb290c1swXTsKLSAgIAkJYXNzZXJ0Tm90TnVsbChyb290KTsKLQotICAgICAgICBMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0KLQkJLy8gPHRhcmdldCBuYW1lPSJtYWluIj4KLQkJQW50RWxlbWVudE5vZGUgZWxlbWVudCA9IChBbnRFbGVtZW50Tm9kZSljaGlsZHJlbi5nZXQoMik7Ci0JCWFzc2VydEVxdWFscyg1LCBnZXRTdGFydGluZ1JvdyhlbGVtZW50KSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRTdGFydGluZ0NvbHVtbihlbGVtZW50KSk7IC8vIHdpdGggdGFiIGluIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKDUsIGdldEVuZGluZ1JvdyhlbGVtZW50KSk7Ci0JCS8vbWFpbiBoYXMgbm8gZW5kaW5nIGNvbHVtbiBhcyB0aGUgZWxlbWVudCBpcyBub3QgY2xvc2VkCi0gICAgICAgIGludCBvZmZzZXQgPSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoKS5pbmRleE9mKCJ0YXJnZXQgbmFtZT1cIm1haW5cIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCBlbGVtZW50LmdldE9mZnNldCgpKTsgCi0gICAgfQotCi0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgb3V0bGluZSBjYW4gaGFuZGxlIGEgYnVpbGQgZmlsZSB3aXRoIG9ubHkgdGhlIDxwcm9qZWN0PjwvcHJvamVjdD4gdGFncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2l0aFByb2plY3RPbmx5QnVpbGRGaWxlKCkgewotCQlBbnRNb2RlbCBtb2RlbD0gZ2V0QW50TW9kZWwoInByb2plY3RPbmx5LnhtbCIpOwotCQlBbnRFbGVtZW50Tm9kZVtdIHJvb3RzID0gbW9kZWwuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JCWFzc2VydE5vdE51bGwocm9vdHMpOwotCQlBbnRFbGVtZW50Tm9kZSByb290PSByb290c1swXTsKLQkJYXNzZXJ0Tm90TnVsbChyb290KTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGUgb3V0bGluZSBjYW4gaGFuZGxlIGFuIGVtcHR5IGJ1aWxkIGZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdpdGhFbXB0eUJ1aWxkRmlsZSgpIHsKLQkJQW50TW9kZWwgbW9kZWw9IGdldEFudE1vZGVsKCJlbXB0eS54bWwiKTsKLQkJQW50RWxlbWVudE5vZGVbXSByb290cyA9IG1vZGVsLmdldFJvb3RFbGVtZW50cygpOwotCQlhc3NlcnROb3ROdWxsKHJvb3RzKTsKLQkJYXNzZXJ0VHJ1ZShyb290cy5sZW5ndGggPT0gMCk7Ci0JfQkJCi0KLQkvKioKLQkgKiBTb21lIHRlc3Rpbmcgb2YgZ2V0dGluZyB0aGUgcmlnaHQgbG9jYXRpb24gb2YgdGFncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QWR2YW5jZWRUYXNrTG9jYXRpb24oKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlBbnRNb2RlbCBtb2RlbD0gZ2V0QW50TW9kZWwoIm91dGxpbmVfc2VsZWN0X3Rlc3RfYnVpbGQueG1sIik7Ci0gICAgICAgIAotCQlBbnRFbGVtZW50Tm9kZVtdIHJvb3RzID0gbW9kZWwuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwocm9vdHMpOwotICAgICAgICBBbnRFbGVtZW50Tm9kZSByb290UHJvamVjdD0gcm9vdHNbMF07Ci0gICAgICAgIC8vIEdldCB0aGUgY29udGVudCBhcyBzdHJpbmcKLSAgICAgICAgU3RyaW5nIHdob2xlRG9jdW1lbnRTdHJpbmcgPSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIDxwcm9qZWN0PgotICAgICAgICBhc3NlcnROb3ROdWxsKHJvb3RQcm9qZWN0KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGdldFN0YXJ0aW5nUm93KHJvb3RQcm9qZWN0KSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBnZXRTdGFydGluZ0NvbHVtbihyb290UHJvamVjdCkpOwotICAgICAgICBpbnQgb2Zmc2V0ID0gd2hvbGVEb2N1bWVudFN0cmluZy5pbmRleE9mKCJwcm9qZWN0Iik7Ci0gICAgICAgIAotCSAgICBhc3NlcnRFcXVhbHMob2Zmc2V0LCByb290UHJvamVjdC5nZXRPZmZzZXQoKSk7Ci0gICAgICAgIAotCQkvLyA8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICBBbnRFbGVtZW50Tm9kZSBlbGVtZW50ID0gKEFudEVsZW1lbnROb2RlKXJvb3RQcm9qZWN0LmdldENoaWxkTm9kZXMoKS5nZXQoMSk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJvcGVydGllcyIsIGVsZW1lbnQuZ2V0TGFiZWwoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNiwgZ2V0U3RhcnRpbmdSb3coZWxlbWVudCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMywgZ2V0U3RhcnRpbmdDb2x1bW4oZWxlbWVudCkpOwotICAgICAgICBvZmZzZXQgPSB3aG9sZURvY3VtZW50U3RyaW5nLmluZGV4T2YoInRhcmdldCBuYW1lPVwicHJvcGVydGllc1wiIik7Ci0gICAgICAKLQkgICAgYXNzZXJ0RXF1YWxzKG9mZnNldCwgZWxlbWVudC5nZXRPZmZzZXQoKSk7Ci0JfQotCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShBbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmNsYXNzKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvQ29kZUNvbXBsZXRpb25UZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9Db2RlQ29tcGxldGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBiYzRlMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9Db2RlQ29tcGxldGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZwotICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCi0gKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkaXRpb25hbCB0ZXN0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0LlRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5BYnN0cmFjdEFudFVJVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRlc3RzIGV2ZXJ5dGhpbmcgYWJvdXQgY29kZSBjb21wbGV0aW9uIGFuZCBjb2RlIGFzc2lzdGFuY2UuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENvZGVDb21wbGV0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yIGZvciBDb2RlQ29tcGxldGlvblRlc3QuCi0gICAgICogQHBhcmFtIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgQ29kZUNvbXBsZXRpb25UZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKENvZGVDb21wbGV0aW9uVGVzdC5jbGFzcyk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgYXR0cmlidXRlcyBvZiB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlUHJvcG9zYWxzKCkgewotICAgICAgICBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcigpOwotCi0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJjb250YWlucyIsICJjYSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2FzZXNlbnNpdGl2ZSAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIsIHByb3Bvc2Fsc1swXS5nZXREaXNwbGF5U3RyaW5nKCkpOwotCi0gICAgICAgIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRBdHRyaWJ1dGVQcm9wb3NhbHMoIm1vdmUiLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxNiwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nID0gcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJpZCIpIAotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygidGFza25hbWUiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygiZGVzY3JpcHRpb24iKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygiZmlsZSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJwcmVzZXJ2ZWxhc3Rtb2RpZmllZCAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJ0b2ZpbGUiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygidG9kaXIiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygib3ZlcndyaXRlIC0gKHRydWUgfCBmYWxzZSB8IG9uIHwgb2ZmIHwgeWVzIHwgbm8pIikKLSAgICAgICAgfHwgZGlzcGxheVN0cmluZy5lcXVhbHMoImZpbHRlcmluZyAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJmbGF0dGVuIC0gKHRydWUgfCBmYWxzZSB8IG9uIHwgb2ZmIHwgeWVzIHwgbm8pIikKLSAgICAgICAgfHwgZGlzcGxheVN0cmluZy5lcXVhbHMoImluY2x1ZGVlbXB0eWRpcnMiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygiZmFpbG9uZXJyb3IgLSAodHJ1ZSB8IGZhbHNlIHwgb24gfCBvZmYgfCB5ZXMgfCBubykiKQotICAgICAgICB8fCBkaXNwbGF5U3RyaW5nLmVxdWFscygidmVyYm9zZSAtICh0cnVlIHwgZmFsc2UgfCBvbiB8IG9mZiB8IHllcyB8IG5vKSIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJlbmNvZGluZyIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJvdXRwdXRlbmNvZGluZyIpCi0gICAgICAgIHx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJlbmFibGVtdWx0aXBsZW1hcHBpbmcgLSAodHJ1ZSB8IGZhbHNlIHwgb24gfCBvZmYgfCB5ZXMgfCBubykiKSk7Ci0gICAgICAgIAotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJtb3ZlIiwgInRvIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJyZWZlcmVuY2UiLCAiaWRsIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJyZWZlcmVuY2UiLCAiaWQiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoImlkIiwgcHJvcG9zYWxzWzBdLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0KLSAgICAgICAgcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEF0dHJpYnV0ZVByb3Bvc2FscygicmVmZXJlbmNlIiwgImkiKTsKLSAgICAgICAgLy9pZCBpbmNsdWRlc2ZpbGUgaW5jbHVkZXMKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICBkaXNwbGF5U3RyaW5nPSBwcm9wb3NhbHNbMF0uZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICBhc3NlcnRUcnVlKGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJpZCIpIAotICAgICAgICAJCXx8ICBkaXNwbGF5U3RyaW5nLmVxdWFscygiaW5jbHVkZUZpbGUiKQotCQkJCXx8IGRpc3BsYXlTdHJpbmcuZXF1YWxzKCJpbmNsdWRlcyIpKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0QXR0cmlidXRlUHJvcG9zYWxzKCJwcm9qZWN0IiwgImRlIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwcm9wb3NhbHMubGVuZ3RoKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdW5xdW90ZWQgKGJ1ZyA0MDg3MSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgIAlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiYnVpbGR0ZXN0MS54bWwiKSk7Ci0KLSAgICAJaW50IGxpbmVOdW1iZXI9IDc7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDE3OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3BlcnR5UHJvcG9zYWxzKGdldEN1cnJlbnREb2N1bWVudCgpLCAiIiwgbGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA+PSAxKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoInByb3AxIiwgcHJvcG9zYWxzKTsKLSAgICAJCi0gICAgCWxpbmVOdW1iZXI9IDE4OwotICAgIAljb2x1bW5OdW1iZXI9IDI1OwotICAgIAlsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wZXJ0eVByb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIsIGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJwcm9wMiIsIHByb3Bvc2Fscyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgInN5c3RlbSIgcHJvcGVydGllcwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1Qcm9wZXJ0eVByb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJidWlsZHRlc3QxLnhtbCIpKTsKLSAgICAJCi0gICAgCWludCBsaW5lTnVtYmVyPSAxODsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMjU7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0UHJvcGVydHlQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksICIiLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID49IDEpOwotICAgIAlhc3NlcnRDb250YWlucygiamF2YS5ob21lIiwgcHJvcG9zYWxzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdCB0aGUgY29kZSBjb21wbGV0aW9uIGZvciB0aGUgZGVwZW5kIGF0dHJpYnV0ZSBvZiBhIHRhcmdldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RGVwZW5kUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDEueG1sIikpOwotICAgIAkvL3NpbXBsZSBkZXBlbmRzCi0gICAgCWludCBsaW5lTnVtYmVyPSAxMDsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMzQ7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksIGdldEN1cnJlbnREb2N1bWVudCgpLmdldCgwLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKSwgIiIsICJkZXBlbmRzIik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA9PSA3KTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoInByZXRlc3QiLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRDb250YWlucygidGVzdE1vcmVEZXBlbmRzIiwgcHJvcG9zYWxzKTsKLSAgICAJLy9jb21tYSBzZXBhcmF0ZWQgZGVwZW5kcwotICAgIAlsaW5lTnVtYmVyPSAxNzsKLSAgICAJY29sdW1uTnVtYmVyPSA1MzsKLSAgICAJbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksIGdldEN1cnJlbnREb2N1bWVudCgpLmdldCgwLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKSwgIiIsICJkZXBlbmRzIik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA9PSA2KTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoIm1haW4iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnREb2VzTm90Q29udGFpbigicHJldGVzdCIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0IHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIHRoZSBpZiBhdHRyaWJ1dGUgb2YgYSB0YXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhcmdldElmUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDEueG1sIikpOwotCi0gICAgCWludCBsaW5lTnVtYmVyPSAxNTsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMzE7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFyZ2V0QXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksIGdldEN1cnJlbnREb2N1bWVudCgpLmdldCgwLCBsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKSwgIiIsICJpZiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJwcm9wMSIsIHByb3Bvc2Fscyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3QgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGhlIHVubGVzcyBhdHRyaWJ1dGUgb2YgYSB0YXJnZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhcmdldFVubGVzc1Byb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJidWlsZHRlc3QxLnhtbCIpKTsKLQotICAgIAlpbnQgbGluZU51bWJlcj0gMTY7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDQzOwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGdldEN1cnJlbnREb2N1bWVudCgpLCBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXQoMCwgbGluZU9mZnNldCArIGNvbHVtbk51bWJlciksICJwcm9wIiwgInVubGVzcyIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPj0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJwcm9wMSIsIHByb3Bvc2Fscyk7Ci0KLSAgICB9Ci0gICAgCi0gCS8qKgotIAkgKiBBc3NlcnRzIHRoYXQgPGNvZGU+ZGlzcGxheVN0cmluZzwvY29kZT4gaXMgaW4gb25lIG9mIHRoZSAKLSAJICogY29tcGxldGlvbiBwcm9wb3NhbHMuCi0gCSAqLwotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRDb250YWlucyhTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FsQXJyYXkpIHsKLSAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2FsQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbEFycmF5W2ldOwotICAgICAgICAgICAgU3RyaW5nIHByb3Bvc2FsRGlzcGxheVN0cmluZyA9IHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLSAgICAgICAgICAgIGlmKGRpc3BsYXlTdHJpbmcuZXF1YWxzKHByb3Bvc2FsRGlzcGxheVN0cmluZykpIHsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIGZvdW5kKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICAvKioKLSAJICogQXNzZXJ0cyB0aGF0IDxjb2RlPmRpc3BsYXlTdHJpbmc8L2NvZGU+IGlzIG5vdCBpbiBvbmUgb2YgdGhlIAotIAkgKiBjb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAJICovCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydERvZXNOb3RDb250YWluKFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxBcnJheSkgewotICAgICAgICBib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHByb3Bvc2FsQXJyYXlbaV07Ci0gICAgICAgICAgICBTdHJpbmcgcHJvcG9zYWxEaXNwbGF5U3RyaW5nID0gcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICAgICAgaWYoZGlzcGxheVN0cmluZy5lcXVhbHMocHJvcG9zYWxEaXNwbGF5U3RyaW5nKSkgewotICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGZvdW5kKTsKLSAgICB9ICAgICAgICAKLQotCS8qKgotCSAqIFRlc3RzIHRoZSBwcm9wZXJ0eSBwcm9wb3NhbHMgZm9yIHRoZSBjYXNlIHRoYXQgdGhleSBhcmUgZGVmaW5lZCBpbgotCSAqIGEgZGVwZW5kZW50IHRhcmdldHMuCi0JICovCi0gICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5UHJvcG9zYWxEZWZpbmVkSW5EZXBlbmRhbnRUYXJnZXRzKCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0gICAgICAgIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJkZXBlbmRlbmN5dGVzdC54bWwiKSk7Ci0KLSAgICAgICAgRmlsZSBmaWxlPSBnZXRCdWlsZEZpbGUoImRlcGVuZGVuY3l0ZXN0LnhtbCIpOwotICAgICAgICBwcm9jZXNzb3Iuc2V0RWRpdGVkRmlsZShmaWxlKTsKLQkJU3RyaW5nIGRvY3VtZW50VGV4dCA9IGdldEZpbGVDb250ZW50QXNTdHJpbmcoZmlsZSk7Ci0KLQkJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIoMzUpOwotCQlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKDQxKTsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gZG9jdW1lbnRUZXh0Lmxhc3RJbmRleE9mKCIkeyIpOwotCQlhc3NlcnRUcnVlKGN1cnNvclBvc2l0aW9uICE9IC0xKTsKLSAgICAgICAgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wZXJ0eVByb3Bvc2FscyhuZXcgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudChkb2N1bWVudFRleHQpLCAiIiwgY3Vyc29yUG9zaXRpb24rMik7Ci0JCWFzc2VydENvbnRhaW5zKCJpbml0X3Byb3AiLCBwcm9wb3NhbHMpOwotCQlhc3NlcnRDb250YWlucygibWFpbl9wcm9wIiwgcHJvcG9zYWxzKTsKLQkJYXNzZXJ0Q29udGFpbnMoInByb3BfcHJvcCIsIHByb3Bvc2Fscyk7Ci0JCWFzc2VydENvbnRhaW5zKCJkb19ub3RfY29tcGlsZSIsIHByb3Bvc2Fscyk7Ci0JCWFzc2VydENvbnRhaW5zKCJhZGl0X3Byb3AiLCBwcm9wb3NhbHMpOwotCQlhc3NlcnRDb250YWlucygiY29tcGlsZV9wcm9wIiwgcHJvcG9zYWxzKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGFza3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBpbiB0aGUgYnVpbGRmaWxlCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbVRhc2tQcm9wb3NhbHMoKSB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJ0YXNrZGVmLnhtbCIpKTsKLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFRhc2tQcm9wb3NhbHMoZ2V0Q3VycmVudERvY3VtZW50KCksICJ0YXJnZXQiLCAibWluIik7Ci0JCWFzc2VydEVxdWFscygxLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IHByb3Bvc2Fsc1swXTsKLQkJYXNzZXJ0RXF1YWxzKCJtaW5lIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLQl9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGFza3MgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCB2aWEgdGhlIHRhc2sgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblBvaW50VGFza1Byb3Bvc2FscygpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoInRhc2tkZWYueG1sIikpOwotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgInRhcmdldCIsICJjb29sIik7Ci0JCWFzc2VydEVxdWFscyg0LCBwcm9wb3NhbHMubGVuZ3RoKTsKLQkJYXNzZXJ0Q29udGFpbnMoImNvb2xVSVRhc2siLCBwcm9wb3NhbHMpOwotCX0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciB0YXNrcyB0aGF0IGhhdmUgYmVlbiBkZWZpbmVkIHZpYSBtYWNyb2RlZiBpbiB0aGUgYnVpbGRmaWxlCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdE1hY3JvZGVmUHJvcG9zYWxzKCkgewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgibWFjcm9kZWYueG1sIikpOwotCi0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgInRhcmdldCIsICJlY2xpcHNlbWEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gcHJvcG9zYWxzWzBdOwotCQlhc3NlcnRFcXVhbHMoImVjbGlwc2VNYWNybyIsIHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0gICAgICAgIAotCX0KLQkKLQkvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBuZXN0ZWQgZWxlbWVudCBhdHRyaWJ1dGVzCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdE1hY3JvZGVmTmVzdGVkRWxlbWVudEF0dHJpYnV0ZVByb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJtYWNyb2RlZi54bWwiKSk7Ci0JCWludCBsaW5lTnVtYmVyPSA1OwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAxMTsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDQpOwotICAgIAlhc3NlcnRDb250YWlucygiZGVzY3JpcHRpb24iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRDb250YWlucygibmFtZSIsIHByb3Bvc2Fscyk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIHRhc2tzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgdmlhIG1hY3JvZGVmIGluIHRoZSBidWlsZGZpbGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWFjcm9kZWZBdHRyaWJ1dGVQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgibWFjcm9kZWYueG1sIikpOwotCQlpbnQgbGluZU51bWJlcj0gMTI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDE2OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gMik7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJ2IiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoImVjbGlwc2UiLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnRUcnVlKCJBZGRpdGlvbmFsIHByb3Bvc2FsIGluZm9ybWF0aW9uIG5vdCBjb3JyZWN0IiwgcHJvcG9zYWxzWzFdLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKS5zdGFydHNXaXRoKCJUZXN0aW5nIEVjbGlwc2UiKSk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGRlZmluZWQgdmlhIG1hY3JvZGVmIGluIHRoZSBidWlsZGZpbGUKLSAgICAgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWFjcm9kZWZFbGVtZW50UHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoIm1hY3JvZGVmLnhtbCIpKTsKLQkJaW50IGxpbmVOdW1iZXI9IDEzOwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAzOwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gMSk7Ci0gICAgCWFzc2VydFRydWUoIlByb3Bvc2FsIG5vdCBjb3JyZWN0IiwgcHJvcG9zYWxzWzBdLmdldERpc3BsYXlTdHJpbmcoKS5lcXVhbHMoInNvbWUtdGFza3MiKSk7Ci0gICAgCWFzc2VydFRydWUoIkFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mb3JtYXRpb24gbm90IGNvcnJlY3QiLCBwcm9wb3NhbHNbMF0uZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpLmVuZHNXaXRoKCJOb3QgcmVxdWlyZWQiKSk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgdGFza3MgaGF2aW5nIHBhcmVudCB0YXNrcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VGFza1Byb3Bvc2FscygpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImJ1aWxkdGVzdDEueG1sIikpOwotCi0gICAgICAgCi0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiICAgICAgICAgPCIsICJyZW5hbWUiLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiICAgICAgIDxjbCIsICJwcm9wZXJ0eSIsICJjbCIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscygiY2xhc3NwYXRoIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLQotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiICAgICAgIDxwciIsICJwcm9wZXJ0eSIsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICBwcm9wb3NhbCA9IHByb3Bvc2Fsc1swXTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzc3BhdGgiLCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgLy8gIjxwcm9qZWN0Pjx0YXJnZXQ+PG1rIgotICAgICAgICBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscygiPHByb2plY3Q+PHRhcmdldD48bWsiLCAidGFyZ2V0IiwgIm1rIik7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBwcm9wb3NhbHMubGVuZ3RoKTsKLSAgICAgICAgcHJvcG9zYWwgPSBwcm9wb3NhbHNbMF07Ci0gICAgICAgIGFzc2VydEVxdWFscygibWtkaXIiLCBwcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgICAgICAKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogVGVzdCBmb3IgYnVnIDQwOTUxCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1peGVkRWxlbWVudHMoKSB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJtaXhlZC54bWwiKSk7Ci0JCS8vU3RyaW5nIHN0cmluZyA9ICI8cHJvamVjdD48dGFyZ2V0PjxzcWwgZHJpdmVyPVwiXCIgcGFzc3dvcmQ9XCJcIiB1cmw9XCJcIiB1c2VyaWQ9XCJcIj48L3NxbD48Y29uY2F0PjwvY29uY2F0PiI7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0VGFza1Byb3Bvc2FscyhnZXRDdXJyZW50RG9jdW1lbnQoKSwgcHJvY2Vzc29yLmdldFBhcmVudE5hbWUoZ2V0Q3VycmVudERvY3VtZW50KCksIDAsIDYyKSwgInQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gcHJvcG9zYWxzWzBdOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zYWN0aW9uIiwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpKTsKLQkJCi0JCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRUYXNrUHJvcG9zYWxzKGdldEN1cnJlbnREb2N1bWVudCgpLCBwcm9jZXNzb3IuZ2V0UGFyZW50TmFtZShnZXRDdXJyZW50RG9jdW1lbnQoKSwgMCwgNzYpLCAiIik7Ci0JCS8vZmlsZWxpc3QgZmlsZXNldCBmaWx0ZXJjaGFpbiBmb290ZXIgaGVhZGVyIHBhdGgKLQkJYXNzZXJ0RXF1YWxzKDYsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQlwcm9wb3NhbCA9IHByb3Bvc2Fsc1swXTsKLQkJYXNzZXJ0RXF1YWxzKCJmaWxlbGlzdCIsIHByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKSk7Ci0JfQotCQotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBhbGdvcml0aG0gZm9yIGZpbmRpbmcgYSBjaGlsZCBhcyB1c2VkIGJ5IHRoZSBwcm9jZXNzb3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbmRDaGlsZEVsZW1lbnQoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICAvLyBDcmVhdGUgdGhlIHRlc3QgZGF0YQotICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gZG9jQnVpbGRlci5uZXdEb2N1bWVudCgpOwotICAgICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgicGFyZW50Iik7Ci0gICAgICAgIEF0dHIgYXR0cmlidXRlID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZSgiYXR0MSIpOwotICAgICAgICBwYXJlbnRFbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlKTsKLSAgICAgICAgQ29tbWVudCBjb21tZW50ID0gZG9jLmNyZWF0ZUNvbW1lbnQoImxha2pqZmxzYWtkZmoiKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb21tZW50KTsKLSAgICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgiY2hpbGQiKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICBjaGlsZEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudCgic2Vjb25kY2hpbGQiKTsKLSAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICAKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBwcm9jZXNzb3IKLSAgICAgICAgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRlc3QgaXQhCi0gICAgICAgIGNoaWxkRWxlbWVudCA9IHByb2Nlc3Nvci5maW5kQ2hpbGRFbGVtZW50TmFtZWRPZihwYXJlbnRFbGVtZW50LCAiamtsIik7Ci0gICAgICAgIGFzc2VydE51bGwoY2hpbGRFbGVtZW50KTsKLSAgICAgICAgY2hpbGRFbGVtZW50ID0gcHJvY2Vzc29yLmZpbmRDaGlsZEVsZW1lbnROYW1lZE9mKHBhcmVudEVsZW1lbnQsICJzZWNvbmRjaGlsZCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygic2Vjb25kY2hpbGQiLCBjaGlsZEVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgcHJvY2Vzc29yIGNvcnJlY3RseSBkZXRlcm1pbmVzIHRoZSBhdHRyaWJ1dGUgcHJvcG9zYWwgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmluZ0F0dHJpYnV0ZVByb3Bvc2FsTW9kZSgpIHsKLSAgICAgICAgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLSAgICAgICAgaW50IG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48cHJvcGVydHkgdGEiLCAyMSwgInRhIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48cHJvcGVydHkgIiwgMTksICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wZXJ0eSAgICIsIDIxLCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvcGVydHkgaWQ9XCJodVwiICIsIDE4LCAiIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvcGVydHkgaWQ9XCJodVwiIFxyXG4gIiwgMjEsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9wZXJ0eVxuIiwgMTAsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMLCBtb2RlKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgdGhhdCB0aGUgcHJvY2Vzc29yIGNvcnJlY3RseSBkZXRlcm1pbmVzIHRoZSBhdHRyaWJ1dGUgdmFsdWUgcHJvcG9zYWwgbW9kZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmluZ0F0dHJpYnV0ZVZhbHVlUHJvcG9zYWxNb2RlKCkgewotICAgICAgICBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcigpOwotICAgICAgICBpbnQgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wZXJ0eSB0YWtlPVwiIiwgMjUsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9wZXJ0eSBpZD1cImh1XCIgIiwgMTQsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMLCBtb2RlKTsKLSAgICAgICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9wZXJ0eSBpZD1cImh1XCIgXHJcbiAiLCAxNiwgImh1Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9WQUxVRV9QUk9QT1NBTCwgbW9kZSk7Ci0gICAgICAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvcGVydHkgXG5cdFx0aWQ9XCJodVwiIFxyXG4gIiwgMTksICJodSIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9BVFRSSUJVVEVfVkFMVUVfUFJPUE9TQUwsIG1vZGUpOwotICAgIH0KLSAgICAKLQkvKioKLQkqIFRlc3RzIGhvdyB0aGUgcHJvY2Vzc29yIGRldGVybWluZXMgdGhlIHByb3Bvc2FsIG1vZGUuCi0JKi8KLSAgIHB1YmxpYyB2b2lkIHRlc3REZXRlcm1pbmluZ1Byb3BlcnR5UHJvcG9zYWxNb2RlKCkgewotCSAgIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JICAgaW50IG1vZGUgPXByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjx0YXJnZXQgbmFtZT1cIiRcIiIsIDI0LCAiIik7Ci0JICAgYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfUFJPUEVSVFlfUFJPUE9TQUwsIG1vZGUpOwotCSAgIG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48dGFyZ2V0IG5hbWU9XCIke1wiIiwgMjUsICIiKTsKLQkgICBhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCwgbW9kZSk7Ci0JICAgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjx0YXJnZXQgbmFtZT1cIiR7amEuYmxcIiIsIDMwLCAiamEuYmwiKTsKLQkgICBhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCwgbW9kZSk7Ci0JICAKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjx0YXJnZXQ+PGVjaG8+JHsiLCAyNSwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCwgbW9kZSk7Ci0gICB9Ci0gICAgCi0JLyoqCi0JICogVGVzdHMgaG93IHRoZSBwcm9jZXNzb3IgZGV0ZXJtaW5lcyB0aGUgcHJvcG9zYWwgbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5pbmdUYXNrUHJvcG9zYWxNb2RlKCkgewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcigpOwotICAgIAotCQlpbnQgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wIiwgMTQsICJwcm9wIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUwsIG1vZGUpOwotCQltb2RlID0gcHJvY2Vzc29yLmRldGVybWluZVByb3Bvc2FsTW9kZSgiPHByb2plY3Q+IGhqayIsIDEzLCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUwsIG1vZGUpOwotCQltb2RlID0gcHJvY2Vzc29yLmRldGVybWluZVByb3Bvc2FsTW9kZSgiPHByb2plY3Q+IGhqazwiLCAxNCwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsgLy8gYWxsb3cgdGhpcyBjYXNlIHRob3VnaCBpdCBpcyBub3QgdmFsaWQgd2l0aCBBbnQKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0PiIsIDksICIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCwgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD4gIiwgMTAsICIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCwgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48LyIsIDExLCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORywgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdD48IDwvcHJvamVjdD4iLCAxMCwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0IGRlZmF1bHQ9XCJoZXlcIj48dGFyZ2V0IG5hbWU9XCJoZXlcIj5hPC90YXJnZXQ+PC9wcm9qZWN0PiIsIDQ0LCAiYSIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0IGRlZmF1bHQ9XCJoZXlcIj48dGFyZ2V0IG5hbWU9XCJoZXlcIj48L3RhcmdldD48L3Byb2plY3Q+IiwgNDMsICIiKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCwgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdCBkZWZhdWx0PVwiaGV5XCI+PHRhcmdldCBuYW1lPVwiaGV5XCI+PGE8L3RhcmdldD48L3Byb2plY3Q+IiwgNDUsICI8YSIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjx0YXJnZXQgbmFtZT1cIm1haW5cIj48emlwPjxzaXplPjwvc2l6ZT48L3ppcD48LyIsIDQ2LCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORywgbW9kZSk7Ci0JCW1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCIiLCAwLCAiIik7Ci0JCWFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX0JVSUxERklMRSwgbW9kZSk7Ci0JCW1vZGU9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0IGRlZmF1bHQ9XCJoZXlcIj48dGFyZ2V0IG5hbWU9XCJoZXlcIj48amF2YWM+YTwvamF2YWM+PC90YXJnZXQ+PC9wcm9qZWN0PiIsIDUxLCAiYSIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQkJbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0PiBoamsiLCAxMywgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMLCBtb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgaG93IHRoZSBwcm9jZXNzb3IgZGV0ZXJtaW5lcyB0aGUgcHJvcG9zYWwgbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5pbmdUYXNrQ2xvc2luZ1Byb3Bvc2FsTW9kZSgpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkKLQkJaW50IG1vZGUgPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8dGFyZ2V0IG5hbWU9XCJtYWluXCI+PHppcD48c2l6ZT48L3NpemU+PC96aXA+PC8iLCA0NiwgIiIpOwotCQlhc3NlcnRFcXVhbHMoVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLlRFU1RfUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMX0NMT1NJTkcsIG1vZGUpOwotCX0KLQotICAgIC8qKgotICAgICAqIFRlc3RzIGhvdyB0aGUgcHJlZml4IHdpbGwgYmUgZGV0ZXJtaW5lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0ZXJtaW5pbmdQcmVmaXgoKSB7Ci0gICAgICAgIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0KLSAgICAgICAgLy8gY3Vyc29yIGFmdGVyICR7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBwcm9jZXNzb3IuZ2V0UHJlZml4RnJvbURvY3VtZW50KCI8cHJvamVjdD48dGFyZ2V0IG5hbWU9XCIke31cIiIsIDI1KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwcmVmaXgpOwotCi0gICAgICAgIC8vIGN1cnNvciBhZnRlciAkCi0gICAgICAgIHByZWZpeCA9IHByb2Nlc3Nvci5nZXRQcmVmaXhGcm9tRG9jdW1lbnQoIjxwcm9qZWN0Pjx0YXJnZXQgbmFtZT1cIiR7XCIiLCAyNCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiIiwgcHJlZml4KTsKLQotICAgICAgICAvLyBjdXJzb3IgYWZ0ZXIgJHtqYS4KLSAgICAgICAgcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgiPHByb2plY3Q+PHRhcmdldCBuYW1lPVwiJHtqYS5cIiIsIDI4KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYS4iLCBwcmVmaXgpOwotICAgICAgICAKLSAgICAgICAgLy8gY3Vyc29yIGFmdGVyIDwKLQkJcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgiPHByb2plY3Q+PCIsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBwcmVmaXgpOwotCQkKLQkJcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgiPHByb2plY3QgbmFtZT0gXCJ0ZXN0XCI+PHRhciIsIDI2KTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXIiLCBwcmVmaXgpOwotCQkKLQkJcHJlZml4ID0gcHJvY2Vzc29yLmdldFByZWZpeEZyb21Eb2N1bWVudCgicHJvIiwgMyk7Ci0JCWFzc2VydEVxdWFscygicHJvIiwgcHJlZml4KTsKLSAgICB9ICAgIAotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGhvdyB0aGUgcHJvY2Vzc29yIGRldGVybWluZXMgdGhlIHByb3Bvc2FsIG1vZGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdERldGVybWluaW5nTm9uZVByb3Bvc2FsTW9kZSgpIHsKLSAgICAgICAgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQotICAgICAgICBpbnQgbW9kZSA9IHByb2Nlc3Nvci5kZXRlcm1pbmVQcm9wb3NhbE1vZGUoIjxwcm9qZWN0Pjxwcm9wIGJsYSIsIDE4LCAiYmxhIik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuVEVTVF9QUk9QT1NBTF9NT0RFX05PTkUsIG1vZGUpOwotCQltb2RlPSBwcm9jZXNzb3IuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKCI8cHJvamVjdCBkZWZhdWx0PVwiaGV5XCI+PHRhcmdldCBuYW1lPSIsIDM3LCAibmFtZT0iKTsKLQkJYXNzZXJ0RXF1YWxzKFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3Nvci5URVNUX1BST1BPU0FMX01PREVfTk9ORSwgbW9kZSk7Ci0JfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIHRhc2tzIGluIGFuIGVtcHR5IGJ1aWxkIGZpbGUgKG5vIHBhcmVudCkuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhc2tQcm9wb3NhbHNGb3JFbXB0eUJ1aWxkRmlsZSgpIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImVtcHR5LnhtbCIpKTsKLQotICAgICAgICBJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEJ1aWxkRmlsZVByb3Bvc2FscygiIiwgIiIpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygicHJvamVjdCIsIHByb3Bvc2Fsc1swXS5nZXREaXNwbGF5U3RyaW5nKCkpOwotICAgICAgICAKLSAgICAgICAgcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEJ1aWxkRmlsZVByb3Bvc2FscygiICAgICAgICAgICAgamwiLCAiamwiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgICAgICAKLSAgICAgICAgcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldEJ1aWxkRmlsZVByb3Bvc2FscygiICAgIFxuPHByb2plY3Q+PC9wcm9qZWN0PiIsICIiKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciByZWZpZHMgKEJ1ZyA0OTgzMCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmaWRQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgicmVmaWQueG1sIikpOwotCi0JCWludCBsaW5lTnVtYmVyPSA5OwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAxNjsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJLy9mb3Igc3VyZSBzaG91bGQgaGF2ZSBwcm9qZWN0LmNsYXNzLnBhdGggYW5kIHByb2plY3QuY2xhc3MucGF0aDIKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID49IDIpOwotICAgIAlhc3NlcnRDb250YWlucygicHJvamVjdC5jbGFzcy5wYXRoIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0RG9lc05vdENvbnRhaW4oInByb2plY3QuY2xhc3MucGF0aDIiLCBwcm9wb3NhbHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBjdXN0b20gdGFzayB0aGF0IGhhcyBhIGJvb2xlYW4gYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJvb2xlYW5Qcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiY3VzdG9tQm9vbGVhbi54bWwiKSk7Ci0KLQkJaW50IGxpbmVOdW1iZXI9IDI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDQ0OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAkvL3RydWUgZmFsc2UgeWVzIG5vIG9uIG9mZgotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gNik7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJ0cnVlIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoIm5vIiwgcHJvcG9zYWxzKTsKLSAgICB9Ci0gICAgCi0gICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIGN1c3RvbSB0YXNrIHRoYXQgaGFzIGFuIGVudW1lcmF0ZWQgYXR0cmlidXRlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUVudW1lcmF0ZWRQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sIikpOwotCQlpbnQgbGluZU51bWJlcj0gMjsKLSAgICAJaW50IGNvbHVtbk51bWJlcj0gMjQ7Ci0gICAgCWludCBsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBwcm9jZXNzb3IuZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KGdldEN1cnJlbnREb2N1bWVudCgpLCAiYyIpOwotICAgIAlhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgcHJvcG9zYWxzIiwgMiwgcHJvcG9zYWxzLmxlbmd0aCk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJjb29sIiwgcHJvcG9zYWxzKTsKLSAgICAJYXNzZXJ0Q29udGFpbnMoImNoaWxsaW4iLCBwcm9wb3NhbHMpOwotICAgIAlhc3NlcnREb2VzTm90Q29udGFpbigiYXdlc29tZSIsIHByb3Bvc2Fscyk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIGN1c3RvbSB0YXNrIHRoYXQgaGF2ZSBhIHJlZmVyZW5jZSBhdHRyaWJ1dGUKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUmVmZXJlbmNlUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImV4dGVuc2lvblBvaW50VGFza1NlcFZNLnhtbCIpKTsKLQkJaW50IGxpbmVOdW1iZXI9IDI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDQxOwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgImUiKTsKLSAgICAJYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHByb3Bvc2FscyIsIDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotICAgIAkvL3RoZSByZWZlcmVuY2UgdG8gdGhlIHByb2plY3QgYnkgbmFtZQotICAgIAlhc3NlcnRDb250YWlucygiRXh0ZW5zaW9uIFBvaW50IFRhc2siLCBwcm9wb3NhbHMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyB0aGUgY29kZSBjb21wbGV0aW9uIGZvciBuZXN0ZWQgZWxlbWVudCBhdHRyaWJ1dGVzIG9mIGN1c3RvbSB0YXNrcwotICAgICAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFbGVtZW50QXR0cmlidXRlUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoIm5lc3RlZEVsZW1lbnRBdHRyaWJ1dGVzLnhtbCIpKTsKLQkJaW50IGxpbmVOdW1iZXI9IDQ7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDE4OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gMSk7Ci0gICAgCWFzc2VydENvbnRhaW5zKCJ3b3JrcyIsIHByb3Bvc2Fscyk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gZm9yIG5lc3RlZCBlbGVtZW50IGF0dHJpYnV0ZSB2YWx1ZXMgb2YgY3VzdG9tIHRhc2tzCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZEVsZW1lbnRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKGdldEFudE1vZGVsKCJuZXN0ZWRFbGVtZW50QXR0cmlidXRlcy54bWwiKSk7Ci0gICAgCWludCBsaW5lTnVtYmVyPSA0OwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAyNTsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDYpOyAvL3RoZSBib29sZWFuIHByb3Bvc2FscwotICAgIAlhc3NlcnRDb250YWlucygidHJ1ZSIsIHByb3Bvc2Fscyk7Ci0JfQotCQotCS8qKgotICAgICAqIFRlc3RzIHRoZSBjb2RlIGNvbXBsZXRpb24gd2hlbiBhIHBhcnNlIGVycm9yIG9jY3VycyBpbiB0aGUgcHJvamVjdCBkZWZpbml0aW9uCi0gICAgICogYnVnIDYzMTUxCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEJhZFByb2plY3RQcm9wb3NhbHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvcihnZXRBbnRNb2RlbCgiYmFkcHJvamVjdC54bWwiKSk7Ci0gICAgCWludCBsaW5lTnVtYmVyPSAwOwotICAgIAlpbnQgY29sdW1uTnVtYmVyPSAxMDsKLSAgICAJaW50IGxpbmVPZmZzZXQ9IGdldEN1cnJlbnREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRMaW5lTnVtYmVyKGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDdXJzb3JQb3NpdGlvbihsaW5lT2Zmc2V0ICsgY29sdW1uTnVtYmVyKTsKLSAgICAJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICJuIik7Ci0gICAgCWFzc2VydFRydWUocHJvcG9zYWxzLmxlbmd0aCA9PSAxKTsgCi0gICAgCWFzc2VydENvbnRhaW5zKCJuYW1lIiwgcHJvcG9zYWxzKTsKLQl9Ci0JCi0JLyoqCi0gICAgICogVGVzdHMgdGhlIGNvZGUgY29tcGxldGlvbiBmb3IgYXR0cmlidXRlIHZhbHVlIHByb3Bvc2FscyBib3RoIHdpdGggYW5kIHdpdGhvdXQgbGVhZGluZyB3aGl0ZXNwYWNlCi0gICAgICovCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoZ2V0QW50TW9kZWwoImphdmFjLnhtbCIpKTsKLSAgICAJaW50IGxpbmVOdW1iZXI9IDI7Ci0gICAgCWludCBjb2x1bW5OdW1iZXI9IDI5OwotICAgIAlpbnQgbGluZU9mZnNldD0gZ2V0Q3VycmVudERvY3VtZW50KCkuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldExpbmVOdW1iZXIobGluZU51bWJlcik7Ci0gICAgCXByb2Nlc3Nvci5zZXRDb2x1bW5OdW1iZXIoY29sdW1uTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldEN1cnNvclBvc2l0aW9uKGxpbmVPZmZzZXQgKyBjb2x1bW5OdW1iZXIpOwotICAgIAlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcHJvY2Vzc29yLmdldFByb3Bvc2Fsc0Zyb21Eb2N1bWVudChnZXRDdXJyZW50RG9jdW1lbnQoKSwgIiIpOwotICAgIAlhc3NlcnRUcnVlKHByb3Bvc2Fscy5sZW5ndGggPT0gNik7IC8vYm9vbGVhbiBwcm9wb3NhbHMgCi0gICAgCWFzc2VydENvbnRhaW5zKCJmYWxzZSIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIAlsaW5lTnVtYmVyPSAzOwotICAgIAljb2x1bW5OdW1iZXI9IDE5OwotICAgIAlsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDYpOyAvL2Jvb2xlYW4gcHJvcG9zYWxzIAotICAgIAlhc3NlcnRDb250YWlucygidHJ1ZSIsIHByb3Bvc2Fscyk7Ci0gICAgCQotICAgIAlsaW5lTnVtYmVyPSA0OwotICAgIAljb2x1bW5OdW1iZXI9IDIyOwotICAgIAlsaW5lT2Zmc2V0PSBnZXRDdXJyZW50RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTsKLSAgICAJcHJvY2Vzc29yLnNldENvbHVtbk51bWJlcihjb2x1bW5OdW1iZXIpOwotICAgIAlwcm9jZXNzb3Iuc2V0Q3Vyc29yUG9zaXRpb24obGluZU9mZnNldCArIGNvbHVtbk51bWJlcik7Ci0gICAgCXByb3Bvc2FscyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHNGcm9tRG9jdW1lbnQoZ2V0Q3VycmVudERvY3VtZW50KCksICIiKTsKLSAgICAJYXNzZXJ0VHJ1ZShwcm9wb3NhbHMubGVuZ3RoID09IDYpOyAvL2Jvb2xlYW4gcHJvcG9zYWxzIAotICAgIAlhc3NlcnRDb250YWlucygibm8iLCBwcm9wb3NhbHMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9UYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjFlY2RkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL1Rhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcKLSAqIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkgsIAotICogQmVybGluLCBEdWVzc2VsZG9yZiwgRnJhbmtmdXJ0IChHZXJtYW55KS4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBHRUJJVCBHZXNlbGxzY2hhZnQgZnVlciBFRFYtQmVyYXR1bmcgdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5UYXNrRGVzY3JpcHRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdGFza3MgZGVzY3JpcHRpb24gcHJvdmlkZXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIHB1YmxpYyBUYXNrRGVzY3JpcHRpb25Qcm92aWRlclRlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgLyoqIAotICAgICAqIFRlc3RzIGdldHRpbmcgdGhlIGRlc2NyaXB0aW9uIG9mIGEgdGFzay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGluZ1Rhc2tEZXNjcmlwdGlvbigpIHsKLSAgICAgICAgVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBUYXNrRGVzY3JpcHRpb25Qcm92aWRlci5nZXREZWZhdWx0KCk7Ci0gICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3ZpZGVyLmdldERlc2NyaXB0aW9uRm9yVGFzaygiYXBwbHkiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdGlvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBnZXR0aW5nIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEdldHRpbmdBdHRyaWJ1dGUoKSB7Ci0gICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm92aWRlci5nZXREZXNjcmlwdGlvbkZvclRhc2tBdHRyaWJ1dGUoImFwcGx5IiwgImV4ZWN1dGFibGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjcmlwdGlvbik7Ci0gICAgICAgIGFzc2VydFRydWUoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgZ2V0dGluZyB0aGUgcmVxdWlyZWQgdmFsdWUgb2YgYW4gYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nUmVxdWlyZWQoKSB7Ci0gICAgICAgIFRhc2tEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0RGVmYXVsdCgpOwotICAgICAgICBTdHJpbmcgcmVxdWlyZWQgPSBwcm92aWRlci5nZXRSZXF1aXJlZEF0dHJpYnV0ZUZvclRhc2tBdHRyaWJ1dGUoImFwcGx5IiwgImV4ZWN1dGFibGUiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXF1aXJlZCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygieWVzIiwgcmVxdWlyZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0LmNsYXNzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL0Zvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5NWNmYy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIEZvcm1hdHRpbmdQcmVmZXJlbmNlc1Rlc3QoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdldENhbm9uaWNhbEluZGVudCgpIHsKLSAgICAgCi0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmczsKLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3Qgc3BhY2VzIAotICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICIscHJlZnMuZ2V0Q2Fub25pY2FsSW5kZW50KCkpOwotICAgICAgICAKLSAgICAgICAgLy8gZW5zdXJlIHRoZSB2YWx1ZSBpcyBub3QgaGFyZCBjb2RlZAotICAgICAgICBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIiAgICAgICAiLHByZWZzLmdldENhbm9uaWNhbEluZGVudCgpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIHVzZSB0YWIgY2hhcmFjdGVyCi0gICAgICAgIHByZWZzID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpewotICAgICAgICAgICAgcHVibGljIGludCBnZXRUYWJXaWR0aCgpIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsgICAgICAgIAotICAgICAgICBhc3NlcnRFcXVhbHMoIlx0IixwcmVmcy5nZXRDYW5vbmljYWxJbmRlbnQoKSk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0LmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTJkZDUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbERvY3VtZW50Rm9ybWF0dGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbERvY3VtZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkFic3RyYWN0QW50VUlUZXN0OwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhtbERvY3VtZW50Rm9ybWF0dGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICovCi0gICAgcHVibGljIFhtbERvY3VtZW50Rm9ybWF0dGVyVGVzdChTdHJpbmcgbmFtZSkgewotICAgICAgICBzdXBlcihuYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmFsIFRlc3QgCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEdlbmVyYWxGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpewotICAgICAgICAgICAgcHVibGljIGludCBnZXRUYWJXaWR0aCgpIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdHJpcEJsYW5rTGluZXMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdXNlU3BhY2VzSW5zdGVhZE9mVGFicygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2ltcGxlVGVzdCgiZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwiLCJmb3JtYXRUZXN0X3RhcmdldDAxLnhtbCIscHJlZnMpOyAgICAgICAgCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5zdXJlIHRoYXQgdGFiIHdpZHRoIGlzIG5vdCBoYXJkIGNvZGVkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdFRhYldpZHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKXsKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VGFiV2lkdGgoKSB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJldHVybiA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gc3RyaXBCbGFua0xpbmVzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzZVNwYWNlc0luc3RlYWRPZlRhYnMoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIHNpbXBsZVRlc3QoImZvcm1hdFRlc3Rfc291cmNlMDEueG1sIiwiZm9ybWF0VGVzdF90YXJnZXQwMi54bWwiLHByZWZzKTsgICAgICAgIAotICAgIH0KLQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3Qgd2l0aCB0YWIgY2hhcmFjdGVycyBpbnN0ZWFkIG9mIHNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0VGFic0luc3RlYWRPZlNwYWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCl7Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHN0cmlwQmxhbmtMaW5lcygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgc2ltcGxlVGVzdCgiZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwiLCJmb3JtYXRUZXN0X3RhcmdldDAzLnhtbCIscHJlZnMpOyAgICAgICAgCi0gICAgfQotICAgIAotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlTmFtZSAtIGZpbGUgdG8gZm9ybWF0Ci0gICAgICogQHBhcmFtIHRhcmdldEZpbGVOYW1lIC0gdGhlIHNvdXJjZSBmaWxlIGFmdGVyIGEgcHJvcGVybHkgZXhlY3V0ZWQgZm9ybWF0Ci0gICAgICogQHBhcmFtIHByZWZzIC0gZ2l2ZW4gdGhlIGluY2x1ZGVkIHByZWZlcmVuY2UgaW5zdHJ1Y3Rpb25zCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2ltcGxlVGVzdChTdHJpbmcgc291cmNlRmlsZU5hbWUsIFN0cmluZyB0YXJnZXRGaWxlTmFtZSwgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIHByZWZzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgCi0gICAgICAgIFhtbERvY3VtZW50Rm9ybWF0dGVyIHhtbEZvcm1hdHRlciA9IG5ldyBYbWxEb2N1bWVudEZvcm1hdHRlcigpOwotICAgICAgICBTdHJpbmcgcmVzdWx0ID0geG1sRm9ybWF0dGVyLmZvcm1hdChnZXRGaWxlQ29udGVudEFzU3RyaW5nKGdldEJ1aWxkRmlsZShzb3VyY2VGaWxlTmFtZSkpLHByZWZzKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhnZXRCdWlsZEZpbGUodGFyZ2V0RmlsZU5hbWUpKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3VsdCwgcmVzdWx0KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRm9ybWF0dGVyVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbEZvcm1hdHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlOTdmOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9mb3JtYXR0ZXIvWG1sRm9ybWF0dGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSm9obi1NYXNvbiBQLiBTaGFja2VsZm9yZCAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5mb3JtYXR0ZXIuRm9ybWF0dGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLnByZWZlcmVuY2VzLkFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhtbEZvcm1hdHRlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgICBwdWJsaWMgZmluYWwgdm9pZCB0ZXN0Rm9ybWF0VXNpbmdQcmVmZXJlbmNlU3RvcmUoKSB7Ci0gICAgICAgIFByZWZlcmVuY2VzIHByZWZzID0gQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0gICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX1dSQVBfTE9ORywgdHJ1ZSk7Ci0gICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX01BWF9MSU5FX0xFTkdUSCwgNDApOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9BTElHTiwgZmFsc2UpOwotICAgICAgICBwcmVmcy5zZXRWYWx1ZShBbnRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkZPUk1BVFRFUl9UQUJfQ0hBUiwgdHJ1ZSk7Ci0gICAgICAgIHByZWZzLnNldFZhbHVlKEFudEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRk9STUFUVEVSX1RBQl9TSVpFLCA0KTsKLSAgICAgICAgU3RyaW5nIHhtbERvYyA9ICI8cHJvamVjdCBkZWZhdWx0PVwiZ29cIj48dGFyZ2V0IG5hbWU9XCJnb1wiIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj48ZWNobz5oaTwvZWNobz48L3RhcmdldD48L3Byb2plY3Q+IjsKLSAgICAgICAgU3RyaW5nIGZvcm1hdHRlZERvYyA9IFhtbEZvcm1hdHRlci5mb3JtYXQoeG1sRG9jKTsKLSAgICAgICAgU3RyaW5nIGV4cGVjdGVkID0gIjxwcm9qZWN0IGRlZmF1bHQ9XCJnb1wiPlxuXHQ8dGFyZ2V0IG5hbWU9XCJnb1wiXG5cdCAgICAgICAgZGVzY3JpcHRpb249XCJEZW1vbnN0cmF0ZSB0aGUgd3JhcHBpbmcgb2YgbG9uZyB0YWdzLlwiPlxuXHRcdDxlY2hvPmhpPC9lY2hvPlxuXHQ8L3RhcmdldD5cbjwvcHJvamVjdD4iOwotICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZvcm1hdHRlZERvYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIHZvaWQgdGVzdEZvcm1hdFdpdGhQcmVmZXJlbmNlUGFyYW1ldGVyKCkgewotICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMgPSBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gd3JhcExvbmdUYWdzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldE1heGltdW1MaW5lV2lkdGgoKSB7IHJldHVybiA0MDt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7IHJldHVybiBmYWxzZTt9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2VTcGFjZXNJbnN0ZWFkT2ZUYWJzKCkgeyByZXR1cm4gdHJ1ZTt9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IGdldFRhYldpZHRoKCkgeyByZXR1cm4gNjt9Ci0gICAgICAgIH07Ci0gICAgICAgIFN0cmluZyB4bWxEb2MgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+PHRhcmdldCBuYW1lPVwiZ29cIiBkZXNjcmlwdGlvbj1cIkRlbW9uc3RyYXRlIHRoZSB3cmFwcGluZyBvZiBsb25nIHRhZ3MuXCI+PGVjaG8+aGk8L2VjaG8+PC90YXJnZXQ+PC9wcm9qZWN0PiI7Ci0gICAgICAgIFN0cmluZyBmb3JtYXR0ZWREb2MgPSBYbWxGb3JtYXR0ZXIuZm9ybWF0KHhtbERvYywgcHJlZnMpOwotICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiPHByb2plY3QgZGVmYXVsdD1cImdvXCI+XG4gICAgICA8dGFyZ2V0IG5hbWU9XCJnb1wiXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uPVwiRGVtb25zdHJhdGUgdGhlIHdyYXBwaW5nIG9mIGxvbmcgdGFncy5cIj5cbiAgICAgICAgICAgIDxlY2hvPmhpPC9lY2hvPlxuICAgICAgPC90YXJnZXQ+XG48L3Byb2plY3Q+IjsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBmb3JtYXR0ZWREb2MpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbFRhZ0Zvcm1hdHRlclRlc3QuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL2Zvcm1hdHRlci9YbWxUYWdGb3JtYXR0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmZiNGEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3IvZm9ybWF0dGVyL1htbFRhZ0Zvcm1hdHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IEpvaG4tTWFzb24gUC4gU2hhY2tlbGZvcmQgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBKb2huLU1hc29uIFAuIFNoYWNrZWxmb3JkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbFRhZ0Zvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci0KLS8qKgotICogIAotICovCi1wdWJsaWMgY2xhc3MgWG1sVGFnRm9ybWF0dGVyVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotICAgIC8vIFRPRE8gVGhpcyB0ZXN0IGlzIHRvbyBsb3cgbGV2ZWwgYW5kIHRvbyB0aWdodGx5IGNvdXBsZWQgdG8gaW50ZXJuYWxzLgotCi0gICAgLyogLS0tLS0tLS0tLS0tLS0tLSBUZXN0IEZpeHR1cmUgLS0tLS0tLS0tLS0tLS0tLSAqLwotICAgIC8vIEluIGNhc2UgYW55b25lIHdvbmRlcnMgd2h5IG1hbnkgcGVvcGxlIHJlY29tbWVuZCBhZ2FpbnN0IHRlc3RpbmcKLSAgICAvLyBwcml2YXRlcywgSSBwcm9kdWNlIHRoaXMgZXhhbXBsZS4uLgotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElubmVyQ2xhc3NGYWN0b3J5IGV4dGVuZHMgWG1sVGFnRm9ybWF0dGVyIHsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMKLSAgICAgICAgICAgICAgICBYbWxUYWdGb3JtYXR0ZXIuUGFyc2VFeGNlcHRpb24gewotCi0gICAgICAgICAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGFnIGV4dGVuZHMgWG1sVGFnRm9ybWF0dGVyLlRhZyB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZ0Zvcm1hdHRlciBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5UYWdGb3JtYXR0ZXIgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBsaW5lUmVxdWlyZXNXcmFwKFN0cmluZyBsaW5lLCBpbnQgbGluZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICBpbnQgdGFiV2lkdGgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIubGluZVJlcXVpcmVzV3JhcChsaW5lLCBsaW5lV2lkdGgsIHRhYldpZHRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCB0YWJFeHBhbmRlZExpbmVXaWR0aChTdHJpbmcgbGluZSwgaW50IHRhYldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRhYkV4cGFuZGVkTGluZVdpZHRoKGxpbmUsIHRhYldpZHRoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIFN0cmluZyB3cmFwVGFnKFRhZyB0YWcsIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluZGVudCkgewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci53cmFwVGFnKHRhZywgcHJlZnMsIGluZGVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhZ1BhcnNlciBleHRlbmRzIFhtbFRhZ0Zvcm1hdHRlci5UYWdQYXJzZXIgewotCi0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKFN0cmluZyB0YWdUZXh0KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgWG1sVGFnRm9ybWF0dGVyLlBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RWxlbWVudE5hbWUodGFnVGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBMaXN0IGdldEF0dGlidXRlcyhTdHJpbmcgZWxlbWVudFRleHQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBYbWxUYWdGb3JtYXR0ZXIuUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRpYnV0ZXMoZWxlbWVudFRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBUYWcgY3JlYXRlVGFnKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGFnRm9ybWF0dGVyIGNyZWF0ZVRhZ0Zvcm1hdHRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGFnRm9ybWF0dGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFRhZ1BhcnNlciBjcmVhdGVUYWdQYXJzZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRhZ1BhcnNlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlQXR0cmlidXRlUGFpcihPYmplY3QgYXR0cmlidXRlUGFpciwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBYbWxUYWdGb3JtYXR0ZXIuQXR0cmlidXRlUGFpciBwYWlyID0gKFhtbFRhZ0Zvcm1hdHRlci5BdHRyaWJ1dGVQYWlyKSBhdHRyaWJ1dGVQYWlyOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGF0dHJpYnV0ZSwgcGFpci5nZXRBdHRyaWJ1dGUoKSk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHBhaXIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqLwotICAgIHB1YmxpYyBYbWxUYWdGb3JtYXR0ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKGZpbmFsIGJvb2xlYW4gd3JhcExvbmdUYWdzLAotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGlnbkNsb3NlQ2hhciwgZmluYWwgaW50IG1heExpbmVXaWR0aCkgewotCi0gICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGluZ1ByZWZlcmVuY2VzKCkgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhbGlnbkVsZW1lbnRDbG9zZUNoYXIoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFsaWduQ2xvc2VDaGFyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB3cmFwTG9uZ1RhZ3MoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBMb25nVGFnczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBnZXRNYXhpbXVtTGluZVdpZHRoKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtYXhMaW5lV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogIAotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzaW1wbGVUZXN0KFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQsCi0gICAgICAgICAgICBGb3JtYXR0aW5nUHJlZmVyZW5jZXMgcHJlZnMsIFN0cmluZyBpbmRlbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgIAkKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IFhtbFRhZ0Zvcm1hdHRlci5mb3JtYXQoc291cmNlLCBwcmVmcywgaW5kZW50KTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKHRhcmdldCwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFRlc3QgTWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tICovCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyR2V0RWxlbWVudE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdQYXJzZXIgdGFnUGFyc2VyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnUGFyc2VyKCk7Ci0KLSAgICAgICAgU3RyaW5nIGVsZW1lbnRGaXh0dXJlMSA9ICI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygibXlFbGVtZW50IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKGVsZW1lbnRGaXh0dXJlMSkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgU3RyaW5nIGVsZW1lbnRGaXh0dXJlMiA9ICI8bXlFbGVtZW50XHRcbmF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGFzc2VydEVxdWFscygibXlFbGVtZW50IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKGVsZW1lbnRGaXh0dXJlMikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eC8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8eD4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBhc3NlcnRFcXVhbHMoIng6eSIsIHRhZ1BhcnNlci5nZXRFbGVtZW50TmFtZSgiPHg6eS8+IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4OnkiLCB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjx4OnkgYWJjLz4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIEV4Y2VwdGlvbiBlMSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0YWdQYXJzZXIuZ2V0RWxlbWVudE5hbWUoIjw+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUxID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlMS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCi0gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLQotICAgICAgICBFeGNlcHRpb24gZTIgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgdGFnUGFyc2VyLmdldEVsZW1lbnROYW1lKCI8PiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlMiA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlMik7Ci0gICAgICAgIGFzc2VydFRydWUoZTIuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAotICAgICAgICAgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlBhcnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyR2V0QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdQYXJzZXIgdGFnUGFyc2VyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnUGFyc2VyKCk7Ci0KLSAgICAgICAgTGlzdCBhdHRyaWJ1dGVQYWlyczsKLQotICAgICAgICAvLyB0ZXN0IG5vcm1hbCBzaXR1YXRpb24KLSAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLSAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVQYWlycy5zaXplKCkpOwotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDApLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUxIiwgInZhbHVlMSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkudmFsaWRhdGVBdHRyaWJ1dGVQYWlyKGF0dHJpYnV0ZVBhaXJzLmdldCgxKSwKLSAgICAgICAgICAgICAgICAiYXR0cmlidXRlMiIsICJ2YWx1ZTIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICAgICAgCi0gICAgICAgIC8vIHRlc3Qgd2l0aCBleHRyYSB3aGl0ZXNwYWNlIGFuZCBmdW5ueSBxdW90ZXMKLSAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLSAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IFxuYXR0cmlidXRlMSA9ICAndmFsdWUxXCInXG5hdHRyaWJ1dGUyXHQ9XCJ2YWx1ZTInXCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIGFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVQYWlycy5zaXplKCkpOwotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDApLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUxIiwgInZhbHVlMVwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS52YWxpZGF0ZUF0dHJpYnV0ZVBhaXIoYXR0cmlidXRlUGFpcnMuZ2V0KDEpLAotICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUyIiwgInZhbHVlMiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLS8vIFRPRE8gYXR0cmlidXRlcyB3aGljaCBjb250YWluIHdoaXRlc3BhY2Ugc2hvdWxkIHRocm93IGEgcGFyc2UgZXJyb3IKLS8vICAgICAgIAotLy8gICAgICAgIC8vIHRlc3QgcGFyc2UgZXJyb3JzIC0gd2hpdGVzcGFjZSBpbiBhdHRyaWJ1dGUgbmFtZQotLy8gICAgICAgIEV4Y2VwdGlvbiBlMSA9IG51bGw7Ci0vLyAgICAgICAgdHJ5IHsKLS8vICAgICAgICAgICAgYXR0cmlidXRlUGFpcnMgPSB0YWdQYXJzZXIKLS8vICAgICAgICAgICAgICAgICAgICAuZ2V0QXR0aWJ1dGVzKCI8bXlFbGVtZW50IGF0IHRyaWJ1dGUxID0gXCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iKTsKLS8vICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotLy8gICAgICAgICAgICBlMSA9IGU7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIGFzc2VydE5vdE51bGwoZTEpOwotLy8gICAgICAgIGFzc2VydFRydWUoZTEuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAotLy8gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHBhcnNlIGVycm9ycyAtIGVxdWFscyBpbiB0aGUgd3JvbmcgcGxhY2UKLSAgICAgICAgRXhjZXB0aW9uIGUyID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXJzID0gdGFnUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiID0gYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUyID0gZTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnROb3ROdWxsKGUyKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShlMi5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oCi0gICAgICAgICAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuUGFyc2VFeGNlcHRpb24uY2xhc3MpKTsKLSAgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyB0ZXN0IHBhcnNlIGVycm9ycyAtIHF1b3RlcyBpbiB0aGUgd3JvbmcgcGxhY2UKLSAgICAgICAgRXhjZXB0aW9uIGUzID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGF0dHJpYnV0ZVBhaXJzID0gdGFnUGFyc2VyCi0gICAgICAgICAgICAgICAgICAgIC5nZXRBdHRpYnV0ZXMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cIlwidmFsdWUxXCIgIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBlMyA9IGU7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbChlMyk7Ci0gICAgICAgIGFzc2VydFRydWUoZTMuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKAotICAgICAgICAgICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlBhcnNlRXhjZXB0aW9uLmNsYXNzKSk7Ci0gICAgICAgIAotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtYXQwMSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgaW5kZW50ID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgc291cmNlID0gIjx0YXJnZXQgbmFtZT1cIm15VGFyZ2V0TmFtZVwiIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCIgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgd3JhcHBlZC5cIj4iOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyB0YXJnZXQgPSAiPHRhcmdldCBuYW1lPVwibXlUYXJnZXROYW1lXCJcbiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50Ci0gICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXBlbmRzPVwiYSxiLGMsZCxlLGYsZ1wiXG4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIGluZGVudAotICAgICAgICAgICAgICAgICsgIiAgICAgICAgZGVzY3JpcHRpb249XCJUaGlzIGlzIGEgdmVyeSBsb25nIGVsZW1lbnQgd2hpY2ggb3VnaHQgdG8gYmUgd3JhcHBlZC5cIj4iOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgc2ltcGxlVGVzdChzb3VyY2UsIHRhcmdldCwgZ2V0UHJlZmVyZW5jZXModHJ1ZSwgZmFsc2UsIDYwKSwgaW5kZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEZvcm1hdDAyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBpbmRlbnQgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBzb3VyY2UgPSAiPHRhcmdldCBuYW1lPVwibXlUYXJnZXROYW1lXCIgZGVwZW5kcz1cImEsYixjLGQsZSxmLGdcIiBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiPiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgU3RyaW5nIHRhcmdldCA9ICI8dGFyZ2V0IG5hbWU9XCJteVRhcmdldE5hbWVcIlxuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyBpbmRlbnQKLSAgICAgICAgICAgICAgICArICIgICAgICAgIGRlcGVuZHM9XCJhLGIsYyxkLGUsZixnXCJcbiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgaW5kZW50Ci0gICAgICAgICAgICAgICAgKyAiICAgICAgICBkZXNjcmlwdGlvbj1cIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgZWxlbWVudCB3aGljaCBvdWdodCB0byBiZSB3cmFwcGVkLlwiXG4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArIGluZGVudCArICI+IjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHNpbXBsZVRlc3Qoc291cmNlLCB0YXJnZXQsIGdldFByZWZlcmVuY2VzKHRydWUsIHRydWUsIDYwKSwgaW5kZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdExpbmVSZXF1aXJlc1dyYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdGb3JtYXR0ZXIgdGFnRm9ybWF0dGVyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnRm9ybWF0dGVyKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBzaG91bGRXcmFwID0gdGFnRm9ybWF0dGVyCi0gICAgICAgICAgICAgICAgLmxpbmVSZXF1aXJlc1dyYXAoCi0gICAgICAgICAgICAgICAgICAgICAgICAiXHRcdCAgPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCIgYXR0cmlidXRlMj1cInZhbHVlMlwiIC8+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgNzAsIDgpOwotICAgICAgICBib29sZWFuIHNob3VsZE5vdFdyYXAgPSB0YWdGb3JtYXR0ZXIKLSAgICAgICAgICAgICAgICAubGluZVJlcXVpcmVzV3JhcCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0IDxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIiAvPiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgIDcwLCA4KTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShzaG91bGRXcmFwKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSghc2hvdWxkTm90V3JhcCk7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiAgCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYkV4cGFuZGVkTGluZVdpZHRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgSW5uZXJDbGFzc0ZhY3RvcnkuVGFnRm9ybWF0dGVyIHRhZ0Zvcm1hdHRlciA9IElubmVyQ2xhc3NGYWN0b3J5Ci0gICAgICAgICAgICAgICAgLmNyZWF0ZVRhZ0Zvcm1hdHRlcigpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygyMCwgdGFnRm9ybWF0dGVyLnRhYkV4cGFuZGVkTGluZVdpZHRoKCJcdCAgMTIzNDU2Nzg5MCIsIDgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMTAsIHRhZ0Zvcm1hdHRlci50YWJFeHBhbmRlZExpbmVXaWR0aCgiMTIzNDU2Nzg5MCIsIDgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHMoMTksIHRhZ0Zvcm1hdHRlcgotICAgICAgICAgICAgICAgIC50YWJFeHBhbmRlZExpbmVXaWR0aCgiXHQxXHQyCTM0NTY3ODkwIiwgMykpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRhYlRvU3RyaW5nQW5kTWluaW11bUxlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWcgdGFnID0gSW5uZXJDbGFzc0ZhY3RvcnkuY3JlYXRlVGFnKCk7Ci0KLSAgICAgICAgdGFnLnNldEVsZW1lbnROYW1lKCJteUVsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0YWcuc2V0Q2xvc2VkKGZhbHNlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50PiIsIHRhZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQodHJ1ZSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCAvPiIsIHRhZy50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTEiLCAidmFsdWUxIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB0YWcuYWRkQXR0cmlidXRlKCJhdHRyaWJ1dGUyIiwgInZhbHVlMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIiBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGFnLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQoZmFsc2UpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIj4iLCAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgdGFnLnRvU3RyaW5nKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHModGFnLnRvU3RyaW5nKCkubGVuZ3RoKCksIHRhZy5taW5pbXVtTGVuZ3RoKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqICAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcFRhZygpIHRocm93cyBFeGNlcHRpb24gewotCi0gICAgICAgIElubmVyQ2xhc3NGYWN0b3J5LlRhZyB0YWcgPSBJbm5lckNsYXNzRmFjdG9yeS5jcmVhdGVUYWcoKTsKLQotICAgICAgICBJbm5lckNsYXNzRmFjdG9yeS5UYWdGb3JtYXR0ZXIgdGFnRm9ybWF0dGVyID0gSW5uZXJDbGFzc0ZhY3RvcnkKLSAgICAgICAgICAgICAgICAuY3JlYXRlVGFnRm9ybWF0dGVyKCk7Ci0KLSAgICAgICAgRm9ybWF0dGluZ1ByZWZlcmVuY2VzIGRvbnRBbGlnbkNsb3NlQ2hhciA9IG5ldyBGb3JtYXR0aW5nUHJlZmVyZW5jZXMoKSB7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFsaWduRWxlbWVudENsb3NlQ2hhcigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIEZvcm1hdHRpbmdQcmVmZXJlbmNlcyBkb0FsaWduQ2xvc2VDaGFyID0gbmV3IEZvcm1hdHRpbmdQcmVmZXJlbmNlcygpIHsKLQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWxpZ25FbGVtZW50Q2xvc2VDaGFyKCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRhZy5zZXRFbGVtZW50TmFtZSgibXlFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgdGFnLmFkZEF0dHJpYnV0ZSgiYXR0cmlidXRlMSIsICJ2YWx1ZTEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIHRhZy5hZGRBdHRyaWJ1dGUoImF0dHJpYnV0ZTIiLCAidmFsdWUyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQodHJ1ZSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIlxuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCIgLz4iLCB0YWdGb3JtYXR0ZXIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIC53cmFwVGFnKHRhZywgZG9udEFsaWduQ2xvc2VDaGFyLCAiXHRcdCAgIikpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCI8bXlFbGVtZW50IGF0dHJpYnV0ZTE9XCJ2YWx1ZTFcIlxuIiAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgKyAiXHRcdCAgICAgICAgICAgICBhdHRyaWJ1dGUyPVwidmFsdWUyXCJcblx0XHQgIC8+IiwgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHRhZ0Zvcm1hdHRlci53cmFwVGFnKHRhZywgZG9BbGlnbkNsb3NlQ2hhciwgIlx0XHQgICIpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIHRhZy5zZXRDbG9zZWQoZmFsc2UpOwotCi0gICAgICAgIGFzc2VydEVxdWFscygiPG15RWxlbWVudCBhdHRyaWJ1dGUxPVwidmFsdWUxXCJcbiIgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICsgIlx0XHQgICAgICAgICAgICAgYXR0cmlidXRlMj1cInZhbHVlMlwiPiIsIHRhZ0Zvcm1hdHRlciAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgLndyYXBUYWcodGFnLCBkb250QWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIjxteUVsZW1lbnQgYXR0cmlidXRlMT1cInZhbHVlMVwiXG4iIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICArICJcdFx0ICAgICAgICAgICAgIGF0dHJpYnV0ZTI9XCJ2YWx1ZTJcIlxuXHRcdCAgPiIsIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB0YWdGb3JtYXR0ZXIud3JhcFRhZyh0YWcsIGRvQWxpZ25DbG9zZUNoYXIsICJcdFx0ICAiKSk7IC8vJE5PTi1OTFMtMSQKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RCdWc2MzU1OCgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy8gT3JkaW5hcmlseSB0aGUgZG91YmxlIHNwYWNlIGFmdGVyIHRoZSBlbGVtZW50IG5hbWUgd291bGQgYmUgcmVwYWlyZWQKLQkJLy8gYnV0IGlmIHRoZSBmb3JtYXR0ZXIgaXMgd29ya2luZyBjb3JyZWN0bHkgdGhlc2UgZXhhbXBsZXMgd2lsbCBiZQotCQkvLyBjb25zaWRlcmVkIG1hbGZvcm1lZCBhbmQgd2lsbCBiZSBwYXNzZWQgdGhyb3VnaCB1bnRvdWNoZWQuCi0JCQotCQlTdHJpbmcgc291cmNlMSA9ICI8ZWNobyAgZmlsZT1cImZvb1wiPlxuJmx0O2h0bWw+Jmx0O2JvZHk+Jmx0O3ByZT4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICIke2NvbXBpbGVsb2d9Jmx0Oy9wcmU+Jmx0Oy9ib2R5PiZsdDsvaHRtbD4iOyAvLyROT04tTkxTLTEkCi0JCUZvcm1hdHRpbmdQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKHRydWUsIGZhbHNlLCA2MCk7IC8vJE5PTi1OTFMtMSQKLQkJc2ltcGxlVGVzdChzb3VyY2UxLCBzb3VyY2UxLCBwcmVmcywgIlx0Iik7Ci0JCi0JCVN0cmluZyBzb3VyY2UyID0gIjxlY2hvICBmaWxlPVwiZm9vXCIvYmFyL2Jhej48L2VjaG8+IjsgLy8kTk9OLU5MUy0xJAkJCi0JCXNpbXBsZVRlc3Qoc291cmNlMiwgc291cmNlMiwgcHJlZnMsICJcdCIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdEVkaXRvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0RWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTZjOTMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0RWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RWRpdG9yIGV4dGVuZHMgQW50RWRpdG9yIHsKLQkKLQlUZXN0RWRpdG9yKCkgewotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplRWRpdG9yKCkgewotICAgIH0KLSAgICAvKiogCi0gICAgICogUmV0dXJucyAnMTAnLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjZ2V0Q3Vyc29yUG9zaXRpb24oKQotICAgICAqLwotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiAiMTAiOwotICAgIH0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdExvY2F0aW9uUHJvdmlkZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdExvY2F0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4NWRlMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBFZGl0b3IgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL2VkaXRvci9zdXBwb3J0L1Rlc3RMb2NhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotCi0KLXB1YmxpYyBjbGFzcyBUZXN0TG9jYXRpb25Qcm92aWRlciBleHRlbmRzIExvY2F0aW9uUHJvdmlkZXIgewotCi0JcHJpdmF0ZSBGaWxlIGJ1aWxkRmlsZTsKLQkKLQlwdWJsaWMgVGVzdExvY2F0aW9uUHJvdmlkZXIoRmlsZSBidWlsZEZpbGUpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuYnVpbGRGaWxlPSBidWlsZEZpbGU7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5JTG9jYXRpb25Qcm92aWRlciNnZXRMb2NhdGlvbigpCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBhdGgoYnVpbGRGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0UHJvYmxlbVJlcXVlc3Rvci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0UHJvYmxlbVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjM3OGQwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFByb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnN1cHBvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yOwotCi1wdWJsaWMgY2xhc3MgVGVzdFByb2JsZW1SZXF1ZXN0b3IgaW1wbGVtZW50cyBJUHJvYmxlbVJlcXVlc3RvciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYWNjZXB0UHJvYmxlbShvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW0pCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0UHJvYmxlbShJUHJvYmxlbSBwcm9ibGVtKSB7Ci0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuSVByb2JsZW1SZXF1ZXN0b3IjYmVnaW5SZXBvcnRpbmcoKQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVwb3J0aW5nKCkgewotCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLklQcm9ibGVtUmVxdWVzdG9yI2VuZFJlcG9ydGluZygpCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IEVkaXRvciBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZWRpdG9yL3N1cHBvcnQvVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNjUxY2IuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgRWRpdG9yIFRlc3RzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9lZGl0b3Ivc3VwcG9ydC9UZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5zdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5vdXRsaW5lLkFudE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIFRlc3RUZXh0Q29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgVEVTVF9QUk9QT1NBTF9NT0RFX05PTkUgPSBBbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yLlBST1BPU0FMX01PREVfTk9ORTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQlVJTERGSUxFID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0JVSUxERklMRTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTCA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9UQVNLX1BST1BPU0FMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFU1RfUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTCA9IEFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IuUFJPUE9TQUxfTU9ERV9QUk9QRVJUWV9QUk9QT1NBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9QUk9QT1NBTDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfVEFTS19QUk9QT1NBTF9DTE9TSU5HID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX1RBU0tfUFJPUE9TQUxfQ0xPU0lORzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBURVNUX1BST1BPU0FMX01PREVfQVRUUklCVVRFX1ZBTFVFX1BST1BPU0FMID0gQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3Nvci5QUk9QT1NBTF9NT0RFX0FUVFJJQlVURV9WQUxVRV9QUk9QT1NBTDsKLQkKLQlwcml2YXRlIEZpbGUgZWRpdGVkRmlsZTsKLQotCXB1YmxpYyBUZXN0VGV4dENvbXBsZXRpb25Qcm9jZXNzb3IoQW50TW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgVGVzdFRleHRDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlzdXBlcihudWxsKTsKLQl9Ci0JCi0gICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRBdHRyaWJ1dGVQcm9wb3NhbHMoU3RyaW5nIHRhc2tOYW1lLCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgCWlmIChjdXJzb3JQb3NpdGlvbiA9PSAtMSkgewotICAgIAkJY3Vyc29yUG9zaXRpb249IHRhc2tOYW1lLmxlbmd0aCgpOwotICAgIAl9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVQcm9wb3NhbHModGFza05hbWUsIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVsZW1lbnQgZmluZENoaWxkRWxlbWVudE5hbWVkT2YoRWxlbWVudCBhbkVsZW1lbnQsIFN0cmluZyBjaGlsZEVsZW1lbnROYW1lKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5maW5kQ2hpbGRFbGVtZW50TmFtZWRPZihhbkVsZW1lbnQsIGNoaWxkRWxlbWVudE5hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0VGFza1Byb3Bvc2FscyhTdHJpbmcgdGV4dCwgU3RyaW5nIHBhcmVudE5hbWUsIFN0cmluZyBwcmVmaXgpIHsKLSAgICAJY3Vyc29yUG9zaXRpb249IE1hdGgubWF4KDAsIHRleHQubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFRhc2tQcm9wb3NhbHMobmV3IERvY3VtZW50KHRleHQpLCBwYXJlbnROYW1lLCBwcmVmaXgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhc2tQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIGFQcmVmaXgpIHsKLSAgICAJY3Vyc29yUG9zaXRpb249IE1hdGgubWF4KDAsIGRvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0gICAgCXJldHVybiBzdXBlci5nZXRUYXNrUHJvcG9zYWxzKGRvY3VtZW50LCBwYXJlbnROYW1lLCBhUHJlZml4KTsKLSAgICB9Ci0gICAgCi0gICAgLy9UT0RPIGFkZCB0ZW1wbGF0ZSBwcm9wb3NhbCB0ZXN0aW5nCi0gICAgcHJvdGVjdGVkIENvbGxlY3Rpb24gZ2V0VGVtcGxhdGVQcm9wb3NhbHMoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHJlZml4KSB7Ci0gICAgCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBkZXRlcm1pbmVQcm9wb3NhbE1vZGUoU3RyaW5nIHRleHQsIGludCB0aGVDdXJzb3JQb3NpdGlvbiwgU3RyaW5nIHByZWZpeCkgewotICAgICAgICByZXR1cm4gc3VwZXIuZGV0ZXJtaW5lUHJvcG9zYWxNb2RlKG5ldyBEb2N1bWVudCh0ZXh0KSwgdGhlQ3Vyc29yUG9zaXRpb24sIHByZWZpeCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKFN0cmluZyB0ZXh0LCBpbnQgYUxpbmVOdW1iZXIsIGludCBhQ29sdW1uTnVtYmVyKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRQYXJlbnROYW1lKG5ldyBEb2N1bWVudCh0ZXh0KSwgYUxpbmVOdW1iZXIsIGFDb2x1bW5OdW1iZXIpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmVudE5hbWUoSURvY3VtZW50IGRvYywgaW50IGFMaW5lTnVtYmVyLCBpbnQgYUNvbHVtbk51bWJlcikgewotICAgIAlyZXR1cm4gc3VwZXIuZ2V0UGFyZW50TmFtZShkb2MsIGFMaW5lTnVtYmVyLCBhQ29sdW1uTnVtYmVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeEZyb21Eb2N1bWVudChTdHJpbmcgYURvY3VtZW50VGV4dCwgaW50IGFuT2Zmc2V0KSB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXg9IHN1cGVyLmdldFByZWZpeEZyb21Eb2N1bWVudChhRG9jdW1lbnRUZXh0LCBhbk9mZnNldCk7Ci0gICAgICAgIGN1cnJlbnRQcmVmaXg9IG51bGw7Ci0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wZXJ0eVByb3Bvc2FscyhJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwcmVmaXgsIGludCBjdXJzb3JQb3MpIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5UHJvcG9zYWxzKGRvY3VtZW50LCBwcmVmaXgsIGN1cnNvclBvcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWRpdGVkIEZpbGUgdGhhdCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3Igc2V0cyBvciBhIHRlbXBvcmFyeSAKLSAgICAgKiBmaWxlLCB3aGljaCBvbmx5IHNlcnZlcyBhcyBhIGR1bW15LgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmVkaXRvci5BbnRFZGl0b3JDb21wbGV0aW9uUHJvY2Vzc29yI2dldEVkaXRlZEZpbGUoKQotICAgICAqLwotCXB1YmxpYyBGaWxlIGdldEVkaXRlZEZpbGUoKSB7Ci0JCWlmIChlZGl0ZWRGaWxlICE9IG51bGwpewotCQkJcmV0dXJuIGVkaXRlZEZpbGU7Ci0JCX0KLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3QiLCBudWxsKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHRlbXBGaWxlLmRlbGV0ZU9uRXhpdCgpOwotICAgICAgICByZXR1cm4gdGVtcEZpbGU7Ci0gICAgfQotCi0JcHVibGljIHZvaWQgc2V0TGluZU51bWJlcihpbnQgYUxpbmVOdW1iZXIpIHsKLSAgICAJbGluZU51bWJlciA9IGFMaW5lTnVtYmVyOwotICAgIH0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbk51bWJlcihpbnQgYUNvbHVtbk51bWJlcikgewotICAgIAljb2x1bW5OdW1iZXIgPSBhQ29sdW1uTnVtYmVyOwotICAgIH0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJdGhpcy5jdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLSAgICAKLQlwdWJsaWMgdm9pZCBzZXRFZGl0ZWRGaWxlKEZpbGUgYUZpbGUpIHsKLQkJZWRpdGVkRmlsZT0gYUZpbGU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3IuQW50RWRpdG9yQ29tcGxldGlvblByb2Nlc3NvciNnZXRUYXJnZXRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHRleHRUb1NlYXJjaCwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFRhcmdldEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50LCB0ZXh0VG9TZWFyY2gsIHByZWZpeCwgYXR0cmlidXRlTmFtZSk7Ci0JfQotCS8qKgotCSAqIFNpbmNlIHRoZSB0ZXN0aW5nIG9jY3VycyB3aXRob3V0IG5lY2Vzc2FyaWx5IGhhdmluZyBhbiBhc3NvY2lhdGVkIHZpZXdlciwgcmV0dXJuCi0JICogYSBkdW1teSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBnZXRQcmV2aW91c0NoYXIoKSB7Ci0JCXJldHVybiAnPyc7Ci0JfQotCQotCSAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0YXNrIG5hbWUgaXMga25vd24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLbm93bkVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0gICAgCWlmIChhbnRNb2RlbCAhPSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gc3VwZXIuaXNLbm93bkVsZW1lbnQoZWxlbWVudE5hbWUpOwotICAgIAl9IAotICAgIAlyZXR1cm4gZHRkLmdldEVsZW1lbnQoZWxlbWVudE5hbWUpICE9IG51bGwgOwotICAgIH0KLSAgICAKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcG9zYWxzRnJvbURvY3VtZW50KGRvY3VtZW50LCBwcmVmaXgpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLkFudEVkaXRvckNvbXBsZXRpb25Qcm9jZXNzb3IjZ2V0QnVpbGRGaWxlUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0QnVpbGRGaWxlUHJvcG9zYWxzKFN0cmluZyB0ZXh0LCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdXBlci5nZXRCdWlsZEZpbGVQcm9wb3NhbHMobmV3IERvY3VtZW50KHRleHQpLCBwcmVmaXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0Fic3RyYWN0QW50VUlCdWlsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IxZjI0NC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0UmVzdWx0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQ29uc29sZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdCBleHRlbmRzIEFic3RyYWN0QW50VUlUZXN0IHsKLQotCS8qKgotCSAqIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGVzdCBhcmUgaW4gcHJvZ3Jlc3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0aW5nID0gdHJ1ZTsKLQkJCi0JcHVibGljIEFic3RyYWN0QW50VUlCdWlsZFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJ1bnMgdGhlIHRlc3QgYW5kIGNvbGxlY3RzIHRoZSByZXN1bHQgaW4gYSBUZXN0UmVzdWx0IHdpdGhvdXQgYmxvY2tpbmcKLQkgKiB0aGUgVUkgdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBUZXN0UmVzdWx0IHJlc3VsdCkgewotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJVGhyZWFkIHRocmVhZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdC5zdXBlci5ydW4ocmVzdWx0KTsJCQotCQkJCQl0ZXN0aW5nID0gZmFsc2U7Ci0JCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJCX0KLQkJCX07Ci0JCQl0aHJlYWQgPSBuZXcgVGhyZWFkKHIpOwotCQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCQotCQl3aGlsZSAodGVzdGluZykgewotCQkJdHJ5IHsKLQkJCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0JCQkKLQkJfQkJCi0JfQotCQotCS8qKgotCSAqIExhdW5jaGVzIHRoZSBBbnQgYnVpbGQgd2l0aCB0aGUgYnVpbGRmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCi0JICogV2FpdHMgZm9yIGFsbCBvZiB0aGUgbGluZXMgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuCi0JICogCi0JICogQHBhcmFtIG1haW5UeXBlTmFtZSB0aGUgcHJvZ3JhbSB0byBsYXVuY2gKLQkgKiBAcmV0dXJuIHRocmVhZCBpbiB3aGljaCB0aGUgZmlyc3Qgc3VzcGVuZCBldmVudCBvY2N1cnJlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaChTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlci5sYXVuY2goYnVpbGRGaWxlTmFtZSk7Ci0JCUNvbnNvbGVMaW5lVHJhY2tlci53YWl0Rm9yQ29uc29sZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZUxpbmsoZmluYWwgSUNvbnNvbGVIeXBlcmxpbmsgbGluaykgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWxpbmsubGlua0FjdGl2YXRlZCgpOwotCQkJfQotCQl9KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQWJzdHJhY3RBbnRVSVRlc3QjbGF1bmNoKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgYXJndW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXN1cGVyLmxhdW5jaChidWlsZEZpbGVOYW1lLCBhcmd1bWVudHMpOwotCQlDb25zb2xlTGluZVRyYWNrZXIud2FpdEZvckNvbnNvbGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQnVpbGRUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL0J1aWxkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk0NTYzZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvQnVpbGRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuQW50VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLklBbnRVSVByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQ29uc29sZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci0KLQotcHVibGljIGNsYXNzIEJ1aWxkVGVzdHMgZXh0ZW5kcyBBYnN0cmFjdEFudFVJQnVpbGRUZXN0IHsKLQotCXB1YmxpYyBCdWlsZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLSAgLyoqCi0gICAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIGdldHRpbmcgbWVzc2FnZXMKLSAgICogbG9nZ2VkIHRvIHRoZSBjb25zb2xlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE91dHB1dCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkgIGxhdW5jaCgiZWNob2luZyIpOwotCSAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgZm9yIGJ1aWxkLiBTaG91bGQgYmUgOC4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDgpOwotCSAgU3RyaW5nIG1lc3NhZ2U9IENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDYpOwotCSAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGxhc3QgbWVzc2FnZS4gU2hvdWxkIHN0YXJ0IHdpdGggVG90YWwgdGltZTouIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLCBtZXNzYWdlLnN0YXJ0c1dpdGgoIlRvdGFsIHRpbWU6IikpOwotICB9Ci0gIAotICAvKioKLQkgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGFuZCBnZXR0aW5nIHRoZSBidWlsZCBmYWlsZWQgbWVzc2FnZQotCSAqIGxvZ2dlZCB0byB0aGUgY29uc29sZSB3aXRoIGFzc29jaWF0ZWQgbGluay4KLQkgKiBCdWcgNDIzMzMgYW5kIDQ0NTY1Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkRmFpbGVkTWVzc2FnZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbGF1bmNoKCJiYWQiKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgZm9yIGJ1aWxkLiBTaG91bGQgYmUgNy4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDcpOwotCQlTdHJpbmcgbWVzc2FnZT0gQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoNCk7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIEJ1aWxkIEZhaWxlZDouIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLCBtZXNzYWdlLnN0YXJ0c1dpdGgoIkJVSUxEIEZBSUxFRDoiKSk7Ci0JCWludCBvZmZzZXQ9IC0xOwotCQl0cnkgewotCQkJb2Zmc2V0PSBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KDQpICsgMzA7IC8vbGluayB0byBidWlsZGZpbGUgdGhhdCBmYWlsZWQKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIGdldHRpbmcgb2Zmc2V0IG9mIGxpbmUiLCBmYWxzZSk7Ci0JCX0KLQkJSUNvbnNvbGVIeXBlcmxpbmsgbGluaz0gZ2V0SHlwZXJsaW5rKG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBoeXBlcmxpbmsgZm91bmQgYXQgb2Zmc2V0ICIgKyBvZmZzZXQsIGxpbmspOwotCX0KLSAgCi0gIC8qKgotCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIHRoYXQgdGhlCi0JICogY29ycmVjdCBsaW5rcyBhcmUgaW4gdGhlIGNvbnNvbGUgZG9jCi0JICovCi0JcHVibGljIHZvaWQgdGVzdExpbmtzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlsYXVuY2goImJ1aWxkIik7Ci0JCWludCBvZmZzZXQ9IDI1OyAvL2J1aWxkZmlsZSBsaW5rCi0JCUlDb25zb2xlSHlwZXJsaW5rIGxpbms9IGdldEh5cGVybGluayhvZmZzZXQsIENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLQkJYWN0aXZhdGVMaW5rKGxpbmspOwotCQkKLQkJdHJ5IHsKLQkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCg0KSArIDEwOyAvL2VjaG8gbGluawotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJmYWlsZWQgZ2V0dGluZyBvZmZzZXQgb2YgbGluZSIsIGZhbHNlKTsKLQkJfQotCQlsaW5rPSBnZXRIeXBlcmxpbmsob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGh5cGVybGluayBmb3VuZCBhdCBvZmZzZXQgIiArIG9mZnNldCwgbGluayk7Ci0JCWFjdGl2YXRlTGluayhsaW5rKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgbGF1bmNoaW5nIEFudCBhbmQgdGhhdCB0aGUKLQkgKiBjb3JyZWN0IGNvbG9ycyBhcmUgaW4gdGhlIGNvbnNvbGUgZG9jCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbG9yKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsJCQotCQlsYXVuY2goImVjaG9pbmciKTsKLQkJaW50IG9mZnNldD0gMTU7IC8vYnVpbGRmaWxlCi0JCUNvbG9yIGNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb2xvciBmb3VuZCBhdCAiICsgb2Zmc2V0LCBjb2xvcik7Ci0JCWFzc2VydEVxdWFscyhBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fQ09MT1IpLCBjb2xvcik7Ci0JCXRyeSB7Ci0JCQlvZmZzZXQ9IENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpLmdldExpbmVPZmZzZXQoNCkgKyAxMDsgLy9lY2hvCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotCQl9Ci0JCWNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBjb2xvciBmb3VuZCBhdCAiICsgb2Zmc2V0LCBjb2xvcik7Ci0JCWFzc2VydEVxdWFscyhBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IpLCBjb2xvcik7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIGdldHRpbmcgdGhlIGJ1aWxkIGZhaWxlZCBtZXNzYWdlCi0JICogbG9nZ2VkIHRvIHRoZSBjb25zb2xlLgotCSAqIEJ1ZyA0MjMzMy4KLQkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEZhaWxlZE1lc3NhZ2VEZWJ1ZygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLS8vCQlsYXVuY2hJbkRlYnVnKCJiYWQiKTsKLS8vCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSAzNS4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDM1KTsKLS8vCQlTdHJpbmcgbWVzc2FnZT0gQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMzMpOwotLy8JCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIEJ1aWxkIEZhaWxlZDouIE1lc3NhZ2U6ICIgKyBtZXNzYWdlLCBtZXNzYWdlLnN0YXJ0c1dpdGgoIkJVSUxEIEZBSUxFRDoiKSk7Ci0vLwkJfQotLy8gIAotLy8JICAvKioKLS8vCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIHRoYXQgdGhlCi0vLwkgKiBjb3JyZWN0IGxpbmtzIGFyZSBpbiB0aGUgY29uc29sZSBkb2MKLS8vCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdExpbmtzRGVidWcoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0vLwkJbGF1bmNoSW5EZWJ1ZygiZWNob2luZyIpOwotLy8JCWludCBvZmZzZXQ9IDA7IAotLy8JCXRyeSB7Ci0vLwkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgyKSArIDE1OyAvL2J1aWxkZmlsZSBsaW5lIDMKLS8vCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotLy8JCX0KLS8vCQlJQ29uc29sZUh5cGVybGluayBsaW5rPSBnZXRIeXBlcmxpbmsob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLS8vCQotLy8JCXRyeSB7Ci0vLwkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgzMykgKyAxMDsgLy9lY2hvIGxpbmsKLS8vCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0vLwkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotLy8JCX0KLS8vCQlsaW5rPSBnZXRIeXBlcmxpbmsob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFRlc3RzIGxhdW5jaGluZyBBbnQgYW5kIHRoYXQgdGhlCi0vLwkgKiBjb3JyZWN0IGNvbG9ycyBhcmUgaW4gdGhlIGNvbnNvbGUgZG9jCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RDb2xvckRlYnVnKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLS8vCQlsYXVuY2hJbkRlYnVnKCJlY2hvaW5nIik7Ci0vLwkJaW50IG9mZnNldD0gMDsgCi0vLwkJdHJ5IHsKLS8vCQkJb2Zmc2V0PSBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KDIpICsgMTU7IC8vYnVpbGRmaWxlIGxpbmUgMwotLy8JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLS8vCQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIGdldHRpbmcgb2Zmc2V0IG9mIGxpbmUiLCBmYWxzZSk7Ci0vLwkJfQotLy8JCUNvbG9yIGNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotLy8JCWFzc2VydE5vdE51bGwoIk5vIGNvbG9yIGZvdW5kIGF0ICIgKyBvZmZzZXQsIGNvbG9yKTsKLS8vCQlhc3NlcnRFcXVhbHMoQW50VUlQbHVnaW4uZ2V0UHJlZmVyZW5jZUNvbG9yKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9JTkZPX0NPTE9SKSwgY29sb3IpOwotLy8JCQotLy8JCXRyeSB7Ci0vLwkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCg0KSArIDM7IC8vZGVidWcgaW5mbwotLy8JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLS8vCQkJYXNzZXJ0VHJ1ZSgiZmFpbGVkIGdldHRpbmcgb2Zmc2V0IG9mIGxpbmUiLCBmYWxzZSk7Ci0vLwkJfQotLy8JCWNvbG9yPSBnZXRDb2xvckF0T2Zmc2V0KG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotLy8JCWFzc2VydE5vdE51bGwoIk5vIGNvbG9yIGZvdW5kIGF0ICIgKyBvZmZzZXQsIGNvbG9yKTsKLS8vCQlhc3NlcnRFcXVhbHMoQW50VUlQbHVnaW4uZ2V0UHJlZmVyZW5jZUNvbG9yKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQ09OU09MRV9ERUJVR19DT0xPUiksIGNvbG9yKTsKLS8vCQkKLS8vCQl0cnkgewotLy8JCQlvZmZzZXQ9IENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpLmdldExpbmVPZmZzZXQoMzMpICsgMTA7IC8vZWNobyBsaW5lIDMzCi0vLwkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotLy8JCQlhc3NlcnRUcnVlKCJmYWlsZWQgZ2V0dGluZyBvZmZzZXQgb2YgbGluZSIsIGZhbHNlKTsKLS8vCQl9Ci0vLwkJY29sb3I9IGdldENvbG9yQXRPZmZzZXQob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbCgiTm8gY29sb3IgZm91bmQgYXQgIiArIG9mZnNldCwgY29sb3IpOwotLy8JCWFzc2VydEVxdWFscyhBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX1dBUk5JTkdfQ09MT1IpLCBjb2xvcik7Ci0vLwl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVGVzdHMvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3NlcGFyYXRlVk0vU2VwYXJhdGVWTVRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc2VwYXJhdGVWTS9TZXBhcmF0ZVZNVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5Y2ZlZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBUZXN0cy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc2VwYXJhdGVWTS9TZXBhcmF0ZVZNVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnNlcGFyYXRlVk07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5Db25zb2xlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotCi1wdWJsaWMgY2xhc3MgU2VwYXJhdGVWTVRlc3RzIGV4dGVuZHMgQWJzdHJhY3RBbnRVSUJ1aWxkVGVzdCB7Ci0JCQotICAgIHB1YmxpYyBTZXBhcmF0ZVZNVGVzdHMoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2VwYXJhdGVWTVRlc3RzLmNsYXNzKTsKLQl9Ci0KLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIGdldHRpbmcgbWVzc2FnZXMKLSAgICAgKiBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZWNob2luZ1NlcFZNIik7Ci0gICAgICAJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG51bWJlciBvZiBtZXNzYWdlcyBsb2dnZWQgZm9yIGJ1aWxkLiBTaG91bGQgYmUgNi4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDYpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFRvdGFsIHRpbWU6LiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoNCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDQpLnN0YXJ0c1dpdGgoIlRvdGFsIHRpbWU6IikpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIGhhdmluZyBhbiBleHRyYSBjbGFzc3BhdGggZW50cnkgZGVzaWduYXRlZCB0byBiZSBhdmFpbGJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFDbGFzc3BhdGhFbnRyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRTZXBWTSIpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgbWVzc2FnZXMgbG9nZ2VkIGZvciBidWlsZC4gU2hvdWxkIGJlIDguIFdhcyAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSA9PSA4KTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGFzdCBtZXNzYWdlLiBTaG91bGQgc3RhcnQgd2l0aCBUb3RhbCB0aW1lOi4gTWVzc2FnZTogIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDYpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSg2KS5zdGFydHNXaXRoKCJUb3RhbCB0aW1lOiIpKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGVzdHMgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIGFuZCBoYXZpbmcgYW4gZXh0cmEgY2xhc3NwYXRoIGVudHJ5IGRlc2lnbmF0ZWQgdG8gYmUgYXZhaWxhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRTZXBWTSIpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBudW1iZXIgb2YgbWVzc2FnZXMgbG9nZ2VkIGZvciBidWlsZC4gU2hvdWxkIGJlIDguIFdhcyAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE51bWJlck9mTWVzc2FnZXMoKSA9PSA4KTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGFzdCBtZXNzYWdlLiBTaG91bGQgc3RhcnQgd2l0aCBbZWNob10gJHtwcm9wZXJ0eS51aS50ZXN0aW5nLiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMyksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDMpLnRyaW0oKS5zdGFydHNXaXRoKCJbZWNob10gJHtwcm9wZXJ0eS51aS50ZXN0aW5nIikpOwotICAgICAgCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFtlY2hvXSBoZXkuIE1lc3NhZ2U6ICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSg0KSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoNCkudHJpbSgpLnN0YXJ0c1dpdGgoIltlY2hvXSBoZXkiKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSB2bSBhbmQgaGF2aW5nIGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBkZXNpZ25hdGVkIHRvIGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUG9pbnRUYXNrKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0iKTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSA2LiBXYXMgIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCkgPT0gNik7Ci0gICAgICAJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFtudWxsXSBUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzazIuIE1lc3NhZ2U6ICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSgyKSwgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMikudHJpbSgpLnN0YXJ0c1dpdGgoIltudWxsXSBUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzazIiKSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFRlc3RzIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSB2bSBhbmQgaGF2aW5nIGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBkZXNpZ25hdGVkIHRvIGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUG9pbnRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotICAgICAgCWxhdW5jaCgiZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0iKTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSA2LiBXYXMgIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCkgPT0gNik7Ci0gICAgICAJYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IG1lc3NhZ2UuIFNob3VsZCBzdGFydCB3aXRoIFtlY2hvXSBFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlLiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMiksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDIpLnRyaW0oKS5zdGFydHNXaXRoKCJbZWNob10gRW5zdXJlIHRoYXQgYW4gZXh0ZW5zaW9uIHBvaW50IGRlZmluZWQgdHlwZSIpKTsKLSAgICB9Ci0gICAgCi0JLyoqCi0JICogVGVzdHMgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIGFuZCB0aGF0IHRoZQotCSAqIGNvcnJlY3QgbGlua3MgYXJlIGluIHRoZSBjb25zb2xlIGRvYwotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMaW5rcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbGF1bmNoKCJlY2hvaW5nU2VwVk0iKTsKLQkJaW50IG9mZnNldD0gMTU7IC8vYnVpbGRmaWxlIGxpbmsKLQkJSUNvbnNvbGVIeXBlcmxpbmsgbGluaz0gZ2V0SHlwZXJsaW5rKG9mZnNldCwgQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkpOwotCQlhc3NlcnROb3ROdWxsKCJObyBoeXBlcmxpbmsgZm91bmQgYXQgb2Zmc2V0ICIgKyBvZmZzZXQsIGxpbmspOwotCQl0cnkgewotCQkJb2Zmc2V0PSBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2Zmc2V0KDIpICsgMTA7IC8vZWNobyBsaW5rCi0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUoImZhaWxlZCBnZXR0aW5nIG9mZnNldCBvZiBsaW5lIiwgZmFsc2UpOwotCQl9Ci0JCWxpbms9IGdldEh5cGVybGluayhvZmZzZXQsIENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gaHlwZXJsaW5rIGZvdW5kIGF0IG9mZnNldCAiICsgb2Zmc2V0LCBsaW5rKTsKLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIHZtIGFuZCB0aGF0IHRoZQotCSAqIGNvcnJlY3QgY29sb3JzIGFyZSBpbiB0aGUgY29uc29sZSBkb2MKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sb3IoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlsYXVuY2goImVjaG9pbmdTZXBWTSIpOwotCQlpbnQgb2Zmc2V0PSAxNTsgLy9idWlsZGZpbGUKLQkJQ29sb3IgY29sb3I9IGdldENvbG9yQXRPZmZzZXQob2Zmc2V0LCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCWFzc2VydE5vdE51bGwoIk5vIGNvbG9yIGZvdW5kIGF0ICIgKyBvZmZzZXQsIGNvbG9yKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbG9yLCBBbnRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlQ29sb3IoSUFudFVJUHJlZmVyZW5jZUNvbnN0YW50cy5DT05TT0xFX0lORk9fQ09MT1IpKTsKLQkJdHJ5IHsKLQkJCW9mZnNldD0gQ29uc29sZUxpbmVUcmFja2VyLmdldERvY3VtZW50KCkuZ2V0TGluZU9mZnNldCgyKSArIDEwOyAvL2VjaG8gbGluawotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRUcnVlKCJmYWlsZWQgZ2V0dGluZyBvZmZzZXQgb2YgbGluZSIsIGZhbHNlKTsKLQkJfQotCQljb2xvcj0gZ2V0Q29sb3JBdE9mZnNldChvZmZzZXQsIENvbnNvbGVMaW5lVHJhY2tlci5nZXREb2N1bWVudCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gY29sb3IgZm91bmQgYXQgIiArIG9mZnNldCwgY29sb3IpOwotCQlhc3NlcnRFcXVhbHMoY29sb3IsIEFudFVJUGx1Z2luLmdldFByZWZlcmVuY2VDb2xvcihJQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzLkNPTlNPTEVfV0FSTklOR19DT0xPUikpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIHRoYXQgdGhlCi0JICogY29ycmVjdCB3b3JraW5nIGRpcmVjdG9yeSBpcyBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V29ya2luZ0RpcmVjdG9yeSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbigiZWNob2luZ1NlcFZNIik7Ci0JCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyAiZWNob2luZ1NlcFZNIiwgY29uZmlnKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb3B5PSBjb25maWcuZ2V0V29ya2luZ0NvcHkoKTsKLQkJY29weS5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksIGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLQkJY29weS5zZXRBdHRyaWJ1dGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9BTlRfVEFSR0VUUywgIkJ1ZzQyOTg0Iik7Ci0JCWxhdW5jaEFuZFRlcm1pbmF0ZShjb3B5LCAyMDAwMCk7Ci0JCUNvbnNvbGVMaW5lVHJhY2tlci53YWl0Rm9yQ29uc29sZSgpOwotCQlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSA2LiBXYXMgIiArIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCksIENvbnNvbGVMaW5lVHJhY2tlci5nZXROdW1iZXJPZk1lc3NhZ2VzKCkgPT0gNik7Ci0JCWFzc2VydFRydWUoIkluY29ycmVjdCBsYXN0IG1lc3NhZ2UuIFNob3VsZCBlbmQgd2l0aCAiICsgUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUgKyAiLiBNZXNzYWdlOiAiICsgQ29uc29sZUxpbmVUcmFja2VyLmdldE1lc3NhZ2UoMiksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDIpLmVuZHNXaXRoKFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKSk7Ci0JfQotCQotCSAvKioKLSAgICAgKiBUZXN0cyBsYXVuY2hpbmcgQW50IGluIGEgc2VwYXJhdGUgdm0gYW5kIGdldHRpbmcgbWVzc2FnZXMKLSAgICAgKiBsb2dnZWQgdG8gdGhlIGNvbnNvbGUgZm9yIHByb2plY3QgaGVscC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdEhlbHAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0gICAgICAJbGF1bmNoKCJlY2hvaW5nU2VwVk0iLCAiLXAiKTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbnVtYmVyIG9mIG1lc3NhZ2VzIGxvZ2dlZCBmb3IgYnVpbGQuIFNob3VsZCBiZSAxNC4gV2FzICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpLCBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TnVtYmVyT2ZNZXNzYWdlcygpID09IDE0KTsKLSAgICAgIAlhc3NlcnRUcnVlKCJJbmNvcnJlY3QgbGFzdCBtZXNzYWdlLiBTaG91bGQgc3RhcnQgd2l0aCBlY2hvMjouIE1lc3NhZ2U6ICIgKyBDb25zb2xlTGluZVRyYWNrZXIuZ2V0TWVzc2FnZSgxMiksIENvbnNvbGVMaW5lVHJhY2tlci5nZXRNZXNzYWdlKDEyKS50cmltKCkuc3RhcnRzV2l0aCgiZWNobzIiKSk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS8ucHJvamVjdCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhZWE3MS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgRXh0IERpciBUZXN0IEV4YW1wbGUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BbnRWaWV3IEV4dERpciBUZXN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEV4dCBEaXIgVGVzdCBFeGFtcGxlL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MzNhZDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEV4dCBEaXIgVGVzdCBFeGFtcGxlL2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJFeHRlcm5hbCBEaXIgVGVzdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdC1vbmUiPiAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IkluaXQiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3Qtb25lIiBkZXBlbmRzPSJpbml0LHRlc3QtdHdvIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJPbmUgLSBtdWx0aXBsZSBkZXBlbmRlbnRzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXR3byIgZGVwZW5kcz0iaW5pdCx0ZXN0LXRocmVlIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJUd28gLSBzaW1pbGFyIGRlcGVuZGVuY2llcyIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC10aHJlZSI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iVGhyZWUgLSBzaW1wbGUiLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgRXh0IERpciBUZXN0IEV4YW1wbGUvcmVhZG1lLnR4dCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNiMTVhLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBFeHQgRGlyIFRlc3QgRXhhbXBsZS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLUNyZWF0ZSBhIG5ldyBzaW1wbGUgcHJvamVjdCB3aXRoIHByb2plY3QgZGlyZWN0b3J5IG91dHNpZGUgRUNMSVBTRV9IT01FCi0gCi1pbXBvcnQgdGhpcyBkaXJlY3RvcnkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC8uY2xhc3NwYXRoIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGZiNDg4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iSlJFX0xJQiIgcm9vdHBhdGg9IkpSRV9TUkNST09UIiBzb3VyY2VwYXRoPSJKUkVfU1JDIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvLnByb2plY3QgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWQ4YWU5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BbnRWaWV3IEphdmEgVGVzdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2Jpbi5sb2cgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2Jpbi5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYjRmZTUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC9iaW4ubG9nCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1Db21waWxlZCAxMyBsaW5lcyBpbiA5OTEgbXMgKDEzLjEgbGluZXMvcykNCi0xIC5jbGFzcyBmaWxlIGdlbmVyYXRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYmluL21haW4uY2xhc3MgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2Jpbi9tYWluLmNsYXNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjBkOTZjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYmluL21haW4uY2xhc3MKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWFiMzUyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3QvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9IkphdmEgQ29tcGlsZSBUZXN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJjb21waWxlIj4gICAgICAgCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJjb21waWxlIiBkZXBlbmRzPSJwcm9wZXJ0aWVzLGVudiI+Ci0JICAgPGphdmFjIGRlc3RkaXI9ImJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJ0cnVlIiBkZWJ1Zz0ib24iIGluY2x1ZGVBbnRSdW50aW1lPSJubyI+Ci0JCQk8c3JjIHBhdGg9InNyYy8iLz4KLQkgICA8L2phdmFjPgotCTwvdGFyZ2V0PgotCi0gICAgPHRhcmdldCBuYW1lPSJjbGVhbiI+IAotICAgICAgIDxkZWxldGUgZmlsZT0iYmluL21haW4uY2xhc3MiLz4KLSAgICA8L3RhcmdldD4KLSAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImVudiI+Ci0gICAgICAgPGVjaG8+IAotICAgICAgICAgICBTeXN0ZW0gUHJvcGVydGllcwotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBqYXZhLnZlcnNpb246ICR7amF2YS52ZXJzaW9ufQotICAgICAgICAgICBqYXZhLnZlbmRvcjogJHtqYXZhLnZlbmRvcn0KLSAgICAgICAgICAgamF2YS5ob21lOiAke2phdmEuaG9tZX0KLSAgICAgICAgICAgamF2YS5jbGFzcy5wYXRoOiAke2phdmEuY2xhc3MucGF0aH0KLSAgICAgICAgICAgamF2YS5leHQuZGlyczogJHtqYXZhLmV4dC5kaXJzfQotICAgICAgICAgICBvcy5uYW1lOiAke29zLm5hbWV9Ci0gICAgICAgICAgIG9zLmFyY2g6ICR7b3MuYXJjaH0KLSAgICAgICAgICAgb3MudmVyc2lvbjogJHtvcy52ZXJzaW9ufQotICAgICAgICAgICB1c2VyLm5hbWU6ICR7dXNlci5uYW1lfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgICAgIEFudCBFbnZpcm9ubWVudAotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgIGJhc2VkaXI6ICR7YmFzZWRpcn0KLSAgICAgICAgICAgYW50LmZpbGU6ICR7YW50LmZpbGV9Ci0gICAgICAgICAgIGFudC52ZXJzaW9uOiAke2FudC52ZXJzaW9ufQotICAgICAgICAgICBhbnQucHJvamVjdC5uYW1lOiAke2FudC5wcm9qZWN0Lm5hbWV9Ci0gICAgICAgICAgIGFudC5qYXZhLnZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0KLSAgICAgICAgICAgYnVpbGQuY29tcGlsZXI6ICR7YnVpbGQuY29tcGlsZXJ9Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC9zcmMvbWFpbi5jbGFzcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3Qvc3JjL21haW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjY2M5YjQuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IEphdmEgVGVzdC9zcmMvbWFpbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3Qvc3JjL21haW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBKYXZhIFRlc3Qvc3JjL21haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhYjViOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgSmF2YSBUZXN0L3NyYy9tYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vKioKLSAqIEBhdXRob3Igcm9zY29lLm0ucnVzaAotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIG1haW4gewotCXB1YmxpYyAgbWFpbigpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbyBXb3JsZCFcbiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0Ly5wcm9qZWN0IGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTlkZmIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5BbnRWaWV3IFRlc3Q8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9CdWlsZGZpbGUgRXJyb3IvYnVpbGQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvQnVpbGRmaWxlIEVycm9yL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkZjYyYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9CdWlsZGZpbGUgRXJyb3IvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9IkFudFZpZXcgVGVzdC4wMSIgYmFzZWRpcj0iLiIgZGVmYXVsdD0idGVzdC1vbmUiPiAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IkluaXQiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3Qtb25lIiBkZXBlbmRzPSJpbml0LHRlc3QtdHdvIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJPbmUgLSBtdWx0aXBsZSBkZXBlbmRlbnRzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXR3byIgZGVwZW5kcz0iaW5pdCx0ZXN0LXRocmVlIiBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24gb2YgdGVzdC10d28iPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IlR3byAtIHNpbWlsYXIgZGVwZW5kZW5jaWVzIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LXRocmVlIiBkZXNjcmlwdGlvbj0iZGVzY3JpcHRpb24gb2YgdGVzdC10aHJlZSI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iVGhyZWUgLSBzaW1wbGUiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9ImVudiIKLSAgICAgICA8ZWNobz4KLSAgICAgICAgICAgU2hlbGwgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgQU5UX0hPTUU6ICR7ZS5BTlRfSE9NRX0KLSAgICAgICAgICAgSkFWQV9IT01FOiAke2UuSkFWQV9IT01FfQotICAgICAgICAgICBDTEFTU1BBVEg6ICR7ZS5DTEFTU1BBVEh9Ci0gICAgICAKLSAgICAgICAgICAgU3lzdGVtIFByb3BlcnRpZXMKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgamF2YS52ZXJzaW9uOiAke2phdmEudmVyc2lvbn0KLSAgICAgICAgICAgamF2YS52ZW5kb3I6ICR7amF2YS52ZW5kb3J9Ci0gICAgICAgICAgIGphdmEuaG9tZTogJHtqYXZhLmhvbWV9Ci0gICAgICAgICAgIGphdmEuY2xhc3MucGF0aDogJHtqYXZhLmNsYXNzLnBhdGh9Ci0gICAgICAgICAgIGphdmEuZXh0LmRpcnM6ICR7amF2YS5leHQuZGlyc30KLSAgICAgICAgICAgb3MubmFtZTogJHtvcy5uYW1lfQotICAgICAgICAgICBvcy5hcmNoOiAke29zLmFyY2h9Ci0gICAgICAgICAgIG9zLnZlcnNpb246ICR7b3MudmVyc2lvbn0KLSAgICAgICAgICAgdXNlci5uYW1lOiAke3VzZXIubmFtZX0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICAgICBBbnQgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBiYXNlZGlyOiAke2Jhc2VkaXJ9Ci0gICAgICAgICAgIGFudC5maWxlOiAke2FudC5maWxlfQotICAgICAgICAgICBhbnQudmVyc2lvbjogJHthbnQudmVyc2lvbn0KLSAgICAgICAgICAgYW50LnByb2plY3QubmFtZTogJHthbnQucHJvamVjdC5uYW1lfQotICAgICAgICAgICBhbnQuamF2YS52ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvQ3VzdG9tIEJ1aWxkIGZpbGVuYW1lL2N1c3RvbUJ1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L0N1c3RvbSBCdWlsZCBmaWxlbmFtZS9jdXN0b21CdWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MGM5NzUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvQ3VzdG9tIEJ1aWxkIGZpbGVuYW1lL2N1c3RvbUJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJDdXN0b20gYnVpbGQgZmlsZW5hbWUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3Qtb25lIj4gICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJJbml0Ii8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJ0ZXN0LW9uZSIgZGVwZW5kcz0iaW5pdCx0ZXN0LXR3byI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iT25lIC0gbXVsdGlwbGUgZGVwZW5kZW50cyIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC10d28iIGRlcGVuZHM9ImluaXQsdGVzdC10aHJlZSIgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIG9mIHRlc3QtdHdvIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJUd28gLSBzaW1pbGFyIGRlcGVuZGVuY2llcyIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC10aHJlZSIgZGVzY3JpcHRpb249ImRlc2NyaXB0aW9uIG9mIHRlc3QtdGhyZWUiPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9IlRocmVlIC0gc2ltcGxlIi8+Ci0gICAgPC90YXJnZXQ+Ci0gICAgPHRhcmdldCBuYW1lPSJlbnYiPgotICAgICAgIDxlY2hvPgotICAgICAgICAgICBTeXN0ZW0gUHJvcGVydGllcwotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBqYXZhLnZlcnNpb246ICR7amF2YS52ZXJzaW9ufQotICAgICAgICAgICBqYXZhLnZlbmRvcjogJHtqYXZhLnZlbmRvcn0KLSAgICAgICAgICAgamF2YS5ob21lOiAke2phdmEuaG9tZX0KLSAgICAgICAgICAgamF2YS5jbGFzcy5wYXRoOiAke2phdmEuY2xhc3MucGF0aH0KLSAgICAgICAgICAgamF2YS5leHQuZGlyczogJHtqYXZhLmV4dC5kaXJzfQotICAgICAgICAgICBvcy5uYW1lOiAke29zLm5hbWV9Ci0gICAgICAgICAgIG9zLmFyY2g6ICR7b3MuYXJjaH0KLSAgICAgICAgICAgb3MudmVyc2lvbjogJHtvcy52ZXJzaW9ufQotICAgICAgICAgICB1c2VyLm5hbWU6ICR7dXNlci5uYW1lfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgICAgIEFudCBFbnZpcm9ubWVudAotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgIGJhc2VkaXI6ICR7YmFzZWRpcn0KLSAgICAgICAgICAgYW50LmZpbGU6ICR7YW50LmZpbGV9Ci0gICAgICAgICAgIGFudC52ZXJzaW9uOiAke2FudC52ZXJzaW9ufQotICAgICAgICAgICBhbnQucHJvamVjdC5uYW1lOiAke2FudC5wcm9qZWN0Lm5hbWV9Ci0gICAgICAgICAgIGFudC5qYXZhLnZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0KLSAgICAgICAgICAgYnVpbGQuY29tcGlsZXI6ICR7YnVpbGQuY29tcGlsZXJ9Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9BbnQgVmlldyBUZXN0cy9BbnRWaWV3IFRlc3QvTWlzc2luZyBkZWZhdWx0IHRhcmdldC9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIGRlZmF1bHQgdGFyZ2V0L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4ZTRjMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIGRlZmF1bHQgdGFyZ2V0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJNaXNzaW5nIFByb2plY3QgZGVmYXVsdCB0ZXN0IiBiYXNlZGlyPSIuIj4gICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJlbnYiPgotICAgICAgIDxlY2hvPiAgICAKLSAgICAgICAgICAgU3lzdGVtIFByb3BlcnRpZXMKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgamF2YS52ZXJzaW9uOiAke2phdmEudmVyc2lvbn0KLSAgICAgICAgICAgamF2YS52ZW5kb3I6ICR7amF2YS52ZW5kb3J9Ci0gICAgICAgICAgIGphdmEuaG9tZTogJHtqYXZhLmhvbWV9Ci0gICAgICAgICAgIGphdmEuY2xhc3MucGF0aDogJHtqYXZhLmNsYXNzLnBhdGh9Ci0gICAgICAgICAgIGphdmEuZXh0LmRpcnM6ICR7amF2YS5leHQuZGlyc30KLSAgICAgICAgICAgb3MubmFtZTogJHtvcy5uYW1lfQotICAgICAgICAgICBvcy5hcmNoOiAke29zLmFyY2h9Ci0gICAgICAgICAgIG9zLnZlcnNpb246ICR7b3MudmVyc2lvbn0KLSAgICAgICAgICAgdXNlci5uYW1lOiAke3VzZXIubmFtZX0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICAgICBBbnQgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBiYXNlZGlyOiAke2Jhc2VkaXJ9Ci0gICAgICAgICAgIGFudC5maWxlOiAke2FudC5maWxlfQotICAgICAgICAgICBhbnQudmVyc2lvbjogJHthbnQudmVyc2lvbn0KLSAgICAgICAgICAgYW50LnByb2plY3QubmFtZTogJHthbnQucHJvamVjdC5uYW1lfQotICAgICAgICAgICBhbnQuamF2YS52ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ci0gICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyOiAke2J1aWxkLmNvbXBpbGVyfQotICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBlbGVtZW50L2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBlbGVtZW50L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RmYmRhMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIHByb2plY3QgZWxlbWVudC9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPG1pc3Npbmdwcm9qZWN0IG5hbWU9Ik1pc3NpbmcgcHJvamVjdCBlbGVtZW50IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJlbnYiPiAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9ImVudiI+Ci0gICAgICAgPGVjaG8+ICAgIAotICAgICAgICAgICBTeXN0ZW0gUHJvcGVydGllcwotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBqYXZhLnZlcnNpb246ICR7amF2YS52ZXJzaW9ufQotICAgICAgICAgICBqYXZhLnZlbmRvcjogJHtqYXZhLnZlbmRvcn0KLSAgICAgICAgICAgamF2YS5ob21lOiAke2phdmEuaG9tZX0KLSAgICAgICAgICAgamF2YS5jbGFzcy5wYXRoOiAke2phdmEuY2xhc3MucGF0aH0KLSAgICAgICAgICAgamF2YS5leHQuZGlyczogJHtqYXZhLmV4dC5kaXJzfQotICAgICAgICAgICBvcy5uYW1lOiAke29zLm5hbWV9Ci0gICAgICAgICAgIG9zLmFyY2g6ICR7b3MuYXJjaH0KLSAgICAgICAgICAgb3MudmVyc2lvbjogJHtvcy52ZXJzaW9ufQotICAgICAgICAgICB1c2VyLm5hbWU6ICR7dXNlci5uYW1lfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgCi0gICAgICAgICAgIEFudCBFbnZpcm9ubWVudAotICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgICAgIGJhc2VkaXI6ICR7YmFzZWRpcn0KLSAgICAgICAgICAgYW50LmZpbGU6ICR7YW50LmZpbGV9Ci0gICAgICAgICAgIGFudC52ZXJzaW9uOiAke2FudC52ZXJzaW9ufQotICAgICAgICAgICBhbnQucHJvamVjdC5uYW1lOiAke2FudC5wcm9qZWN0Lm5hbWV9Ci0gICAgICAgICAgIGFudC5qYXZhLnZlcnNpb246ICR7YW50LmphdmEudmVyc2lvbn0KLSAgICAgICAgICAgYnVpbGQuY29tcGlsZXI6ICR7YnVpbGQuY29tcGlsZXJ9Ci0gICAgICA8L2VjaG8+Ci0gICAgPC90YXJnZXQ+Ci08L21pc3Npbmdwcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBuYW1lL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L01pc3NpbmcgcHJvamVjdCBuYW1lL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwZmU2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9NaXNzaW5nIHByb2plY3QgbmFtZS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgYmFzZWRpcj0iLiIgZGVmYXVsdD0iZW52Ij4gICAgICAgCi0gICAgPHRhcmdldCBuYW1lPSJlbnYiPgotICAgICAgIDxlY2hvPiAgICAKLSAgICAgICAgICAgU3lzdGVtIFByb3BlcnRpZXMKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgamF2YS52ZXJzaW9uOiAke2phdmEudmVyc2lvbn0KLSAgICAgICAgICAgamF2YS52ZW5kb3I6ICR7amF2YS52ZW5kb3J9Ci0gICAgICAgICAgIGphdmEuaG9tZTogJHtqYXZhLmhvbWV9Ci0gICAgICAgICAgIGphdmEuY2xhc3MucGF0aDogJHtqYXZhLmNsYXNzLnBhdGh9Ci0gICAgICAgICAgIGphdmEuZXh0LmRpcnM6ICR7amF2YS5leHQuZGlyc30KLSAgICAgICAgICAgb3MubmFtZTogJHtvcy5uYW1lfQotICAgICAgICAgICBvcy5hcmNoOiAke29zLmFyY2h9Ci0gICAgICAgICAgIG9zLnZlcnNpb246ICR7b3MudmVyc2lvbn0KLSAgICAgICAgICAgdXNlci5uYW1lOiAke3VzZXIubmFtZX0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgICAgICBBbnQgRW52aXJvbm1lbnQKLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICBiYXNlZGlyOiAke2Jhc2VkaXJ9Ci0gICAgICAgICAgIGFudC5maWxlOiAke2FudC5maWxlfQotICAgICAgICAgICBhbnQudmVyc2lvbjogJHthbnQudmVyc2lvbn0KLSAgICAgICAgICAgYW50LnByb2plY3QubmFtZTogJHthbnQucHJvamVjdC5uYW1lfQotICAgICAgICAgICBhbnQuamF2YS52ZXJzaW9uOiAke2FudC5qYXZhLnZlcnNpb259Ci0gICAgICAgICAgIGJ1aWxkLmNvbXBpbGVyOiAke2J1aWxkLmNvbXBpbGVyfQotICAgICAgPC9lY2hvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbWlsYXIgRGVwZW5kZW5jaWVzL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbWlsYXIgRGVwZW5kZW5jaWVzL2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1YzY1MC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9TaW1pbGFyIERlcGVuZGVuY2llcy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iU2ltaWxpYXIgZGVwZW5kZW5jaWVzIiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJ0ZXN0LW9uZSI+ICAgICAgIAotICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iSW5pdCIvPgotICAgIDwvdGFyZ2V0PgotICAgIDx0YXJnZXQgbmFtZT0idGVzdC1vbmUiIGRlcGVuZHM9ImluaXQsdGVzdC10d28iPgotICAgICAgIDxlY2hvIG1lc3NhZ2U9Ik9uZSAtIG11bHRpcGxlIGRlcGVuZGVudHMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtdHdvIiBkZXBlbmRzPSJpbml0LHRlc3QtdGhyZWUiIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiBvZiB0ZXN0LXR3byI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iVHdvIC0gc2ltaWxhciBkZXBlbmRlbmNpZXMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtdGhyZWUiIGRlc2NyaXB0aW9uPSJkZXNjcmlwdGlvbiBvZiB0ZXN0LXRocmVlIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJUaHJlZSAtIHNpbXBsZSIvPgotICAgIDwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbXBsZSBEZXBlbmRlbmN5L2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvQW50IFZpZXcgVGVzdHMvQW50VmlldyBUZXN0L1NpbXBsZSBEZXBlbmRlbmN5L2J1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxZThkZC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0FudCBWaWV3IFRlc3RzL0FudFZpZXcgVGVzdC9TaW1wbGUgRGVwZW5kZW5jeS9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJTaW1wbGUiIGJhc2VkaXI9Ii4iIGRlZmF1bHQ9InRlc3QtYSI+ICAgICAgICAKLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYSI+Ci0gICAgICAgPGVjaG8gbWVzc2FnZT0iQSAtIG5vIGRlcGVuZGVudHMiLz4KLSAgICA8L3RhcmdldD4KLSAgICA8dGFyZ2V0IG5hbWU9InRlc3QtYiIgZGVwZW5kcz0idGVzdC1hIj4KLSAgICAgICA8ZWNobyBtZXNzYWdlPSJCIC0gc2ltcGxlIGRlcGVuZGVuY3kiLz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9leHRlcm5hbHRvb2xzL01pZ3JhdGlvblRlc3RzLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL0V4dGVybmFsIFRvb2xzL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9leHRlcm5hbHRvb2xzL01pZ3JhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZGZiNmEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9FeHRlcm5hbCBUb29scy9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvZXh0ZXJuYWx0b29scy9NaWdyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmV4dGVybmFsdG9vbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5JRGVidWdVSUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5SZWZyZXNoVGFiOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLnJlZ2lzdHJ5LkV4dGVybmFsVG9vbE1pZ3JhdGlvbjsKLQotLyoqCi0gKiBUZXN0cyBtaWdyYXRpb24gb2YgQW50IGFuZCBFeHRlcm5hbCBUb29sIGNvbmZpZ3VyYXRpb25zIGZyb20gb2xkCi0gKiBmb3JtYXRzIHRvIHRoZSBjdXJyZW50IGZvcm1hdC4KLSAqLwotcHVibGljIGNsYXNzIE1pZ3JhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMCBBbnQgYnVpbGRmaWxlCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIwQW50TWlncmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXAgYXJndW1lbnRNYXA9IGdldDIwQW50QXJndW1lbnRNYXAoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcgPSBFeHRlcm5hbFRvb2xNaWdyYXRpb24uY29uZmlnRnJvbUFyZ3VtZW50TWFwKGFyZ3VtZW50TWFwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTWlncmF0aW9uIGZhaWxlZCIsIGNvbmZpZyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbmZpZ3VyYXRpb24gdHlwZSIsIElBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLklEX0FOVF9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUsIGNvbmZpZy5nZXRUeXBlKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbnQgdG9vbCIsIGNvbmZpZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImxvY2F0aW9uIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sICIiKSk7Ci0JCWFzc2VydEVxdWFscygicmVmcmVzaCBzY29wZSIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoUmVmcmVzaFRhYi5BVFRSX1JFRlJFU0hfU0NPUEUsICIiKSk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0c0Zyb21Db25maWcoY29uZmlnKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gdGFyZ2V0cyBmb3VuZCIsIHRhcmdldHMpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB0YXJnZXRzIiwgMiwgdGFyZ2V0cy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoInRhcmdldDEiLCB0YXJnZXRzWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXJnZXQyIiwgdGFyZ2V0c1sxXSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJidWlsZCBraW5kcyIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1JVTl9CVUlMRF9LSU5EUywgIiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhcmcgICIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1RPT0xfQVJHVU1FTlRTLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoIndvcmtpbmcgZGlyIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksICIiKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYXJndW1lbnRzIGZvciBhbiBBbnQgYnVpbGRmaWxlIHVzaW5nCi0JICogRWNsaXBzZSAyLjAgYXJndW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gYSBtYXAgb2YgMi4wIGFyZ3VtZW50cyBmb3IgYW4gQW50IGJ1aWxkZmlsZS4KLQkgKi8KLQlwcml2YXRlIE1hcCBnZXQyMEFudEFyZ3VtZW50TWFwKCkgewotCQlIYXNoTWFwIGFyZ3VtZW50cz0gbmV3IEhhc2hNYXAoKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1ZFUlNJT04sICIyLjAiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfVFlQRSwgIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMudHlwZS5hbnQiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfTkFNRSwgImFudCB0b29sIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX0xPQ0FUSU9OLCAibG9jYXRpb24iKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfUkVGUkVTSCwgInJlZnJlc2ggc2NvcGUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfQVJHVU1FTlRTLCAiYXJnICR7YW50X3RhcmdldDp0YXJnZXQxfSAke2FudF90YXJnZXQ6dGFyZ2V0Mn0iKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfU0hPV19MT0csICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX0JMT0NLLCAiZmFsc2UiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfQlVJTERfVFlQRVMsICJidWlsZCBraW5kcyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9ESVJFQ1RPUlksICJ3b3JraW5nIGRpciIpOwotCQlyZXR1cm4gYXJndW1lbnRzOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMCBBbnQgYnVpbGRmaWxlCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIwUHJvZ3JhbU1pZ3JhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3VtZW50TWFwPSBnZXQyMFByb2dyYW1Bcmd1bWVudE1hcCgpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5jb25maWdGcm9tQXJndW1lbnRNYXAoYXJndW1lbnRNYXApOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbmZpZ3VyYXRpb24gdHlwZSIsIElFeHRlcm5hbFRvb2xDb25zdGFudHMuSURfUFJPR1JBTV9CVUlMREVSX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUsIGNvbmZpZy5nZXRUeXBlKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9ncmFtIHRvb2wiLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb2NhdGlvbiIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoInJlZnJlc2ggc2NvcGUiLCBjb25maWcuZ2V0QXR0cmlidXRlKFJlZnJlc2hUYWIuQVRUUl9SRUZSRVNIX1NDT1BFLCAiIikpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfQ0FQVFVSRV9PVVRQVVQsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiYnVpbGQga2luZHMiLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9SVU5fQlVJTERfS0lORFMsICIiKSk7Ci0JCWFzc2VydEVxdWFscygiYXJnICR7YW50X3RhcmdldDp0YXJnZXQxfSAke2FudF90YXJnZXQ6dGFyZ2V0Mn0iLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgIiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3b3JraW5nIGRpciIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLCAiIikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFyZ3VtZW50cyBmb3IgZXhlY3V0aW5nIGEgcHJvZ3JhbQotCSAqIHVzaW5nIEVjbGlwc2UgMi4wIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIDIuMCBhcmd1bWVudHMgZm9yIGEgcHJvZ3JhbQotCSAqLwotCXByaXZhdGUgTWFwIGdldDIwUHJvZ3JhbUFyZ3VtZW50TWFwKCkgewotCQlIYXNoTWFwIGFyZ3VtZW50cz0gbmV3IEhhc2hNYXAoKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1ZFUlNJT04sICIyLjAiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfVFlQRSwgIm9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMudHlwZS5wcm9ncmFtIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX05BTUUsICJwcm9ncmFtIHRvb2wiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfTE9DQVRJT04sICJsb2NhdGlvbiIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9SRUZSRVNILCAicmVmcmVzaCBzY29wZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9BUkdVTUVOVFMsICJhcmcgJHthbnRfdGFyZ2V0OnRhcmdldDF9ICR7YW50X3RhcmdldDp0YXJnZXQyfSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9TSE9XX0xPRywgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1RPT0xfQkxPQ0ssICJmYWxzZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVE9PTF9CVUlMRF9UWVBFUywgImJ1aWxkIGtpbmRzIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19UT09MX0RJUkVDVE9SWSwgIndvcmtpbmcgZGlyIik7Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMSBBbnQgYnVpbGRmaWxlCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIxQW50TWlncmF0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlNYXAgYXJndW1lbnRNYXA9IGdldDIxQW50QXJndW1lbnRNYXAoKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weSBjb25maWcgPSBFeHRlcm5hbFRvb2xNaWdyYXRpb24uY29uZmlnRnJvbUFyZ3VtZW50TWFwKGFyZ3VtZW50TWFwKTsKLQkJYXNzZXJ0Tm90TnVsbCgiTWlncmF0aW9uIGZhaWxlZCIsIGNvbmZpZyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIldyb25nIGNvbmZpZyB0eXBlIiwgSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfQU5UX0JVSUxERVJfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRSwgY29uZmlnLmdldFR5cGUoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoImFudCBjb25maWciLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb2NhdGlvbiIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoIndvcmtpbmcgZGlyZWN0b3J5IiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksICIiKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1NIT1dfQ09OU09MRSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1BST01QVF9GT1JfQVJHVU1FTlRTLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInJlZnJlc2ggc2NvcGUiLCBjb25maWcuZ2V0QXR0cmlidXRlKFJlZnJlc2hUYWIuQVRUUl9SRUZSRVNIX1NDT1BFLCAiIikpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldEF0dHJpYnV0ZShSZWZyZXNoVGFiLkFUVFJfUkVGUkVTSF9SRUNVUlNJVkUsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiYnVpbGQga2luZHMiLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9SVU5fQlVJTERfS0lORFMsICIiKSk7Ci0JCWFzc2VydEVxdWFscygiYXJnMSBhcmcyIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsICIiKSk7Ci0JCVN0cmluZ1tdIHRhcmdldHM9IEFudFV0aWwuZ2V0VGFyZ2V0c0Zyb21Db25maWcoY29uZmlnKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgdGFyZ2V0cyIsIDIsIHRhcmdldHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXJnZXQxIiwgdGFyZ2V0c1swXSk7Ci0JCWFzc2VydEVxdWFscygidGFyZ2V0MiIsIHRhcmdldHNbMV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbWFwIG9mIGFyZ3VtZW50cyBmb3IgZXhlY3V0aW5nIGFuIEFudAotCSAqIGJ1aWxkZmlsZSB1c2luZyBFY2xpcHNlIDIuMSBhcmd1bWVudHMuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiAyLjEgYXJndW1lbnRzIGZvciBhbiBBbnQgYnVpbGRmaWxlCi0JICovCi0JcHJpdmF0ZSBNYXAgZ2V0MjFBbnRBcmd1bWVudE1hcCgpIHsKLQkJSGFzaE1hcCBhcmd1bWVudHM9IG5ldyBIYXNoTWFwKCk7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19WRVJTSU9OLCAiMi4xIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19OQU1FLCAiYW50IGNvbmZpZyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVFlQRSwgRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRPT0xfVFlQRV9BTlRfQlVJTEQpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfTE9DQVRJT04sICJsb2NhdGlvbiIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfV09SS19ESVIsICJ3b3JraW5nIGRpcmVjdG9yeSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfQ0FQVFVSRV9PVVRQVVQsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19TSE9XX0NPTlNPTEUsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19TSE9XX0NPTlNPTEUsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SVU5fQktHUk5ELCAidHJ1ZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfUFJPTVBUX0FSR1MsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SRUZSRVNIX1NDT1BFLCAicmVmcmVzaCBzY29wZSIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfUkVGUkVTSF9SRUNVUlNJVkUsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SVU5fQlVJTERfS0lORFMsICJidWlsZCBraW5kcyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfQVJHUywgImFyZzEgYXJnMiIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfRVhUUkFfQVRUUiwgRXh0ZXJuYWxUb29sTWlncmF0aW9uLlJVTl9UQVJHRVRTX0FUVFJJQlVURSArICI9dGFyZ2V0MSx0YXJnZXQyIik7Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCQotCS8qKgotCSAqIFRlc3RzIG1pZ3JhdGlvbiBvZiBhcmd1bWVudHMgZnJvbSBhbiBFY2xpcHNlIDIuMSBwcm9ncmFtCi0JICogY29uZmlndXJhdGlvbiB0byBhIGN1cnJlbnQgbGF1bmNoIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdDIxUHJvZ3JhbU1pZ3JhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3VtZW50TWFwPSBnZXQyMVByb2dyYW1Bcmd1bWVudE1hcCgpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5jb25maWdGcm9tQXJndW1lbnRNYXAoYXJndW1lbnRNYXApOwotCQlhc3NlcnROb3ROdWxsKCJNaWdyYXRpb24gZmFpbGVkIiwgY29uZmlnKTsKLQkJCi0JCWFzc2VydEVxdWFscygiV3JvbmcgY29uZmlnIHR5cGUiLCBJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLklEX1BST0dSQU1fQlVJTERFUl9MQVVOQ0hfQ09ORklHVVJBVElPTl9UWVBFLCBjb25maWcuZ2V0VHlwZSgpLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvZ3JhbSBjb25maWciLCBjb25maWcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb2NhdGlvbiIsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiIikpOwotCQlhc3NlcnRFcXVhbHMoIndvcmtpbmcgZGlyZWN0b3J5IiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfV09SS0lOR19ESVJFQ1RPUlksICIiKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9DQVBUVVJFX09VVFBVVCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1NIT1dfQ09OU09MRSwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSURlYnVnVUlDb25zdGFudHMuQVRUUl9MQVVOQ0hfSU5fQkFDS0dST1VORCwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNvbmZpZy5nZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX1BST01QVF9GT1JfQVJHVU1FTlRTLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInJlZnJlc2ggc2NvcGUiLCBjb25maWcuZ2V0QXR0cmlidXRlKFJlZnJlc2hUYWIuQVRUUl9SRUZSRVNIX1NDT1BFLCAiIikpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY29uZmlnLmdldEF0dHJpYnV0ZShSZWZyZXNoVGFiLkFUVFJfUkVGUkVTSF9SRUNVUlNJVkUsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiYnVpbGQga2luZHMiLCBjb25maWcuZ2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9SVU5fQlVJTERfS0lORFMsICIiKSk7Ci0JCWFzc2VydEVxdWFscygiYXJnMSBhcmcyIiwgY29uZmlnLmdldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsICIiKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSBtYXAgb2YgYXJndW1lbnRzIGZvciBleGVjdXRpbmcgYSBwcm9ncmFtCi0JICogYnVpbGRmaWxlIHVzaW5nIEVjbGlwc2UgMi4xIGFyZ3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIDIuMSBhcmd1bWVudHMgZm9yIGEgcHJvZ3JhbQotCSAqLwotCXByaXZhdGUgTWFwIGdldDIxUHJvZ3JhbUFyZ3VtZW50TWFwKCkgewotCQlIYXNoTWFwIGFyZ3VtZW50cz0gbmV3IEhhc2hNYXAoKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1ZFUlNJT04sICIyLjEiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX05BTUUsICJwcm9ncmFtIGNvbmZpZyIpOwotCQlhcmd1bWVudHMucHV0KEV4dGVybmFsVG9vbE1pZ3JhdGlvbi5UQUdfVFlQRSwgSUV4dGVybmFsVG9vbENvbnN0YW50cy5UT09MX1RZUEVfUFJPR1JBTSk7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19MT0NBVElPTiwgImxvY2F0aW9uIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19XT1JLX0RJUiwgIndvcmtpbmcgZGlyZWN0b3J5Iik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19DQVBUVVJFX09VVFBVVCwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1NIT1dfQ09OU09MRSwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1NIT1dfQ09OU09MRSwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1JVTl9CS0dSTkQsICJ0cnVlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19QUk9NUFRfQVJHUywgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1JFRlJFU0hfU0NPUEUsICJyZWZyZXNoIHNjb3BlIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19SRUZSRVNIX1JFQ1VSU0lWRSwgInRydWUiKTsKLQkJYXJndW1lbnRzLnB1dChFeHRlcm5hbFRvb2xNaWdyYXRpb24uVEFHX1JVTl9CVUlMRF9LSU5EUywgImJ1aWxkIGtpbmRzIik7Ci0JCWFyZ3VtZW50cy5wdXQoRXh0ZXJuYWxUb29sTWlncmF0aW9uLlRBR19BUkdTLCAiYXJnMSBhcmcyIik7Ci0JCXJldHVybiBhcmd1bWVudHM7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9hYm91dC5odG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU1MDZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4zMHRoIEphbnVhcnksIDIwMDM8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcyBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2ZDc2ZS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0JCQkgICBwbHVnaW4ucHJvcGVydGllcyxcCi0JCQkgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHRlc3RidWlsZGZpbGVzLyxcCi0gICAgICAgICAgICAgICBsaWIvLFwKLSAgICAgICAgICAgICAgIGxpYi8qLmphcixcCi0gICAgICAgICAgICAgICAqLmphcgotICAgICAgICAgICAgICAgCi1zb3VyY2UuYW50dGVzdHN1aS5qYXIgPSB0ZXN0IHBsdWdpbi8sXAotCQkJCQkJQW50IEVkaXRvciBUZXN0cy8sXAotCQkJCQkJRXh0ZXJuYWwgVG9vbHMvLFwKLQkJCQkJCUFudCBUZXN0cy8sXAotICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRmaWxlcy8KLQkJCQkJCQotc291cmNlLmxpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIgPSB0ZXN0IHN1cHBvcnQvCi1qYXJzLmNvbXBpbGUub3JkZXI9YW50dGVzdHN1aS5qYXIsbGliL2FudFVJVGVzdHNTdXBwb3J0LmphcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2J1aWxkZmlsZXMvYnVpbGRBbnRUZXN0c1N1cHBvcnRKQVIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2FiNzIzLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvYnVpbGRmaWxlcy9idWlsZEFudFRlc3RzU3VwcG9ydEpBUi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGQgdGVzdHMgc3VwcG9ydCBqYXIiIGRlZmF1bHQ9ImJ1aWxkIiBiYXNlZGlyPSIuLiI+Ci0KLQk8cHJvcGVydHkgbmFtZT0iYm9vdGNsYXNzcGF0aCIgdmFsdWU9IiIvPgotCi0JPHRhcmdldCBuYW1lPSJidWlsZCIgZGVzY3JpcHRpb249IlJlbW92ZXMgYWxsIGJ1aWxkIGFydGlmYWN0cywgcmVjcmVhdGVzIHRoZSBzdXBwb3J0IGphciwgYW5kIHJlZnJlc2hlcyB0aGlzIHBsdWdpbidzIHJlc291cmNlcyIgZGVwZW5kcz0iY2xlYW4sIGxpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIiLz4KLQotCTx0YXJnZXQgbmFtZT0iaW5pdCIgZGVwZW5kcz0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ2ZXJzaW9uLnN1ZmZpeCIgdmFsdWU9Il8zLjAuMCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYW50X3ZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzEuNi4xIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0ibGliL2FudFVJVGVzdHNTdXBwb3J0LmphciIgZGVwZW5kcz0iaW5pdCIgZGVzY3JpcHRpb249ICJCdWlsZHMgdGhlIHN1cHBvcnQgSkFSIj4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3RkaXIiIHZhbHVlPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VUlUZXN0c1N1cHBvcnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFVJVGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0vbGliL2FudFVJVGVzdHNTdXBwb3J0Lmphci5iaW4iLz4KLQkJPCEtLSBjb21waWxlIHRoZSBzb3VyY2UgY29kZSAtLT4KLQkJPGphdmFjIHRhcmdldD0iMS4xIiBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9saWIvYW50VUlUZXN0c1N1cHBvcnQuamFyLmJpbiIgZmFpbG9uZXJyb3I9ImZhbHNlIiB2ZXJib3NlPSJmYWxzZSIgZGVidWc9Im9uIiBpbmNsdWRlQW50UnVudGltZT0ieWVzIiBib290Y2xhc3NwYXRoPSIke2Jvb3RjbGFzc3BhdGh9IiAKLQkJCWNsYXNzcGF0aD0iJHtiYXNlZGlyfS8uLi9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvYmluOwotCQkJJHtlY2xpcHNlLmhvbWV9L3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lJHt2ZXJzaW9uLnN1ZmZpeH0vcnVudGltZS5qYXI7Ci0JCQkke2Jhc2VkaXJ9L2JpbjsKLQkJCSR7ZWNsaXBzZS5ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLmFudC5jb3JlJHt2ZXJzaW9uLnN1ZmZpeH0vYW50c3VwcG9ydC5qYXI7Ci0JCQkke2Jhc2VkaXJ9Ly4uL29yZy5lY2xpcHNlLmFudC5jb3JlL2JpbiI+Ci0JCQk8c3JjIHBhdGg9InRlc3Qgc3VwcG9ydC8iLz4KLQkJPC9qYXZhYz4KLQkJPG1rZGlyIGRpcj0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIiLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2xpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIiIGJhc2VkaXI9IiR7dGVtcC5mb2xkZXJ9L2xpYi9hbnRVSVRlc3RzU3VwcG9ydC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9saWIvYW50VUlUZXN0c1N1cHBvcnQuamFyIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9pY29ucy9hbnQuZ2lmIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9pY29ucy9hbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEzNjVjLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvaWNvbnMvYW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvbGliLy5jdnNpZ25vcmUgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjkwODk4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1hbnRVSVRlc3RzU3VwcG9ydC5qYXIKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzIyOGIyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lPUFudCBVSSBUZXN0IFBsdWdpbgotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVkNjU2Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luCi0gICBpZD0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpIgotICAgbmFtZT0iJXBsdWdpbk5hbWUiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQW50VUlUZXN0UGx1Z2luIj4KLSAgIAotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS5hbnQiLz4KLQkgIDxpbXBvcnQgcGx1Z2luPSJvcmcuanVuaXQiLz4gICAKLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmpkdC5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuYW50LmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZGVidWcudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZHQuZGVidWciLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5hbnQudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0gCi08cnVudGltZT4KLSAgPGxpYnJhcnkgbmFtZT0iYW50dGVzdHN1aS5qYXIiID4KLSAgICAgPGV4cG9ydCBuYW1lID0gIioiLz4KLSAgPC9saWJyYXJ5PiAKLTwvcnVudGltZT4KLQotIDxleHRlbnNpb24KLSAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGVMaW5lVHJhY2tlcnMiPgotCSAgPGNvbnNvbGVMaW5lVHJhY2tlcgotCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luLkNvbnNvbGVMaW5lVHJhY2tlciIKLQkgICAgICAgIHByb2Nlc3NUeXBlPSJvcmcuZWNsaXBzZS5hbnQudWkuYW50UHJvY2VzcyIKLQkgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbi5Db25zb2xlTGluZVRyYWNrZXIiPgotCSAgPC9jb25zb2xlTGluZVRyYWNrZXI+Ci0gIDwvZXh0ZW5zaW9uPgotICAKLSAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmV4dHJhQ2xhc3NwYXRoRW50cmllcyI+Ci0gICAgICA8ZXh0cmFDbGFzc3BhdGhFbnRyeQotICAgICAgICAgICAgbGlicmFyeT0ibGliL2FudFVJVGVzdHNTdXBwb3J0LmphciIKLSAgICAgICAgICAgIGVjbGlwc2VSdW50aW1lPSJmYWxzZSI+Ci0gICAgICA8L2V4dHJhQ2xhc3NwYXRoRW50cnk+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzIj4KLQkgICAgPGFudFRhc2sgCi0JICAgIAluYW1lPSJjb29sVUlUYXNrIiAKLQkgICAgCWNsYXNzPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrcy5BbnRUZXN0VGFzazIiCi0JICAgIAlsaWJyYXJ5PSJsaWIvYW50VUlUZXN0c1N1cHBvcnQuamFyIgotCSAgICAJZWNsaXBzZVJ1bnRpbWU9ImZhbHNlIj4KLQkgICAgPC9hbnRUYXNrPgotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRUeXBlcyI+Ci0JICAgIDxhbnRUeXBlIAotCSAgICAJbmFtZT0iY29vbFVJVHlwZSIgCi0JICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudHlwZXMuQW50VGVzdFBhdGgiCi0JICAgIAlsaWJyYXJ5PSJsaWIvYW50VUlUZXN0c1N1cHBvcnQuamFyIgotCSAgICAJZWNsaXBzZVJ1bnRpbWU9ImZhbHNlIj4KLQkgICAgPC9hbnRUeXBlPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5hbnQuY29yZS5hbnRQcm9wZXJ0aWVzIj4KLSAgICAgIDxhbnRQcm9wZXJ0eQotICAgICAgICAgICAgbmFtZT0icHJvcGVydHkudWkudGVzdGluZyIKLSAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KLSAgICAgIDwvYW50UHJvcGVydHk+Ci0gICAgICAgPGFudFByb3BlcnR5Ci0gICAgICAgICAgICBuYW1lPSJwcm9wZXJ0eS51aS50ZXN0aW5nMiIKLSAgICAgICAgICAgIHZhbHVlPSJoZXkiCi0gICAgICAgICAgICAgZWNsaXBzZVJ1bnRpbWU9ImZhbHNlIj4KLSAgICAgIDwvYW50UHJvcGVydHk+Ci0gICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BYnN0cmFjdEFudFVJVGVzdC5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BYnN0cmFjdEFudFVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRjYWZmLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQWJzdHJhY3RBbnRVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS50ZXN0cGx1Z2luOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5lZGl0b3Iub3V0bGluZS5BbnRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkuZWRpdG9yLm91dGxpbmUuWE1MQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubGF1bmNoQ29uZmlndXJhdGlvbnMuSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLm1vZGVsLkFudFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3Iuc3VwcG9ydC5UZXN0TG9jYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLnN1cHBvcnQuVGVzdFByb2JsZW1SZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSVByb2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkuRGVidWdVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5pbnRlcm5hbC51aS52aWV3cy5jb25zb2xlLkNvbnNvbGVEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmludGVybmFsLnVpLnZpZXdzLmNvbnNvbGUuSHlwZXJsaW5rUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuaW50ZXJuYWwudWkudmlld3MuY29uc29sZS5TdHJlYW1QYXJ0aXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUNvbG9yUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLmludGVybmFsLm1vZGVsLklFeHRlcm5hbFRvb2xDb25zdGFudHM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFudFVJVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIElEb2N1bWVudCBjdXJyZW50RG9jdW1lbnQ7Ci0KLQlwdWJsaWMgQWJzdHJhY3RBbnRVSVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgRmlsZSBnZXRCdWlsZEZpbGUoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHsKLQkJSUZpbGUgZmlsZSA9IGdldFByb2plY3QoKS5nZXRGb2xkZXIoImJ1aWxkZmlsZXMiKS5nZXRGaWxlKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKCJDb3VsZCBub3QgZmluZCBidWlsZCBmaWxlIG5hbWVkOiAiICsgYnVpbGRGaWxlTmFtZSwgZmlsZS5leGlzdHMoKSk7Ci0JCXJldHVybiBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRVSVRlc3RzJyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlc3QgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJRmlsZSBmaWxlID0gZ2V0QnVpbGRGaWxlKGZpbGVOYW1lKTsKLQkJSW5wdXRTdHJlYW0gaW47Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaW5pdGlhbENvbnRlbnQ9IGdldFN0cmVhbUNvbnRlbnRBc1N0cmluZyhpbik7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnQoaW5pdGlhbENvbnRlbnQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyZWFtQ29udGVudEFzU3RyaW5nKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlcjsKLQkJdHJ5IHsKLQkJCXJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCUFudFVJUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUJ1ZmZlcmVkUmVhZGVyIHRlbXBCdWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCi0JCXJldHVybiBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcodGVtcEJ1ZmZlcmVkUmVhZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWFkZXJDb250ZW50QXNTdHJpbmcoQnVmZmVyZWRSZWFkZXIgdGVtcEJ1ZmZlcmVkUmVhZGVyKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZW1wUmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJU3RyaW5nIHRlbXBMaW5lPSB0ZW1wQnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQotCQkJd2hpbGUodGVtcExpbmUgIT0gbnVsbCkgewotCQkJCWlmKHRlbXBSZXN1bHQubGVuZ3RoKCkgIT0gMCkgewotCQkJCQl0ZW1wUmVzdWx0LmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0ZW1wUmVzdWx0LmFwcGVuZCh0ZW1wTGluZSk7Ci0JCQkJdGVtcExpbmUgPSB0ZW1wQnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJQW50VUlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGVtcFJlc3VsdC50b1N0cmluZygpOwotCX0KLQkJCi0JcHJvdGVjdGVkIEFudE1vZGVsIGdldEFudE1vZGVsKFN0cmluZyBmaWxlTmFtZSkgewotCQljdXJyZW50RG9jdW1lbnQ9IGdldERvY3VtZW50KGZpbGVOYW1lKTsKLQkJQW50TW9kZWwgbW9kZWw9IG5ldyBBbnRNb2RlbChYTUxDb3JlLmdldERlZmF1bHQoKSwgY3VycmVudERvY3VtZW50LCBuZXcgVGVzdFByb2JsZW1SZXF1ZXN0b3IoKSwgbmV3IFRlc3RMb2NhdGlvblByb3ZpZGVyKGdldEJ1aWxkRmlsZShmaWxlTmFtZSkpKTsKLQkJbW9kZWwucmVjb25jaWxlKG51bGwpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldEN1cnJlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGN1cnJlbnREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3VycmVudERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3VycmVudERvY3VtZW50KElEb2N1bWVudCBjdXJyZW50RG9jdW1lbnQpIHsKLQkJdGhpcy5jdXJyZW50RG9jdW1lbnQgPSBjdXJyZW50RG9jdW1lbnQ7Ci0JfQotCQotCS8qKgotCSAqIExhdW5jaGVzIHRoZSBBbnQgYnVpbGQgd2l0aCB0aGUgYnVpbGRmaWxlIG5hbWUgKG5vIGV4dGVuc2lvbikuCi0JICogCi0JICogQHBhcmFtIGJ1aWxkRmlsZU5hbWUgdGhlIGFudCBidWlsZGZpbGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaChTdHJpbmcgYnVpbGRGaWxlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRMYXVuY2hDb25maWd1cmF0aW9uKGJ1aWxkRmlsZU5hbWUpOwotCQlhc3NlcnROb3ROdWxsKCJDb3VsZCBub3QgbG9jYXRlIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnKTsKLQkJbGF1bmNoQW5kVGVybWluYXRlKGNvbmZpZywgMjAwMDApOwotCX0KLQkKLQkvKioKLQkgKiBMYXVuY2hlcyB0aGUgQW50IGJ1aWxkIHdpdGggdGhlIGJ1aWxkZmlsZSBuYW1lIChubyBleHRlbnNpb24pLgotCSAqIAotCSAqIEBwYXJhbSBidWlsZEZpbGVOYW1lIHRoZSBidWlsZGZpbGUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBhbnQgYXJndW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGF1bmNoKFN0cmluZyBidWlsZEZpbGVOYW1lLCBTdHJpbmcgYXJndW1lbnRzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZyA9IGdldExhdW5jaENvbmZpZ3VyYXRpb24oYnVpbGRGaWxlTmFtZSk7Ci0JCWFzc2VydE5vdE51bGwoIkNvdWxkIG5vdCBsb2NhdGUgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yICIgKyBidWlsZEZpbGVOYW1lLCBjb25maWcpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvcHk9IGNvbmZpZy5nZXRXb3JraW5nQ29weSgpOwotCQljb3B5LnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfVE9PTF9BUkdVTUVOVFMsIGFyZ3VtZW50cyk7Ci0JCWxhdW5jaEFuZFRlcm1pbmF0ZShjb3B5LCAyMDAwMCk7Ci0JfQotCQotCS8qKgotCSogTGF1bmNoZXMgdGhlIEFudCBidWlsZCBpbiBkZWJ1ZyBtb2RlIHdpdGggdGhlIGJ1aWxkZmlsZSBuYW1lIChubyBleHRlbnNpb24pLgotCSogCi0JKiBAcGFyYW0gbWFpblR5cGVOYW1lIHRoZSBwcm9ncmFtIHRvIGxhdW5jaAotCSogQHJldHVybiB0aHJlYWQgaW4gd2hpY2ggdGhlIGZpcnN0IHN1c3BlbmQgZXZlbnQgb2NjdXJyZWQKLQkqLwotCXByb3RlY3RlZCB2b2lkIGxhdW5jaEluRGVidWcoU3RyaW5nIGJ1aWxkRmlsZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoQ29uZmlndXJhdGlvbihidWlsZEZpbGVOYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbCgiQ291bGQgbm90IGxvY2F0ZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgIiArIGJ1aWxkRmlsZU5hbWUsIGNvbmZpZyk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29weT0gY29uZmlnLmdldFdvcmtpbmdDb3B5KCk7Ci0JCWNvcHkuc2V0QXR0cmlidXRlKElFeHRlcm5hbFRvb2xDb25zdGFudHMuQVRUUl9UT09MX0FSR1VNRU5UUywgIi1kZWJ1ZyIpOwotCQlsYXVuY2hBbmRUZXJtaW5hdGUoY29weSwgMTAwMDApOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIGdpdmVuIGJ1aWxkZmlsZQotCSAqIAotCSAqIEBwYXJhbSBidWlsZEZpbGVOYW1lIGJ1aWxkZmlsZSB0byBsYXVuY2gKLQkgKiBAc2VlIFByb2plY3RDcmVhdGlvbkRlY29yYXRvcgotCSAqLwotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbiBnZXRMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBidWlsZEZpbGVOYW1lKSB7Ci0JCUlGaWxlIGZpbGUgPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoImxhdW5jaENvbmZpZ3VyYXRpb25zIikuZ2V0RmlsZShidWlsZEZpbGVOYW1lICsgIi5sYXVuY2giKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0TGF1bmNoTWFuYWdlcigpLmdldExhdW5jaENvbmZpZ3VyYXRpb24oZmlsZSk7Ci0JCWFzc2VydFRydWUoIkNvdWxkIG5vdCBmaW5kIGxhdW5jaCBjb25maWd1cmF0aW9uIGZvciAiICsgYnVpbGRGaWxlTmFtZSwgY29uZmlnLmV4aXN0cygpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRBc1N0cmluZyhGaWxlIGFGaWxlKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShhRmlsZSk7Ci0JICAgIElucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pOwotCSAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZFJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCQotCSAgICBTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JICAgIHRyeSB7Ci0JICAgICAgICBTdHJpbmcgbGluZT0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkgICAgCi0JICAgICAgICB3aGlsZShsaW5lICE9IG51bGwpIHsKLQkgICAgICAgICAgICByZXN1bHQgKz0gIlxuIjsKLQkgICAgICAgICAgICByZXN1bHQgKz0gbGluZTsKLQkgICAgICAgICAgICBsaW5lID0gYnVmZmVyZWRSZWFkZXIucmVhZExpbmUoKTsKLQkgICAgICAgIH0KLQkgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLQkgICAgICAgIHJldHVybiBudWxsOwotCSAgICB9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXByb3RlY3RlZCBTQVhQYXJzZXIgZ2V0U0FYUGFyc2VyKCkgewotCQlTQVhQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlBbnRVSVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0sIFNBWFBhcnNlciBwYXJzZXIsIERlZmF1bHRIYW5kbGVyIGhhbmRsZXIsIEZpbGUgZWRpdGVkRmlsZSkgewotCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZT0gbmV3IElucHV0U291cmNlKHN0cmVhbSk7Ci0JCWlmIChlZGl0ZWRGaWxlICE9IG51bGwpIHsKLQkJCS8vbmVlZGVkIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgZXh0ZXJuYWwgZW50aXRpZXMKLQkJCWlucHV0U291cmNlLnNldFN5c3RlbUlkKGVkaXRlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlci5wYXJzZShpbnB1dFNvdXJjZSwgaGFuZGxlcik7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXVuY2ggbWFuYWdlcgotCSAqIAotCSAqIEByZXR1cm4gbGF1bmNoIG1hbmFnZXIKLQkgKi8KLQlwcm90ZWN0ZWQgSUxhdW5jaE1hbmFnZXIgZ2V0TGF1bmNoTWFuYWdlcigpIHsKLQkJcmV0dXJuIERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlICdBbnRVSVRlc3RzJyBwcm9qZWN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlc3QgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGUoIGdldFByb2plY3QoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxhdW5jaEFuZFRlcm1pbmF0ZShJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWcsIGludCB0aW1lb3V0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCURlYnVnRXZlbnRXYWl0ZXIgd2FpdGVyPSBuZXcgRGVidWdFbGVtZW50S2luZEV2ZW50V2FpdGVyKERlYnVnRXZlbnQuVEVSTUlOQVRFLCBJUHJvY2Vzcy5jbGFzcyk7Ci0JCXdhaXRlci5zZXRUaW1lb3V0KHRpbWVvdXQpOwotCi0JCU9iamVjdCB0ZXJtaW5hdGVlID0gbGF1bmNoQW5kV2FpdChjb25maWcsIHdhaXRlcik7CQkKLQkJYXNzZXJ0Tm90TnVsbCgiUHJvZ3JhbSBkaWQgbm90IHRlcm1pbmF0ZS4iLCB0ZXJtaW5hdGVlKTsKLQkJYXNzZXJ0VHJ1ZSgidGVybWluYXRlZSBpcyBub3QgYW4gSVByb2Nlc3MiLCB0ZXJtaW5hdGVlIGluc3RhbmNlb2YgSVByb2Nlc3MpOwotCQlJUHJvY2VzcyBwcm9jZXNzID0gKElQcm9jZXNzKSB0ZXJtaW5hdGVlOwotCQlhc3NlcnRUcnVlKCJwcm9jZXNzIGlzIG5vdCB0ZXJtaW5hdGVkIiwgcHJvY2Vzcy5pc1Rlcm1pbmF0ZWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIExhdW5jaGVzIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGFuZCB3YWl0cyBmb3IgYW4gZXZlbnQuIFJldHVybnMgdGhlCi0JICogc291cmNlIG9mIHRoZSBldmVudC4gSWYgdGhlIGV2ZW50IGlzIG5vdCByZWNlaXZlZCwgdGhlIGxhdW5jaCBpcwotCSAqIHRlcm1pbmF0ZWQgYW5kIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24gdG8gbGF1bmNoCi0JICogQHBhcmFtIHdhaXRlciB0aGUgZXZlbnQgd2FpdGVyIHRvIHVzZQotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSBzb3VyY2Ugb2YgdGhlIGV2ZW50Ci0JICogQGV4Y2VwdGlvbiBFeGNlcHRpb24gaWYgdGhlIGV2ZW50IGlzIG5ldmVyIHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbGF1bmNoQW5kV2FpdChJTGF1bmNoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBEZWJ1Z0V2ZW50V2FpdGVyIHdhaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTGF1bmNoIGxhdW5jaCA9IGNvbmZpZ3VyYXRpb24ubGF1bmNoKElMYXVuY2hNYW5hZ2VyLlJVTl9NT0RFLCBudWxsKTsKLQkJT2JqZWN0IHN1c3BlbmRlZT0gd2FpdGVyLndhaXRGb3JFdmVudCgpOwotCQlpZiAoc3VzcGVuZGVlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbGF1bmNoLnRlcm1pbmF0ZSgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlmYWlsKCJQcm9ncmFtIGRpZCBub3Qgc3VzcGVuZCwgYW5kIHVuYWJsZSB0byB0ZXJtaW5hdGUgbGF1bmNoLiIpOwotCQkJfQotCQl9Ci0JCWFzc2VydE5vdE51bGwoIlByb2dyYW0gZGlkIG5vdCBzdXNwZW5kLCBsYXVuY2ggdGVybWluYXRlZC4iLCBzdXNwZW5kZWUpOwotCQlyZXR1cm4gc3VzcGVuZGVlOwkJCi0JfQotCQotCXByb3RlY3RlZCBJQ29uc29sZUh5cGVybGluayBnZXRIeXBlcmxpbmsoaW50IG9mZnNldCwgSURvY3VtZW50IGRvYykgewotCQlpZiAob2Zmc2V0ID49IDAgJiYgZG9jICE9IG51bGwpIHsKLQkJCVBvc2l0aW9uW10gcG9zaXRpb25zID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcG9zaXRpb25zID0gZG9jLmdldFBvc2l0aW9ucyhIeXBlcmxpbmtQb3NpdGlvbi5IWVBFUl9MSU5LX0NBVEVHT1JZKTsKLQkJCX0gY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBubyBsaW5rcyBoYXZlIGJlZW4gYWRkZWQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07Ci0JCQkJaWYgKG9mZnNldCA+PSBwb3NpdGlvbi5nZXRPZmZzZXQoKSAmJiBvZmZzZXQgPD0gKHBvc2l0aW9uLmdldE9mZnNldCgpICsgcG9zaXRpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCXJldHVybiAoKEh5cGVybGlua1Bvc2l0aW9uKXBvc2l0aW9uKS5nZXRIeXBlckxpbmsoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBDb2xvciBnZXRDb2xvckF0T2Zmc2V0KGludCBvZmZzZXQsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUNvbnNvbGVEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gKENvbnNvbGVEb2N1bWVudFBhcnRpdGlvbmVyKWRvY3VtZW50LmdldERvY3VtZW50UGFydGl0aW9uZXIoKTsKLQkJCWlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQkJSUNvbnNvbGVDb2xvclByb3ZpZGVyIGNvbG9yUHJvdmlkZXIgPSBEZWJ1Z1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRDb25zb2xlRG9jdW1lbnRNYW5hZ2VyKCkuZ2V0Q29sb3JQcm92aWRlcihJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9BTlRfUFJPQ0VTU19UWVBFKTsKLQkJCQlJVHlwZWRSZWdpb25bXSByZWdpb25zPSBwYXJ0aXRpb25lci5jb21wdXRlUGFydGl0aW9uaW5nKG9mZnNldCwgZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KS5nZXRMZW5ndGgoKSk7Ci0JCQkJCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmVhbVBhcnRpdGlvbiBwYXJ0aXRpb24gPSAoU3RyZWFtUGFydGl0aW9uKXJlZ2lvbnNbaV07Ci0JCQkJCXJldHVybiBjb2xvclByb3ZpZGVyLmdldENvbG9yKHBhcnRpdGlvbi5nZXRTdHJlYW1JZGVudGlmaWVyKCkpOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RQbHVnaW4uamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0UGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjFiMWEuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotcHVibGljIGNsYXNzIEFudFVJVGVzdFBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCQotCXByaXZhdGUgc3RhdGljIEFudFVJVGVzdFBsdWdpbiBkZWZsdDsKLQkKLQlwdWJsaWMgQW50VUlUZXN0UGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlkZWZsdD0gdGhpczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBBbnRVSVRlc3RQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmx0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5hYmxlQXV0b2J1aWxkKGJvb2xlYW4gZW5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIGRpc2FibGUgYXV0byBidWlsZAotCQlJV29ya3NwYWNlIHdvcmtzcGFjZT0gQW50VUlUZXN0UGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJV29ya3NwYWNlRGVzY3JpcHRpb24gZGVzYz0gd29ya3NwYWNlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2Muc2V0QXV0b0J1aWxkaW5nKGVuYWJsZSk7Ci0JCXdvcmtzcGFjZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQl9Ci0JCi0JcHVibGljIEZpbGUgZ2V0RmlsZUluUGx1Z2luKElQYXRoIHBhdGgpIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBnZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCk7Ci0JCQlVUkwgaW5zdGFsbFVSTD0gbmV3IFVSTChidW5kbGUuZ2V0RW50cnkoIi8iKSwgcGF0aC50b1N0cmluZygpKTsKLQkJCVVSTCBsb2NhbFVSTD0gUGxhdGZvcm0uYXNMb2NhbFVSTChpbnN0YWxsVVJMKTsKLQkJCXJldHVybiBuZXcgRmlsZShsb2NhbFVSTC5nZXRGaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vQW50VUlUZXN0cy5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOGY3ODMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9BbnRVSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA0IEdFQklUIEdlc2VsbHNjaGFmdCBmdWVyIEVEVi1CZXJhdHVuZwotICogdW5kIEluZm9ybWF0aWstVGVjaG5vbG9naWVuIG1iSCwgCi0gKiBCZXJsaW4sIER1ZXNzZWxkb3JmLCBGcmFua2Z1cnQgKEdlcm1hbnkpIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgR0VCSVQgR2VzZWxsc2NoYWZ0IGZ1ZXIgRURWLUJlcmF0dW5nIHVuZCBJbmZvcm1hdGlrLVRlY2hub2xvZ2llbiBtYkggLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAJICAgSUJNIENvcnBvcmF0aW9uIC0gYWRkaXRpb25hbCB0ZXN0cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLkJ1aWxkVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5BbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuQ29kZUNvbXBsZXRpb25UZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbEZvcm1hdHRlclRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLmVkaXRvci5mb3JtYXR0ZXIuWG1sVGFnRm9ybWF0dGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZWRpdG9yLmZvcm1hdHRlci5Gb3JtYXR0aW5nUHJlZmVyZW5jZXNUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5lZGl0b3IuZm9ybWF0dGVyLlhtbERvY3VtZW50Rm9ybWF0dGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuZXh0ZXJuYWx0b29scy5NaWdyYXRpb25UZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc2VwYXJhdGVWTS5TZXBhcmF0ZVZNVGVzdHM7Ci0KLS8qKgotICogVGVzdCBzdWl0ZSBmb3IgdGhlIEFudCBVSQotICovCi1wdWJsaWMgY2xhc3MgQW50VUlUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0KLSAgICAgICAgVGVzdFN1aXRlIHN1aXRlPSBuZXcgQW50VUlUZXN0cygpOwotICAgICAgICBzdWl0ZS5zZXROYW1lKCJBbnQgVUkgVW5pdCBUZXN0cyIpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShCdWlsZFRlc3RzLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShTZXBhcmF0ZVZNVGVzdHMuY2xhc3MpKTsKLSAgICAgICAgc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKENvZGVDb21wbGV0aW9uVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGFza0Rlc2NyaXB0aW9uUHJvdmlkZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShBbnRFZGl0b3JDb250ZW50T3V0bGluZVRlc3RzLmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShNaWdyYXRpb25UZXN0cy5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoRm9ybWF0dGluZ1ByZWZlcmVuY2VzVGVzdC5jbGFzcykpOwotICAgICAgICBzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoWG1sRG9jdW1lbnRGb3JtYXR0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShYbWxUYWdGb3JtYXR0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShYbWxGb3JtYXR0ZXJUZXN0LmNsYXNzKSk7Ci0gICAgICAgIHJldHVybiBzdWl0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0NvbnNvbGVMaW5lVHJhY2tlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Db25zb2xlTGluZVRyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVkNjZhOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0NvbnNvbGVMaW5lVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlTGluZVRyYWNrZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLS8qKgotICogU2ltcGxlIGNvbnNvbGUgbGluZSB0cmFja2VyIGV4dGVuc2lvbiBwb2ludCB0aGF0IGNvbGxlY3RzIHRoZSBsaW5lcwotICogYXBwZW5kZWQgdG8gdGhlIGNvbnNvbGUuIAotICovCi1wdWJsaWMgY2xhc3MgQ29uc29sZUxpbmVUcmFja2VyIGltcGxlbWVudHMgSUNvbnNvbGVMaW5lVHJhY2tlckV4dGVuc2lvbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnNvbGUgY29uc29sZTsKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGxpbmVzPSBuZXcgQXJyYXlMaXN0KCk7IAotCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29uc29sZUNsb3NlZD0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljb25zb2xlID0gbnVsbDsKLQkJbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGVMaW5lVHJhY2tlciNpbml0KG9yZy5lY2xpcHNlLmRlYnVnLnVpLmNvbnNvbGUuSUNvbnNvbGUpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGluaXQoSUNvbnNvbGUgYykgewotCQlDb25zb2xlTGluZVRyYWNrZXIuY29uc29sZT0gYzsKLQkJbGluZXM9IG5ldyBBcnJheUxpc3QoKTsKLQkJY29uc29sZUNsb3NlZD0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5jb25zb2xlLklDb25zb2xlTGluZVRyYWNrZXIjbGluZUFwcGVuZGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaW5lQXBwZW5kZWQoSVJlZ2lvbiBsaW5lKSB7Ci0JCWxpbmVzLmFkZChsaW5lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtYmVyT2ZNZXNzYWdlcygpIHsKLQkJcmV0dXJuIGxpbmVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWVzc2FnZShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgbGluZXMuc2l6ZSgpKXsKLQkJCUlSZWdpb24gbGluZVJlZ2lvbj0gKElSZWdpb24pbGluZXMuZ2V0KGluZGV4KTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNvbnNvbGUuZ2V0RG9jdW1lbnQoKS5nZXQobGluZVJlZ2lvbi5nZXRPZmZzZXQoKSwgbGluZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTGlzdCBnZXRBbGxNZXNzYWdlcygpIHsKLQkJTGlzdCBhbGw9IG5ldyBBcnJheUxpc3QobGluZXMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7IGkrKykgewotCQkJSVJlZ2lvbiBsaW5lUmVnaW9uPSAoSVJlZ2lvbilsaW5lcy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWFsbC5hZGQoY29uc29sZS5nZXREb2N1bWVudCgpLmdldChsaW5lUmVnaW9uLmdldE9mZnNldCgpLCBsaW5lUmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBjb25zb2xlLmdldERvY3VtZW50KCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3YWl0Rm9yQ29uc29sZSgpIHsKLQkJaWYgKGNvbnNvbGVDbG9zZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJc3luY2hyb25pemVkIChsaW5lcykgewotCQkJCWxpbmVzLndhaXQoMjAwMDApOwotCQkJfQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgewotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuY29uc29sZS5JQ29uc29sZUxpbmVUcmFja2VyRXh0ZW5zaW9uI2NvbnNvbGVDbG9zZWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnNvbGVDbG9zZWQoKSB7Ci0JCWNvbnNvbGVDbG9zZWQ9IHRydWU7Ci0JCQotCQlzeW5jaHJvbml6ZWQgKGxpbmVzKSB7Ci0JCQlsaW5lcy5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9EZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdlYTI3YS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdFdmVudDsKLQotLyoqCi0gKiBXYWl0cyBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEga2luZCBvZiBlbGVtZW50LiAgQ29tcGFyZSB0aGlzIHRvIFNwZWNpZmljRGVidWdFbGVtZW50RXZlbnRXYWl0ZXIgd2hpY2ggaXMKLSAqIHVzZWQgdG8gd2FpdCBmb3IgYSB0eXBlIG9mIGV2ZW50IG9uIGEgc3BlY2lmaWMgZGVidWcgZWxlbWVudCBvYmplY3QuCi0gKi8KLQotcHVibGljIGNsYXNzIERlYnVnRWxlbWVudEtpbmRFdmVudFdhaXRlciBleHRlbmRzIERlYnVnRXZlbnRXYWl0ZXIgewotCQotCXByb3RlY3RlZCBDbGFzcyBmRWxlbWVudENsYXNzOwotCQotCXB1YmxpYyBEZWJ1Z0VsZW1lbnRLaW5kRXZlbnRXYWl0ZXIoaW50IGV2ZW50S2luZCwgQ2xhc3MgZWxlbWVudENsYXNzKSB7Ci0JCXN1cGVyKGV2ZW50S2luZCk7Ci0JCWZFbGVtZW50Q2xhc3MgPSBlbGVtZW50Q2xhc3M7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChEZWJ1Z0V2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCXJldHVybiBzdXBlci5hY2NlcHQoZXZlbnQpICYmIGZFbGVtZW50Q2xhc3MuaXNJbnN0YW5jZShvKTsKLQl9Ci0KLX0KLQotCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL0RlYnVnRXZlbnRXYWl0ZXIuamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzA2MzdlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vRGVidWdFdmVudFdhaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI7Ci0KLS8qKgotICogVGhlIDxjb2RlPkRlYnVnRXZlbnRXYWl0ZXI8L2NvZGU+IGlzCi0gKiB0byB3YWl0IGZvciBhIHNwZWNpZmljIGtpbmQgb2YgZGVidWcgZXZlbnQuCi0gKiA8cD4KLSAqIFdoZW4gYSA8Y29kZT5EZWJ1Z0V2ZW50V2FpdGVyPC9jb2RlPiBpcyBjcmVhdGVkLCBpdAotICogcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSA8Y29kZT5EZWJ1Z1BsdWdpbjwvY29kZT4gYXMKLSAqIGFuIDxjb2RlPklEZWJ1Z0V2ZW50U2V0TGlzdGVuZXI8L2NvZGU+LgotICogPHA+Ci0gKiBOT1RFOiA8Y29kZT5EZWJ1Z0V2ZW50V2FpdGVyPC9jb2RlPiBvYmplY3RzIGFyZSBpbnRlbmRlZCBmb3IKLSAqIG9uZSB0aW1lIHVzZSBvbmx5IQotICovCi1wdWJsaWMgY2xhc3MgRGVidWdFdmVudFdhaXRlciBpbXBsZW1lbnRzIElEZWJ1Z0V2ZW50U2V0TGlzdGVuZXIgewotCS8qKgotCSAqIFRoZSBraW5kIG9mIGV2ZW50IHRoZSB3YWl0ZXIgaXMgd2FpdGluZyBmb3IKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGZFdmVudFR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGUgd2FpdGVyIHdpbGwgd2FpdCBiZWZvcmUgdGltaW5nIG91dC4KLQkgKi8KLQlwcm90ZWN0ZWQgbG9uZyBmVGltZW91dDsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5JRGVidWdNb2RlbE1hbmFnZXI8L2NvZGU+IHRoaXMgd2FpdGVyIGlzIGxpc3RlbmluZyB0by4KLQkgKi8KLQlwcm90ZWN0ZWQgRGVidWdQbHVnaW4gZkRlYnVnUGx1Z2luOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPkRlYnVnRXZlbnQ8L2NvZGU+IHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCBEZWJ1Z0V2ZW50IGZFdmVudDsKLQkKLQkvKioKLQkgKiBUaGUgZXZlbnQgc2V0IHRoYXQgd2FzIGFjY2VwdGVkCi0JICovCi0JcHJvdGVjdGVkIERlYnVnRXZlbnRbXSBmRXZlbnRTZXQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlIGlmIG5vbmUgaXMgZ2l2ZW4gKDIwMDAwKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9USU1FT1VUPSAxNTAwMDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGVidWdFdmVudFdhaXRlcjwvY29kZT4gd2hpY2gKLQkgKiB3YWl0cyBmb3IgZXZlbnRzIG9mIGEga2luZCA8Y29kZT5ldmVudFR5cGU8L2NvZGU+LgotCSAqIFRoZSB3YWl0IG1ldGhvZCB3aWxsIHdhaXQgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudFdhaXRlcihpbnQgZXZlbnRUeXBlKSB7Ci0JCWZEZWJ1Z1BsdWdpbj0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQlmRXZlbnRUeXBlPSBldmVudFR5cGU7Ci0JCWZUaW1lb3V0PSBERUZBVUxUX1RJTUVPVVQ7Ci0KLQkJZkRlYnVnUGx1Z2luLmFkZERlYnVnRXZlbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRydWUgaWYgdGhlIDxjb2RlPkRlYnVnRXZlbnQ8L2NvZGU+IGlzIGFjY2VwdGFibGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KERlYnVnRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGV2ZW50LmdldEtpbmQoKSA9PSBmRXZlbnRUeXBlICYmIGV2ZW50LmdldERldGFpbCgpICE9IERlYnVnRXZlbnQuRVZBTFVBVElPTl9JTVBMSUNJVDsKLQl9Ci0JLyoqCi0JICogQW5zd2VycyB0aGUgZXZlbnQgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFdmVudE5hbWUoaW50IGZsYWcpIHsKLQkJc3dpdGNoIChmbGFnKSB7Ci0JCQljYXNlIERlYnVnRXZlbnQuQ1JFQVRFIDoKLQkJCQlyZXR1cm4gIkNyZWF0ZSI7Ci0JCQljYXNlIERlYnVnRXZlbnQuVEVSTUlOQVRFIDoKLQkJCQlyZXR1cm4gIlRlcm1pbmF0ZSI7Ci0JCQljYXNlIERlYnVnRXZlbnQuUkVTVU1FIDoKLQkJCQlyZXR1cm4gIlJlc3VtZSI7Ci0JCQljYXNlIERlYnVnRXZlbnQuU1VTUEVORCA6Ci0JCQkJcmV0dXJuICJTdXNwZW5kIjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiVU5LTk9XTiI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGVzIGRlYnVnIGV2ZW50cy4KLQkgKgotCSAqIEBzZWUgSURlYnVnRXZlbnRMaXN0ZW5lcgotCSAqIEBzZWUgI2FjY2VwdChEZWJ1Z0V2ZW50KQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVEZWJ1Z0V2ZW50cyhEZWJ1Z0V2ZW50W10gZXZlbnRzKSB7Ci0JCS8vcHJpbnRSZWNlaXZlZChldmVudHMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFjY2VwdChldmVudHNbaV0pKSB7Ci0JCQkJZkV2ZW50PSBldmVudHNbaV07Ci0JCQkJZkV2ZW50U2V0ID0gZXZlbnRzOwotCQkJCXVucmVnaXN0ZXIoKTsKLQkJCQlub3RpZnlBbGwoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBtZXNzYWdlIGluZGljYXRpbmcgd2hpY2ggZXZlbnQgd2FzIHJlY2VpdmVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50UmVjZWl2ZWQoRGVidWdFdmVudFtdIGV2ZW50cykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMgKyIgZ290ICIgKyBldmVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciB0aGlzIGNhbGxiYWNrCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChsb25nIG1pbGxpc2Vjb25kcykgewotCQlmVGltZW91dD0gbWlsbGlzZWNvbmRzOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXJzIHRoaXMgd2FpdGVyIGFzIGEgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKCkgewotCQlmRGVidWdQbHVnaW4ucmVtb3ZlRGVidWdFdmVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNvdXJjZSBvZiB0aGUgYWNjZXB0ZWQgZXZlbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgbm8gZXZlbnQgd2FzIGFjY2VwdGVkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHdhaXRGb3JFdmVudCgpIHsKLQkJaWYgKGZFdmVudCA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXdhaXQoZlRpbWVvdXQpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkludGVycnVwdGVkIHdhaXRpbmcgZm9yIGV2ZW50Iik7Ci0JCQl9Ci0JCX0KLQkJdW5yZWdpc3RlcigpOwotCQlpZiAoZkV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZFdmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBldmVudCwgaWYgYW55LgotCSAqLwotCXB1YmxpYyBEZWJ1Z0V2ZW50IGdldEV2ZW50KCkgewotCQlyZXR1cm4gZkV2ZW50OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY2NlcHRlZCBldmVudCBzZXQsIGlmIGFueS4KLQkgKi8KLQlwdWJsaWMgRGVidWdFdmVudFtdIGdldEV2ZW50U2V0KCkgewotCQlyZXR1cm4gZkV2ZW50U2V0OwotCX0JCi19Ci0KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QgcGx1Z2luL29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS90ZXN0cGx1Z2luL1Byb2plY3RDcmVhdGlvbkRlY29yYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI0ZmZkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdENyZWF0aW9uRGVjb3JhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuYW50LmludGVybmFsLnVpLmxhdW5jaENvbmZpZ3VyYXRpb25zLklBbnRMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5BbnRVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5hbnQuaW50ZXJuYWwudWkubW9kZWwuSUFudFVJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5tb2RlbC5JQW50VUlQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLklEZWJ1Z1VJQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkphdmFSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuaW50ZXJuYWwubW9kZWwuSUV4dGVybmFsVG9vbENvbnN0YW50czsKLQotLyoqCi0gKiBUZXN0IHRvIGNsb3NlIHRoZSB3b3JrYmVuY2gsIHNpbmNlIGRlYnVnIHRlc3RzIGRvIG5vdCBydW4gaW4gdGhlIFVJCi0gKiB0aHJlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0Q3JlYXRpb25EZWNvcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEFudFVJVGVzdCB7Ci0JCi0JcHVibGljIFByb2plY3RDcmVhdGlvbkRlY29yYXRvcihTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByb2plY3RDcmVhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJLy8gZGVsZXRlIGFueSBwcmUtZXhpc3RpbmcgcHJvamVjdAotCQkJSVByb2plY3QgcHJvID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKLQkJCWlmIChwcm8uZXhpc3RzKCkpIHsKLQkJCQlwcm8uZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJfQotCQkJLy8gY3JlYXRlIHByb2plY3QgYW5kIGltcG9ydCBidWlsZGZpbGVzIGFuZCBzdXBwb3J0IGZpbGVzCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUHJvamVjdEhlbHBlci5jcmVhdGVQcm9qZWN0KFByb2plY3RIZWxwZXIuUFJPSkVDVF9OQU1FKTsKLQkJCUlGb2xkZXIgZm9sZGVyID0gUHJvamVjdEhlbHBlci5hZGRGb2xkZXIocHJvamVjdCwgImJ1aWxkZmlsZXMiKTsKLQkJCVByb2plY3RIZWxwZXIuYWRkRm9sZGVyKHByb2plY3QsICJsYXVuY2hDb25maWd1cmF0aW9ucyIpOwotCQkJRmlsZSByb290ID0gQW50VUlUZXN0UGx1Z2luLmdldERlZmF1bHQoKS5nZXRGaWxlSW5QbHVnaW4oUHJvamVjdEhlbHBlci5URVNUX0JVSUxERklMRVNfRElSKTsKLQkJCVByb2plY3RIZWxwZXIuaW1wb3J0RmlsZXNGcm9tRGlyZWN0b3J5KHJvb3QsIGZvbGRlci5nZXRGdWxsUGF0aCgpLCBudWxsKTsKLQkJCQotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiZWNob2luZyIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbigiYnVpbGQiKTsKLQkJCWNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb24oImJhZCIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImVjaG9pbmdTZXBWTSIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImV4dGVuc2lvblBvaW50U2VwVk0iKTsKLQkJCWNyZWF0ZUxhdW5jaENvbmZpZ3VyYXRpb25Gb3JTZXBhcmF0ZVZNKCJleHRlbnNpb25Qb2ludFRhc2tTZXBWTSIpOwotCQkJY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oImV4dGVuc2lvblBvaW50VHlwZVNlcFZNIik7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2RvIG5vdCBzaG93IHRoZSBBbnQgYnVpbGQgZmFpbGVkIGVycm9yIGRpYWxvZwotCQkJQW50VUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKElBbnRVSVByZWZlcmVuY2VDb25zdGFudHMuQU5UX0VSUk9SX0RJQUxPRywgZmFsc2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzaGFyZWQgbGF1bmNoIGNvbmZpZ3VyYXRpb24gZm9yIGxhdW5jaGluZyBBbnQgaW4gYSBzZXBhcmF0ZSBWTSB3aXRoIHRoZSBnaXZlbgotCSAqIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlTGF1bmNoQ29uZmlndXJhdGlvbkZvclNlcGFyYXRlVk0oU3RyaW5nIGxhdW5jaENvbmZpZ05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJTGF1bmNoQ29uZmlndXJhdGlvblR5cGUgdHlwZSA9IGdldExhdW5jaE1hbmFnZXIoKS5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShJQW50TGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5JRF9BTlRfTEFVTkNIX0NPTkZJR1VSQVRJT05fVFlQRSk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnID0gdHlwZS5uZXdJbnN0YW5jZShnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoImxhdW5jaENvbmZpZ3VyYXRpb25zIiksIGxhdW5jaENvbmZpZ05hbWUpOwotCQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9NQUlOX1RZUEVfTkFNRSwgIm9yZy5lY2xpcHNlLmFudC5pbnRlcm5hbC51aS5hbnRzdXBwb3J0LkludGVybmFsQW50UnVubmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9DTEFTU1BBVEhfUFJPVklERVIsICJvcmcuZWNsaXBzZS5hbnQudWkuQW50Q2xhc3NwYXRoUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQljb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0pFQ1RfTkFNRSwgZ2V0SmF2YVByb2plY3QoKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJRXh0ZXJuYWxUb29sQ29uc3RhbnRzLkFUVFJfTE9DQVRJT04sICIke3dvcmtzcGFjZV9sb2M6LyIgKyBQcm9qZWN0SGVscGVyLlBST0pFQ1RfTkFNRSArICIvYnVpbGRmaWxlcy8iICsgbGF1bmNoQ29uZmlnTmFtZSArICIueG1sfSIpOwotCQljb25maWcuc2V0QXR0cmlidXRlKElEZWJ1Z1VJQ29uc3RhbnRzLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQsIHRydWUpOwotCQljb25maWcuc2V0QXR0cmlidXRlKERlYnVnUGx1Z2luLkFUVFJfUFJPQ0VTU19GQUNUT1JZX0lELCBJQW50VUlDb25zdGFudHMuUkVNT1RFX0FOVF9QUk9DRVNTX0ZBQ1RPUllfSUQpOwotCQkgCi0JCXNldFZNKGNvbmZpZyk7Ci0JCQkJCi0JCWNvbmZpZy5kb1NhdmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIHNoYXJlZCBsYXVuY2ggY29uZmlndXJhdGlvbiBmb3IgbGF1bmNoaW5nIEFudCBpbiBhIHNlcGFyYXRlIFZNIHdpdGggdGhlIGdpdmVuCi0JICogbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVMYXVuY2hDb25maWd1cmF0aW9uKFN0cmluZyBsYXVuY2hDb25maWdOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlIHR5cGUgPSBnZXRMYXVuY2hNYW5hZ2VyKCkuZ2V0TGF1bmNoQ29uZmlndXJhdGlvblR5cGUoSUFudExhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfQU5UX0xBVU5DSF9DT05GSUdVUkFUSU9OX1RZUEUpOwotCQlJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGNvbmZpZyA9IHR5cGUubmV3SW5zdGFuY2UoZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJsYXVuY2hDb25maWd1cmF0aW9ucyIpLCBsYXVuY2hDb25maWdOYW1lKTsKLQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIGdldEphdmFQcm9qZWN0KCkuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUV4dGVybmFsVG9vbENvbnN0YW50cy5BVFRSX0xPQ0FUSU9OLCAiJHt3b3Jrc3BhY2VfbG9jOi8iICsgUHJvamVjdEhlbHBlci5QUk9KRUNUX05BTUUgKyAiL2J1aWxkZmlsZXMvIiArIGxhdW5jaENvbmZpZ05hbWUgKyAiLnhtbH0iKTsKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJRGVidWdVSUNvbnN0YW50cy5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5ELCB0cnVlKTsKLQkJCQotCQljb25maWcuZG9TYXZlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZNKElMYXVuY2hDb25maWd1cmF0aW9uV29ya2luZ0NvcHkgY29uZmlnKSB7Ci0JCUlWTUluc3RhbGwgdm0gPSBKYXZhUnVudGltZS5nZXREZWZhdWx0Vk1JbnN0YWxsKCk7Ci0JCVN0cmluZyB2bU5hbWU9IHZtLmdldE5hbWUoKTsKLQkJU3RyaW5nIHZtVHlwZUlEPSB2bS5nZXRWTUluc3RhbGxUeXBlKCkuZ2V0SWQoKTsJCQkKLQkJY29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9WTV9JTlNUQUxMX05BTUUsIHZtTmFtZSk7Ci0JCWNvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfVk1fSU5TVEFMTF9UWVBFLCB2bVR5cGVJRCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBwbHVnaW4vb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3Rlc3RwbHVnaW4vUHJvamVjdEhlbHBlci5qYXZhIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjI1MDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHBsdWdpbi9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvdGVzdHBsdWdpbi9Qcm9qZWN0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkudGVzdHBsdWdpbjsKLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklPdmVyd3JpdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLmRhdGF0cmFuc2Zlci5GaWxlU3lzdGVtU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLkltcG9ydE9wZXJhdGlvbjsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyB0byBzZXQgdXAgYW4gSVByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SGVscGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfQlVJTERGSUxFU19ESVI9IG5ldyBQYXRoKCJ0ZXN0YnVpbGRmaWxlcyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggVEVTVF9SRVNPVVJDRVNfRElSPSBuZXcgUGF0aCgidGVzdHJlc291cmNlcyIpOwkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIFRFU1RfTElCX0RJUj0gbmV3IFBhdGgoInRlc3RsaWIiKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05BTUU9ICJBbnQgVUkgVGVzdHMiOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBJUHJvamVjdC4KLQkgKi8JCi0JcHVibGljIHN0YXRpYyBJUHJvamVjdCBjcmVhdGVQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlUm9vdCByb290PSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0PSByb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXByb2plY3QuY3JlYXRlKG51bGwpOwotCQl9IGVsc2UgewotCQkJcHJvamVjdC5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJfQotCQkKLQkJaWYgKCFwcm9qZWN0LmlzT3BlbigpKSB7Ci0JCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0JCX0KLQkJCi0JCWlmICghcHJvamVjdC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCQkJYWRkTmF0dXJlVG9Qcm9qZWN0KHByb2plY3QsIEphdmFDb3JlLk5BVFVSRV9JRCwgbnVsbCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE5hdHVyZVRvUHJvamVjdChJUHJvamVjdCBwcm9qLCBTdHJpbmcgbmF0dXJlSWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvai5nZXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmdbXSBwcmV2TmF0dXJlcz0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCVN0cmluZ1tdIG5ld05hdHVyZXM9IG5ldyBTdHJpbmdbcHJldk5hdHVyZXMubGVuZ3RoICsgMV07Ci0JCVN5c3RlbS5hcnJheWNvcHkocHJldk5hdHVyZXMsIDAsIG5ld05hdHVyZXMsIDAsIHByZXZOYXR1cmVzLmxlbmd0aCk7Ci0JCW5ld05hdHVyZXNbcHJldk5hdHVyZXMubGVuZ3RoXT0gbmF0dXJlSWQ7Ci0JCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyhuZXdOYXR1cmVzKTsKLQkJcHJvai5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbW9uaXRvcik7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgYW4gSVByb2plY3QuCi0JICovCQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKElQcm9qZWN0IHByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBZGRzIGEgZm9sZGVyIHRvIGFuIElQcm9qZWN0LgotCSAqLwkJCi0JcHVibGljIHN0YXRpYyBJRm9sZGVyIGFkZEZvbGRlcihJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgY29udGFpbmVyTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJCUlGb2xkZXIgZm9sZGVyPSBwcm9qZWN0LmdldEZvbGRlcihjb250YWluZXJOYW1lKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJZm9sZGVyLmNyZWF0ZShmYWxzZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9Ci0JCQotCQlyZXR1cm4gZm9sZGVyOwotCQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGltcG9ydEZpbGVzRnJvbURpcmVjdG9yeShGaWxlIHJvb3REaXIsIElQYXRoIGRlc3RQYXRoLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CQkKLQkJSUltcG9ydFN0cnVjdHVyZVByb3ZpZGVyIHN0cnVjdHVyZVByb3ZpZGVyID0gRmlsZVN5c3RlbVN0cnVjdHVyZVByb3ZpZGVyLklOU1RBTkNFOwotCQlMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgxMDApOwotCQlhZGRGaWxlcyhyb290RGlyLCBmaWxlcyk7Ci0JCXRyeSB7Ci0JCQlJbXBvcnRPcGVyYXRpb24gb3A9IG5ldyBJbXBvcnRPcGVyYXRpb24oZGVzdFBhdGgsIHJvb3REaXIsIHN0cnVjdHVyZVByb3ZpZGVyLCBuZXcgSW1wb3J0T3ZlcndyaXRlUXVlcnkoKSwgZmlsZXMpOwotCQkJb3Auc2V0Q3JlYXRlQ29udGFpbmVyU3RydWN0dXJlKGZhbHNlKTsKLQkJCW9wLnJ1bihtb25pdG9yKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRGaWxlcyhGaWxlIGRpciwgTGlzdCBjb2xsZWN0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCUxpc3Qgc3ViRGlycyA9IG5ldyBBcnJheUxpc3QoMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkgewotCQkJCWNvbGxlY3Rpb24uYWRkKGZpbGVzW2ldKTsKLQkJCX0gZWxzZSBpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCXN1YkRpcnMuYWRkKGZpbGVzW2ldKTsKLQkJCX0KLQkJfQotCQlJdGVyYXRvciBpdGVyID0gc3ViRGlycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUZpbGUgc3ViRGlyID0gKEZpbGUpaXRlci5uZXh0KCk7Ci0JCQlhZGRGaWxlcyhzdWJEaXIsIGNvbGxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEltcG9ydE92ZXJ3cml0ZVF1ZXJ5IGltcGxlbWVudHMgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQkJcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgZmlsZSkgewotCQkJcmV0dXJuIEFMTDsKLQkJfQkKLQl9CQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YSBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3Rhc2tzL0FudFRlc3RUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlN2IzM2EuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrIGV4dGVuZHMgVGFzayB7Ci0JCi0JcHVibGljIEFudFRlc3RUYXNrKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWVjaG8uc2V0TWVzc2FnZSgiVGVzdGluZyBBbnQgaW4gRWNsaXBzZSB3aXRoIGEgY3VzdG9tIHRhc2siKTsKLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvQW50VGVzdFRhc2syLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiN2JhZi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9BbnRUZXN0VGFzazIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3M7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLkVjaG87Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuRW51bWVyYXRlZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5SZWZlcmVuY2U7Ci0KLQotcHVibGljIGNsYXNzIEFudFRlc3RUYXNrMiBleHRlbmRzIFRhc2sgewotCQotCVN0cmluZyBmTWVzc2FnZT0gIkRlZmF1bHQiOwotCVJlZmVyZW5jZSBmUmVmPSBudWxsOwotCQotCXB1YmxpYyBBbnRUZXN0VGFzazIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmFwYWNoZS50b29scy5hbnQuVGFzayNleGVjdXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEJ1aWxkRXhjZXB0aW9uIHsKLQkJRWNobyBlY2hvPSBuZXcgRWNobygpOwotCQllY2hvLnNldFByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJZWNoby5zZXRNZXNzYWdlKCJUZXN0aW5nIEFudCBpbiBFY2xpcHNlIHdpdGggYSBjdXN0b20gdGFzazI6ICIgKyBmTWVzc2FnZSk7Ci0JCWVjaG8uZXhlY3V0ZSgpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKENvb2wgYXR0cikgewotICAgICAgICBmTWVzc2FnZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlKFJlZmVyZW5jZSByZWYpIHsKLSAgICAgICAgZlJlZj0gcmVmOwotICAgIH0KLQkKLQkvKioKLSAgICAgKiBFbnVtZXJhdGVkIGF0dHJpYnV0ZSB3aXRoIHRoZSB2YWx1ZXMgImNvb2wiLCAiY2hpbGxpbiIgYW5kICJhd2Vzb21lIi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvb2wgZXh0ZW5kcyBFbnVtZXJhdGVkQXR0cmlidXRlIHsKLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldFZhbHVlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyJjb29sIiwgImNoaWxsaW4iLCAiYXdlc29tZSJ9OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0IHN1cHBvcnQvb3JnL2VjbGlwc2UvYW50L3Rlc3RzL3VpL3N1cHBvcnQvdGFza3MvTmVzdEVsZW1lbnRUYXNrLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9OZXN0RWxlbWVudFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU0MTA3Mi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90YXNrcy9OZXN0RWxlbWVudFRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrczsKLQotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LkJ1aWxkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuRWNobzsKLQotcHVibGljIGNsYXNzIE5lc3RFbGVtZW50VGFzayBleHRlbmRzIFRhc2sgeyAgCi0JCi0JU3RyaW5nIG1lc3NhZ2U9ICJiYXIiOwotCU5lc3RlZEVsZW1lbnQgZTsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5lc3RlZEVsZW1lbnR7Ci0gICAgCUJvb2xlYW4gd29ya3M9IEJvb2xlYW4uRkFMU0U7Ci0gICAgCXB1YmxpYyBOZXN0ZWRFbGVtZW50KCkgewkKLSAgICAJfQotICAgIAkKLSAgICAgICAgcHVibGljIHZvaWQgc2V0V29ya3MoQm9vbGVhbiBib29sZWFuVmFsdWUpIHsKLSAgICAgICAgCXdvcmtzPSBib29sZWFuVmFsdWU7Ci0gICAgICAgIH0KLQotCQlwdWJsaWMgYm9vbGVhbiB3b3JrcygpIHsKLQkJCXJldHVybiB3b3Jrcy5ib29sZWFuVmFsdWUoKTsKLQkJfQotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBhZGROZXN0ZWRFbGVtZW50KE5lc3RlZEVsZW1lbnQgbmVzdGVkRWxlbWVudCkgewotICAgIAllPSBuZXN0ZWRFbGVtZW50OwotICAgIH0KLSAgIAotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCUVjaG8gZWNobz0gbmV3IEVjaG8oKTsKLQkJZWNoby5zZXRQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JCWlmIChlLndvcmtzKCkpIHsKLQkJCWVjaG8uc2V0TWVzc2FnZShtZXNzYWdlKTsKLQkJfSBlbHNlIHsKLQkJCWVjaG8uc2V0TWVzc2FnZSgiYWNrIik7Ci0JCX0KLQkJZWNoby5leGVjdXRlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3Qgc3VwcG9ydC9vcmcvZWNsaXBzZS9hbnQvdGVzdHMvdWkvc3VwcG9ydC90eXBlcy9BbnRUZXN0UGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDIyNDIwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdCBzdXBwb3J0L29yZy9lY2xpcHNlL2FudC90ZXN0cy91aS9zdXBwb3J0L3R5cGVzL0FudFRlc3RQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnR5cGVzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS50b29scy5hbnQuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5QYXRoOwotCi1wdWJsaWMgY2xhc3MgQW50VGVzdFBhdGggZXh0ZW5kcyBQYXRoIHsKLQkKLQlTdHJpbmcgbWVzc2FnZTsKLQkKLQlwdWJsaWMgQW50VGVzdFBhdGgoUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXN1cGVyKHByb2plY3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXRoaXMubWVzc2FnZT0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZmY0My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn1cLi5cLi4iLz4KLTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aSIvPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1maWxlIgotICAgICAgICAgICAgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiLz4KLSAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPgotICA8dGFyZ2V0IG5hbWU9InN1aXRlIj4KLSAgICA8cHJvcGVydHkgbmFtZT0iamR0LWZvbGRlciIgCi0gICAgICAgICAgICAgIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vamR0X2ZvbGRlciIvPgotICAgIDxkZWxldGUgZGlyPSIke2pkdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotICAgIDxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7amR0LWZvbGRlcn0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9Ii8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NuYW1lIiAKLSAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnRlc3RwbHVnaW4uQW50VUlUZXN0cyIvPgotICAgIDwvYW50PgotICA8L3RhcmdldD4KLQotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxzdWl0ZSxjbGVhbnVwIj4KLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2FudFVJVGVzdHNTdXBwb3J0LmphciBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTRlZWM4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYW50VUlUZXN0c1N1cHBvcnQuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9iYWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWM0ZDUxLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2dlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2JhZHByb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGE3OWE4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYmFkcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTxwcm9qZWN0IG5kZWZhdWx0PSJtYWtlIj4KLQk8dGFyZ2V0IG5hbWU9Im1ha2UiPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuQ3AxMjUxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQuQ3AxMjUxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmOTUzOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLkNwMTI1MS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTEiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0gICAgIDx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0gICAgICAgICAgPCEtLSBkaXNwbGF5cyBIZWxsbyBpbiBSdXNzaWFuIC0tPgotICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9Isfk8ODi8fLi8+ny5SIvPgotICAgICA8L3RhcmdldD4KLQotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLlVURjgueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZC5VVEY4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlNDczMy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLlVURjgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idGVzdCIgZGVmYXVsdD0iaW5pdCIgYmFzZWRpcj0iLiI+Ci0KLSAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgICA8IS0tIGRpc3BsYXlzIEhlbGxvIGluIFJ1c3NpYW4gLS0+Ci0gICAgICAgICAgPGVjaG8gbWVzc2FnZT0i0JfQtNGA0LDQstE/0YLQstGD0LnRgtC1Ii8+Ci0gICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2J1aWxkLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkNjRkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRWNob2luZyIgZGVmYXVsdD0iZWNobzEiIGJhc2VkaXI9Ii4uIj4KLQotCTx0YXJnZXQgbmFtZT0iZWNobzEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMSIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzIiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMiIvPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iZWNobzMiIGRlc2NyaXB0aW9uPSAiQW4gZWNobzMhIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzMiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDdlYmUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXByb3AxPXZhbDEKLXByb3AyID0gdmFsMgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0MS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMDQyZmYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0cHJvamVjdCIgYmFzZWRpcj0iLiIgZGVmYXVsdD0ibWFpbiI+Ci0JPHByb3BlcnR5IG5hbWU9InByb3BEIiB2YWx1ZT0idmFsRCIgLz4KLSAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGR0ZXN0MS5wcm9wZXJ0aWVzIiAvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJwcm9wViIgdmFsdWU9InZhbFYiIC8+Ci0gICAgPHRhcmdldCBuYW1lPSJtYWluIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InByb3BlcnR5X2luX3RhcmdldCIgdmFsdWU9InZhbCIvPgotICAgICAgICA8ZWNobz4kezwvZWNobz4KLSAgICA8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InByZXRlc3QiPjwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idGVzdCIgZGVwZW5kcz0iIj4KLQkJPGVjaG8+ZGVwZW5kczwvZWNobz4KLQk8L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QyIj48L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3QzIj48L3RhcmdldD4KLQk8dGFyZ2V0IG5hbWU9InRlc3RJZiIgaWY9IiI+PC90YXJnZXQ+Ci0JPHRhcmdldCBuYW1lPSJ0ZXN0VW5sZXNzIiB1bmxlc3M9InByb3AiPjwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0idGVzdE1vcmVEZXBlbmRzIiBkZXBlbmRzPSJwcmV0ZXN0LCAiPgotCQk8ZWNobyBtZXNzYWdlPSIkIj48L2VjaG8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvYnVpbGR0ZXN0Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlM2U1ZDMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9idWlsZHRlc3QyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3Rwcm9qZWN0IiBiYXNlZGlyPSIuIiBkZWZhdWx0PSJtYWluIj4KLQk8cHJvcGVydHkgbmFtZT0icHJvcEQiIHZhbHVlPSJ2YWxEIiAvPgotCTxwcm9wZXJ0eSBmaWxlPSJidWlsZHRlc3QxLnByb3BlcnRpZXMiIC8+Ci0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2N1c3RvbUJvb2xlYW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGQzN2EwLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvY3VzdG9tQm9vbGVhbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImRlZmF1bHRUYXJnZXROYW1lIj4KLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHRUYXJnZXROYW1lIj4KLQkJPGVjbGlwc2UuYnVpbGRTY3JpcHQgcmVjdXJzaXZlZ2VuZXJhdGlvbj0iIi8+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2RlcGVuZGVuY3l0ZXN0LnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjZiYTU3Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZGVwZW5kZW5jeXRlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLSBFaW4gdGVzdCBjYXNlIHNvbGx0ZSBkaWUgcHJvcGVydHkgcHJvcG9zYWxzIGluIG1haW4gICAgICAgLS0+Ci08IS0tIFVlYmVycHJ1ZWZlbiwgdW5kIG9iIGRpZSBkaXZlcnNlbiBwcm9wZXJ0aWVzIGVudHNwcmVjaGVuZCAtLT4KLTwhLS0gZGVyIGRlcGVuZGVuY2llcyBnZXNldHp0IHNpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCi08cHJvamVjdCBkZWZhdWx0PSJtYWluIj4KLQotCTxwcm9wZXJ0eSBuYW1lPSJkb19pbml0IiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwcm9wX3Byb3AiIHZhbHVlPSJ2YWwiPjwvcHJvcGVydHk+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkb19ub3RfY29tcGlsZSIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIHByb3BlcnRpZXMiPjwvZWNobz4KLQk8L3RhcmdldD4KLQotCTwhLS0gc2hvdWxkIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIHByb3BlcnR5IGlzIG5vdCBzZXQgICAgICAtLT4gCi0JPHRhcmdldCBuYW1lPSJhZGRpdGlvbmFsX3Byb3BlcnRpZXMiIGlmPSJkb19hZGRpdF9wcm9wcyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhZGl0X3Byb3AiIHZhbHVlPSJ2YWwiIC8+Ci0JCTxlY2hvIG1lc3NhZ2U9ImV4ZWN1dGluZyBhZGRpdGlvbmFsX3Byb3BlcnRpZXMiPjwvZWNobz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGlmPSJkb2luaXQiIGRlcGVuZHM9InByb3BlcnRpZXMsYWRkaXRpb25hbF9wcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9ImluaXRfcHJvcCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIGluaXQiPjwvZWNobz4KLQk8L3RhcmdldD4KLQkKLQk8IS0tIHNob3VsZCBuZXZlciBiZSBleGVjdXRlZCBzaW5jZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0ICAgLS0+Ci0JPCEtLSBieSBwcm9wZXJ0aWVzIGJlY2F1c2Ugb2YgZGVwZW5kZW5jaWVzIGJlZm9yZSAgICAgICAgICAgIC0tPiAKLQk8dGFyZ2V0IG5hbWU9ImNvbXBpbGUiIHVubGVzcz0iZG9fbm90X2NvbXBpbGUiPgotCQk8cHJvcGVydHkgbmFtZT0iY29tcGlsZV9wcm9wIiB2YWx1ZT0idmFsIj48L3Byb3BlcnR5PgotCQk8ZWNobyBtZXNzYWdlPSJleGVjdXRpbmcgY29tcGlsZSI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJpbml0LCBjb21waWxlIj4KLQkJPHByb3BlcnR5IG5hbWU9Im1haW5fcHJvcCIgdmFsdWU9InZhbCI+PC9wcm9wZXJ0eT4KLQkJPGVjaG8gbWVzc2FnZT0iZXhlY3V0aW5nIG1haW4gJHt3ZWxsfSI+PC9lY2hvPgotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VjaG9pbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RkNjRkLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFY2hvaW5nIiBkZWZhdWx0PSJlY2hvMSIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJlY2hvMSI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8xIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMiI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8yIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJlY2hvMyIgZGVzY3JpcHRpb249ICJBbiBlY2hvMyEiPgotCQk8ZWNobyBtZXNzYWdlPSJlY2hvMyIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lY2hvaW5nU2VwVk0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2I0OTg0Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZWNob2luZ1NlcFZNLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkVjaG9pbmciIGRlZmF1bHQ9ImVjaG8xIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9ImVjaG8xIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzEiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8yIj4KLQkJPGVjaG8gbWVzc2FnZT0iZWNobzIiLz4KLQk8L3RhcmdldD4KLQkKLQk8dGFyZ2V0IG5hbWU9ImVjaG8zIiBkZXNjcmlwdGlvbj0gIkFuIGVjaG8zISI+Ci0JCTxlY2hvIG1lc3NhZ2U9ImVjaG8zIi8+Ci0JPC90YXJnZXQ+Ci0JCi0JPHRhcmdldCBuYW1lPSJCdWc0Mjk4NCI+Ci0JCTxlY2hvIG1lc3NhZ2U9InVzZXIuZGlyOiAke3VzZXIuZGlyfSIvPgotCTwvdGFyZ2V0PgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9lbXB0eS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VtcHR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2VtcHR5LnhtbAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50U2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFNlcFZNLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczNWVkMC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2V4dGVuc2lvblBvaW50U2VwVk0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPHByb2plY3QgbmFtZT0iRXh0ZW5zaW9uIHBvaW50IHRlc3RpbmcgaW4gc2VwYXJhdGUgVk0iCi0gICAgICAgICBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnRzIgotICAgICAgICAgYmFzZWRpcj0iLiIKLSA+Ci0gICAgPHRhc2tkZWYgbmFtZT0ic2VwYXJhdGVWTVRhc2siIGNsYXNzbmFtZT0ib3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpLnN1cHBvcnQudGFza3MuQW50VGVzdFRhc2siPgotICAgIDwvdGFza2RlZj4KLSAgICA8dGFyZ2V0IG5hbWU9IkV4dGVuc2lvbiBQb2ludHMiCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0gIkVuc3VyZSB0aGF0IGFuIGV4dHJhIGNsYXNzcGF0aCBlbnRyeSBkZXNpZ25hdGVkIGFzIG5vdCByZXF1aXJpbmcgdGhlIEVjbGlwc2UgcnVudGltZSBzaG93cyB1cCBpbiBhIHNlcGFyYXRlIFZNIGJ1aWxkIgotICAgICA+Ci0gICAgICAgIDxzZXBhcmF0ZVZNVGFzay8+Ci0gICAgICAgICA8ZWNobz4ke3Byb3BlcnR5LnVpLnRlc3Rpbmd9PC9lY2hvPgotICAgICAgICA8ZWNobz4ke3Byb3BlcnR5LnVpLnRlc3RpbmcyfTwvZWNobz4KLSAgICA8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUYXNrU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFRhc2tTZXBWTS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTQ5NDUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFRhc2tTZXBWTS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9IkV4dGVuc2lvbiBQb2ludCBUYXNrIiBkZWZhdWx0PSJFeHRlbnNpb24gUG9pbnQgVGFzayIgYmFzZWRpcj0iLiI+Ci0JPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVGFzayIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0YXNrIGlzIHByZXNlbnQiPgotCQk8Y29vbFVJVGFzayBtZXNzYWdlPSJjb29sIiByZWZlcmVuY2U9IiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZXh0ZW5zaW9uUG9pbnRUeXBlU2VwVk0ueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFR5cGVTZXBWTS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYTk1NWUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9leHRlbnNpb25Qb2ludFR5cGVTZXBWTS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08cHJvamVjdCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVmYXVsdD0iRXh0ZW5zaW9uIFBvaW50IFR5cGUiIGJhc2VkaXI9Ii4iPgotCi0JPGNvb2xVSVR5cGUgaWQ9ImNvbXBpbGUuY2xhc3NwYXRoIj4KLSAgICAgIDxmaWxlc2V0IGRpcj0ibGliIj4KLSAgICAgICAgPGluY2x1ZGUgbmFtZT0iKiovKi5qYXIiLz4KLSAgICAgIDwvZmlsZXNldD4KLSAgICA8L2Nvb2xVSVR5cGU+Ci0gICAgCi0JPHRhcmdldCBuYW1lPSJFeHRlbnNpb24gUG9pbnQgVHlwZSIgZGVzY3JpcHRpb249ICJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiPgotCQk8ZWNobyBtZXNzYWdlPSJFbnN1cmUgdGhhdCBhbiBleHRlbnNpb24gcG9pbnQgZGVmaW5lZCB0eXBlIGlzIHByZXNlbnQiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3Rfc291cmNlMDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTFmZjc4Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF9zb3VyY2UwMS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJmb3JtYXRUZXN0Ij4KLQotPCEtLSA9ID0gPSA9ID0gPSAtLT48IS0tIGZvcm1hdFRlc3QgIC0tPjwhLS0gPSA9ID0gPSA9ID0gLS0+PHRhcmdldCBuYW1lPSJmb3JtYXRUZXN0IiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iLS0+IHRlc3QgdGFyZ2V0IG9uZSI+PCEtLSBoZWxsbyB3b3JsZCAtLT48Z3JlZXRpbmcgLz48L3RhcmdldD4KLQotPCEtLSAtIC0gLSAtIC0gLSAtLT4KLTwhLS0gaW5pdCAgICAgICAgLS0+Ci08IS0tIC0gLSAtIC0gLSAtIC0tPgotPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gIDxwcmVzZXRkZWYgbmFtZT0iZ3JlZXRpbmciPjxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotPC9wcmVzZXRkZWY+Ci0gICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTkyMjguLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgotCi0gICA8IS0tID0gPSA9ID0gPSA9IC0tPgotICAgPCEtLSBmb3JtYXRUZXN0ICAtLT4KLSAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9ImZvcm1hdFRlc3QiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSItLT4gdGVzdCB0YXJnZXQgb25lIj4KLSAgICAgIDwhLS0gaGVsbG8gd29ybGQgLS0+Ci0gICAgICA8Z3JlZXRpbmcgLz4KLSAgIDwvdGFyZ2V0PgotCi0gICA8IS0tIC0gLSAtIC0gLSAtIC0tPgotICAgPCEtLSBpbml0ICAgICAgICAtLT4KLSAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0gICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gICAgICA8cHJlc2V0ZGVmIG5hbWU9ImdyZWV0aW5nIj4KLSAgICAgICAgIDxlY2hvPiR7Z3JlZXRpbmd9PC9lY2hvPgotICAgICAgPC9wcmVzZXRkZWY+Ci0gICA8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAyLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvZm9ybWF0VGVzdF90YXJnZXQwMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMWFkOWMuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9ImZvcm1hdFRlc3QiPgotCi0gICAgICAgPCEtLSA9ID0gPSA9ID0gPSAtLT4KLSAgICAgICA8IS0tIGZvcm1hdFRlc3QgIC0tPgotICAgICAgIDwhLS0gPSA9ID0gPSA9ID0gLS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJmb3JtYXRUZXN0IiBkZXBlbmRzPSJpbml0IiBkZXNjcmlwdGlvbj0iLS0+IHRlc3QgdGFyZ2V0IG9uZSI+Ci0gICAgICAgICAgICAgIDwhLS0gaGVsbG8gd29ybGQgLS0+Ci0gICAgICAgICAgICAgIDxncmVldGluZyAvPgotICAgICAgIDwvdGFyZ2V0PgotCi0gICAgICAgPCEtLSAtIC0gLSAtIC0gLSAtLT4KLSAgICAgICA8IS0tIGluaXQgICAgICAgIC0tPgotICAgICAgIDwhLS0gLSAtIC0gLSAtIC0gLS0+Ci0gICAgICAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImdyZWV0aW5nIiB2YWx1ZT0iaGkiIC8+Ci0gICAgICAgICAgICAgIDxwcmVzZXRkZWYgbmFtZT0iZ3JlZXRpbmciPgotICAgICAgICAgICAgICAgICAgICAgPGVjaG8+JHtncmVldGluZ308L2VjaG8+Ci0gICAgICAgICAgICAgIDwvcHJlc2V0ZGVmPgotICAgICAgIDwvdGFyZ2V0PgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9mb3JtYXRUZXN0X3RhcmdldDAzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljZDk1My4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2Zvcm1hdFRlc3RfdGFyZ2V0MDMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0iZm9ybWF0VGVzdCI+Ci0KLQk8IS0tID0gPSA9ID0gPSA9IC0tPgotCTwhLS0gZm9ybWF0VGVzdCAgLS0+Ci0JPCEtLSA9ID0gPSA9ID0gPSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImZvcm1hdFRlc3QiIGRlcGVuZHM9ImluaXQiIGRlc2NyaXB0aW9uPSItLT4gdGVzdCB0YXJnZXQgb25lIj4KLQkJPCEtLSBoZWxsbyB3b3JsZCAtLT4KLQkJPGdyZWV0aW5nIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIC0gLSAtIC0gLSAtIC0tPgotCTwhLS0gaW5pdCAgICAgICAgLS0+Ci0JPCEtLSAtIC0gLSAtIC0gLSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0iZ3JlZXRpbmciIHZhbHVlPSJoaSIgLz4KLQkJPHByZXNldGRlZiBuYW1lPSJncmVldGluZyI+Ci0JCQk8ZWNobz4ke2dyZWV0aW5nfTwvZWNobz4KLQkJPC9wcmVzZXRkZWY+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL2phdmFjLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWUwMGMyLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvamF2YWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJqYXZhY0l0Ij4KLQk8dGFyZ2V0IG5hbWU9ImphdmFjSXQiPgotCQk8amF2YWMgaW5jbHVkZWphdmFydW50aW1lPSIiCi0JCQlmb2xsb3dzeW1saW5rcz0iIgotCQkJaW5jbHVkZWFudHJ1bnRpbWU9IiIvPgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbWFjcm9kZWYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9tYWNyb2RlZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MWYwMWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9tYWNyb2RlZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJ0eXBlIj4KLQotCTxtYWNyb2RlZiBuYW1lPSJlY2xpcHNlTWFjcm8iPgotCQk8YXR0cmlidXRlIG5hbWU9InYiIGRlZmF1bHQ9Ik5PVCBTRVQiIC8+Ci0JCTxhdHRyaWJ1dGUgbmFtZT0iZWNsaXBzZSIgZGVmYXVsdD0ieWVzIiBkZXNjcmlwdGlvbj0iVGVzdGluZyBFY2xpcHNlIi8+Ci0JCTxlbGVtZW50IG5hbWU9InNvbWUtdGFza3MiIG9wdGlvbmFsPSJ5ZXMiIC8+Ci0JCTxzZXF1ZW50aWFsPgotCQkJPGVjaG8+RWNsaXBzZSE6IEB7dn08L2VjaG8+Ci0JCTwvc2VxdWVudGlhbD4KLQk8L21hY3JvZGVmPgotCi0JPHRhcmdldCBuYW1lPSJ0eXBlIj4KLQkJPGVjbGlwc2VNYWNybyB2PSJUaGlzIGlzIHYiPgotCQkJCi0JCTwvZWNsaXBzZU1hY3JvPgotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9taXhlZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21peGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY4ZWRiYi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL21peGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTxwcm9qZWN0Pjx0YXJnZXQ+PHNxbCBkcml2ZXI9IiIgcGFzc3dvcmQ9IiIgdXJsPSIiIHVzZXJpZD0iIj48L3NxbD48Y29uY2F0PjwvY29uY2F0PjwvdGFyZ2V0PjwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL25lc3RlZEVsZW1lbnRBdHRyaWJ1dGVzLnhtbCBiL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjBkOTE5Li4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvbmVzdGVkRWxlbWVudEF0dHJpYnV0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08cHJvamVjdCBkZWZhdWx0PSJnbyI+Ci0JPHRhc2tkZWYgbmFtZT0ibmVzdGVkVGVzdCIgY2xhc3NuYW1lPSJvcmcuZWNsaXBzZS5hbnQudGVzdHMudWkuc3VwcG9ydC50YXNrcy5OZXN0RWxlbWVudFRhc2siIC8+Ci0JPHRhcmdldCBuYW1lPSJnbyI+Ci0JCTxuZXN0ZWRUZXN0PgotCQkJPG5lc3RlZGVsZW1lbnQgd29ya3M9IiIgLz4KLQkJPC9uZXN0ZWRUZXN0PgotCTwvdGFyZ2V0PgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb3V0bGluZV9zZWxlY3RfdGVzdF9idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL291dGxpbmVfc2VsZWN0X3Rlc3RfYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGYwZjVlLi4wMDAwMDAwCi0tLSBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvb3V0bGluZV9zZWxlY3RfdGVzdF9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiBkZWZhdWx0PSJ6aXAucGx1Z2luIiBiYXNlZGlyPSIuIj4KLQk8dGFyZ2V0IG5hbWU9ImluaXQiIGRlcGVuZHM9InByb3BlcnRpZXMiPgotCSAgICA8cHJvcGVydHkgZmlsZT0iYnVpbGQucHJvcGVydGllcyIgLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzAuNC41IiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luc19kaXIiIHZhbHVlPSIke2VjbGlwc2VfZGlyfS9wbHVnaW5zIiAvPgotCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luIiB2YWx1ZT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5pbnRlcm5hbC5hbnQuZWRpdG9yIiAvPgotCQk8cHJvcGVydHkgbmFtZT0iZnVsbC5uYW1lIiB2YWx1ZT0iJHtwbHVnaW59JHt2ZXJzaW9uLnN1ZmZpeH0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9IiAvPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQucmVzdWx0LmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0iIC8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzb3VyY2UuYW50RWRpdG9yLmphciIgdmFsdWU9InNyYy8iIC8+Ci0JCTxlY2hvIG1lc3NhZ2U9IlZhbHVlIGlzICR7cGx1Z2luc19kaXJ9IiAvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJwcm9wZXJ0aWVzIiBpZj0iZWNsaXBzZS5ydW5uaW5nIj4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLmNvbXBpbGVyIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSkRUQ29tcGlsZXJBZGFwdGVyIi8+Ci0JPC90YXJnZXQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvcHJvamVjdE9ubHkueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wcm9qZWN0T25seS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWNlNWIuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9wcm9qZWN0T25seS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotCi0KLTxwcm9qZWN0ID48L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9yZWZpZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3JlZmlkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlYjU2Yy4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3JlZmlkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxwcm9qZWN0IGRlZmF1bHQ9IjEiPgotCTxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiPgotCQk8cGF0aGVsZW1lbnQgbG9jYXRpb249ImxpYi8iIC8+Ci0JCTxwYXRoZWxlbWVudCBwYXRoPSIke2phdmEuY2xhc3MucGF0aH0vIiAvPgotCQk8cGF0aGVsZW1lbnQgcGF0aD0iJHthZGRpdGlvbmFsLnBhdGh9IiAvPgotCTwvcGF0aD4KLQotCTx0YXJnZXQgbmFtZT0iMSI+Ci0JCTxwYXRoIGlkPSJwcm9qZWN0LmNsYXNzLnBhdGgyIj4KLQkJCTxwYXRoIHJlZmlkPSJwcm9qZWN0LmNsYXNzLnBhdGgiIC8+Ci0JCTwvcGF0aD4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3J1c3NpYW5idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTM1NjYuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy9ydXNzaWFuYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ3aW5kb3dzLTEyNTEiPz4KLTxwcm9qZWN0IG5hbWU9InRlc3QiIGRlZmF1bHQ9ImluaXQiIGJhc2VkaXI9Ii4iPgotCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPCEtLSBkaXNwbGF5cyBIZWxsbyBpbiBSdXNzaWFuIC0tPgotCQk8ZWNobyBtZXNzYWdlPSLDh8Okw7DDoMOiw7HDssOiw7PDqcOyw6UiLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90YXNrZGVmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhNjZhOC4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rhc2tkZWYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPHByb2plY3QgZGVmYXVsdD0idHlwZSI+Ci0KLQk8dGFza2RlZiBuYW1lPSJtaW5lIiBjbGFzc25hbWU9Im9yZy5lY2xpcHNlLmFudC50ZXN0cy51aS5zdXBwb3J0LnRhc2tzLkFudFRlc3RUYXNrIiBjbGFzc3BhdGg9ImFudFVJVGVzdHNTdXBwb3J0LmphciI+Ci0JPC90YXNrZGVmPgotCi0JPHRhcmdldCBuYW1lPSJ0eXBlIj4KLQotCTwvdGFyZ2V0PgotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0MS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QxLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2MGEzMi4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLQotPGJsYT4KLSAgPGJsdWI+PC9ibHViPgotICA8a2xpY2s+Ci0gICAgPGd1cmdlbD48L2d1cmdlbD4KLSAgICA8aGFsCi0gICAgPGtsYWNrLz4KLSAgICA8aHVtcGYvPgotICA8L2tsaWNrPgotPC9ibGE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0Mi54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhODc2NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3QyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGJsYT4KLSAgPGJsdWI+PC9ibHViPgotICA8a2xpY2s+Ci0gICAgPGd1cmdlbD48L2d1cmdlbD4KLSAgICA8aGFsPjwvaGFsPgotICAgIDxrbGFjay8+Ci0gICAgPGh1bXBmLz4KLSAgPC9rbGljaz4KLTwvYmxhPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FudC9vcmcuZWNsaXBzZS5hbnQudGVzdHMudWkvdGVzdGJ1aWxkZmlsZXMvdGVzdDMueG1sIGIvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0My54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NDA4OGUuLjAwMDAwMDAKLS0tIGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0My54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTxibGE+Ci0gIDxibHViPgotICA8L2JsdWI+Ci08LwpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NC54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ2MGY3OS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTx0YXJnZXQgbmFtZT0ibWFpbiI+PG1rClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYW50L29yZy5lY2xpcHNlLmFudC50ZXN0cy51aS90ZXN0YnVpbGRmaWxlcy90ZXN0NS54bWwgYi9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q1LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI5N2Q5NS4uMDAwMDAwMAotLS0gYS9hbnQvb3JnLmVjbGlwc2UuYW50LnRlc3RzLnVpL3Rlc3RidWlsZGZpbGVzL3Rlc3Q1LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPHByb2plY3QgbmFtZT0ibWFpbiI+Ci0JPHRhcmdldCBuYW1lPSJibGEiIC8+Ci0JPHByb3BlcnR5IG5hbWU9InByb3AxIiB2YWx1ZT0idmFsMSIvPgotCTxwcm9wZXJ0eSBuYW1lPSJwcm9wMiIgdmFsdWU9InZhbDIiLz4KLQk8cHJvcGVydHkgbmFtZT0icHJvcDMiIHZhbHVlPSJ2YWwzIi8+Ci08ZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy93aGF0c25ldy9zd3QucHJvcGVydGllcwppbmRleCAxZjYwY2U4Li5jM2FlODgyIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3Mvd2hhdHNuZXcvc3d0LnByb3BlcnRpZXMKKysrIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL3doYXRzbmV3L3N3dC5wcm9wZXJ0aWVzCkBAIC03LDQgKzcsOSBAQAogbmV3cy5wYWdlLWNvbnRlbnQubmV3cy1saW5rcy51cGRhdGVzLmxpbmstaWNvbiA9IGNzcy9ncmFwaGljcy9pY29ucy9vYmo0OC91cGRhdGVzX29iai5naWYKIG5ld3MucGFnZS1jb250ZW50Lm5ld3MtbGlua3MuZWNsaXBzZS5saW5rLWljb24gPSBjc3MvZ3JhcGhpY3MvaWNvbnMvb2JqNDgvY29tbXVuaXR5X29iai5naWYKIAorbmV3cy5wYWdlLWNvbnRlbnQubm90ZXdvcnRoeS1saW5rcy5sYXlvdXQubmNvbHVtbnMgPSAyCituZXdzLnBhZ2UtY29udGVudC5ub3Rld29ydGh5LWxpbmtzLmxheW91dC52c3BhY2luZyA9IDMwCisKK25ld3MubGluay1pY29uID0gY3NzL2dyYXBoaWNzL2ljb25zL29iajQ4L25ld19vYmouZ2lmCisKIG5ld3Muc3VidGl0bGUtaWQgPSBuZXdzL3BhZ2UtY29udGVudC9wYWdlLXRpdGxlCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3Mvd2hhdHNuZXcvd2hhdHNuZXcuY3NzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vY3NzL3doYXRzbmV3L3doYXRzbmV3LmNzcwppbmRleCA2NTMwMjViLi5kYjQyNmViIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9jc3Mvd2hhdHNuZXcvd2hhdHNuZXcuY3NzCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2Nzcy93aGF0c25ldy93aGF0c25ldy5jc3MKQEAgLTEyLDYgKzEyLDU5IEBACiAgKiB0d28gY29sdW1ucyB0aGF0IGFyZSBjZW50ZXJlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLg0KICAqLw0KIA0KKyNub3Rld29ydGh5LWxpbmtzIHsNCisJdGV4dC1hbGlnbiA6IGxlZnQ7DQorCXdpZHRoIDogNzYwcHg7DQorCS8qIFRvIGNlbnRlciBpbiBNb3ogKGhhdmUgdG8gdXNlIHRleHQtYWxpZ24gZm9yIElFKSAqLwkNCisJbWFyZ2luOiAwcHggYXV0bzsNCit9DQorDQorI25vdGV3b3J0aHktbGlua3MgYSB7IA0KKwl3aWR0aCA6IDM3MHB4Ow0KKwl0ZXh0LWFsaWduIDogbGVmdDsgDQorCW1hcmdpbi1sZWZ0IDogNXB4Ow0KKwltYXJnaW4tcmlnaHQgOiA1cHg7DQorCW1hcmdpbi10b3AgOiA1cHg7DQorCW1hcmdpbi1ib3R0b20gOiAtMjBweDsNCisJdmVydGljYWwtYWxpZ24gOiB0b3A7DQorfQ0KKw0KKyNub3Rld29ydGh5LWxpbmtzID4gYSB7IHZlcnRpY2FsLWFsaWduIDogbWlkZGxlOyB9DQorDQorI25vdGV3b3J0aHktbGlua3MgYSBpbWcgew0KKwloZWlnaHQgOiA1N3B4Ow0KKwl3aWR0aCA6IDU3cHg7DQorCXZlcnRpY2FsLWFsaWduIDogbWlkZGxlOw0KK30NCisNCisjbm90ZXdvcnRoeS1saW5rcyBhIC5saW5rLWxhYmVsIHsNCisJZGlzcGxheSA6IGJsb2NrOw0KKwl3aWR0aCA6IDMwMHB4Ow0KKwlwb3NpdGlvbiA6IHJlbGF0aXZlOw0KKwl0b3AgOiAtNTBweDsNCisJbGVmdCA6IDYwcHg7DQorfQ0KKw0KKyNub3Rld29ydGh5LWxpbmtzIGEgcCAudGV4dCB7DQorCWRpc3BsYXkgOiBibG9jazsNCisJd2lkdGggOiAzMDBweDsNCisJcG9zaXRpb24gOiByZWxhdGl2ZTsNCisJdG9wIDogLTQ1cHg7DQorCWxlZnQgOiA1M3B4Ow0KK30NCisNCisvKiBTcGVjaWFsIGNhc2UgZm9yIE1vemlsbGEsIGJlY2F1c2UgdGhlIGxpbmtzIGFyZSBkaXNwbGF5ZWQNCisgICBpbiAxIHZlcnRpY2FsIGNvbHVtbiBpbnN0ZWFkIG9mIDIgY2VudGVyZWQgY29sdW1ucyAqLw0KKyNub3Rld29ydGh5LWxpbmtzID4gYSB7IHdpZHRoIDogNzAwcHg7IH0NCisjbm90ZXdvcnRoeS1saW5rcyBhID4gLmxpbmstbGFiZWwgeyB3aWR0aCA6IDcwMHB4OyB9DQorI25vdGV3b3J0aHktbGlua3MgYSBwID4gLnRleHQgeyB3aWR0aCA6IDcwMHB4OyB9DQorDQorI25vdGV3b3J0aHktbGlua3MgYTpob3ZlciB7IGJvcmRlci1yaWdodCA6IDVweDsgfQ0KKw0KKyNub3Rld29ydGh5LWxpbmtzIGEgaW1nIHsgYmFja2dyb3VuZC1pbWFnZSA6IHVybCguLi9ncmFwaGljcy9pY29ucy9vYmo0OC9uZXdfb2JqLmdpZik7IH0NCisjbm90ZXdvcnRoeS1saW5rcyBhOmhvdmVyIGltZyB7IGJhY2tncm91bmQtaW1hZ2UgOiB1cmwoLi4vZ3JhcGhpY3MvaWNvbnMvb2JqNDgvbmV3aG92X29iai5naWYpOyB9DQorDQorDQogI25ld3MtbGlua3Mgew0KIAl0ZXh0LWFsaWduIDogbGVmdDsNCiAJd2lkdGggOiA3NjBweDsNCmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyb0NvbnRlbnQueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2UucGxhdGZvcm0vaW50cm9Db250ZW50LnhtbAppbmRleCAxMDYyOGFkLi4xNTRhZGNlIDEwMDY0NAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS9pbnRyb0NvbnRlbnQueG1sCisrKyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnBsYXRmb3JtL2ludHJvQ29udGVudC54bWwKQEAgLTE2NywxMCArMTY3LDE1IEBACiAgICAgPGdyb3VwIGlkPSJwYWdlLWNvbnRlbnQiPgogICAgICAgPHRleHQgc3R5bGUtaWQ9InBhZ2UtdGl0bGUiIGlkPSJwYWdlLXRpdGxlIj5XSEFUJ1MgTkVXPC90ZXh0PgogICAgICAgPGFuY2hvciBpZD0iYmVnaW5BbmNob3IiLz4KLSAgICAgIDxncm91cCBpZD0ibmV3cy1saW5rcyI+Ci0gICAgICAgIDxsaW5rIGxhYmVsPSJOZXcgYW5kIG5vdGV3b3J0aHkiIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3doYXRzTmV3L3BsYXRmb3JtX3doYXRzbmV3Lmh0bWwiIGlkPSJuZXctYW5kLW5vdGV3b3J0aHkiPgorICAgICAgPGdyb3VwIGlkPSJub3Rld29ydGh5LWxpbmtzIiBsYWJlbD0iTmV3IGFuZCBOb3Rld29ydGh5Ij4KKyAgICAgICAgPGxpbmsgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iIHVybD0iaHR0cDovL29yZy5lY2xpcHNlLnVpLmludHJvL3Nob3dIZWxwVG9waWM/aWQ9L29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3doYXRzTmV3L3BsYXRmb3JtX3doYXRzbmV3Lmh0bWwiIGlkPSJwbGF0Zm9ybS1ub3Rld29ydGh5IiBzdHlsZS1pZD0ibm90ZXdvcnRoeS1saW5rIj4KICAgICAgICAgICA8dGV4dD5GaW5kIG91dCBhYm91dCB0aGUgbWFqb3IgbmV3IGZlYXR1cmVzIGluIHRoaXMgcmVsZWFzZTwvdGV4dD4KICAgICAgICAgPC9saW5rPgorICAgICAgICA8YW5jaG9yIGlkPSJqZHRBbmNob3IiLz4KKyAgICAgICAgPGFuY2hvciBpZD0icGRlQW5jaG9yIi8+CisgICAgICAgIDxhbmNob3IgaWQ9ImdlbmVyYWxBbmNob3IiLz4KKyAgICAgIDwvZ3JvdXA+CisgICAgICA8Z3JvdXAgaWQ9Im5ld3MtbGlua3MiIGxhYmVsPSJHZW5lcmFsIj4KICAgICAgICAgPGxpbmsgbGFiZWw9Ik1pZ3JhdGlvbiBmcm9tIHRoZSBwcmV2aW91cyByZWxlYXNlIiB1cmw9Imh0dHA6Ly9vcmcuZWNsaXBzZS51aS5pbnRyby9zaG93SGVscFRvcGljP2lkPS9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2L3BvcnRpbmcvZWNsaXBzZV8zXzBfcG9ydGluZ19ndWlkZS5odG1sIiBpZD0ibWlncmF0aW9uIj4KICAgICAgICAgICA8dGV4dD5MZWFybiB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIG1ha2UgeW91ciBvbGQgY29kZSB3b3JrIGluIEVjbGlwc2UgMy4wPC90ZXh0PgogICAgICAgICA8L2xpbms+CmRpZmYgLS1naXQgYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvLnByb2plY3QgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNDk4YzIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uuc2RrPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0Lmh0bWwgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5pbmkgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmMxMTg5Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQ0KLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpDQotYWJvdXRUZXh0PSVibHVyYg0KLQ0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikNCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5DQotDQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQ0KLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmDQotDQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpDQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQ0KLQ0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQ0KLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkNCi0NCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkNCi0jIG9wdGlvbmFsDQotDQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQ0KLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4NCi0jIG9wdGlvbmFsDQotDQotDQotDQotDQpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0Lm1hcHBpbmdzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjBjYTg3Li4wMDAwMDAwCi0tLSBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9hYm91dC5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjViMDkuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1FY2xpcHNlIFByb2plY3QgU0RLXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDAsIDIwMDQuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlCi0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9idWlsZC5wcm9wZXJ0aWVzIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2E0ZjIuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcz1cCi1hYm91dC5odG1sLFwKLWFib3V0LmluaSxcCi1hYm91dC5tYXBwaW5ncyxcCi1hYm91dC5wcm9wZXJ0aWVzLFwKLWVjbGlwc2UzMi5naWYsXAotcGx1Z2luLnhtbCxcCi1wbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL2VjbGlwc2UzMi5naWYgYi9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcxYThmNi4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ucHJvcGVydGllcyBiL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNTJhYS4uMDAwMDAwMAotLS0gYS9wbGF0Zm9ybS9vcmcuZWNsaXBzZS5zZGsvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wbHVnaW5OYW1lPUVjbGlwc2UgUHJvamVjdCBTREsKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi1hY3Rpdml0eS5qYXZhPUphdmEgRGV2ZWxvcG1lbnQKLWFjdGl2aXR5LmphdmEuZGVzYz1EZXZlbG9wIEphdmEgYXBwbGljYXRpb25zLgotYWN0aXZpdHkucGx1Z2luPVBsdWctaW4gRGV2ZWxvcG1lbnQKLWFjdGl2aXR5LnBsdWdpbi5kZXNjPURldmVsb3AgcGx1Zy1pbnMsIGZyYWdtZW50cywgYW5kIGZlYXR1cmVzIGZvciBFY2xpcHNlLgotCi1hY3Rpdml0eS50ZWFtLmN2cz1DVlMgU3VwcG9ydAotYWN0aXZpdHkudGVhbS5jdnMuZGVzYz1Vc2UgdGhlIENvbmN1cnJlbnQgVmVyc2lvbnMgU3lzdGVtIChDVlMpIHRvIG1hbmFnZSByZXNvdXJjZXMuCi1hY3Rpdml0eS50ZWFtPUNvcmUgVGVhbSBTdXBwb3J0Ci1hY3Rpdml0eS50ZWFtLmRlc2M9U2hhcmUgcHJvamVjdHMgdXNpbmcgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50IHN5c3RlbXMuCi0KLWFjdGl2aXR5LmNhdC5kZXZlbG9wbWVudD1EZXZlbG9wbWVudAotYWN0aXZpdHkuY2F0LmRldmVsb3BtZW50LmRlc2M9VXNlIHRoZSBFY2xpcHNlIFNESyB0byBkZXZlbG9wIGFwcGxpY2F0aW9ucy4KLWFjdGl2aXR5LmNhdC50ZWFtPVRlYW0KLWFjdGl2aXR5LmNhdC50ZWFtLmRlc2M9VXNlIGNvbmZpZ3VyYXRpb24gbWFuYWdlbWVudCBzeXN0ZW1zIHRvIG1hbmFnZSByZXNvdXJjZXMuCi0KLQotCi0KZGlmZiAtLWdpdCBhL3BsYXRmb3JtL29yZy5lY2xpcHNlLnNkay9wbHVnaW4ueG1sIGIvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDllYzMuLjAwMDAwMDAKLS0tIGEvcGxhdGZvcm0vb3JnLmVjbGlwc2Uuc2RrL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQotPHBsdWdpbg0KLSAgIGlkPSJvcmcuZWNsaXBzZS5zZGsiDQotICAgbmFtZT0iJXBsdWdpbk5hbWUiDQotICAgdmVyc2lvbj0iMy4wLjAiDQotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+DQotDQotICAgPHJlcXVpcmVzPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPg0KLSAgIDwvcmVxdWlyZXM+DQotDQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4NCi0gIA0KLSAgICAgIDxhY3Rpdml0eQ0KLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS5qYXZhIg0KLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlYWN0aXZpdHkuamF2YS5kZXNjIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiPg0KLSAgICAgIDwvYWN0aXZpdHk+DQotICAgICAgDQotICAgICAgPGFjdGl2aXR5DQotICAgICAgICAgICAgbmFtZT0iJWFjdGl2aXR5LnBsdWdpbiINCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LnBsdWdpbi5kZXNjIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCI+DQotICAgICAgPC9hY3Rpdml0eT4NCi0gICAgICANCi0gICAgICA8YWN0aXZpdHlSZXF1aXJlbWVudEJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCINCi0gICAgICAgICAgICByZXF1aXJlZEFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmphdmFEZXZlbG9wbWVudCI+DQotICAgICAgPC9hY3Rpdml0eVJlcXVpcmVtZW50QmluZGluZz4NCi0gIA0KLSAgICAgIDxhY3Rpdml0eQ0KLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS50ZWFtLmN2cyINCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LnRlYW0uY3ZzLmRlc2MiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzIj4NCi0gICAgICA8L2FjdGl2aXR5PiANCi0gICAgICANCi0gICAgICA8YWN0aXZpdHkNCi0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkudGVhbSINCi0gICAgICAgICAgICBkZXNjcmlwdGlvbj0iJWFjdGl2aXR5LnRlYW0uZGVzYyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbSI+DQotICAgICAgPC9hY3Rpdml0eT4gDQotICAgICAgDQotICAgICAgPGFjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMiDQotICAgICAgICAgICAgcmVxdWlyZWRBY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtIj4NCi0gICAgICA8L2FjdGl2aXR5UmVxdWlyZW1lbnRCaW5kaW5nPg0KLSAgICAgIA0KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuamF2YURldmVsb3BtZW50Ig0KLSAgICAgICAgICAgIHBhdHRlcm49Im9yZ1wuZWNsaXBzZVwuamR0XC5kZWJ1Zy9kZWJ1Z01vZGVsIj4NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5qZHRcLi4qLy4qIj4NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5qZHRcLmNvcmUvamF2YW5hdHVyZSI+DQotDQotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPg0KLSAgICAgIA0KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UucGx1Z0luRGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC5wZGVcLi4qLy4qIj4NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+DQotICAgICAgDQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5wbHVnSW5EZXZlbG9wbWVudCINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnBkZS9QbHVnaW5OYXR1cmUiPg0KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4NCi0gICAgICA8YWN0aXZpdHlQYXR0ZXJuQmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnRlYW0iDQotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC50ZWFtXC51aS9vcmcuKiI+DQotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPiAgICAgICAgICAgIA0KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMiDQotICAgICAgICAgICAgcGF0dGVybj0ib3JnXC5lY2xpcHNlXC50ZWFtXC5jdnNcLnVpLy4qIj4NCi0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+DQotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cyINCi0gICAgICAgICAgICBwYXR0ZXJuPSJvcmdcLmVjbGlwc2VcLnRlYW1cLmN2c1wuY29yZS8uKmN2c25hdHVyZSI+DQotICAgICAgPC9hY3Rpdml0eVBhdHRlcm5CaW5kaW5nPg0KLSAgICAgIA0KLSAgICAgIDxjYXRlZ29yeQ0KLSAgICAgICAgICAgIG5hbWU9IiVhY3Rpdml0eS5jYXQuZGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5jYXQuZGV2ZWxvcG1lbnQuZGVzYyINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY2F0ZWdvcmllcy5kZXZlbG9wbWVudENhdGVnb3J5Ij4NCi0gICAgICA8L2NhdGVnb3J5Pg0KLQ0KLSAJICA8Y2F0ZWdvcnkNCi0gICAgICAgICAgICBuYW1lPSIlYWN0aXZpdHkuY2F0LnRlYW0iDQotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVhY3Rpdml0eS5jYXQudGVhbS5kZXNjIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jYXRlZ29yaWVzLnRlYW1DYXRlZ29yeSI+DQotDQotICAgICAgPC9jYXRlZ29yeT4NCi0gICAgICANCi0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5qYXZhRGV2ZWxvcG1lbnQiDQotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY2F0ZWdvcmllcy5kZXZlbG9wbWVudENhdGVnb3J5Ij4NCi0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPg0KLSAgICAgIA0KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZw0KLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLnBsdWdJbkRldmVsb3BtZW50Ig0KLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3JpZXMuZGV2ZWxvcG1lbnRDYXRlZ29yeSI+DQotICAgICAgPC9jYXRlZ29yeUFjdGl2aXR5QmluZGluZz4NCi0NCi0gICAgICA8Y2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmcNCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS50ZWFtIg0KLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmNhdGVnb3JpZXMudGVhbUNhdGVnb3J5Ij4NCi0gICAgICA8L2NhdGVnb3J5QWN0aXZpdHlCaW5kaW5nPiAgICAgICAgDQotICAgICAgDQotICAgICAgPGNhdGVnb3J5QWN0aXZpdHlCaW5kaW5nDQotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMiDQotICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuY2F0ZWdvcmllcy50ZWFtQ2F0ZWdvcnkiPg0KLSAgICAgIDwvY2F0ZWdvcnlBY3Rpdml0eUJpbmRpbmc+DQotICANCi0gICAgICA8IS0tIGJpbmQgYWxsIGVsZW1lbnRzIHRoYXQgc3RhcnQgd2l0aCAib3JnIiAtLT4gICAgICANCi0gICAgICAgDQotICAgICAgPGRlZmF1bHRFbmFibGVtZW50DQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmphdmFEZXZlbG9wbWVudCI+DQotICAgICAgPC9kZWZhdWx0RW5hYmxlbWVudD4NCi0gICAgICANCi0gICAgICA8ZGVmYXVsdEVuYWJsZW1lbnQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGx1Z0luRGV2ZWxvcG1lbnQiPg0KLSAgICAgIDwvZGVmYXVsdEVuYWJsZW1lbnQ+DQotICAgICAgDQotICAgICAgPGRlZmF1bHRFbmFibGVtZW50DQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0iPg0KLSAgICAgIDwvZGVmYXVsdEVuYWJsZW1lbnQ+ICAgICAgDQotICAgPC9leHRlbnNpb24+DQotICAgDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4NCi0gICAgICA8cHJpbWFyeVdpemFyZA0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5KYXZhUHJvamVjdFdpemFyZCI+DQotICAgICAgPC9wcmltYXJ5V2l6YXJkPg0KLSAgICAgIDxwcmltYXJ5V2l6YXJkDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS51aS5OZXdQcm9qZWN0V2l6YXJkIj4NCi0gICAgICA8L3ByaW1hcnlXaXphcmQ+DQotICAgICAgPHByaW1hcnlXaXphcmQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3Q2xhc3NDcmVhdGlvbldpemFyZCI+DQotICAgICAgPC9wcmltYXJ5V2l6YXJkPg0KLSAgICAgIDxwcmltYXJ5V2l6YXJkDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0ludGVyZmFjZUNyZWF0aW9uV2l6YXJkIj4NCi0gICAgICA8L3ByaW1hcnlXaXphcmQ+DQotICAgICAgPHByaW1hcnlXaXphcmQNCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnVpLk5ld1NjaGVtYUZpbGVXaXphcmQiPg0KLSAgICAgIDwvcHJpbWFyeVdpemFyZD4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNDYzYWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYmluCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5vcHRpb25zIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYzcxNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLSMgRGVidWdnaW5nIG9wdGlvbnMgZm9yIHRoZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIHBsdWdpbgotCi0jIFR1cm4gb24gZ2VuZXJhbCBkZWJ1Z2dpbmcgZm9yIHRoZSBwbHVnaW4uCi1vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2RlYnVnPWZhbHNlCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDkxYjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUuYm9vdDwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5vc2dpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5vc2dpLnV0aWw8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZkMTI0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy5pbmkKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLXNvdXJjZS5jb25maWd1cmF0b3IuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvY29uZmlnLmluaSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkY2QxYTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IvY29uZmlnLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLSMgRWNsaXBzZSBydW50aW1lIGNvbmZpZ3VyYXRpb24gZmlsZQ0KLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBtZXJnZWQgaW50byB0aGUgDQotIyBTeXN0ZW0gcHJvcGVydGllcyBvbiBzeXN0ZW0gc3RhcnR1cC4gIFRoZSB2YWx1ZXMgY29udHJvbCB0aGUgd2F5IHRoZSANCi0jIHJ1bnRpbWUgaXMgc3RydWN0dXJlZCBhbmQgcnVucy4NCi0NCi0jIE5vdGU6ICBPbmx5IHBsYXRmb3JtOi9iYXNlLyBhbmQgZmlsZTogVVJMcyBhcmUgc3VwcG9ydGVkLiAgSW4gZ2VuZXJhbCB0aGUgDQotIyBVUkxzIGdpdmVuIG1heSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgKGUuZy4sIC4uLi9sb2NhdGlvbl8xLjIuMykuICANCi0jIElmIGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3lzdGVtIGJpbmRzDQotIyB0byB0aGUgbG9jYXRpb24gd2hpY2ggbWF0Y2hlcyBleGFjdGx5IG9yIHRvIHRoZSB2ZXJzaW9uZWQgbG9jYXRpb24gd2l0aCB0aGUNCi0jIGxhdGVzdCB2ZXJzaW9uIG51bWJlci4gIElmIGEgdmVyc2lvbiBudW1iZXIgaXMgZ2l2ZW4gdGhlbiBvbmx5IGV4YWN0IG1hdGNoZXMNCi0jIGFyZSBjb25zaWRlcmVkLg0KLQ0KLSMgVGhlIFVSTCBmb3IgdGhlIHJ1bnRpbWUgZW50cnkgcG9pbnQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcw0KLSMgcGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpIA0KLSNvc2dpLmZyYW1ld29yayA9IHBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaQ0KLQ0KLSMgVGhlIGNsYXNzcGF0aCBmb3IgdGhlIGZyYW1ld29yayBmb3VuZCBhdCB0aGUgb3NnaS5mcmFtZXdvcmsgbG9jYXRpb24uICBUaGlzIA0KLSMgY29tbWEtc2VwYXJhdGVkIGxpc3QgY29udGFpbnMgZWl0aGVyIFVSTHMgb3Igc2ltcGxlIGVsZW1lbnQgbmFtZXMuICBTaW1wbGUNCi0jIG5hbWVzIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBpbnN0YWxsIGRpcmVjdG9yeS4gIA0KLSMgVHlwaWNhbGx5IHRoaXMgdmFsdWUgbmVlZCBub3QgYmUgc2V0IGFzIGl0IGlzIGluaXRpYWxpemVkIGJ5IHRoZSBmcmFtZXdvcmsgaXRzZWxmLg0KLSMgVmVyc2lvbiBtYXRjaCBzZWFyY2hpbmcgaXMgbm90IGRvbmUgZm9yIFVSTHMgbGlzdGVkIGhlcmUuDQotI29zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoID0NCi0NCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgdG8gc2VhcmNoIGZvciB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlIChzcGxhc2guYm1wKS4NCi0jIEZvciBlYWNoIGxpc3QgZWxlbWVudCBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBhdHRlcm4gbmwvPGxvY2FsZT4gaXMgc2VhcmNoZWQuDQotIyBUaGUgc3lzdGVtIGJpbmRzIHRvIHRoZSBmaXJzdCBtYXRjaGluZyBmaWxlLiAgVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4NCi1vc2dpLnNwbGFzaFBhdGggPSBwbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnBsYXRmb3JtDQotDQotIyBUaGUgbG9jYXRpb24gb2YgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZS4gIElmIHRoaXMgdmFsdWUgaXMgc2V0IGF0IHN5c3RlbSBzdGFydHVwIGl0IGlzIHVzZWQgDQotIyBpbiBmYXZvdXIgb2YgdGhlIG9zZ2kuc3BsYXNoUGF0aCBzZWFyY2hpbmcgb3V0bGluZWQgYWJvdmUuICBJZiB0aGUgdmFsdWUgaXMgbm90IHNldCANCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLg0KLSNvc2dpLnNwbGFzaExvY2F0aW9uID0NCi0NCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgc3RhcnRlZA0KLSMgb25jZSB0aGUgc3lzdGVtIGlzIHVwIGFuZCBydW5uaW5nLiAgRWFjaCBlbnRyeSBpZiBvZiB0aGUgZm9ybQ0KLSMgICAgIDxVUkwgfCBzaW1wbGUgYnVuZGxlIGxvY2F0aW9uPltAPHN0YXJ0bGV2ZWw+XQ0KLSMgU2ltcGxlIGJ1bmRsZSBsb2NhdGlvbnMgYXJlIGludGVyZXByZXRlZCBhcyByZWxhdGl2ZSB0byB0aGUgZnJhbWV3b3JrJ3MgcGFyZW50IGRpcmVjdG9yeS4NCi0jIFRoZSBzdGFydGxldmVsIGluZGljYXRlcyB0aGUgT1NHaSBzdGFydCBsZXZlbCBhdCB3aGljaCB0aGUgYnVuZGxlIHNob3VsZCBydW4uDQotIyBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIHRoZSBzeXN0ZW0gY29tcHV0ZXMgYW4gYXBwcm9wcmlhdGUgZGVmYXVsdC4NCi0jIG9zZ2kuYnVuZGxlcyA9IA0KLSNvc2dpLmJ1bmRsZXM9b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lQDI6c3RhcnQsIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3JAMzpzdGFydA0KLQ0KLSMgRGVmYXVsdCBzdGFydCBsZXZlbCBvZiBidW5kbGVzDQotI29zZ2kuYnVuZGxlcy5kZWZhdWx0U3RhcnRMZXZlbD00DQotDQotIyBUaGUgcHJvZHVjdCB0byBydW4uICBBIGdpdmVuIEVjbGlwc2UgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtYW55IHByb2R1Y3RzLg0KLSMgVGhlIHByb2R1Y3QgaWRlbnRpZmllZCB3aWxsIHN1cHBseSB0aGUgYnJhbmRpbmcgKHdpbmRvdyBpY29ucywgdGl0bGUgYmFyIHRleHQpIGV0YyANCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIA0KLWVjbGlwc2UucHJvZHVjdD1vcmcuZWNsaXBzZS5wbGF0Zm9ybQ0KLQ0KLSMgVGhlIGFwcGxpY2F0aW9uIHRvIHJ1bi4gIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaGVyZSBpcyB0aGUgaWQgb2YgdGhlIGFwcGxpY2F0aW9uIGV4dGVuc2lvbg0KLSMgdGhlIHJ1bnRpbWUgd2lsbCBmaW5kLCBpbnN0YW50aWF0ZSBhbmQgZXhlY3V0ZSBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAuICBXaGVuIHRoaXMNCi0jIGFwcGxpY2F0aW9uIGV4aXRzLCBlY2xpcHNlIHdpbGwgYWxzbyBleGl0LiAgTm90ZSB0aGF0IHR5cGljYWxseSB0aGUgaWRlbnRpZmllZCBlY2xpcHNlLnByb2R1Y3QNCi0jIGRlZmluZXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdG8gcnVuLg0KLSNlY2xpcHNlLmFwcGxpY2F0aW9uPW9yZy5lY2xpcHNlLnVpLmlkZS53b3JrYmVuY2gNCi0NCi0NCi0NCi0jIEVuZCBvZiBmaWxlIG1hcmtlciAtIG11c3QgYmUgaGVyZQ0KLWVvZj1lb2YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWM5NzJkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9IEluc3RhbGwvVXBkYXRlIENvbmZpZ3VyYXRvcgotcHJvdmlkZXJOYW1lPSBFY2xpcHNlLm9yZwotcHJvZHVjdFByb3ZpZGVyTmFtZT0gVXBkYXRlIENvbmZpZ3VyYXRvciBQcm9kdWN0IFByb3ZpZGVyCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjViYmVmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLkNvbmZpZ3VyYXRpb25BY3RpdmF0b3IiPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9ImNvbmZpZ3VyYXRvci5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJ1cGRhdGVDb25maWd1cmF0b3JQcm9kdWN0UHJvdmlkZXIiCi0gICAgICAgICBuYW1lPSIlcHJvZHVjdFByb3ZpZGVyTmFtZSIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPgotICAgICAgPHByb3ZpZGVyPiAKLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUHJvZHVjdFByb3ZpZGVyIi8+IAotICAgICAgPC9wcm92aWRlcj4gCi0gICAgICAgICAKLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRvclV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0b3JVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmMzZWQwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRvclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0aW9uQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBnZXQgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBkYXRhIHdpdGhvdXQgaGF2aW5nIHRvCi0gKiB1c2UgQm9vdExvYWRlciBtZXRob2RzIGZyb20gdGhlIGNvbXBhdGliaWxpdHkgbGF5ZXIuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdG9yVXRpbHMgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gY29uZmlndXJhdGlvbi4gVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIG9uZSB3ZSB1c2VkCi0JICogdG8gY2FsbCBvbiBCb290TG9hZGVyLgotCSAqIAotCSAqIEByZXR1cm4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiB1c2VkIGluIGN1cnJlbnQgaW5zdGFuY2Ugb2YgcGxhdGZvcm0KLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHN0YXRpYyBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIGFjcXVpcmUgZmFjdG9yeSBzZXJ2aWNlIGZpcnN0Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIGNvbmZpZ0ZhY3RvcnlTUiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoY29uZmlnRmFjdG9yeVNSID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3RvcnkgPSAoSVBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkpIGNvbnRleHQuZ2V0U2VydmljZShjb25maWdGYWN0b3J5U1IpOwotCQlpZiAoY29uZmlnRmFjdG9yeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkvLyBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGZhY3RvcnkKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gY29uZmlnRmFjdG9yeS5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCWNvbnRleHQudW5nZXRTZXJ2aWNlKGNvbmZpZ0ZhY3RvcnlTUik7Ci0JCXJldHVybiBjdXJyZW50Q29uZmlnOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBvYmplY3QsIG9wdGlvbmFsbHkgaW5pdGlhbGl6ZWQgd2l0aCBwcmV2aW91c2x5IHNhdmVkCi0JICogY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gV2Ugd2lsbCB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiB0aGUgb2xkIG9uZSBpbiBCb290TG9hZGVyLgotCSAqIAotCSAqIEBwYXJhbSB1cmwgbG9jYXRpb24gb2YgcHJldmlvdXNseSBzYXZlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIElmIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaXMgc3BlY2lmaWVkLCBhbiBlbXB0eSBjb25maWd1cmF0aW9uIG9iamVjdCBpcyByZXR1cm5lZAotCSAqIEByZXR1cm4gcGxhdGZvcm0gY29uZmlndXJhdGlvbiB1c2VkIGluIGN1cnJlbnQgaW5zdGFuY2Ugb2YgcGxhdGZvcm0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGFjcXVpcmUgZmFjdG9yeSBzZXJ2aWNlIGZpcnN0Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIGNvbmZpZ0ZhY3RvcnlTUiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoY29uZmlnRmFjdG9yeVNSID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5IGNvbmZpZ0ZhY3RvcnkgPSAoSVBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkpIGNvbnRleHQuZ2V0U2VydmljZShjb25maWdGYWN0b3J5U1IpOwotCQlpZiAoY29uZmlnRmFjdG9yeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkvLyBnZXQgdGhlIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGZhY3RvcnkKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb25maWdGYWN0b3J5LmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbih1cmwpOwotCQljb250ZXh0LnVuZ2V0U2VydmljZShjb25maWdGYWN0b3J5U1IpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvbkFjdGl2YXRvci5nZXRJbnN0YWxsVVJMKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0b3IvSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0b3IvSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTQwMmI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL0lQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBQbGF0Zm9ybSBjb25maWd1cmF0aW9uIGludGVyZmFjZS4gUmVwcmVzZW50cyB0aGUgcnVudGltZQotICogY29uZmlndXJhdGlvbiB1c2VkIGJ5IHRoZSBFY2xpcHNlIHBsYXRmb3JtLiBBbnkgY29uZmlndXJhdGlvbgotICogY2hhbmdlcyBkbyBub3QgdGFrZSBlZmZlY3QgdW50aWwgbmV4dCBzdGFydHVwIG9mIHRoZSBFY2xpcHNlCi0gKiBwbGF0Zm9ybS4KLSAqIDxwPgotICogRG8gbm90IHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIG9yIGl0cyBuZXN0ZWQgaW50ZXJmYWNlcy4gVXNlIHRoZSBmYWN0b3J5IG1ldGhvZHMgCi0gKiBvbiBJUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeSB0byBjcmVhdGUgYSBJUGxhdGZvcm1Db25maWd1cmF0aW9uLCB0aGVuIHVzZSB0aGUgZmFjdG9yeSBtZXRob2RzCi0gKiBvbiB0aGUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIElTaXRlRW50cnksSUZlYXR1cmVFbnRyeSBhbmQgSVNpdGVQb2xpY3kuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gewotCi0JLyoqCi0JICogQ29uZmlndXJhdGlvbiBlbnRyeSByZXByZXNlbnRpbmcgYW4gaW5zdGFsbCBzaXRlLgotCSAqIAotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJU2l0ZUVudHJ5IHsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgVVJMIGZvciB0aGlzIHNpdGUKLQkJICogCi0JCSAqIEByZXR1cm4gc2l0ZSB1cmwKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIFVSTCBnZXRVUkwoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgcG9saWN5IGZvciB0aGlzIHNpdGUKLQkJICogCi0JCSAqIEByZXR1cm4gc2l0ZSBwb2xpY3kKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIElTaXRlUG9saWN5IGdldFNpdGVQb2xpY3koKTsKLQotCQkvKioKLQkJICogU2V0cyB0aGUgc2l0ZSBwb2xpY3kKLQkJICogCi0JCSAqIEBwYXJhbSBwb2xpY3kgc2l0ZSBwb2xpY3kKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2l0ZVBvbGljeShJU2l0ZVBvbGljeSBwb2xpY3kpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBmZWF0dXJlcyB2aXNpYmxlIG9uIHRoZSBzaXRlLiBOb3RlLCB0aGF0IHRoaXMgaXMgc2ltcGx5IGEgCi0JCSAqIHJlZmxlY3Rpb24gb2YgdGhlIHNpdGUgY29udGVudC4gVGhlIGZlYXR1cmVzIG1heSBvciBtYXkgbm90IGJlIGFjdHVhbGx5IGNvbmZpZ3VyZWQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmUgZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gZmVhdHVyZXMgYXJlIGZvdW5kLgotCQkgKiBBIGZlYXR1cmUgZW50cnkgaXMgcmV0dXJuZWQgYXMgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzaXRlIFVSTAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0RmVhdHVyZXMoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyBhIGxpc3Qgb2YgcGx1Zy1pbnMgdmlzaWJsZSBvbiB0aGUgc2l0ZS4gTm90ZSwgdGhhdCB0aGlzIGlzIHNpbXBseSBhIAotCQkgKiByZWZsZWN0aW9uIG9mIHRoZSBzaXRlIGNvbnRlbnQgYW5kIHRoZSBjdXJyZW50IHBvbGljeSBmb3IgdGhlIHNpdGUuIFRoZSBwbHVnLWlucwotCQkgKiBtYXkgb3IgbWF5IG5vdCBlbmQgdXAgYmVpbmcgdXNlZCBieSBFY2xpcHNlIChkZXBlbmRzIG9uIHdoaWNoIHBsdWctaW4gYXJlIAotCQkgKiBhY3R1YWxseSBib3VuZCBieSB0aGUgcGxhdGZvcm0pLgotCQkgKiAKLQkJICogQHJldHVybiBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHBsdWctaW5zIGFyZSBmb3VuZC4KLQkJICogQSBwbHVnLWluIGVudHJ5IGlzIHJldHVybmVkIGFzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgc2l0ZSBVUkwJCSAqIAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0UGx1Z2lucygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGEgc3RhbXAgcmVmbGVjdGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc2l0ZS4gSWYgY2FsbGVkIHJlcGVhdGVkbHksCi0JCSAqIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYXMgbG9uZyBhcyBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0byB0aGUgc2l0ZSAoY2hhbmdlcyB0bwotCQkgKiBmZWF0dXJlcyBvciBwbHVnaW5zKS4KLQkJICogCi0JCSAqIEByZXR1cm4gc2l0ZSBjaGFuZ2Ugc3RhbXAKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0Q2hhbmdlU3RhbXAoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyBhIHN0YW1wIHJlZmxlY3RpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZlYXR1cmVzIG9uIHRoZSBzaXRlLiAKLQkJICogSWYgY2FsbGVkIHJlcGVhdGVkbHksIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYXMgbG9uZyBhcyBubyBjaGFuZ2VzIHdlcmUgbWFkZSB0bwotCQkgKiBmZWF0dXJlcyBvbiB0aGUgc2l0ZS4KLQkJICogCi0JCSAqIEByZXR1cm4gc2l0ZSBmZWF0dXJlcyBjaGFuZ2Ugc3RhbXAgCi0JCSAqIEBzaW5jZSAyLjAKLQkJICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIG1ldGhvZAotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGEgc3RhbXAgcmVmbGVjdGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGx1Zy1pbnMgb24gdGhlIHNpdGUuIAotCQkgKiBJZiBjYWxsZWQgcmVwZWF0ZWRseSwgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSBhcyBsb25nIGFzIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvCi0JCSAqIHBsdWctaW5zIG9uIHRoZSBzaXRlLgotCQkgKiAKLQkJICogQHJldHVybiBzaXRlIHBsdWctaW5zIGNoYW5nZSBzdGFtcCAKLQkJICogQHNpbmNlIDIuMAotCQkgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHRoaXMgbWV0aG9kCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRQbHVnaW5zQ2hhbmdlU3RhbXAoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgdGhlIHNpdGUgY2FuIGJlIHVwZGF0ZWQuCi0JCSAqIAotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHNpdGUgY2FuIGJlIHVwZGF0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNVcGRhdGVhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBzaXRlIHJlcHJlc2VudHMgYW4gaW5zdGFsbCBzaXRlCi0JCSAqIHRoYXQgaGFzIGJlZW4gbGlua2VkIHZpYSBhIG5hdGl2ZSBpbnN0YWxsZXIgKHVzaW5nIHRoZSBsaW5rcy88bGlua2ZpbGU+Ci0JCSAqIG1lY2hhbmlzbSkKLQkJICogCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNpdGUgaXMgbGlua2VkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlbHlMaW5rZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTaXRlIHBvbGljeS4gVGhlIHNpdGUgcG9saWN5IG9iamVjdCBkZXRlcm1pbmVzIGhvdyBwbHVnLWlucwotCSAqIGNvbnRhaW5lZCBvbiB0aGUgc2l0ZSBhcmUgcHJvY2Vzc2VkIGR1cmluZyBzdGFydHVwLiBJbiBnZW5lcmFsLAotCSAqIHRoZXJlIGFyZSAzIHdheXMgb2YgY29uZmlndXJpbmcgYSBzaXRlIHBvbGljeQotCSAqIDx1bD4KLQkgKiA8bGk+ZXhwbGljaXRseSBzcGVjaWZ5IHdoaWNoIHBsdWctaW5zIGFyZSB0byBiZSBpbmNsdWRlZCBhdAotCSAqIHN0YXJ0dXAgKHR5cGU9PVVTRVJfSU5DTFVERSkuIEFueSBvdGhlciBwbHVnLWlucyBsb2NhdGVkCi0JICogYXQgdGhlIHNpdGUgYXJlIGlnbm9yZWQgYXQgc3RhcnR1cC4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGJlc3QKLQkgKiBwb2xpY3kgd2hlbiB1c2luZyByZW1vdGUgc2l0ZXMgd2hlcmUgdGhlIHVzZXIgd2lzaGVzCi0JICogdG8gcmV0YWluIGV4cGxpY2l0IGNvbnRyb2wgb3ZlciB0aGUgcGx1Zy1pbnMgdGhhdCBhcmUgaW5jbHVkZWQKLQkgKiBmcm9tIHN1Y2ggc2l0ZS4KLQkgKiA8bGk+ZXhwbGljaXRseSBzcGVjaWZ5IHdoaWNoIHBsdWctaW5zIGFyZSB0byBiZSBleGNsdWRlZCBhdAotCSAqIHN0YXJ0dXAgKHR5cGU9PVVTRVItRVhDTFVERSkuIEFsbCBvdGhlciBwbHVnLWlucyBsb2NhdGVkCi0JICogYXQgdGhlIHNpdGUgYXJlIHVzZWQgYXQgc3RhcnR1cC4gVGhpcyBwb2xpY3kgcmVxdWlyZXMgdGhhdAotCSAqIHRoZSBzaXRlIHN1cHBvcnQgYW4gYWNjZXNzICJwcm90b2NvbCIgdGhhdCBhbGxvd3MgcGx1Zy1pbgotCSAqIGRpc2NvdmVyeS4gSW4gZ2VuZXJhbCwgdGhlc2UgYXJlIHNpdGVzIGRlZmluZWQgdXNpbmcgdGhlICJmaWxlIgotCSAqIFVSTCBwcm90b2NvbC4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIGJlc3QgcG9saWN5IGZvciBsb2NhbAotCSAqIGluc3RhbGwgc2l0ZXMgKG9uIHRoZSB1c2VyIHN5c3RlbSkuCi0JICogPC91bD4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludGVyZmFjZSBJU2l0ZVBvbGljeSB7Ci0KLQkJLyoqCi0JCSAqIFBvbGljeSB0eXBlIGNvbnN0YW50cy4KLQkJICovCi0KLQkJLyoqIAotCQkgKiBVc2VyLWRlZmluZWQgaW5jbHVzaW9uIGxpc3QuIFRoZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JCSAqIHBvbGljeSB0eXBlIGlzIGludGVycHJldGVkIGFzIHBhdGggZW50cmllcyB0byBpbmNsdWRlZCBwbHVnaW4ueG1sCi0JCSAqIG9yIGZyYWdtZW50LnhtbCA8Yj5yZWxhdGl2ZTwvYj4gdG8gdGhlIHNpdGUgVVJMCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX0lOQ0xVREUgPSAwOwotCi0JCS8qKgotCQkgKiBVc2VyLWRlZmluZWQgZXhjbHVzaW9uIGxpc3QuIFRoZSBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCi0JCSAqIHBvbGljeSB0eXBlIGlzIGludGVycHJldGVkIGFzIHBhdGggZW50cmllcyB0byBleGNsdWRlZCBwbHVnaW4ueG1sCi0JCSAqIG9yIGZyYWdtZW50LnhtbCA8Yj5yZWxhdGl2ZTwvYj4gdG8gdGhlIHNpdGUgVVJMCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVU0VSX0VYQ0xVREUgPSAxOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gcG9saWN5IHR5cGUKLQkJICogCi0JCSAqIEByZXR1cm4gcG9saWN5IHR5cGUKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIGludCBnZXRUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBwb2xpY3kgaW5jbHVzaW9uLyBleGNsdXNpb24gbGlzdAotCQkgKiAKLQkJICogQHJldHVybiB0aGUgbGlzdCBhcyBhbiBhcnJheQotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0TGlzdCgpOwotCi0JCS8qKgotCQkgKiBTZXQgbmV3IHBvbGljeSBsaXN0LiBUaGUgbGlzdCBlbnRyaWVzIGFyZSBpbnRlcnByZXRlZCBiYXNlZCBvbiB0aGUgcG9saWN5Ci0JCSAqIHR5cGUuIFNlZSBkZXNjcmlwdGlvbiBvZiB0aGUgcG9saWN5IHR5cGUgY29uc3RhbnRzIGZvciBkZXRhaWxzLgotCQkgKiAKLQkJICogQHBhcmFtIGxpc3QgcG9saWN5IGluY2x1c2lvbi8gZXhjbHVzaW9uIGxpc3QgYXMgYW4gYXJyYXkuCi0JCSAqIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgdGhlcmUgYXJlIG5vIGVudHJpZXMuCi0JCSAqIEBzZWUgI1VTRVJfSU5DTFVERQotCQkgKiBAc2VlICNVU0VSX0VYQ0xVREUKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0TGlzdChTdHJpbmdbXSBsaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBGZWF0dXJlIGVudHJ5LgotCSAqIFJlcHJlc2VudHMgcnVudGltZSAiaGludHMiIGFib3V0IGNvbmZpZ3VyZWQgZmVhdHVyZXMuCi0JICogVGhlIGluZm9ybWF0aW9uIGlzIHVzZWQgZHVyaW5nIGV4ZWN1dGlvbiB0byBsb2NhdGUgdGhlCi0JICogY29ycmVjdCBhdHRyaWJ1dGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBmZWF0dXJlLiBOb3RlLAotCSAqIHRoYXQgYSB0eXBpY2FsIGNvbmZpZ3VyYXRpb24gY2FuIGRlY2xhcmUgbXVsdGlwbGUgZmVhdHVyZQotCSAqIGVudHJpZXMuIEF0IGV4ZWN1dGlvbiB0aW1lLCBvbmx5IG9uZSBjYW4gYmUgc2VsZWN0ZWQgYXMKLQkgKiB0aGUgYWN0aXZlIHByaW1hcnkgZmVhdHVyZS4gVGhpcyBpcyBkZXRlcm1pbmVkIGJhc2VkIG9uIAotCSAqIHNwZWNpZmllZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9yIGNvbXB1dGVkIGRlZmF1bHRzLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlRW50cnkgewotCi0JCS8qKgotCQkgKiBSZXR1cm5zIGZlYXR1cmUgaWRlbnRpZmllci4KLQkJICogQHJldHVybiBmZWF0dXJlIGlkZW50aWZpZXIKLQkJICogQHNpbmNlIDIuMAotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWRlbnRpZmllcigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50bHkgY29uZmlndXJlZCB2ZXJzaW9uIGZvciB0aGUgZmVhdHVyZS4KLQkJICogQHJldHVybiBmZWF0dXJlIHZlcnNpb24gKGFzIHN0cmluZyksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVZlcnNpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGUgZmVhdHVyZSBwbHVnLWluIGZvciB0aGlzIGZlYXR1cmUgZW50cnkuCi0JCQkgKiAgTm90ZSwgICAgICB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGEgZmVhdHVyZSBpbiBmYWN0Ci0JCQkgKiBzdXBwbGllcyBhIGNvcnJlc3BvbmRpbmcgZmVhdHVyZSBwbHVnaW4sIHNvIHRoZSByZXN1bHQgY2FuIGJlCi0JCQkgKiA8Y29kZT5udWxsPC9jb2RlPi4gQWxzbywgaWYgc3VwcGxpZWQsIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZQotCQkJICogcGx1Z2luIHdpbGwgaW4gZmFjdCBiZSBsb2FkZWQgaW50byB0aGUgcGx1Zy1pbiByZWdpc3RyeSBhdCBydW50aW1lCi0JCQkgKiAoZHVlIHRvIHJ1bGVzIGFuZCBjb25zdHJhaW50IGNoZWNraW5nIHBlcmZvcm1lZCBieSB0aGUgcmVnaXN0cnkKLQkJCSAqIGxvYWRpbmcgc3VwcG9ydCkuIENvbnNlcXVlbnRseSBjb2RlIG1ha2luZyB1c2Ugb2YgdGhpcyBtZXRob2QgbXVzdAotCQkJICogaGFuZGxlIHRoZXNlIGNvbmRpdGlvbnMuCi0JCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyIChhcyBzdHJpbmcpLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCQkgKiBAc2luY2UgMi4xCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIGZlYXR1cmUgcGx1Zy1pbiBmb3IgdGhpcyBmZWF0dXJlCi0JCSAqIGVudHJ5LiBOb3RlLCB0aGF0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IGEgZmVhdHVyZSBpbiBmYWN0Ci0JCSAqIHN1cHBsaWVzIGEgY29ycmVzcG9uZGluZyBmZWF0dXJlIHBsdWdpbiwgc28gdGhlIHJlc3VsdCBjYW4gYmUKLQkJICogPGNvZGU+bnVsbDwvY29kZT4uIEFsc28sIGlmIHN1cHBsaWVkLCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCB0aGUKLQkJICogcGx1Z2luIHdpbGwgaW4gZmFjdCBiZSBsb2FkZWQgaW50byB0aGUgcGx1Zy1pbiByZWdpc3RyeSBhdCBydW50aW1lCi0JCSAqIChkdWUgdG8gcnVsZXMgYW5kIGNvbnN0cmFpbnQgY2hlY2tpbmcgcGVyZm9ybWVkIGJ5IHRoZSByZWdpc3RyeQotCQkgKiBsb2FkaW5nIHN1cHBvcnQpLiBDb25zZXF1ZW50bHkgY29kZSBtYWtpbmcgdXNlIG9mIHRoaXMgbWV0aG9kIG11c3QKLQkJICogaGFuZGxlIHRoZXNlIGNvbmRpdGlvbnMuCi0JCSAqIEByZXR1cm4gZmVhdHVyZSB2ZXJzaW9uIChhcyBzdHJpbmcpLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVQbHVnaW5WZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIHRvIHJ1biB3aGVuIHRoaXMgZmVhdHVyZSBpcyB0aGUKLQkJICogcHJpbWFyeSBmZWF0dXJlLgotCQkgKiBAcmV0dXJuIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IAotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVBcHBsaWNhdGlvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIFVSTHMgdG8gdGhlIGZlYXR1cmUgInJvb3QiIGxvY2F0aW9ucy4gVGhlIHJvb3QKLQkJICogVVJMcyBhcmUgaW5zdGFsbCBsb2NhdGlvbnMgb2YgdGhlIGZlYXR1cmUgcGx1Z2luIGFuZCBpdHMKLQkJICogZnJhZ21lbnRzLgotCQkgKgotCQkgKiBAcmV0dXJuIGFycmF5IG9mIFVSTHMsIG9yIGFuIGVtcHR5IGFycmF5Ci0JCSAqIEBzaW5jZSAyLjAKLQkJICovCi0JCXB1YmxpYyBVUkxbXSBnZXRGZWF0dXJlUm9vdFVSTHMoKTsKLQotCQkvKioKLQkJICogUmV0dXJucyBhbiBpbmRpY2F0aW9uIHdoZXRoZXIgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIGRlZmluZWQKLQkJICogdG8gYWN0IGFzIGEgcHJpbWFyeSBmZWF0dXJlLgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGNhbiBiZSBwcmltYXJ5LAotCQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCQkgKiBAc2luY2UgMi4wCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjYW5CZVByaW1hcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzaXRlIGVudHJ5Ci0JICoKLQkgKiBAcGFyYW0gdXJsIHNpdGUgVVJMCi0JICogQHBhcmFtIHBvbGljeSBzaXRlIHBvbGljeQotCSAqIEByZXR1cm4gY3JlYXRlZCBzaXRlIGVudHJ5Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJU2l0ZUVudHJ5IGNyZWF0ZVNpdGVFbnRyeShVUkwgdXJsLCBJU2l0ZVBvbGljeSBwb2xpY3kpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgc2l0ZSBwb2xpY3kuIFRoZSBwb2xpY3kgZGV0ZXJtaW5lcyB0aGUgd2F5IHRoZSBzaXRlCi0JICogcGx1Zy1pbiBhcmUgcHJvY2Vzc2VkIGF0IHN0YXJ0cHUKLQkgKgotCSAqIEBwYXJhbSB0eXBlIHBvbGljeSB0eXBlCi0JICogQHBhcmFtIGxpc3QgYW4gYXJyYXkgb2Ygc2l0ZS1yZWxhdGl2ZSBwYXRocyByZXByZXNlbnRpbmcgdGhlCi0JICogaW5jbHVzaW9uLyBleGNsdXNpb24gbGlzdAotCSAqIEByZXR1cm4gY3JlYXRlZCBzaXRlIHBvbGljeSBlbnRyeQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVNpdGVQb2xpY3kgY3JlYXRlU2l0ZVBvbGljeShpbnQgdHlwZSwgU3RyaW5nW10gbGlzdCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmZWF0dXJlIGVudHJ5Ci0JICogQHBhcmFtIGlkIGZlYXR1cmUgaWRlbnRpZmllci4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZlcnNpb24gZmVhdHVyZSB2ZXJzaW9uIChhcyBTdHJpbmcpLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHBsdWdpblZlcnNpb24gdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBwbHVnaW4gKGFzIFN0cmluZykuIENhbiBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwcmltYXJ5IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGRlZmluZWQgYXMgYSBwcmltYXJ5Ci0JICogZmVhdHVyZSwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcGFyYW0gYXBwbGljYXRpb24gaWRlbnRpZmllciBvZiB0aGUgYXBwbGljYXRpb24gdG8gcnVuIHdoZW4gCi0JICogdGhpcyBmZWF0dXJlIGlzIHRoZSBwcmltYXJ5IGZlYXR1cmUuIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiBzcGVjaWZpZWQsIHRoZSBpZGVudGlmaWVyIG11c3QgcmVwcmVzZW50IGEgdmFsaWQgZXh0ZW5zaW9uIAotCSAqIHJlZ2lzdGVyZWQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnM8L2NvZGU+Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIEBwYXJhbSByb290IGFuIGFycmF5IG9mIFVSTHMgdG8gZmVhdHVyZSByb290IGRpcmVjdG9yaWVzLgotCSAqIFRoZXNlIGFyZSBVUkxzIHRvIGluc3RhbGwgbG9jYXRpb25zIGZvciB0aGUgZmVhdHVyZSBwbHVnaW4KLQkgKiBhbmQgaXRzIGZyYWdtZW50cy4gQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEByZXR1cm4gY3JlYXRlIGZlYXR1cmUgZW50cnkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIElGZWF0dXJlRW50cnkgY3JlYXRlRmVhdHVyZUVudHJ5KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBwbHVnaW5WZXJzaW9uLCBib29sZWFuIHByaW1hcnksIFN0cmluZyBhcHBsaWNhdGlvbiwgVVJMW10gcm9vdCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmZWF0dXJlIGVudHJ5Ci0JICogQHBhcmFtIGlkIGZlYXR1cmUgaWRlbnRpZmllci4gTXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHZlcnNpb24gZmVhdHVyZSB2ZXJzaW9uIChhcyBTdHJpbmcpLiBDYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHBsdWdpbklkZW50aWZpZXIgaWRlbnRpZmllciBvZiB0aGUgZmVhdHVyZSBwbHVnaW4gKGFzIFN0cmluZykuIENhbgotCSAqIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSAgcGx1Z2luVmVyc2lvbiAgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBwbHVnaW4gKGFzIFN0cmluZykuIENhbiBiZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSBwcmltYXJ5IDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGRlZmluZWQgYXMgYSBwcmltYXJ5Ci0JICogZmVhdHVyZSwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcGFyYW0gYXBwbGljYXRpb24gaWRlbnRpZmllciBvZiB0aGUgYXBwbGljYXRpb24gdG8gcnVuIHdoZW4KLQkgKiB0aGlzIGZlYXR1cmUgaXMgdGhlIHByaW1hcnkgZmVhdHVyZS4gQ2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIElmIHNwZWNpZmllZCwgdGhlIGlkZW50aWZpZXIgbXVzdCByZXByZXNlbnQgYSB2YWxpZCBleHRlbnNpb24KLQkgKiByZWdpc3RlcmVkIGluIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zPC9jb2RlPgotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKiBAcGFyYW0gcm9vdCBhbiBhcnJheSBvZiBVUkxzIHRvIGZlYXR1cmUgcm9vdCBkaXJlY3Rvcmllcy4KLQkgKiBUaGVzZSBhcmUgVVJMcyB0byBpbnN0YWxsIGxvY2F0aW9ucyBmb3IgdGhlIGZlYXR1cmUgcGx1Z2luCi0JICogYW5kIGl0cyBmcmFnbWVudHMuIENhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGNyZWF0ZSBmZWF0dXJlIGVudHJ5Ci0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZUVudHJ5IGNyZWF0ZUZlYXR1cmVFbnRyeShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcGx1Z2luSWRlbnRpZmllciwgU3RyaW5nIHBsdWdpblZlcnNpb24sIGJvb2xlYW4gcHJpbWFyeSwgU3RyaW5nIGFwcGxpY2F0aW9uLCBVUkxbXSByb290KTsKLQotCS8qKgotCSAqIENvbmZpZ3VyZXMgdGhlIHNwZWNpZmllZCBzaXRlIGVudHJ5LiBJZiBhIHNpdGUgZW50cnkgd2l0aCB0aGUKLQkgKiBzYW1lIHNpdGUgVVJMIGlzIGFscmVhZHkgY29uZmlndXJlZCwgdGhlIGVudHJ5IGlzIDxiPm5vdDwvYj4gcmVwbGFjZWQuCi0JICogCi0JICogQHBhcmFtIGVudHJ5IHNpdGUgZW50cnkgCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVNpdGUoSVNpdGVFbnRyeSBlbnRyeSk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBzcGVjaWZpZWQgc2l0ZSBlbnRyeS4gSWYgYSBzaXRlIGVudHJ5IHdpdGggdGhlCi0JICogc2FtZSBzaXRlIFVSTCBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQsIHRoZSByZXBsYWNlbWVudCBiZWhhdmlvciBmb3IKLQkgKiB0aGUgZW50cnkgY2FuIGJlIHNwZWNpZmllZC4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cnkgc2l0ZSBlbnRyeSAKLQkgKiBAcGFyYW0gIHJlcGxhY2UgaW5kaWNhdGluZyB3aGV0aGVyIGFuIGV4aXN0aW5nIGNvbmZpZ3VyZWQgZW50cnkgd2l0aAotCSAqIHRoZSBzYW1lIFVSTCBzaG91bGQgYmUgcmVwbGFjZWQgKDxjb2RlPnRydWU8L2NvZGU+KSBvciBub3QgKDxjb2RlPmZhbHNlPC9jb2RlPikuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVNpdGUoSVNpdGVFbnRyeSBlbnRyeSwgYm9vbGVhbiByZXBsYWNlKTsKLQotCS8qKgotCSAqIFVuY29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIGVudHJ5LiBEb2VzIG5vdCBkbyBhbnl0aGluZyBpZiB0aGUgZW50cnkKLQkgKiBpcyBub3QgY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZW50cnkgc2l0ZSBlbnRyeQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZVNpdGUoSVNpdGVFbnRyeSBlbnRyeSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvbmZpZ3VyZWQgc2l0ZSBlbnRyaWVzCi0JICogCi0JICogQHJldHVybiBhcnJheSBvZiBzaXRlIGVudHJpZXMuIFJldHVybnMgYW4gZW1wdHkgYXJyYXkgaWYgbm8gc2l0ZXMgYXJlCi0JICogY29uZmlndXJlZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVNpdGVFbnRyeVtdIGdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHNpdGUgZW50cnkgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwKLQkgKiAKLQkgKiBAcGFyYW0gdXJsIHNpdGUgdXJsCi0JICogQHJldHVybiBtYXRjaGluZyBzaXRlIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBtYXRjaCBmb3VuZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVNpdGVFbnRyeSBmaW5kQ29uZmlndXJlZFNpdGUoVVJMIHVybCk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmVzIHRoZSBmZWF0dXJlIGVudHJ5LgotCSAqIElmIGFub3RoZXIgZmVhdHVyZSBlbnRyeSB3aXRoIHRoZSBzYW1lIGZlYXR1cmUgaWRlbnRpZmllciAKLQkgKiBhbHJlYWR5IGV4aXN0cywgaXQgaXMgcmVwbGFjZWQuCi0JICogQHBhcmFtIGVudHJ5IGZlYXR1cmUgZW50cnkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlRmVhdHVyZUVudHJ5KElGZWF0dXJlRW50cnkgZW50cnkpOwotCi0JLyoqCi0JICogVW5jb25maWd1cmVzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBlbnRyeSBpZiBpdCBleGlzdHMuCi0JICogQHBhcmFtIGVudHJ5IGZlYXR1cmUgZW50cnkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSBlbnRyeSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmUgZW50cmllcy4KLQkgKiBAcmV0dXJuIGFycmF5IG9yIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIGVudHJpZXMKLQkgKiBhcmUgY29uZmlndXJlZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVFbnRyeVtdIGdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOwotCi0JLyoqCi0JICogTG9jYXRlcyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgZW50cnkuCi0JICogQHBhcmFtIGlkIGZlYXR1cmUgaWRlbnRpZmllcgotCSAqIEByZXR1cm4gZmVyYXR1cmUgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVFbnRyeSBmaW5kQ29uZmlndXJlZEZlYXR1cmVFbnRyeShTdHJpbmcgaWQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGxvY2F0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0JICogCi0JICogQHJldHVybiBjb25maWd1cmF0aW9uIGxvY2F0aW9uIFVSTCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogY29uZmlndXJhdGlvbiBsb2NhdGlvbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTCBnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdGFtcCByZWZsZWN0aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb25maWd1cmF0aW9uLiBJZiBjYWxsZWQgcmVwZWF0ZWRseSwKLQkgKiByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIGxvbmcgYXMgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGNvbmZpZ3VyYXRpb24gKGNoYW5nZXMgdG8KLQkgKiBzaXRlcywgZmVhdHVyZXMgb3IgcGx1Z2lucykuCi0JICogCi0JICogQHJldHVybiBjb25maWd1cmF0aW9uIGNoYW5nZSBzdGFtcAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRDaGFuZ2VTdGFtcCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0YW1wIHJlZmxlY3RpbmcgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZlYXR1cmVzIGluIHRoZSBjb25maWd1cmF0aW9uLiAKLQkgKiBJZiBjYWxsZWQgcmVwZWF0ZWRseSwgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSBhcyBsb25nIGFzIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvCi0JICogZmVhdHVyZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBjb25maWd1cmF0aW9uIGZlYXR1cmVzIGNoYW5nZSBzdGFtcCAKLQkgKiBAc2luY2UgMi4wCi0JICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRGZWF0dXJlc0NoYW5nZVN0YW1wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RhbXAgcmVmbGVjdGluZyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGx1Zy1pbnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIAotCSAqIElmIGNhbGxlZCByZXBlYXRlZGx5LCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIGxvbmcgYXMgbm8gY2hhbmdlcyB3ZXJlIG1hZGUgdG8KLQkgKiBwbHVnLWlucyBpbiB0aGUgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGNvbmZpZ3VyYXRpb24gcGx1Zy1pbnMgY2hhbmdlIHN0YW1wIAotCSAqIEBzaW5jZSAyLjAKLQkgKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIGxvbmcgZ2V0UGx1Z2luc0NoYW5nZVN0YW1wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBjb25maWd1cmVkIHByaW1hcnkgZmVhdHVyZS4gQSBwcmltYXJ5IGZlYXR1cmUKLQkgKiBpcyB1c2VkIHRvIHNwZWNpZnkgcHJvZHVjdCBjdXN0b21pemF0aW9uIGluZm9ybWF0aW9uIGZvciBhIHJ1bm5pbmcgaW5zdGFuY2UKLQkgKiBvZiBFY2xpcHNlLiAKLQkgKiAKLQkgKiBAcmV0dXJuIHByaW1hcnkgZmVhdHVyZSBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGNvbmZpZ3VyZWQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5RmVhdHVyZUlkZW50aWZpZXIoKTsKLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwbHVnLWluIHBhdGggZm9yIHRoaXMgY29uZmlndXJhdGlvbi4gVGhlIHJlc3VsdCBpbmNsdWRlcyBhbGwgcGx1Zy1pbnMKLQkgKiB2aXNpYmxlIG9uIGVhY2ggb2YgdGhlIGNvbmZpZ3VyZWQgc2l0ZXMgYmFzZWQgb24gZWFjaCBzaXRlIHBvbGljeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBsdWctaW4gcGF0aCBlbGVtZW50cyAoZnVsbCBVUkwgZW50cmllcyksIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgVVJMW10gZ2V0UGx1Z2luUGF0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBib290c3RyYXAgcGx1Z2luIGlkZW50aWZpZXJzIHdob3NlCi0JICogbG9jYXRpb24gbmVlZHMgdG8gYmUgZXhwbGljaXRseSBpZGVudGlmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgaWRlbnRpZmllcnMsIG9yIGVtcHR5IGFycmF5Ci0JICogb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMAotCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBtZXRob2QuIENoZWNrIHRoZSBvc2dpLmJ1bmRsZXMgc3lzdGVtIHByb3BlcnR5IGZvciB0aGUKLQkgKiB1cmxzIG9mIHRoZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgYnVuZGxlcwotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRCb290c3RyYXBQbHVnaW5JZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYXRpb24gb2YgYSBib290c3RyYXAgcGx1Z2luLgotCSAqIAotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNnZXRCb290c3RyYXBQbHVnaW5JZGVudGlmaWVycygpCi0JICogQHBhcmFtIGlkIHBsdWdpbiBpZGVudGlmaWVyLiBNdXN0IG1hdGNoIG9uZSBvZiB0aGUgZW50cmllcyByZXR1cm5lZAotCSAqIGJ5IGdldEJvb3RzdHJhcFBsdWdpbklkZW50aWZpZXJzKCkKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICogQGRlcHJlY2F0ZWQgRG8gbm90IHVzZSB0aGlzIG1ldGhvZC4gVXNlIHRoZSBvc2lnLmJ1bmRsZXMgc3lzdGVtIHByb3BlcnR5IGNvbnRhaW5zCi0JICogdGhlIHVybHMgb2YgdGhlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZCBidW5kbGVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb3RzdHJhcFBsdWdpbkxvY2F0aW9uKFN0cmluZyBpZCwgVVJMIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGNhbiBiZSB1cGRhdGVkLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29uZmlndXJhdGlvbiBjYW4gYmUgdXBkYXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IAotCSAqIG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGlzIHRyYW5zaWVudC4gQSB0cmFuc2llbnQKLQkgKiBjb25maWd1cmF0aW9uIHR5cGljYWxseSByZXByZXNlbnRzIGEgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB3YXMgY29tcHV0ZWQgZm9yIGEgc2luZ2xlIGluc3RhbnRpYXRpb24gb2YgdGhlIHBsYXRmb3JtIGFuZCBpcyBub3QKLQkgKiBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIG9uIHN1YnNlcXVlbnQgaW5zdGFudGlhdGlvbnMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBjb25maWd1cmF0aW9uIGlzIHRyYW5zaWVudCwgPGNvZGU+ZmFsc2U8L2NvZGU+IAotCSAqIG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gaXMgdHJhbnNpZW50IG9yIG5vdC4gQSB0cmFuc2llbnQKLQkgKiBjb25maWd1cmF0aW9uIHR5cGljYWxseSByZXByZXNlbnRzIGEgc2NlbmFyaW8gd2hlcmUgdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiB3YXMgY29tcHV0ZWQgZm9yIGEgc2luZ2xlIGluc3RhbnRpYXRpb24gb2YgdGhlIHBsYXRmb3JtIGFuZCBpcyBub3QKLQkgKiBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIG9uIHN1YnNlcXVlbnQgaW5zdGFudGlhdGlvbnMuIFRoaXMgbWV0aG9kIGhhcwotCSAqIG5vIGVmZmVjdCBpZiBjYWxsZWQgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0gY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgY29uZmlndXJhdGlvbiBpcyB0cmFuc2llbnQsIDxjb2RlPmZhbHNlPC9jb2RlPiAKLQkgKiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgaXNUcmFuc2llbnQoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBDYWxsZWQgdG8gcmVmcmVzaCB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gSW4gcGFydGljdWxhciwKLQkgKiBjYXVzZXMgY2hhbmdlIHN0YW1wcyB0byBiZSByZWNvbXB1dGVkIGJhc2VkIG9uIHRoZSBjdXJyZW50Ci0JICogY29uZmlndXJhdGlvbiBzdGF0ZSwgYW5kIHVwZGF0ZXMgdGhlIGxpc3RzIG9mIGF2YWlsYWJsZSBwbHVnLWlucy4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpOwotCi0JLyoqCi0JICogQ2FsbGVkIHRvIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCB0byBzYXZlIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHRoZQotCSAqIHNwZWNpZmllZCBsb2NhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB1cmwgc2F2ZSBsb2NhdGlvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZShVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL0lQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRvci9JUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDljOTg4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdG9yL0lQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBjcmVhdGluZyBwbGF0Zm9ybSBjb25maWd1cmF0aW9ucy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgcGxhdGZvcm0gY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gdXNlZCBpbiBjdXJyZW50IGluc3RhbmNlIG9mIHBsYXRmb3JtCi0JICovCQotCXB1YmxpYyBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkvKioKLQkgKiBSZXR1cm5zIGEgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBvYmplY3QsIG9wdGlvbmFsbHkgaW5pdGlhbGl6ZWQgd2l0aCBwcmV2aW91c2x5IHNhdmVkCi0JICogY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdXJsIGxvY2F0aW9uIG9mIHByZXZpb3VzbHkgc2F2ZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBJZiA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlzIHNwZWNpZmllZCwgYW4gZW1wdHkgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgcmV0dXJuZWQKLQkgKiBAcmV0dXJuIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gdXNlZCBpbiBjdXJyZW50IGluc3RhbmNlIG9mIHBsYXRmb3JtCi0JICovCQotCXB1YmxpYyBJUGxhdGZvcm1Db25maWd1cmF0aW9uIGdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRvci9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRvci9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMGY5ZjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0b3IvcGFja2FnZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPCFkb2N0eXBlIGh0bWwgcHVibGljICItLy93M2MvL2R0ZCBodG1sIDQuMCB0cmFuc2l0aW9uYWwvL2VuIj4KLTxodG1sPgotPGhlYWQ+Ci0gICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4KLSAgIDx0aXRsZT5QYWNrYWdlLWxldmVsIEphdmFkb2M8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci1Qcm92aWRlcyBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBkYXRhLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbnRlcmZhY2VzIGZvciBhY2Nlc3NpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGUgbG9jYWwKLXN5c3RlbSBpbnN0YWxsYXRpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uIAotPHA+Ci08Yj5Ob3RlOjwvYj4gVGhpcyBwYWNrYWdlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLWNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLShyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi08L3A+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Cb290RGVzY3JpcHRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQm9vdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2M2I3NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Cb290RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotCi1wdWJsaWMgY2xhc3MgQm9vdERlc2NyaXB0b3IgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmdbXSBsaWJzOwotCXByaXZhdGUgVVJMIGRpcjsKLQotCXB1YmxpYyBCb290RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmdbXSBsaWJzLCBVUkwgZGlyKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5saWJzID0gbGliczsKLQkJdGhpcy5kaXIgPSBkaXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExpYnJhcmllcygpIHsKLQkJcmV0dXJuIGxpYnM7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRQbHVnaW5EaXJlY3RvcnlVUkwoKSB7Ci0JCXJldHVybiBkaXI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0J1bmRsZU1hbmlmZXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9CdW5kbGVNYW5pZmVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGFiYTllLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0J1bmRsZU1hbmlmZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLS8qKgotICogUGFyc2VzIE1BTklGRVNULk1GCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdCBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQlwcml2YXRlIEZpbGUgbWFuaWZlc3RGaWxlOwotCXByaXZhdGUgUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7Ci0JcHJpdmF0ZSBJT0V4Y2VwdGlvbiBleGNlcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgYnVuZGxlVVJMOwotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBsb2NhbCBmaWxlCi0JICovCi0JcHVibGljIEJ1bmRsZU1hbmlmZXN0KEZpbGUgbWFuaWZlc3QpIHsKLQkJc3VwZXIoKTsKLQkJbWFuaWZlc3RGaWxlID0gbWFuaWZlc3Q7Ci0JCWlmIChtYW5pZmVzdC5leGlzdHMoKSAmJiAhbWFuaWZlc3QuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZUlucHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWZvcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obWFuaWZlc3QpOwotCQkJCXBhcnNlKGZvcyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGZvcyAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQkvKioKLQkJICogQ29uc3RydWN0b3IgZm9yIGxvY2FsIGZpbGUKLQkJICovCi0JCXB1YmxpYyBCdW5kbGVNYW5pZmVzdChJbnB1dFN0cmVhbSBpbnB1dCwgU3RyaW5nIGJ1bmRsZVVybCkgewotCQkJc3VwZXIoKTsKLQkJCWJ1bmRsZVVSTCA9IGJ1bmRsZVVybDsKLQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJcGFyc2UoaW5wdXQpOwotCQkJfQotCQl9Ci0JLyoqCi0JICogUGFyc2VzIG1hbmlmZXN0LCBjcmVhdGVzIFBsdWdpbkVudHJ5IGlmIG1hbmlmZXN0IGlzIHZhbGlkLCBzdG9yZXMKLQkgKiBleGNlcHRpb24gaWYgYW55IG9jY3VycwotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgSW5wdXRTdHJlYW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHsKLQkJdHJ5IHsKLQkJCU1hbmlmZXN0IG0gPSBuZXcgTWFuaWZlc3QoaW4pOwotCQkJQXR0cmlidXRlcyBhID0gbS5nZXRNYWluQXR0cmlidXRlcygpOwotCQkJLy8gcGx1Z2luIGlkCi0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gYS5nZXRWYWx1ZShDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQlpZiAoc3ltYm9saWNOYW1lID09IG51bGwpIHsKLQkJCQkvLyBJbiBFY2xpcHNlIG1hbmlmZXN0IG11c3QgaGF2ZSBCdW5kbGUtU3ltYm9saWNOYW1lIGF0dHJpYnV0ZQotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBpZDsKLQkJCXRyeSB7Ci0JCQkJTWFuaWZlc3RFbGVtZW50W10gZWxlbWVudHMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoCi0JCQkJCQlDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSwgc3ltYm9saWNOYW1lKTsKLQkJCQlpZCA9IGVsZW1lbnRzWzBdLmdldFZhbHVlKCk7Ci0JCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gYmUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oYmUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCS8vIHBsdWdpbiB2ZXJzaW9uCi0JCQlTdHJpbmcgdmVyc2lvbiA9IGEuZ2V0VmFsdWUoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJCWlmICh2ZXJzaW9uID09IG51bGwpIHsKLQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKAotCQkJCQkJIkJ1bmRsZU1hbmlmZXN0Lm5vVmVyc2lvbiIsIENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWQpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgaG9zdFBsdWdpbiA9IGEuZ2V0VmFsdWUoQ29uc3RhbnRzLkZSQUdNRU5UX0hPU1QpOwotCQkJcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKLQkJCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsCi0JCQkJCXZlcnNpb24pKTsKLQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQoaG9zdFBsdWdpbiAhPSBudWxsCi0JCQkJCSYmIGhvc3RQbHVnaW4ubGVuZ3RoKCkgPiAwKTsKLQkJCS8vIFNldCBVUkwKLQkJCWlmKGJ1bmRsZVVSTCE9bnVsbCl7Ci0JCQkJcGx1Z2luRW50cnkuc2V0VVJMKGJ1bmRsZVVSTCk7Ci0JCQl9ZWxzZXsKLQkJCQlGaWxlIHBsdWdpbkRpciA9IG1hbmlmZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaWYgKHBsdWdpbkRpciAhPSBudWxsKSB7Ci0JCQkJCXBsdWdpbkRpciA9IHBsdWdpbkRpci5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJfQotCQkJCWlmIChwbHVnaW5EaXIgIT0gbnVsbCl7Ci0JCQkJCXBsdWdpbkVudHJ5LnNldFVSTChQTFVHSU5TICsgIi8iICsgcGx1Z2luRGlyLmdldE5hbWUoKSArICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCS8vCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJZXhjZXB0aW9uID0gaW9lOwotCQl9Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGV4Y2VwdGlvbiAhPSBudWxsIHx8IHBsdWdpbkVudHJ5ICE9IG51bGw7Ci0JfQotCS8qKgotCSAqIE9idGFpbnMgUGx1Z2luRW50cnkgZnJvbSBhIG1hbmlmZXN0LgotCSAqIAotCSAqIEByZXR1cm4gUGx1Z2luRW50cnkgb3IgbnVsbCBpZiB2YWxpZCBtYW5pZmVzdCBkb2VzIG5vdCBleGlzdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBpZiBleGNlcHRpb24gZHVyaW5nIHBhcnNpbmcKLQkgKi8KLQlwdWJsaWMgUGx1Z2luRW50cnkgZ2V0UGx1Z2luRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKLQkJCXRocm93IGV4Y2VwdGlvbjsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBwbHVnaW5FbnRyeTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNGE3NjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQkKLQlwcml2YXRlIEhhc2hNYXAgc2l0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgRGF0ZSBkYXRlOwotCXByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQ7IC8vIG5lZWRlZCB0byBhY2NvdW50IGZvciBmaWxlIHN5c3RlbSBsaW1pdGF0aW9ucwotCXByaXZhdGUgVVJMIHVybDsKLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNpZW50Q29uZmlnOwotCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5OwotCXByaXZhdGUgQ29uZmlndXJhdGlvbiBsaW5rZWRDb25maWc7IC8vIHNoYXJlZCBjb25maWd1cmF0aW9uCi0JCi0JcHVibGljIENvbmZpZ3VyYXRpb24oKSB7Ci0JCXRoaXMobmV3IERhdGUoKSk7Ci0JCS8vIHRoZSBjb25maWcgaXMgY3JlYXRlZCBub3cgb3Igb3V0IG9mIGEgcGxhdGZvcm0ueG1sIHdpdGhvdXQgYSBkYXRlCi0JCWlzRGlydHkgPSB0cnVlOwotCX0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbihEYXRlIGRhdGUpICB7Ci0JCXRoaXMuZGF0ZSA9IGRhdGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQkKLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGlua2VkQ29uZmlnKENvbmZpZ3VyYXRpb24gbGlua2VkQ29uZmlnKSB7Ci0JCXRoaXMubGlua2VkQ29uZmlnID0gbGlua2VkQ29uZmlnOwotCQkvLyBtYWtlIGFsbCB0aGUgc2l0ZXMgcmVhZC1vbmx5Ci0JCVNpdGVFbnRyeVtdIGxpbmtlZFNpdGVzID0gbGlua2VkQ29uZmlnLmdldFNpdGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxsaW5rZWRTaXRlcy5sZW5ndGg7IGkrKykKLQkJCWxpbmtlZFNpdGVzW2ldLnNldFVwZGF0ZWFibGUoZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXRMaW5rZWRDb25maWcoKSB7Ci0JCXJldHVybiBsaW5rZWRDb25maWc7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29uZmlnIG5lZWRzIHRvIGJlIHNhdmVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGlzRGlydHk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERpcnR5KGJvb2xlYW4gZGlydHkpIHsKLQkJaXNEaXJ0eSA9IGRpcnR5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRTaXRlRW50cnkoU3RyaW5nIHVybCwgU2l0ZUVudHJ5IHNpdGUpIHsKLQkJLy8gb25seSBhZGQgdGhlIHNhbWUgc2l0ZSBvbmNlCi0JCWlmIChzaXRlcy5nZXQodXJsKSA9PSBudWxsICYmIChsaW5rZWRDb25maWcgPT0gbnVsbCB8fCBsaW5rZWRDb25maWcuc2l0ZXMuZ2V0KHVybCkgPT0gbnVsbCkpIHsKLQkJCXNpdGUuc2V0Q29uZmlnKHRoaXMpOwotCQkJc2l0ZXMucHV0KHVybCwgc2l0ZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2l0ZUVudHJ5KFN0cmluZyB1cmwpIHsKLQkJc2l0ZXMucmVtb3ZlKHVybCk7Ci0JfQotCQotCXB1YmxpYyBTaXRlRW50cnkgZ2V0U2l0ZUVudHJ5KFN0cmluZyB1cmwpIHsKLQkJU2l0ZUVudHJ5IHNpdGUgPSAoU2l0ZUVudHJ5KXNpdGVzLmdldCh1cmwpOwotCQlpZiAoc2l0ZSA9PSBudWxsICYmIGxpbmtlZENvbmZpZyAhPSBudWxsKQotCQkJc2l0ZSA9IGxpbmtlZENvbmZpZy5nZXRTaXRlRW50cnkodXJsKTsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCQotCXB1YmxpYyBTaXRlRW50cnlbXSBnZXRTaXRlcygpIHsKLQkJaWYgKGxpbmtlZENvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIChTaXRlRW50cnlbXSkgc2l0ZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2l0ZUVudHJ5W3NpdGVzLnNpemUoKV0pOwotCQllbHNlIHsKLQkJCUFycmF5TGlzdCBjb21iaW5lZFNpdGVzID0gbmV3IEFycmF5TGlzdChzaXRlcy52YWx1ZXMoKSk7Ci0JCQljb21iaW5lZFNpdGVzLmFkZEFsbChsaW5rZWRDb25maWcuc2l0ZXMudmFsdWVzKCkpOwotCQkJcmV0dXJuIChTaXRlRW50cnlbXSkgY29tYmluZWRTaXRlcy50b0FycmF5KG5ldyBTaXRlRW50cnlbY29tYmluZWRTaXRlcy5zaXplKCldKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgRWxlbWVudCB0b1hNTChEb2N1bWVudCBkb2MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCi0JCXRyeSB7Ci0JCQlFbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChDRkcpOwotCi0JCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfVkVSU0lPTiwgVkVSU0lPTik7Ci0JCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfREFURSwgU3RyaW5nLnZhbHVlT2YoZGF0ZS5nZXRUaW1lKCkpKTsKLQkJCVN0cmluZyB0cmFuc2l0b3J5ID0gaXNUcmFuc2llbnQoKSA/ICJ0cnVlIiA6ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJY29uZmlnRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1RSQU5TSUVOVCwgdHJhbnNpdG9yeSk7Ci0JCQkJCQkKLQkJCWlmIChsaW5rZWRDb25maWcgIT0gbnVsbCkgewotCQkJCWNvbmZpZ0VsZW1lbnQuc2V0QXR0cmlidXRlKENGR19TSEFSRURfVVJMLCBsaW5rZWRDb25maWcuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0KLQkJCS8vIGNvbGxlY3Qgc2l0ZSBlbnRyaWVzCi0JCQlTaXRlRW50cnlbXSBsaXN0ID0gKFNpdGVFbnRyeVtdKSBzaXRlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBTaXRlRW50cnlbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxpbmtlZENvbmZpZyAhPSBudWxsICYmIGxpbmtlZENvbmZpZy5nZXRTaXRlRW50cnkobGlzdFtpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlFbGVtZW50IHNpdGVFbGVtZW50ID0gbGlzdFtpXS50b1hNTChkb2MpOwotCQkJCWNvbmZpZ0VsZW1lbnQuYXBwZW5kQ2hpbGQoc2l0ZUVsZW1lbnQpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gY29uZmlnRWxlbWVudDsKLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbHMubmV3Q29yZUV4Y2VwdGlvbigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSAKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJldHVybiB0cmFuc2llbnRDb25maWc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIGlzVHJhbnNpZW50KSB7Ci0JCXRoaXMudHJhbnNpZW50Q29uZmlnID0gaXNUcmFuc2llbnQ7Ci0JfQotCQotCXB1YmxpYyBEYXRlIGdldERhdGUoKSB7Ci0JCXJldHVybiBkYXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREYXRlKERhdGUgZGF0ZSkgewotCQl0aGlzLmRhdGUgPSBkYXRlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB1bmNvbmZpZ3VyZUZlYXR1cmVFbnRyeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklGZWF0dXJlRW50cnkgZmVhdHVyZSkgewotCQlTaXRlRW50cnlbXSBzaXRlcyA9IGdldFNpdGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykKLQkJCWlmIChzaXRlc1tpXS51bmNvbmZpZ3VyZUZlYXR1cmVFbnRyeShmZWF0dXJlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyBsYXN0TW9kaWZpZWQpIHsKLQkJdGhpcy5sYXN0TW9kaWZpZWQgPSBsYXN0TW9kaWZpZWQ7Ci0JfQotCQotCXB1YmxpYyBsb25nIGxhc3RNb2RpZmllZCgpIHsKLQkJaWYgKGxhc3RNb2RpZmllZCAhPSAwKQotCQkJcmV0dXJuIGxhc3RNb2RpZmllZDsKLQkJZWxzZQotCQkJcmV0dXJuIGRhdGUuZ2V0VGltZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb25BY3RpdmF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRpb25BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwM2Q5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5zdGFydGxldmVsLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLio7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yLCBJQnVuZGxlR3JvdXBQcm92aWRlciwgSUNvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUElfQ09ORklHVVJBVE9SID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9MT0NBVElPTiA9ICJvc2dpLmluc3RhbGxMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0NPTkZJR19TVEFNUCA9ICJsYXN0LmNvbmZpZy5zdGFtcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1NQQUNFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfUFJFRklYID0gInVwZGF0ZUAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOSVRJQUxfUFJFRklYID0gImluaXRpYWxAIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIGRlYnVnIG9wdGlvbnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPUFRJT05fREVCVUcgPSBQSV9DT05GSUdVUkFUT1IgKyAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAotCS8vIGRlYnVnIHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCS8vIG9zCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgcGxhdGZvcm1UcmFja2VyOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBjb25maWd1cmF0aW9uRmFjdG9yeVNSOwotCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247Ci0JCi0JLy8gSW5zdGFsbCBsb2NhdGlvbgotCXByaXZhdGUgc3RhdGljIFVSTCBpbnN0YWxsVVJMOwotCQotCS8vIExvY2F0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIGRhdGEKLQlwcml2YXRlIExvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uOwotCQotCS8vTmVlZCB0byBzdG9yZSB0aGF0IGJlY2F1c2UgaXQgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBwbGF0Zm9ybUNvbmZpZ3VyYXRpb24KLQlwcml2YXRlIGxvbmcgbGFzdFRpbWVTdGFtcDsKLQotCS8vIFRoZSBleHBlY3RlZCBzdGF0ZXMgdGltZXN0YW1wCi0JcHJpdmF0ZSBsb25nIGxhc3RTdGF0ZVRpbWVTdGFtcDsKLQkKLQkvLyBTaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBDb25maWd1cmF0aW9uQWN0aXZhdG9yIGNvbmZpZ3VyYXRvcjsKLQotCXB1YmxpYyBDb25maWd1cmF0aW9uQWN0aXZhdG9yKCkgewotCQljb25maWd1cmF0b3IgPSB0aGlzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRleHQgPSBjdHg7Ci0JCWxvYWRPcHRpb25zKCk7Ci0JCWFjcXVpcmVGcmFtZXdvcmtMb2dTZXJ2aWNlKCk7Ci0JCWluaXRpYWxpemUoKTsKLQkJCi0JCS8vU2hvcnQgY3V0LCBpZiB0aGUgY29uZmlndXJhdGlvbiBoYXMgbm90IGNoYW5nZWQKLQkJU3RyaW5nIHByb2R1Y3QgPSBjb25maWd1cmF0aW9uLmdldFByaW1hcnlGZWF0dXJlSWRlbnRpZmllcigpOwotCQkKLQkJaWYgKGNhblJ1bldpdGhDYWNoZWREYXRhKCkpIHsJCQotCQkJVXRpbHMuZGVidWcoIlNhbWUgbGFzdCB0aW1lIHN0YW1wICoqKioqIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoRUNMSVBTRV9QUk9EVUNUKSA9PSBudWxsICYmIHByb2R1Y3QgIT0gbnVsbCkgewotCQkJCVV0aWxzLmRlYnVnKCJubyBlY2xpcHNlLnByb2R1Y3QsIHNldHRpbmcgaXQgYW5kIHJldHVybmluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLnNldFByb3BlcnR5KEVDTElQU0VfUFJPRFVDVCwgcHJvZHVjdCk7Ci0JCQl9Ci0JCQlQbGF0Zm9ybS5yZWdpc3RlckJ1bmRsZUdyb3VwUHJvdmlkZXIodGhpcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlVdGlscy5kZWJ1ZygiU3RhcnRpbmcgdXBkYXRlIGNvbmZpZ3VyYXRvci4uLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5zdGFsbEJ1bmRsZXMoKTsKLQkJUGxhdGZvcm0ucmVnaXN0ZXJCdW5kbGVHcm91cFByb3ZpZGVyKHRoaXMpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyB0aGlzIHRlc3QgaXMgbm90IHJlYWxseSBuZWVkZWQgYW55IG1vcmUgdGhhbiBhbnkgcGx1Z2luIGhhcyAKLQkJLy8gdG8gdGVzdCB0byBzZWUgaWYgdGhlIHJ1bnRpbWUgaXMgcnVubmluZy4gIEl0IHdhcyB0aGVyZSBmcm9tIGVhcmxpZXIgZGF5cwotCQkvLyB3aGVyZSBzdGFydHVwIHdhcyBtdWNoIG1vcmUgZGlzam9pbnQuICBTb21lIGRheSB0aGF0IGxldmVsIG9mIGRlY291cGxpbmcKLQkJLy8gd2lsbCByZXR1cm4gYnV0IGZvciBub3cuLi4KLQkJaWYgKCFQbGF0Zm9ybS5pc1J1bm5pbmcoKSkKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uQWN0aXZhdG9yLmluaXRpYWxpemUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWNvbmZpZ0xvY2F0aW9uID0gUGxhdGZvcm0uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCS8vIGNyZWF0ZSB0aGUgbmFtZSBzcGFjZSBkaXJlY3RvcnkgZm9yIHVwZGF0ZSAoY29uZmlndXJhdGlvbi9vcmcuZWNsaXBzZS51cGRhdGUpCi0JCWlmICghY29uZmlnTG9jYXRpb24uaXNSZWFkT25seSgpKSB7Ci0JCQl0cnkgewotCQkJCVVSTCBwcml2YXRlVVJMID0gbmV3IFVSTChjb25maWdMb2NhdGlvbi5nZXRVUkwoKSwgTkFNRV9TUEFDRSk7Ci0JCQkJRmlsZSBmID0gbmV3IEZpbGUocHJpdmF0ZVVSTC5nZXRGaWxlKCkpOwotCQkJCWlmKCFmLmV4aXN0cygpKQotCQkJCQlmLm1rZGlycygpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQkJY29uZmlndXJhdGlvbkZhY3RvcnlTUiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKElQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwgbmV3IFBsYXRmb3JtQ29uZmlndXJhdGlvbkZhY3RvcnkoKSwgbnVsbCk7Ci0JCWNvbmZpZ3VyYXRpb24gPSBnZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oZ2V0SW5zdGFsbFVSTCgpLCBjb25maWdMb2NhdGlvbik7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQl0aHJvdyBVdGlscy5uZXdDb3JlRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiQ29uZmlndXJhdGlvbkFjdGl2YXRvci5jcmVhdGVDb25maWciLCBjb25maWdMb2NhdGlvbi5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQlEYXRhSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmVhbSA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IFVSTChjb25maWdMb2NhdGlvbi5nZXRVUkwoKSxOQU1FX1NQQUNFKycvJytMQVNUX0NPTkZJR19TVEFNUCkub3BlblN0cmVhbSgpKTsKLQkJCWxhc3RUaW1lU3RhbXAgPSBzdHJlYW0ucmVhZExvbmcoKTsKLQkJCWxhc3RTdGF0ZVRpbWVTdGFtcCA9IHN0cmVhbS5yZWFkTG9uZygpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbGFzdFRpbWVTdGFtcCA9IGNvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlU3RhbXAoKSAtIDE7Ci0JCQlsYXN0U3RhdGVUaW1lU3RhbXAgPSAtMTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQlVdGlscy5sb2coZTEuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBxdWljayBmaXggKGhhY2spIGZvciBidWcgNDc4NjEKLQkJdHJ5IHsKLQkJCVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zaHV0ZG93bigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWNvbmZpZ3VyYXRpb25GYWN0b3J5U1IudW5yZWdpc3RlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluc3RhbGxCdW5kbGVzKCkgewotCQlVdGlscy5kZWJ1ZygiSW5zdGFsbGluZyBidW5kbGVzLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoU3RhcnRMZXZlbC5jbGFzcy5nZXROYW1lKCkpOwotCQlpbnQgc3RhcnRMZXZlbCA9IDQ7Ci0JCVN0cmluZyBkZWZhdWx0U3RhcnRMZXZlbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3NnaS5idW5kbGVzLmRlZmF1bHRTdGFydExldmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlZmF1bHRTdGFydExldmVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc3RhcnRMZXZlbCA9IEludGVnZXIucGFyc2VJbnQoZGVmYXVsdFN0YXJ0TGV2ZWwpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJc3RhcnRMZXZlbCA9IDQ7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0YXJ0TGV2ZWwgPCAxKQotCQkJc3RhcnRMZXZlbCA9IDQ7Ci0JCQotCQlTdGFydExldmVsIHN0YXJ0ID0gbnVsbDsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKQotCQkJc3RhcnQgPSAoU3RhcnRMZXZlbCkgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXRyeSB7Ci0JCQkvLyBHZXQgdGhlIGxpc3Qgb2YgY2FjaGVkIGJ1bmRsZXMgYW5kIGNvbXBhcmUgd2l0aCB0aGUgb25lcyB0byBiZSBpbnN0YWxsZWQuCi0JCQkvLyBVbmluc3RhbGwgYWxsIHRoZSBjYWNoZWQgYnVuZGxlcyB0aGF0IGRvIG5vdCBhcHBlYXIgb24gdGhlIG5ldyBsaXN0Ci0JCQlCdW5kbGVbXSBjYWNoZWRCdW5kbGVzID0gY29udGV4dC5nZXRCdW5kbGVzKCk7CQkKLQkJCVVSTFtdIHBsdWdpbnMgPSBjb25maWd1cmF0aW9uLmdldFBsdWdpblBhdGgoKTsKLQkJCQkKLQkJCUJ1bmRsZVtdIGJ1bmRsZXNUb1VuaW5zdGFsbCA9IGdldEJ1bmRsZXNUb1VuaW5zdGFsbChjYWNoZWRCdW5kbGVzLCBwbHVnaW5zKTsKLQkJCWZvciAoaW50IGk9MDsgaTxidW5kbGVzVG9Vbmluc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlVdGlscy5kZWJ1ZygiVW5pbnN0YWxsaW5nICIgKyBidW5kbGVzVG9Vbmluc3RhbGxbaV0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnVuZGxlc1RvVW5pbnN0YWxsW2ldLnVuaW5zdGFsbCgpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVV0aWxzLmxvZyhNZXNzYWdlcy5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25BY3RpdmF0b3IudW5pbnN0YWxsQnVuZGxlIiwgYnVuZGxlc1RvVW5pbnN0YWxsW2ldLmdldExvY2F0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gc3RhcnRzIHRoZSBsaXN0IG9mIGJ1bmRsZXMgdG8gcmVmcmVzaCB3aXRoIGFsbCBjdXJyZW50bHkgdW5yZXNvbHZlZCBidW5kbGVzIChzZWUgYnVnIDUwNjgwKQotCQkJTGlzdCB0b1JlZnJlc2ggPSBnZXRVbnJlc29sdmVkQnVuZGxlcygpOwotCQkJCi0JCQkvLyBHZXQgdGhlIHVybHMgdG8gaW5zdGFsbAotCQkJU3RyaW5nW10gYnVuZGxlc1RvSW5zdGFsbCA9IGdldEJ1bmRsZXNUb0luc3RhbGwoY2FjaGVkQnVuZGxlcywgcGx1Z2lucyk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVV0aWxzLmRlYnVnKCJJbnN0YWxsaW5nICIgKyBidW5kbGVzVG9JbnN0YWxsW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlVUkwgYnVuZGxlVVJMID0gbmV3IFVSTCgicmVmZXJlbmNlOmZpbGU6IitidW5kbGVzVG9JbnN0YWxsW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL0J1bmRsZSB0YXJnZXQgPSBjb250ZXh0Lmluc3RhbGxCdW5kbGUoYnVuZGxlc1RvSW5zdGFsbFtpXSk7Ci0JCQkJCUJ1bmRsZSB0YXJnZXQgPSBjb250ZXh0Lmluc3RhbGxCdW5kbGUoVVBEQVRFX1BSRUZJWCtidW5kbGVzVG9JbnN0YWxsW2ldLCBidW5kbGVVUkwub3BlblN0cmVhbSgpKTsKLQkJCQkJLy8gYW55IG5ldyBidW5kbGUgc2hvdWxkIGJlIHJlZnJlc2hlZCBhcyB3ZWxsCi0JCQkJCXRvUmVmcmVzaC5hZGQodGFyZ2V0KTsKLQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwpCi0JCQkJCQlzdGFydC5zZXRCdW5kbGVTdGFydExldmVsKHRhcmdldCwgc3RhcnRMZXZlbCk7Ci0JCQkJCi0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKCFVdGlscy5pc0F1dG9tYXRpY2FsbHlTdGFydGVkQnVuZGxlKGJ1bmRsZXNUb0luc3RhbGxbaV0pKQotCQkJCQkJVXRpbHMubG9nKE1lc3NhZ2VzLmdldFN0cmluZygiQ29uZmlndXJhdGlvbkFjdGl2YXRvci5pbnN0YWxsQnVuZGxlIiwgYnVuZGxlc1RvSW5zdGFsbFtpXSkgKyAiICAgIiArIGUuZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJCXJlbW92ZUluaXRpYWxCdW5kbGVzKHRvUmVmcmVzaCwgY2FjaGVkQnVuZGxlcyk7Ci0JCQlyZWZyZXNoUGFja2FnZXMoKEJ1bmRsZVtdKSB0b1JlZnJlc2gudG9BcnJheShuZXcgQnVuZGxlW3RvUmVmcmVzaC5zaXplKCldKSk7Ci0JCQkKLQkJCWlmIChTeXN0ZW0uZ2V0UHJvcGVydHkoRUNMSVBTRV9QUk9EVUNUKSA9PSBudWxsICYmIGNvbmZpZ3VyYXRpb24uZ2V0UHJpbWFyeUZlYXR1cmVJZGVudGlmaWVyKCkgIT0gbnVsbCkKLQkJCQlTeXN0ZW0uc2V0UHJvcGVydHkoRUNMSVBTRV9QUk9EVUNULCBjb25maWd1cmF0aW9uLmdldFByaW1hcnlGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJCQotCQkJLy8ga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBjb25maWcgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZAotCQkJd3JpdGVQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UaW1lU3RhbXAoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IAotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJbml0aWFsQnVuZGxlcyhMaXN0IGJ1bmRsZXMsIEJ1bmRsZVtdIGNhY2hlZEJ1bmRsZXMpIHsKLQkJU3RyaW5nW10gaW5pdGlhbFN5bWJvbGljTmFtZXMgPSBnZXRJbml0aWFsU3ltYm9saWNOYW1lcyhjYWNoZWRCdW5kbGVzKTsKLQkJSXRlcmF0b3IgaXRlciA9IGJ1bmRsZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSAoQnVuZGxlKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQlmb3IoaW50IGkgPSAwOyBpIDwgaW5pdGlhbFN5bWJvbGljTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaW5pdGlhbFN5bWJvbGljTmFtZXNbaV0uZXF1YWxzKHN5bWJvbGljTmFtZSkpIHsKLQkJCQkJaXRlci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRJbml0aWFsU3ltYm9saWNOYW1lcyhCdW5kbGVbXSBjYWNoZWRCdW5kbGVzKSB7Ci0JCUFycmF5TGlzdCBpbml0aWFsID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUJ1bmRsZSBidW5kbGUgPSBjYWNoZWRCdW5kbGVzW2ldOwotCQkJaWYgKGJ1bmRsZS5nZXRMb2NhdGlvbigpLnN0YXJ0c1dpdGgoSU5JVElBTF9QUkVGSVgpKSB7Ci0JCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwpCi0JCQkJCWluaXRpYWwuYWRkKHN5bWJvbGljTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgaW5pdGlhbC50b0FycmF5KG5ldyBTdHJpbmdbaW5pdGlhbC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0VW5yZXNvbHZlZEJ1bmRsZXMoKSB7Ci0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBjb250ZXh0LmdldEJ1bmRsZXMoKTsKLQkJTGlzdCB1bnJlc29sdmVkID0gbmV3IEFycmF5TGlzdCgpOyAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxCdW5kbGVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGFsbEJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSA9PSBCdW5kbGUuSU5TVEFMTEVEKQotCQkJCXVucmVzb2x2ZWQuYWRkKGFsbEJ1bmRsZXNbaV0pOwotCQlyZXR1cm4gdW5yZXNvbHZlZDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldEJ1bmRsZXNUb0luc3RhbGwoQnVuZGxlW10gY2FjaGVkQnVuZGxlcywgVVJMW10gbmV3UGx1Z2lucykgewotCQkvLyBGaXJzdCwgY3JlYXRlIGEgbWFwIG9mIHRoZSBjYWNoZWQgYnVuZGxlcywgZm9yIGZhc3RlciBsb29rdXAKLQkJSGFzaFNldCBjYWNoZWRCdW5kbGVzU2V0ID0gbmV3IEhhc2hTZXQoY2FjaGVkQnVuZGxlcy5sZW5ndGgpOwotCQlpbnQgb2Zmc2V0ID0gVVBEQVRFX1BSRUZJWC5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGNhY2hlZEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjYWNoZWRCdW5kbGVzW2ldLmdldEJ1bmRsZUlkKCkgPT0gMCkKLQkJCQljb250aW51ZTsgLy8gc2tpcCB0aGUgc3lzdGVtIGJ1bmRsZQotCQkJU3RyaW5nIGJ1bmRsZUxvY2F0aW9uID0gY2FjaGVkQnVuZGxlc1tpXS5nZXRMb2NhdGlvbigpOwotCQkJLy8gSWdub3JlIGJ1bmRsZXMgbm90IGluc3RhbGxlZCBieSB1cwotCQkJaWYgKCFidW5kbGVMb2NhdGlvbi5zdGFydHNXaXRoKFVQREFURV9QUkVGSVgpKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlidW5kbGVMb2NhdGlvbiA9IGJ1bmRsZUxvY2F0aW9uLnN1YnN0cmluZyhvZmZzZXQpOwotCQkJY2FjaGVkQnVuZGxlc1NldC5hZGQoYnVuZGxlTG9jYXRpb24pOwotCQkJLy8gT24gd2luZG93cywgd2Ugd2lsbCBiZSBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHNlYXJjaCBhcyB3ZWxsLCBzbyBsb3dlciBpdCBub3cKLQkJCWlmIChpc1dpbmRvd3MpCi0JCQkJY2FjaGVkQnVuZGxlc1NldC5hZGQoYnVuZGxlTG9jYXRpb24udG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQkJCi0JCUFycmF5TGlzdCBidW5kbGVzVG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdChuZXdQbHVnaW5zLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbmV3UGx1Z2luc1tpXS5nZXRGaWxlKCk7Ci0JCQkvLyBjaGVjayBpZiBhbHJlYWR5IGluc3RhbGxlZAotCQkJaWYgKGNhY2hlZEJ1bmRsZXNTZXQuY29udGFpbnMobG9jYXRpb24pKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlzV2luZG93cyAmJiBjYWNoZWRCdW5kbGVzU2V0LmNvbnRhaW5zKGxvY2F0aW9uLnRvTG93ZXJDYXNlKCkpKQotCQkJCWNvbnRpbnVlOwotCQkJCi0JCQlidW5kbGVzVG9JbnN0YWxsLmFkZChsb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSlidW5kbGVzVG9JbnN0YWxsLnRvQXJyYXkobmV3IFN0cmluZ1tidW5kbGVzVG9JbnN0YWxsLnNpemUoKV0pOwkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBCdW5kbGVbXSBnZXRCdW5kbGVzVG9Vbmluc3RhbGwoQnVuZGxlW10gY2FjaGVkQnVuZGxlcywgVVJMW10gbmV3UGx1Z2lucykgewotCQkvLyBGaXJzdCwgY3JlYXRlIGEgbWFwIGZvciBmYXN0ZXIgbG9va3VwcwotCQlIYXNoU2V0IG5ld1BsdWdpbnNTZXQgPSBuZXcgSGFzaFNldChuZXdQbHVnaW5zLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTxuZXdQbHVnaW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkKLQkJCVN0cmluZyBwbHVnaW5Mb2NhdGlvbiA9IG5ld1BsdWdpbnNbaV0uZ2V0RmlsZSgpOwotCQkJbmV3UGx1Z2luc1NldC5hZGQocGx1Z2luTG9jYXRpb24pOwotCQkJLy8gT24gd2luZG93cywgd2Ugd2lsbCBiZSBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHNlYXJjaCBhcyB3ZWxsLCBzbyBsb3dlciBpdCBub3cKLQkJCWlmIChpc1dpbmRvd3MpCi0JCQkJbmV3UGx1Z2luc1NldC5hZGQocGx1Z2luTG9jYXRpb24udG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQkJCi0JCUFycmF5TGlzdCBidW5kbGVzVG9Vbmluc3RhbGwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBvZmZzZXQgPSBVUERBVEVfUFJFRklYLmxlbmd0aCgpOwotCQlmb3IgKGludCBpPTA7IGk8Y2FjaGVkQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNhY2hlZEJ1bmRsZXNbaV0uZ2V0QnVuZGxlSWQoKSA9PSAwKQotCQkJCWNvbnRpbnVlOyAvLyBza2lwIHRoZSBzeXN0ZW0gYnVuZGxlCi0JCQlTdHJpbmcgY2FjaGVkQnVuZGxlTG9jYXRpb24gPSBjYWNoZWRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCk7Ci0JCQkvLyBPbmx5IHdvcnJ5IGFib3V0IGJ1bmRsZXMgd2UgaW5zdGFsbGVkCi0JCQlpZiAoIWNhY2hlZEJ1bmRsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoVVBEQVRFX1BSRUZJWCkpCi0JCQkJY29udGludWU7Ci0JCQljYWNoZWRCdW5kbGVMb2NhdGlvbiA9IGNhY2hlZEJ1bmRsZUxvY2F0aW9uLnN1YnN0cmluZyhvZmZzZXQpOwotCi0JCQlpZiAobmV3UGx1Z2luc1NldC5jb250YWlucyhjYWNoZWRCdW5kbGVMb2NhdGlvbikpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoaXNXaW5kb3dzICYmIG5ld1BsdWdpbnNTZXQuY29udGFpbnMoY2FjaGVkQnVuZGxlTG9jYXRpb24udG9Mb3dlckNhc2UoKSkpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWJ1bmRsZXNUb1VuaW5zdGFsbC5hZGQoY2FjaGVkQnVuZGxlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChCdW5kbGVbXSlidW5kbGVzVG9Vbmluc3RhbGwudG9BcnJheShuZXcgQnVuZGxlW2J1bmRsZXNUb1VuaW5zdGFsbC5zaXplKCldKTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBzdGFydHMgdGhlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiB0aGUganVzdCBzdGFydGVkIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIFBsYXRmb3JtQ29uZmlndXJhdGlvbiBnZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oVVJMIGluc3RhbGxVUkwsIExvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc3RhcnR1cChpbnN0YWxsVVJMLCBjb25maWdMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAocGxhdGZvcm1UcmFja2VyICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJCW1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVV0aWxzLmxvZyhVdGlscy5uZXdTdGF0dXMobWVzc2FnZSwgZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uZ2V0Q3VycmVudCgpOwotCi0JfQotCi0JLyoqCi0JICogRG8gUGFja2FnZUFkbWluLnJlZnJlc2hQYWNrYWdlcygpIGluIGEgc3luY2hyb25vdXMgd2F5LiAgQWZ0ZXIgaW5zdGFsbGluZwotCSAqIGFsbCB0aGUgcmVxdWVzdGVkIGJ1bmRsZXMgd2UgbmVlZCB0byBkbyBhIHJlZnJlc2ggYW5kIHdhbnQgdG8gZW5zdXJlIHRoYXQgCi0JICogZXZlcnl0aGluZyBpcyBkb25lIGJlZm9yZSByZXR1cm5pbmcuCi0JICogQHBhcmFtIGJ1bmRsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFBhY2thZ2VzKEJ1bmRsZVtdIGJ1bmRsZXMpIHsKLQkJaWYgKGJ1bmRsZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcGFja2FnZUFkbWluUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluID0gbnVsbDsKLQkJaWYgKHBhY2thZ2VBZG1pblJlZiAhPSBudWxsKSB7Ci0JCQlwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKLQkJCWlmIChwYWNrYWdlQWRtaW4gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJLy8gVE9ETyB0aGlzIGlzIHN1Y2ggYSBoYWNrIGl0IGlzIHNpbGx5LiAgVGhlcmUgYXJlIHN0aWxsIGNhc2VzIGZvciByYWNlIGNvbmRpdGlvbnMgZXRjCi0JCS8vIGJ1dCB0aGlzIHNob3VsZCBhbGxvdyBmb3Igc29tZSBwcm9ncmVzcy4uLgotCQkvLyAocGF0Y2ggZnJvbSBKb2huIEEuKQotCQlmaW5hbCBib29sZWFuW10gZmxhZyA9IG5ldyBib29sZWFuW10ge2ZhbHNlfTsKLQkJRnJhbWV3b3JrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRnJhbWV3b3JrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmcmFtZXdvcmtFdmVudChGcmFtZXdvcmtFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gRnJhbWV3b3JrRXZlbnQuUEFDS0FHRVNfUkVGUkVTSEVEKQotCQkJCQlzeW5jaHJvbml6ZWQgKGZsYWcpIHsKLQkJCQkJCWZsYWdbMF0gPSB0cnVlOwotCQkJCQkJZmxhZy5ub3RpZnlBbGwoKTsKLQkJCQkJfQotCQkJfQotCQl9OwotCQljb250ZXh0LmFkZEZyYW1ld29ya0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcGFja2FnZUFkbWluLnJlZnJlc2hQYWNrYWdlcyhidW5kbGVzKTsKLQkJc3luY2hyb25pemVkIChmbGFnKSB7Ci0JCQl3aGlsZSAoIWZsYWdbMF0pIHsKLQkJCQl0cnkgewotCQkJCQlmbGFnLndhaXQoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNvbnRleHQucmVtb3ZlRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQljb250ZXh0LnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UaW1lU3RhbXAoKSB7Ci0JCURhdGFPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChjb25maWdMb2NhdGlvbi5pc1JlYWRPbmx5KCkpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlTdHJpbmcgY29uZmlnQXJlYSA9IGNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJCWxhc3RUaW1lU3RhbXAgPSBjb25maWd1cmF0aW9uLmdldENoYW5nZVN0YW1wKCk7Ci0JCQlsYXN0U3RhdGVUaW1lU3RhbXAgPSBQbGF0Zm9ybS5nZXRQbGF0Zm9ybUFkbWluKCkuZ2V0U3RhdGUoZmFsc2UpLmdldFRpbWVTdGFtcCgpOwotCQkJc3RyZWFtID0gbmV3IERhdGFPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnQXJlYSArRmlsZS5zZXBhcmF0b3IrIE5BTUVfU1BBQ0UrIEZpbGUuc2VwYXJhdG9yKyBMQVNUX0NPTkZJR19TVEFNUCkpOwotCQkJc3RyZWFtLndyaXRlTG9uZyhsYXN0VGltZVN0YW1wKTsKLQkJCXN0cmVhbS53cml0ZUxvbmcobGFzdFN0YXRlVGltZVN0YW1wKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVV0aWxzLmxvZyhlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJVXRpbHMubG9nKGUxLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRPcHRpb25zKCkgewotCQkvLyBhbGwgdGhpcyBpcyBvbmx5IHRvIGdldCB0aGUgYXBwbGljYXRpb24gYXJncwkJCi0JCURlYnVnT3B0aW9ucyBzZXJ2aWNlID0gbnVsbDsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoRGVidWdPcHRpb25zLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCXNlcnZpY2UgPSAoRGVidWdPcHRpb25zKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKHNlcnZpY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCURFQlVHID0gc2VydmljZS5nZXRCb29sZWFuT3B0aW9uKE9QVElPTl9ERUJVRywgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJLy8gd2UgaGF2ZSB3aGF0IHdlIHdhbnQgLSByZWxlYXNlIHRoZSBzZXJ2aWNlCi0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBjYW5SdW5XaXRoQ2FjaGVkRGF0YSgpIHsKLQkJcmV0dXJuICAhInRydWUiLmVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kuY2hlY2tDb25maWd1cmF0aW9uIikpICYmIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KCJvc2dpLmRldiIpID09IG51bGwgJiYgLy8kTk9OLU5MUy0xJAotCQkJCWxhc3RUaW1lU3RhbXA9PWNvbmZpZ3VyYXRpb24uZ2V0Q2hhbmdlU3RhbXAoKSAmJgotCQkJCWxhc3RTdGF0ZVRpbWVTdGFtcD09UGxhdGZvcm0uZ2V0UGxhdGZvcm1BZG1pbigpLmdldFN0YXRlKGZhbHNlKS5nZXRUaW1lU3RhbXAoKTsKLQl9Ci0JCQkJCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0SW5zdGFsbFVSTCgpIHsKLQkJaWYgKGluc3RhbGxVUkwgPT0gbnVsbCkKLQkJCWluc3RhbGxVUkwgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRVUkwoKTsKLQkJcmV0dXJuIGluc3RhbGxVUkw7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXBQcm92aWRlciNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIkJ1bmRsZUdyb3VwUHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwUHJvdmlkZXIjZ2V0QnVuZGxlR3JvdXBzKCkKLQkgKi8KLQlwdWJsaWMgSUJ1bmRsZUdyb3VwW10gZ2V0QnVuZGxlR3JvdXBzKCkgewotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQnVuZGxlR3JvdXBbMF07Ci0JCWVsc2UgewotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JRmVhdHVyZUVudHJ5W10gZmVhdHVyZXMgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGJ1bmRsZUdyb3VwcyA9IG5ldyBBcnJheUxpc3QoZmVhdHVyZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmZWF0dXJlc1tpXSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSAKLQkJCQkJJiYgKChGZWF0dXJlRW50cnkpZmVhdHVyZXNbaV0pLmhhc0JyYW5kaW5nKCkpCi0JCQkJCWJ1bmRsZUdyb3Vwcy5hZGQoZmVhdHVyZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIChJQnVuZGxlR3JvdXBbXSlidW5kbGVHcm91cHMudG9BcnJheShuZXcgSUJ1bmRsZUdyb3VwW2J1bmRsZUdyb3Vwcy5zaXplKCldKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb25maWd1cmF0b3IoQ29uZmlndXJhdGlvbkFjdGl2YXRvciBjb25maWd1cmF0b3IpIHsKLQkJQ29uZmlndXJhdGlvbkFjdGl2YXRvci5jb25maWd1cmF0b3IgPSBjb25maWd1cmF0b3I7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uQWN0aXZhdG9yIGdldENvbmZpZ3VyYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFjcXVpcmVGcmFtZXdvcmtMb2dTZXJ2aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJU2VydmljZVJlZmVyZW5jZSBsb2dTZXJ2aWNlUmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKEZyYW1ld29ya0xvZy5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobG9nU2VydmljZVJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlVdGlscy5sb2cgID0gKEZyYW1ld29ya0xvZykgY29udGV4dC5nZXRTZXJ2aWNlKGxvZ1NlcnZpY2VSZWZlcmVuY2UpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9Db25maWd1cmF0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjU2NGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdGlvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuKjsKLQotLyoqCi0gKiBwYXJzZSB0aGUgZGVmYXVsdCBzaXRlLnhtbAotICovCi0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50cyB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0KLQkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQkKLQlwcml2YXRlIFVSTCBjdXJyZW50U2l0ZVVSTDsKLQlwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgVVJMIGNvbmZpZ1VSTDsKLQlwcml2YXRlIElucHV0U3RyZWFtIGlucHV0OwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb25maWd1cmF0aW9uUGFyc2VyCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25QYXJzZXIoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJVXRpbHMubG9nKFV0aWxzLm5ld1N0YXR1cygiQ29uZmlndXJhdGlvblBhcnNlciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlVdGlscy5sb2coVXRpbHMubmV3U3RhdHVzKCJDb25maWd1cmF0aW9uUGFyc2VyIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgQ29uZmlndXJhdGlvbiBwYXJzZShVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBERUJVRzoJCQotCQlVdGlscy5kZWJ1ZygiU3RhcnQgcGFyc2luZyBDb25maWd1cmF0aW9uOiIgKyB1cmwpOyAvLyROT04tTkxTLTEkCQotCQlsb25nIGxhc3RNb2RpZmllZCA9IDA7Ci0JCXRyeSB7Ci0JCQljb25maWdVUkwgPSB1cmw7Ci0JCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQkJaWYgKCFpbnB1dEZpbGUuZXhpc3RzKCkgfHwgIWlucHV0RmlsZS5jYW5SZWFkKCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWxhc3RNb2RpZmllZCA9IGlucHV0RmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKLQkJCX0gZWxzZSAKLQkJCQlpbnB1dCA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSwgdGhpcyk7Ci0JCQlyZXR1cm4gY29uZmlnOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJVXRpbHMubG9nKFV0aWxzLm5ld1N0YXR1cygiQ29uZmlndXJhdGlvblBhcnNlci5wYXJzZSgpIGVycm9yOiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCQljb25maWcuc2V0TGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZCk7Ci0JCQl0cnkgewotCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7IAotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCQlpbnB1dCA9IG51bGw7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQlVdGlscy5sb2coZTEuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotCQlTdHJpbmcgdXJpLAotCQlTdHJpbmcgbG9jYWxOYW1lLAotCQlTdHJpbmcgcU5hbWUsCi0JCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLQkJdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJLy8gREVCVUc6CQkKLQkJVXRpbHMuZGVidWcoIlN0YXJ0IEVsZW1lbnQ6IHVyaToiICsgdXJpICsgIiBsb2NhbCBOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCXRyeSB7Ci0KLQkJCVN0cmluZyB0YWcgPSBsb2NhbE5hbWUudHJpbSgpOwotCi0JCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoQ0ZHKSkgewotCQkJCXByb2Nlc3NDb25maWcoYXR0cmlidXRlcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoQ0ZHX1NJVEUpKSB7Ci0JCQkJcHJvY2Vzc1NpdGUoYXR0cmlidXRlcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoQ0ZHX0ZFQVRVUkVfRU5UUlkpKSB7Ci0JCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW5zdGFsbGVkU2l0ZVBhcnNlci5VbmFibGVUb0NyZWF0ZVVSTCIsIGUuZ2V0TWVzc2FnZSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiSW5zdGFsbGVkU2l0ZVBhcnNlci5JbnRlcm5hbEVycm9yIiwgZS50b1N0cmluZygpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKiAKLQkgKiBwcm9jZXNzIHRoZSBTaXRlIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1NpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyByZXNldCBjdXJyZW50IHNpdGUKLQkJY3VycmVudFNpdGVVUkwgPSBudWxsOwotCQkKLQkJU3RyaW5nIHVybFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ0ZHX1VSTCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gdHJ5IHJlbGF0aXZlIHRvIGluc3RhbGwgdXJsCi0JCQl1cmwgPSBuZXcgVVJMKFBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXRJbnN0YWxsVVJMKCksIHVybFN0cmluZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICghaXNWYWxpZFNpdGUodXJsKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIHVzZSB0aGlzIG5ldyBzaXRlCi0JCWN1cnJlbnRTaXRlVVJMID0gdXJsOwotCi0JCWludCBwb2xpY3lUeXBlOwotCQlTdHJpbmdbXSBwb2xpY3lMaXN0ID0gbnVsbDsKLQkJU3RyaW5nIHR5cGVTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKENGR19QT0xJQ1kpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlU3RyaW5nID09IG51bGwpIHsKLQkJCXBvbGljeVR5cGUgPSBERUZBVUxUX1BPTElDWV9UWVBFOwotCQkJcG9saWN5TGlzdCA9IERFRkFVTFRfUE9MSUNZX0xJU1Q7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgaTsKLQkJCWZvciAoaSA9IDA7IGkgPCBDRkdfUE9MSUNZX1RZUEUubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAodHlwZVN0cmluZy5lcXVhbHMoQ0ZHX1BPTElDWV9UWVBFW2ldKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaSA+PSBDRkdfUE9MSUNZX1RZUEUubGVuZ3RoKSB7Ci0JCQkJcG9saWN5VHlwZSA9IERFRkFVTFRfUE9MSUNZX1RZUEU7Ci0JCQkJcG9saWN5TGlzdCA9IERFRkFVTFRfUE9MSUNZX0xJU1Q7Ci0JCQl9IGVsc2UgewotCQkJCXBvbGljeVR5cGUgPSBpOwotCQkJCVN0cmluZyBwbHVnaW5MaXN0ID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfTElTVCk7Ci0JCQkJaWYgKHBsdWdpbkxpc3QgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBsdWdpbkxpc3QsIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwb2xpY3lMaXN0ID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQkJCQkJZm9yIChpPTA7IGk8cG9saWN5TGlzdC5sZW5ndGg7IGkrKykKLQkJCQkJCXBvbGljeUxpc3RbaV0gPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTaXRlUG9saWN5IHNwID0gbmV3IFNpdGVQb2xpY3kocG9saWN5VHlwZSwgcG9saWN5TGlzdCk7Ci0JCVNpdGVFbnRyeSBzaXRlID0gKFNpdGVFbnRyeSkgbmV3IFNpdGVFbnRyeSh1cmwsIHNwKTsKLQotCQlTdHJpbmcgZmxhZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ0ZHX1VQREFURUFCTEUpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmbGFnICE9IG51bGwpIHsKLQkJCWlmIChmbGFnLmVxdWFscygidHJ1ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJc2l0ZS5zZXRVcGRhdGVhYmxlKHRydWUpOwotCQkJZWxzZQotCQkJCXNpdGUuc2V0VXBkYXRlYWJsZShmYWxzZSk7Ci0JCX0KLQkJCi0JCWZsYWcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKENGR19FTkFCTEVEKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmxhZyAhPSBudWxsICYmIGZsYWcuZXF1YWxzKCJmYWxzZSIpKSAvLyROT04tTkxTLTEkCi0JCQlzaXRlLnNldEVuYWJsZWQoZmFsc2UpOwotCQllbHNlCi0JCQlzaXRlLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJU3RyaW5nIGxpbmtuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfTElOS19GSUxFKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGlua25hbWUgIT0gbnVsbCAmJiAhbGlua25hbWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzaXRlLnNldExpbmtGaWxlTmFtZShsaW5rbmFtZS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCX0KLQotCQkvLyBERUJVRzoJCQotCQlVdGlscy5kZWJ1ZygiRW5kIHByb2Nlc3MgY29uZmlnIHNpdGUgdXJsOiIgKyB1cmxTdHJpbmcgKyAiIHBvbGljeToiICsgdHlwZVN0cmluZyArICIgdXBkYXRhYmxlOiIrZmxhZyApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkKLQkJY29uZmlnLmFkZFNpdGVFbnRyeSh1cmwudG9FeHRlcm5hbEZvcm0oKSwgc2l0ZSk7Ci0JfQotCQotCS8qKiAKLQkgKiBwcm9jZXNzIHRoZSBEZWZhdWx0RmVhdHVyZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGN1cnJlbnRTaXRlVVJMID09IG51bGwpCi0JCQlyZXR1cm47IC8vIHRoZSBzaXRlIHdhcyBub3QgY29ycmVjdAotCQkJCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ0ZHX0ZFQVRVUkVfRU5UUllfSUQpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ0ZHX0ZFQVRVUkVfRU5UUllfVkVSU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHBsdWdpblZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKENGR19GRUFUVVJFX0VOVFJZX1BMVUdJTl9WRVJTSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGx1Z2luVmVyc2lvbiA9PSBudWxsIHx8IHBsdWdpblZlcnNpb24udHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlwbHVnaW5WZXJzaW9uID0gdmVyc2lvbjsKLQkJU3RyaW5nIHBsdWdpbklkZW50aWZpZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKENGR19GRUFUVVJFX0VOVFJZX1BMVUdJTl9JREVOVElGSUVSKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGx1Z2luSWRlbnRpZmllciAhPSBudWxsICYmIHBsdWdpbklkZW50aWZpZXIudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlwbHVnaW5JZGVudGlmaWVyID0gbnVsbDsKLQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfRkVBVFVSRV9FTlRSWV9BUFBMSUNBVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8vIGdldCBpbnN0YWxsIGxvY2F0aW9ucwotCQlTdHJpbmcgbG9jYXRpb25zID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfRkVBVFVSRV9FTlRSWV9ST09UKTsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbG9jYXRpb25zICE9IG51bGwgPyBuZXcgU3RyaW5nVG9rZW5pemVyKGxvY2F0aW9ucywiLCIpIDogbmV3IFN0cmluZ1Rva2VuaXplcigiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlBcnJheUxpc3Qgcm9vdExpc3QgPSBuZXcgQXJyYXlMaXN0KHN0LmNvdW50VG9rZW5zKCkpOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKXsKLQkJCXRyeXsKLQkJCQlVUkwgcm9vdEVudHJ5ID0gbmV3IFVSTChzdC5uZXh0VG9rZW4oKSk7Ci0JCQkJcm9vdExpc3QuYWRkKHJvb3RFbnRyeSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIHNraXAgYmFkIGVudHJpZXMgLi4uCi0JCQl9Ci0JCX0KLQkJVVJMW10gcm9vdHMgPSAoVVJMW10pIHJvb3RMaXN0LnRvQXJyYXkobmV3IFVSTFtyb290TGlzdC5zaXplKCldKTsKLQotCQkvLyBnZXQgcHJpbWFyeSBmbGFnCi0JCWJvb2xlYW4gcHJpbWFyeSA9IGZhbHNlOwotCQlTdHJpbmcgZmxhZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ0ZHX0ZFQVRVUkVfRU5UUllfUFJJTUFSWSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZsYWcgIT0gbnVsbCkgewotCQkJaWYgKGZsYWcuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlwcmltYXJ5ID0gdHJ1ZTsKLQkJfQotCQkKLQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9ICBuZXcgRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5JZGVudGlmaWVyLCBwbHVnaW5WZXJzaW9uLCBwcmltYXJ5LCBhcHBsaWNhdGlvbiwgcm9vdHMpOwotCi0JCS8vIHNldCB0aGUgdXJsCi0JCVN0cmluZyB1cmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKENGR19VUkwpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCAmJiB1cmwudHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCWZlYXR1cmVFbnRyeS5zZXRVUkwodXJsKTsKLQkJCi0JCVNpdGVFbnRyeSBzaXRlID0gY29uZmlnLmdldFNpdGVFbnRyeShjdXJyZW50U2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJc2l0ZS5hZGRGZWF0dXJlRW50cnkoZmVhdHVyZUVudHJ5KTsKLQkJCi0JCS8vIGNvbmZpZ3VyZWQgPwotLy8JCVN0cmluZyBjb25maWd1cmVkU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiY29uZmlndXJlZCIpOyAvLyROT04tTkxTLTEkCi0vLwkJYm9vbGVhbiBjb25maWd1cmVkID0gY29uZmlndXJlZFN0cmluZy50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpID8gdHJ1ZSA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKiogCi0JICogcHJvY2VzcyB0aGUgQ29uZmlnIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbmZpZyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGRhdGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKENGR19EQVRFKTsKLQkJaWYgKGRhdGUgPT0gbnVsbCB8fCBkYXRlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oKTsgLy8gY29uc3RydWN0ZWQgd2l0aCBjdXJyZW50IGRhdGUKLQkJZWxzZSB7Ci0JCQlsb25nIHRpbWUgPSAwOwotCQkJdHJ5IHsKLQkJCQl0aW1lID0gTG9uZy5wYXJzZUxvbmcoZGF0ZSk7Ci0JCQkJY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24obmV3IERhdGUodGltZSkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUxKSB7Ci0JCQkJdGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwotCQkJCVV0aWxzLmxvZyhNZXNzYWdlcy5nZXRTdHJpbmcoIkluc3RhbGxlZFNpdGVQYXJzZXIuZGF0ZSIsIGRhdGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCk7IC8vIGNvbnN0cnVjdGVkIHdpdGggY3VycmVudCBkYXRlCi0JCQl9Ci0JCX0KLQkJCi0JCWNvbmZpZy5zZXRVUkwoY29uZmlnVVJMKTsKLQkJCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc2hhcmVkVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfU0hBUkVEX1VSTCk7Ci0JCQlpZiAoc2hhcmVkVVJMICE9IG51bGwpIHsKLQkJCQlDb25maWd1cmF0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBDb25maWd1cmF0aW9uUGFyc2VyKCk7Ci0JCQkJQ29uZmlndXJhdGlvbiBzaGFyZWRDb25maWcgPSBwYXJzZXIucGFyc2UobmV3IFVSTChzaGFyZWRVUkwpKTsKLQkJCQlpZiAoc2hhcmVkQ29uZmlnID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oKTsKLQkJCQljb25maWcuc2V0TGlua2VkQ29uZmlnKHNoYXJlZENvbmZpZyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZCBub3QgbG9hZCBmcm9tIHNoYXJlZCBpbnN0YWxsCi0JCQlVdGlscy5sb2coVXRpbHMubmV3U3RhdHVzKE1lc3NhZ2VzLmdldFN0cmluZygiQ29uZmlndXJhdGlvblBhcnNlci5jYW5ub3RMb2FkU2hhcmVkSW5zdGFsbCIpLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBmbGFnID0gYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfVFJBTlNJRU5UKTsKLQkJaWYgKGZsYWcgIT0gbnVsbCkgewotCQkJY29uZmlnLnNldFRyYW5zaWVudChmbGFnLmVxdWFscygidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLyBERUJVRzoJCQotCQlVdGlscy5kZWJ1ZygiRW5kIFByb2Nlc3NpbmcgQ29uZmlnIFRhZzogZGF0ZToiICsgYXR0cmlidXRlcy5nZXRWYWx1ZShDRkdfREFURSkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2l0ZShVUkwgdXJsKSB7Ci0JCVVSTCByZXNvbHZlZFVSTD0gIHVybDsKLQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgeyAvLyAkTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlyZXNvbHZlZFVSTCA9IFBsYXRmb3JtQ29uZmlndXJhdGlvbi5yZXNvbHZlUGxhdGZvcm1VUkwodXJsKTsgLy8gMTk1MzYKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3aWxsIHVzZSB0aGUgYmFzZWxpbmUgVVJMIC4uLgotCQkJfQotCQl9Ci0JCQotCQlpZiAoIVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRmlsZSBzaXRlUm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCWlmICghc2l0ZVJvb3QuZXhpc3RzKCkpIHsKLQkJCVV0aWxzLmRlYnVnKCJTaXRlICIgKyByZXNvbHZlZFVSTCArICIgZG9lcyBub3QgZXhpc3QgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UKLQkJCXJldHVybiB0cnVlOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNlbmRFbGVtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3VwZXIuZW5kRWxlbWVudCh1cmksIGxvY2FsTmFtZSwgcU5hbWUpOwotCQkKLQkJLy8gREVCVUc6CQkKLQkJVXRpbHMuZGVidWcoIkVuZCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl0cnkgewotCi0JCQlTdHJpbmcgdGFnID0gbG9jYWxOYW1lLnRyaW0oKTsKLQotCQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKENGRykpIHsKLQkJCQkgLy8gVGhpcyBpcyBhIGJpdCBvZiBhIGhhY2suCi0JCQkJIC8vIFdoZW4gbm8gZmVhdHVyZXMgd2VyZSBhZGRlZCB0byB0aGUgc2l0ZSwgYnV0IHRoZSBzaXRlIGlzIGluaXRpYWxpemVkIGZyb20gcGxhdGZvcm0ueG1sIAotCQkJCSAvLyB3ZSBuZWVkIHRvIHNldCB0aGUgZmVhdHVyZSBzZXQgdG8gZW1wdHksIHNvIHdlIGRvbid0IHRyeSB0byBkZXRlY3QgdGhlbS4KLQkJCQlTaXRlRW50cnlbXSBzaXRlcyA9IGNvbmZpZy5nZXRTaXRlcygpOwotCQkJCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykKLQkJCQkJc2l0ZXNbaV0uaW5pdGlhbGl6ZWQoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaWxlbnQgaWdub3JlCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GZWF0dXJlRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDY4M2JkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL0ZlYXR1cmVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZy4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci0KLQotLyoqCi0gKiAKLSAqIEZlYXR1cmUgaW5mb3JtYXRpb24KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVFbnRyeQotCQlpbXBsZW1lbnRzCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklGZWF0dXJlRW50cnksCi0JCQlJQ29uZmlndXJhdGlvbkNvbnN0YW50cywKLQkJCUlCdW5kbGVHcm91cCwKLQkJCUlCdW5kbGVHcm91cENvbnN0YW50cywKLQkJCUlQcm9kdWN0LAotCQkJSVByb2R1Y3RDb25zdGFudHMgewotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luVmVyc2lvbjsKLQlwcml2YXRlIFN0cmluZyBhcHBsaWNhdGlvbjsKLQlwcml2YXRlIFVSTFtdIHJvb3Q7Ci0JcHJpdmF0ZSBib29sZWFuIHByaW1hcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luSWRlbnRpZmllcjsKLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbGljZW5zZVVSTDsKLQlwcml2YXRlIEFycmF5TGlzdCBwbHVnaW5zOwotCXByaXZhdGUgQWJvdXRJbmZvIGJyYW5kaW5nOwotCXByaXZhdGUgU2l0ZUVudHJ5IHNpdGU7Ci0JcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQlwcml2YXRlIGJvb2xlYW4gZnVsbHlQYXJzZWQ7Ci0KLQlwdWJsaWMgRmVhdHVyZUVudHJ5KFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBwbHVnaW5JZGVudGlmaWVyLCBTdHJpbmcgcGx1Z2luVmVyc2lvbiwgYm9vbGVhbiBwcmltYXJ5LCBTdHJpbmcgYXBwbGljYXRpb24sIFVSTFtdIHJvb3QpIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5wbHVnaW5WZXJzaW9uID0gcGx1Z2luVmVyc2lvbjsKLQkJdGhpcy5wbHVnaW5JZGVudGlmaWVyID0gcGx1Z2luSWRlbnRpZmllcjsKLQkJdGhpcy5wcmltYXJ5ID0gcHJpbWFyeTsKLQkJdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwotCQl0aGlzLnJvb3QgPSAocm9vdCA9PSBudWxsID8gbmV3IFVSTFswXSA6IHJvb3QpOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlRW50cnkoIFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBwbHVnaW5WZXJzaW9uLCBib29sZWFuIHByaW1hcnksIFN0cmluZyBhcHBsaWNhdGlvbiwgVVJMW10gcm9vdCkgewotCQl0aGlzKGlkLCB2ZXJzaW9uLCBpZCwgcGx1Z2luVmVyc2lvbiwgcHJpbWFyeSwgYXBwbGljYXRpb24sIHJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpdGUoU2l0ZUVudHJ5IHNpdGUpIHsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0JCi0JcHVibGljIFNpdGVFbnRyeSBnZXRTaXRlKCkgewotCQlyZXR1cm4gdGhpcy5zaXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQbHVnaW4oUGx1Z2luRW50cnkgcGx1Z2luKSB7Ci0JCWlmIChwbHVnaW5zID09IG51bGwpCi0JCQlwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlwbHVnaW5zLmFkZChwbHVnaW4pOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSB1cmwgc3RyaW5nIChyZWxhdGl2ZSB0byB0aGUgc2l0ZSB1cmwpCi0JICogQHBhcmFtIHVybAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIHVybCAocmVsYXRpdmUgdG8gdGhlIHNpdGUpOiBmZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS8KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLS8vCQlpZiAodXJsID09IG51bGwpCi0vLwkJCXVybCA9IEZFQVRVUkVTICsgIi8iICsgaWQgKyAiXyIgKyB2ZXJzaW9uICsgIi8iOwotCQlyZXR1cm4gdXJsOwotCX0KLQkKLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlSWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVWZXJzaW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmVFbnRyeSNnZXRGZWF0dXJlUGx1Z2luVmVyc2lvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlUGx1Z2luVmVyc2lvbigpIHsKLQkJcmV0dXJuIHBsdWdpblZlcnNpb24gIT0gbnVsbCAmJiBwbHVnaW5WZXJzaW9uLmxlbmd0aCgpID4gMCA/IHBsdWdpblZlcnNpb24gOiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkgewotCQkvLyBpZiBubyBwbHVnaW4gaXMgc3BlY2lmaWVkLCB1c2UgdGhlIGZlYXR1cmUgaWQKLQkJcmV0dXJuIHBsdWdpbklkZW50aWZpZXIgIT0gbnVsbCAmJiBwbHVnaW5JZGVudGlmaWVyLmxlbmd0aCgpID4gMCA/IHBsdWdpbklkZW50aWZpZXIgOiBpZDsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlRW50cnkjZ2V0RmVhdHVyZUFwcGxpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBJRmVhdHVyZUVudHJ5I2dldEZlYXR1cmVSb290VVJMcygpCi0JICovCi0JcHVibGljIFVSTFtdIGdldEZlYXR1cmVSb290VVJMcygpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElGZWF0dXJlRW50cnkjY2FuQmVQcmltYXJ5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZVByaW1hcnkoKSB7Ci0JCXJldHVybiBwcmltYXJ5OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IHRvWE1MKERvY3VtZW50IGRvYykgewotCQotCQlFbGVtZW50IGZlYXR1cmVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoQ0ZHX0ZFQVRVUkVfRU5UUlkpOwkJCi0JCS8vIHdyaXRlIG91dCBmZWF0dXJlIGVudHJ5IHNldHRpbmdzCi0JCWlmIChpZCAhPSBudWxsKQotCQkJZmVhdHVyZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19GRUFUVVJFX0VOVFJZX0lELCBpZCk7IAotCQlpZiAocHJpbWFyeSkKLQkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9QUklNQVJZLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2ZXJzaW9uICE9IG51bGwpCi0JCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0ZFQVRVUkVfRU5UUllfVkVSU0lPTiwgdmVyc2lvbik7IAotCQlpZiAocGx1Z2luVmVyc2lvbiAhPSBudWxsICYmICFwbHVnaW5WZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSAmJiBwbHVnaW5WZXJzaW9uLmxlbmd0aCgpID4gMCkKLQkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9QTFVHSU5fVkVSU0lPTiwgcGx1Z2luVmVyc2lvbik7IAotCQlpZiAocGx1Z2luSWRlbnRpZmllciAhPSBudWxsICYmICFwbHVnaW5JZGVudGlmaWVyLmVxdWFscyhpZCkgJiYgcGx1Z2luSWRlbnRpZmllci5sZW5ndGgoKSA+IDApCi0JCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0ZFQVRVUkVfRU5UUllfUExVR0lOX0lERU5USUZJRVIsIHBsdWdpbklkZW50aWZpZXIpOwotCQlpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkKLQkJCWZlYXR1cmVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9BUFBMSUNBVElPTiwgYXBwbGljYXRpb24pOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQlmZWF0dXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1VSTCwgdXJsKTsKLQkJCi0JCVVSTFtdIHJvb3RzID0gZ2V0RmVhdHVyZVJvb3RVUkxzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxyb290cy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHJvb3QgPSByb290c1tpXS50b0V4dGVybmFsRm9ybSgpOwotCQkJaWYgKHJvb3QgIT0gbnVsbCAmJiByb290LnRyaW0oKS5sZW5ndGgoKSA+IDApewotCQkJCUVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudChDRkdfRkVBVFVSRV9FTlRSWV9ST09UKTsKLQkJCQlyb290RWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUocm9vdCkpOwotCQkJCWZlYXR1cmVFbGVtZW50LmFwcGVuZENoaWxkKHJvb3RFbGVtZW50KTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIGZlYXR1cmVFbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUJ1bmRsZUdyb3VwI2dldEJ1bmRsZXMoKQotCSAqLwotCXB1YmxpYyBCdW5kbGVbXSBnZXRCdW5kbGVzKCkgewotCQlpZiAocGx1Z2lucyA9PSBudWxsKQotCQkJZnVsbFBhcnNlKCk7Ci0JCQotCQlBcnJheUxpc3QgYnVuZGxlcyA9IG5ldyBBcnJheUxpc3QocGx1Z2lucy5zaXplKCkpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luRW50cnkgcGx1Z2luID0gKFBsdWdpbkVudHJ5KXBsdWdpbnMuZ2V0KGkpOwotCQkJLy8gZ2V0IHRoZSBoaWdoZXN0IHZlcnNpb24gZm9yIHRoZSBwbHVnaW4KLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luLmdldFBsdWdpbklkZW50aWZpZXIoKSk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJYnVuZGxlcy5hZGQoYnVuZGxlKTsKLQkJfQotCQlyZXR1cm4gKEJ1bmRsZVtdKWJ1bmRsZXMudG9BcnJheShuZXcgQnVuZGxlW2J1bmRsZXMuc2l6ZSgpXSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJZnVsbFBhcnNlKCk7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXRJZGVudGlmaWVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklCdW5kbGVHcm91cCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChicmFuZGluZyA9PSBudWxsKQotCQkJYnJhbmRpbmcgPSBBYm91dEluZm8ucmVhZEZlYXR1cmVJbmZvKGlkLCB2ZXJzaW9uLCBnZXRGZWF0dXJlUGx1Z2luSWRlbnRpZmllcigpKTsKLQkJcmV0dXJuIGJyYW5kaW5nLmdldFByb2R1Y3ROYW1lKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAoYnJhbmRpbmcgPT0gbnVsbCkKLQkJCWJyYW5kaW5nID0gQWJvdXRJbmZvLnJlYWRGZWF0dXJlSW5mbyhpZCwgdmVyc2lvbiwgZ2V0RmVhdHVyZVBsdWdpbklkZW50aWZpZXIoKSk7Ci0JCQotCQkvLyBJQnVuZGxlR3JvdXBDb25zdGFudHMKLQkJaWYgKGtleS5lcXVhbHMoRkVBVFVSRV9JTUFHRSkpCi0JCQlyZXR1cm4gYnJhbmRpbmcuZ2V0RmVhdHVyZUltYWdlVVJMKCkgPT0gbnVsbCA/IG51bGwgOiBicmFuZGluZy5nZXRGZWF0dXJlSW1hZ2VVUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQllbHNlIGlmIChrZXkuZXF1YWxzKFRJUFNfQU5EX1RSSUNLU19IUkVGKSkgCi0JCQlyZXR1cm4gYnJhbmRpbmcuZ2V0VGlwc0FuZFRyaWNrc0hyZWYoKTsKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhJQnVuZGxlR3JvdXBDb25zdGFudHMuV0VMQ09NRV9QQUdFKSkgLy8gc2FtZSB2YWx1ZSBpcyB1c2VkIGJ5IHByb2R1Y3QgYW5kIGJ1bmRsZSBncm91cAotCQkJcmV0dXJuIGJyYW5kaW5nLmdldFdlbGNvbWVQYWdlVVJMKCkgPT0gbnVsbCA/IG51bGwgOiBicmFuZGluZy5nZXRXZWxjb21lUGFnZVVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoV0VMQ09NRV9QRVJTUEVDVElWRSkpCi0JCQlyZXR1cm4gYnJhbmRpbmcuZ2V0V2VsY29tZVBlcnNwZWN0aXZlSWQoKTsKLQkJLy8gSVByb2R1Y3RDb25zdGFudHMKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhBUFBfTkFNRSkpIAotCQkJcmV0dXJuIGJyYW5kaW5nLmdldEFwcE5hbWUoKTsKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhBQk9VVF9URVhUKSkKLQkJCXJldHVybiBicmFuZGluZy5nZXRBYm91dFRleHQoKTsKLQkJZWxzZSBpZiAoa2V5LmVxdWFscyhBQk9VVF9JTUFHRSkpCi0JCQlyZXR1cm4gYnJhbmRpbmcuZ2V0QWJvdXRJbWFnZVVSTCgpID09IG51bGwgPyBudWxsIDogYnJhbmRpbmcuZ2V0QWJvdXRJbWFnZVVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoV0lORE9XX0lNQUdFKSkKLQkJCXJldHVybiBicmFuZGluZy5nZXRXaW5kb3dJbWFnZVVSTCgpPT0gbnVsbCA/IG51bGwgOiBicmFuZGluZy5nZXRXaW5kb3dJbWFnZVVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoV0lORE9XX0lNQUdFUykpIHsKLQkJCVVSTFtdIHVybHMgPSBicmFuZGluZy5nZXRXaW5kb3dJbWFnZXNVUkxzKCk7Ci0JCQlpZiAodXJscyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJU3RyaW5nQnVmZmVyIHdpbmRvd0ltYWdlc1VSTHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8dXJscy5sZW5ndGg7IGkrKyl7Ci0JCQkJd2luZG93SW1hZ2VzVVJMcy5hcHBlbmQodXJsc1tpXS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQlpZiAoaSAhPSB1cmxzLmxlbmd0aC0xKQotCQkJCQl3aW5kb3dJbWFnZXNVUkxzLmFwcGVuZCgnLCcpOwotCQkJfQotCQkJcmV0dXJuIHdpbmRvd0ltYWdlc1VSTHMudG9TdHJpbmcoKTsKLQkJfSBlbHNlIGlmIChrZXkuZXF1YWxzKExJQ0VOU0VfSFJFRikpCi0JCQlyZXR1cm4gZ2V0TGljZW5zZVVSTCgpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0UHJvdmlkZXJOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyTmFtZSgpIHsKLQkJaWYgKGJyYW5kaW5nID09IG51bGwpCi0JCQlicmFuZGluZyA9IEFib3V0SW5mby5yZWFkRmVhdHVyZUluZm8oaWQsIHZlcnNpb24sIGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkpOwotCQlyZXR1cm4gYnJhbmRpbmcuZ2V0UHJvdmlkZXJOYW1lKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0VmVyc2lvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0I2dldEFwcGxpY2F0aW9uKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgewotCQlyZXR1cm4gYXBwbGljYXRpb247Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXRJZCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQkKLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKXsKLQkJaWYgKHJlc291cmNlQnVuZGxlICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JCQotCQkvLyBEZXRlcm1pbmUgdGhlIHByb3BlcnRpZXMgZmlsZSBsb2NhdGlvbgotCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHByb3BlcnRpZXNVUkwgPSBuZXcgVVJMKHNpdGUuZ2V0UmVzb2x2ZWRVUkwoKSwgZ2V0VVJMKCkpOwotCQkJQ2xhc3NMb2FkZXIgbCA9IG5ldyBVUkxDbGFzc0xvYWRlcihuZXcgVVJMW10geyBwcm9wZXJ0aWVzVVJMIH0sIG51bGwpOwotCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKElDb25maWd1cmF0aW9uQ29uc3RhbnRzLkNGR19GRUFUVVJFX0VOVFJZLCBVdGlscy5nZXREZWZhdWx0TG9jYWxlKCksIGwpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJVXRpbHMubG9nKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsgCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlVdGlscy5sb2coZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAKLQkJfQotCQlyZXR1cm4gYnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlVVJMKFN0cmluZyBsaWNlbnNlVVJMKSB7Ci0JCXRoaXMubGljZW5zZVVSTCA9IGxpY2Vuc2VVUkw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZVVSTCgpIHsKLQkJaWYgKGxpY2Vuc2VVUkwgPT0gbnVsbCkKLQkJCWZ1bGxQYXJzZSgpOwotCQlpZiAobGljZW5zZVVSTCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlTdHJpbmcgcmVzb2x2ZWRVUkwgPSBVdGlscy5nZXRSZXNvdXJjZVN0cmluZyhnZXRSZXNvdXJjZUJ1bmRsZSgpLCBsaWNlbnNlVVJMKTsKLQkJaWYgKHJlc29sdmVkVVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc29sdmVkVVJMOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBVUkwoZ2V0U2l0ZSgpLmdldFJlc29sdmVkVVJMKCksIGdldFVSTCgpICsgcmVzb2x2ZWRVUkwpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiByZXNvbHZlZFVSTDsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZnVsbFBhcnNlKCkgewotCQlpZiAoZnVsbHlQYXJzZWQpCi0JCQlyZXR1cm47Ci0JCWZ1bGx5UGFyc2VkID0gdHJ1ZTsKLQkJaWYgKHBsdWdpbnMgPT0gbnVsbCkgCi0JCQlwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlGdWxsRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRnVsbEZlYXR1cmVQYXJzZXIodGhpcyk7Ci0JCXBhcnNlci5wYXJzZSgpOwotCX0KLQkKLQlwdWJsaWMgQnVuZGxlIGdldERlZmluaW5nQnVuZGxlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QnVuZGxlKGdldEZlYXR1cmVQbHVnaW5JZGVudGlmaWVyKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNCcmFuZGluZygpIHsKLQkJcmV0dXJuIHBsdWdpbklkZW50aWZpZXIgIT0gbnVsbCB8fCBQbGF0Zm9ybS5nZXRCdW5kbGUoaWQpICE9IG51bGw7IAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GZWF0dXJlUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GZWF0dXJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDI5ZGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogRGVmYXVsdCBmZWF0dXJlIHBhcnNlci4KLSAqIFBhcnNlcyB0aGUgZmVhdHVyZSBtYW5pZmVzdCBmaWxlIGFzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgRmVhdHVyZUVudHJ5IGZlYXR1cmU7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0KLQkJU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIGZlYXR1cmUgcGFyc2VyLgotCSAqLwotCXB1YmxpYyBGZWF0dXJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQl0cnkgewotCQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgdXJsIGFuZCBjb25zdHJ1Y3RzIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBGZWF0dXJlRW50cnkgcGFyc2UoVVJMIGZlYXR1cmVVUkwpewotCQlmZWF0dXJlPW51bGw7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRoaXMudXJsID0gZmVhdHVyZVVSTDsKLQkJCWluID0gZmVhdHVyZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7OwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCVV0aWxzLmxvZyhlMS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgc3RhcnQgb2YgZWxlbWVudCB0YWdzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlVdGlscy5kZWJ1ZygiU3RhcnQgRWxlbWVudDogdXJpOiIgKyB1cmkgKyAiIGxvY2FsIE5hbWU6IiArIGxvY2FsTmFtZSArICIgcU5hbWU6IiArIHFOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlpZiAoImZlYXR1cmUiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOwotCQkJLy8gc3RvcCBwYXJzaW5nIG5vdwotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJfQotCQkKLQl9Ci0KLQkvKgotCSAqIFByb2Nlc3MgZmVhdHVyZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQotCQkvLyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpIC8vJE5PTi1OTFMtMSQKLQkJfHwgdmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVQYXJzZXIuSWRPclZlcnNpb25JbnZhbGlkIiwgbmV3IFN0cmluZ1tdIHsgaWQsIHZlcn0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotLy8JCQlTdHJpbmcgbGFiZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN0cmluZyBwcm92aWRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByb3ZpZGVyLW5hbWUiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlTdHJpbmcgaW1hZ2VVUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFVdGlscy5pc1ZhbGlkRW52aXJvbm1lbnQob3MsIHdzLCBhcmNoLCBubCkpIAotCQkJCXJldHVybjsKLS8vCQkJU3RyaW5nIGV4Y2x1c2l2ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImV4Y2x1c2l2ZSIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN0cmluZyBhZmZpbml0eSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImNvbG9jYXRpb24tYWZmaW5pdHkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlTdHJpbmcgcHJpbWFyeSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByaW1hcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJYm9vbGVhbiBpc1ByaW1hcnkgPSAidHJ1ZSIuZXF1YWxzKHByaW1hcnkpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXBwbGljYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcHBsaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGx1Z2luID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy9UT0RPIHJvb3RVUkxzCi0JCQlmZWF0dXJlID0gbmV3IEZlYXR1cmVFbnRyeShpZCwgdmVyLCBwbHVnaW4sICIiLCBpc1ByaW1hcnksIGFwcGxpY2F0aW9uLCBudWxsICk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICgiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBmID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJZmVhdHVyZS5zZXRVUkwoImZlYXR1cmVzIiArICIvIiArIGYuZ2V0UGFyZW50RmlsZSgpLmdldE5hbWUoKSArICIvIik7Ly8gKyBmLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9IGVsc2UgewotCQkJCWZlYXR1cmUuc2V0VVJMKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0KLQotCQkJVXRpbHMuCi0JCQkJZGVidWcoIkVuZCBwcm9jZXNzIERlZmF1bHRGZWF0dXJlIHRhZzogaWQ6IiAraWQgKyAiIHZlcjoiICt2ZXIgKyAiIHVybDoiICsgZmVhdHVyZS5nZXRVUkwoKSk7IAkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GdWxsRmVhdHVyZVBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvRnVsbEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllMTRlMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9GdWxsRmVhdHVyZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogQSBtb3JlIGNvbXBsZXRlIGZlYXR1cmUgcGFyc2VyLiBJdCBhZGRzIHRoZSBwbHVnaW5zIGxpc3RlZCB0byB0aGUgZmVhdHVyZS4KLSAqLwotcHVibGljIGNsYXNzIEZ1bGxGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBJQ29uZmlndXJhdGlvbkNvbnN0YW50c3sKLQotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIEZlYXR1cmVFbnRyeSBmZWF0dXJlOwotCXByaXZhdGUgVVJMIHVybDsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBkZXNjcmlwdGlvbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9Ci0JCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBmZWF0dXJlIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgRnVsbEZlYXR1cmVQYXJzZXIoRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKCl7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChmZWF0dXJlLmdldFNpdGUoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRoaXMudXJsID0gbmV3IFVSTChmZWF0dXJlLmdldFNpdGUoKS5nZXRSZXNvbHZlZFVSTCgpLCBmZWF0dXJlLmdldFVSTCgpICsgRkVBVFVSRV9YTUwpOwotCQkJaW4gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgezsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQlVdGlscy5sb2coZTEuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgc3RhcnQgb2YgZWxlbWVudCB0YWdzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNzdGFydEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgQXR0cmlidXRlcykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlVdGlscy5kZWJ1ZygiU3RhcnQgRWxlbWVudDogdXJpOiIgKyB1cmkgKyAiIGxvY2FsIE5hbWU6IiArIGxvY2FsTmFtZSArICIgcU5hbWU6IiArIHFOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQlpZiAoInBsdWdpbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhsb2NhbE5hbWUpKXsgLy8kTk9OLU5MUy0xJAotCQkJaXNEZXNjcmlwdGlvbiA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoImxpY2Vuc2UiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NMaWNlbnNlKGF0dHJpYnV0ZXMpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBQcm9jZXNzIGZlYXR1cmUgaW5mb3JtYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BsdWdpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQotCQkvLyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpIC8vJE5PTi1OTFMtMSQKLQkJfHwgdmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihNZXNzYWdlcy5nZXRTdHJpbmcoIkZlYXR1cmVQYXJzZXIuSWRPclZlcnNpb25JbnZhbGlkIiwgbmV3IFN0cmluZ1tdIHsgaWQsIHZlcn0pKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotLy8JCQlTdHJpbmcgbGFiZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0vLwkJCVN0cmluZyBwcm92aWRlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInByb3ZpZGVyLW5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KG9zLCB3cywgYXJjaCxubCkpCi0JCQkJcmV0dXJuOwotCi0JCQlQbHVnaW5FbnRyeSBwbHVnaW4gPSBuZXcgUGx1Z2luRW50cnkoKTsKLQkJCXBsdWdpbi5zZXRQbHVnaW5JZGVudGlmaWVyKGlkKTsKLQkJCXBsdWdpbi5zZXRQbHVnaW5WZXJzaW9uKHZlcik7Ci0JCQlmZWF0dXJlLmFkZFBsdWdpbihwbHVnaW4pOwotCQkJCi0JCQlVdGlscy4KLQkJCQlkZWJ1ZygiRW5kIHByb2Nlc3MgRGVmYXVsdEZlYXR1cmUgdGFnOiBpZDoiICtpZCArICIgdmVyOiIgK3ZlciArICIgdXJsOiIgKyBmZWF0dXJlLmdldFVSTCgpKTsgCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwcm9jZXNzTGljZW5zZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgKXsKLQkJZmVhdHVyZS5zZXRMaWNlbnNlVVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoIWlzRGVzY3JpcHRpb24pCi0JCQlyZXR1cm47Ci0JCWRlc2NyaXB0aW9uLmFwcGVuZChjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy54bWwuc2F4LkNvbnRlbnRIYW5kbGVyI2VuZEVsZW1lbnQoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkKLQkJCXRocm93cyBTQVhFeGNlcHRpb24gewotCQlpZiAoImRlc2NyaXB0aW9uIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpc0Rlc2NyaXB0aW9uID0gZmFsc2U7Ci0JCQlTdHJpbmcgZCA9IGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkudHJpbSgpOwotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gZmVhdHVyZS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihVdGlscy5nZXRSZXNvdXJjZVN0cmluZyhidW5kbGUsIGQpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9JQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvSUNvbmZpZ3VyYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5MGJiYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9JQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLio7Ci0KLS8qKgotICogQ29uc3RhbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VfUFJPRFVDVCA9ICJlY2xpcHNlLnByb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9BUFBMSUNBVElPTiA9ICJlY2xpcHNlLmFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGRyA9ICJjb25maWciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0JPT1RfUExVR0lOID0gImJvb3RzdHJhcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19VUkwgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19QT0xJQ1kgPSAicG9saWN5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0ZHX1BPTElDWV9UWVBFID0geyAiVVNFUi1JTkNMVURFIiwgIlVTRVItRVhDTFVERSIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1BPTElDWV9UWVBFX1VOS05PV04gPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfTElTVCA9ICJsaXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19TVEFNUCA9ICJzdGFtcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9TVEFNUCA9ICJzdGFtcC5mZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfUExVR0lOX1NUQU1QID0gInN0YW1wLnBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX1VQREFURUFCTEUgPSAidXBkYXRlYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfTElOS19GSUxFID0gImxpbmtmaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19GRUFUVVJFX0VOVFJZID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0ZFQVRVUkVfRU5UUllfUFJJTUFSWSA9ICJwcmltYXJ5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19GRUFUVVJFX0VOVFJZX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWV9QTFVHSU5fVkVSU0lPTiA9ICJwbHVnaW4tdmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWV9QTFVHSU5fSURFTlRJRklFUiA9ICJwbHVnaW4taWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWV9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRkVBVFVSRV9FTlRSWV9ST09UID0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0RBVEUgPSAiZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfUExVR0lOID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfRlJBR01FTlQgPSAiZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0ZHX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfU0hBUkVEX1VSTCA9ICJzaGFyZWRfdXIiOyAvLyROT04tTkxTLTEkCi0JCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRkdfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENGR19UUkFOU0lFTlQgPSAidHJhbnNpZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMy4wIjsgLy8kTk9OLU5MUy0xJAotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9GID0gImVvZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDRkdfTElTVF9MRU5HVEggPSAxMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUE9MSUNZX1RZUEUgPSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBERUZBVUxUX1BPTElDWV9MSVNUID0gbmV3IFN0cmluZ1swXTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRVMgPSAiZmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX1hNTCA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UX1hNTCA9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9NQU5JRkVTVF9NRiA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1hNTCA9ICJmZWF0dXJlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL01lc3NhZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFjMTgxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVuZGxlTmFtZSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQotCS8qKgotCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBpZCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKGlkLCAoU3RyaW5nW10pIG51bGwpOwotCX0KLQkvKioKLQkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cwotCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoaWQsIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcgfSk7Ci0JfQotCS8qKgotCSAqIExvb2t1cCB0aGUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBJRCBpbiB0aGlzIGNhdGFsb2cgYW5kIGJpbmQgaXRzCi0JICogc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nMSwgU3RyaW5nIGJpbmRpbmcyKSB7Ci0JCXJldHVybiBnZXRTdHJpbmcoaWQsIG5ldyBTdHJpbmdbXSB7IGJpbmRpbmcxLCBiaW5kaW5nMiB9KTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cwotCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGlkLCBTdHJpbmdbXSBiaW5kaW5ncykgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiAiTm8gbWVzc2FnZSBhdmFpbGFibGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtZXNzYWdlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1lc3NhZ2UgPSBidW5kbGUuZ2V0U3RyaW5nKGlkKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIHdlIGdvdCBhbiBleGNlcHRpb24gbG9va2luZyBmb3IgdGhlIG1lc3NhZ2UsIGZhaWwgZ3JhY2VmdWxseSBieSBqdXN0IHJldHVybmluZwotCQkJLy8gdGhlIGlkIHdlIHdlcmUgbG9va2luZyBmb3IuICBJbiBtb3N0IGNhc2VzIHRoaXMgaXMgc2VtaS1pbmZvcm1hdGl2ZSBzbyBpcyBub3QgdG9vIGJhZC4KLQkJCXJldHVybiAiTWlzc2luZyBtZXNzYWdlOiAiICsgaWQgKyAiIGluOiAiICsgYnVuZGxlTmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKGJpbmRpbmdzID09IG51bGwpCi0JCQlyZXR1cm4gbWVzc2FnZTsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIGJpbmRpbmdzKTsKLQl9Ci0JLyoqCi0JICogUHJpbnQgYSBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuCi0JICogcHJlLXBlbmQgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWJ1Zyhib29sZWFuIGluY2x1ZGVEYXRlLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoaW5jbHVkZURhdGUpCi0JCQltZXNzYWdlID0gbmV3IERhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpLnRvU3RyaW5nKCkgKyAiIC0gIiArIG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsYXRmb3JtQ29uZmlndXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGxhdGZvcm1Db25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NWJlYzguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGxhdGZvcm1Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLio7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgdGhlIGZlYXR1cmVzIGFuZCBwbHVnaW5zIChidW5kbGVzKSB0byAKLSAqIHRoZSBydW50aW1lLiBDb25maWd1cmF0aW9uIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBjb25maWd1cmF0aW9uL29yZy5lY2xpcHNlLnVwZGF0ZS9wbGF0Zm9ybS54bWwgZmlsZS4KLSAqIFdoZW4gZWNsaXBzZSBzdGFydHMsIGl0IHRyaWVzIHRvIGxvYWQgdGhlIGNvbmZpZyBpbmZvIGZyb20gcGxhdGZvcm0ueG1sLgotICogSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gaXQgYWxzbyB0cmllcyB0byByZWFkIGl0IGZyb20gYSB0ZW1wIG9yIGJhY2t1cCBmaWxlLgotICogSWYgdGhpcyBkb2VzIG5vdCBzdWNjZWVkLCBhIHBsYXRmb3JtLnhtbCBpcyBjcmVhdGVkIGJ5IGluc3BlY3RpbmcgdGhlIGVjbGlwc2UgCi0gKiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IChpdHMgZmVhdHVyZXMgYW5kIHBsdWdpbiBmb2xkZXJzKS4KLSAqIElmIHBsYXRmb3JtLnhtbCBhbHJlYWR5IGV4aXN0cywgYSBjaGVjayBpcyBtYWRlIHRvIHNlZSB3aGVuIGl0IHdhcyBsYXN0IG1vZGlmaWVkCi0gKiBhbmQgd2hldGhlciB0aGVyZSBhcmUgYW55IGZpbGUgc3lzdGVtIGNoYW5nZXMgdGhhdCBhcmUgbmV3ZXIgKHVzZXJzIG1heSBtYW51YWxseSB1bnppcCAKLSAqIGZlYXR1cmVzIGFuZCBwbHVnaW5zKS4gSW4gdGhpcyBjYXNlLCB0aGUgbmV3bHkgYWRkZWQgZmVhdHVyZXMgYW5kIHBsdWdpbnMgYXJlIHBpY2tlZCB1cC4KLSAqIEEgY2hlY2sgZm9yIGV4aXN0ZW5jZSBvZiBmZWF0dXJlcyBhbmQgcGx1Z2lucyBpcyBhbHNvIHBlcmZvcm1lZCwgdG8gZGV0ZWN0IGRlbGV0aW9ucy4KLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24sIElDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgc3RhdGljIFBsYXRmb3JtQ29uZmlndXJhdGlvbiBjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIFVSTCBjb25maWdMb2NhdGlvbjsKLQlwcml2YXRlIEhhc2hNYXAgZXh0ZXJuYWxMaW5rU2l0ZXM7IC8vIHVzZWQgdG8gcmVzdG9yZSBwcmlvciBsaW5rIHNpdGUgc3RhdGUKLQlwcml2YXRlIGxvbmcgY2hhbmdlU3RhbXA7Ci0JcHJpdmF0ZSBsb25nIGZlYXR1cmVzQ2hhbmdlU3RhbXA7Ci0JcHJpdmF0ZSBib29sZWFuIGZlYXR1cmVzQ2hhbmdlU3RhbXBJc1ZhbGlkOwotCXByaXZhdGUgbG9uZyBwbHVnaW5zQ2hhbmdlU3RhbXA7Ci0JcHJpdmF0ZSBib29sZWFuIHBsdWdpbnNDaGFuZ2VTdGFtcElzVmFsaWQ7Ci0JcHJpdmF0ZSBGaWxlTG9jayBsb2NrOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0UgPSAiZWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0hJU1RPUlkgPSAiaGlzdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fWE1MID0gInBsYXRmb3JtLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX05BTUUgPSBDb25maWd1cmF0aW9uQWN0aXZhdG9yLk5BTUVfU1BBQ0UgKyAiLyIgKyBQTEFURk9STV9YTUw7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0lOSSA9ICJjb25maWcuaW5pIjsgLy9OT04tTkxTLTEkIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0ZJTEVfTE9DS19TVUZGSVggPSAiLmxvY2siOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19GSUxFX1RFTVBfU1VGRklYID0gIi50bXAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktTID0gImxpbmtzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJPT1RTVFJBUF9QTFVHSU5TID0ge307IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZFQVRVUkVfSUQgPSAib3JnLmVjbGlwc2UucGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkVBVFVSRV9BUFBMSUNBVElPTiA9ICJvcmcuZWNsaXBzZS51aS5pZGUud29ya2JlbmNoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LX1JFQUQgPSAiciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS19SRUFEX1dSSVRFID0gInJ3IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFVSTCBpbnN0YWxsVVJMOwotCQotCXByaXZhdGUgUGxhdGZvcm1Db25maWd1cmF0aW9uKExvY2F0aW9uIHBsYXRmb3JtQ29uZmlnTG9jYXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5leHRlcm5hbExpbmtTaXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRoaXMuY29uZmlnID0gbnVsbDsKLQkJCi0JCS8vIGluaXRpYWxpemUgY29uZmlndXJhdGlvbgotCQlpbml0aWFsaXplQ3VycmVudChwbGF0Zm9ybUNvbmZpZ0xvY2F0aW9uKTsKLQotCQkvLyBEZXRlY3QgZXh0ZXJuYWwgbGlua3MuIFRoZXNlIGFyZSAic29mdCBsaW5rIiB0byBhZGRpdGlvbmFsIHNpdGVzLiBUaGUgbGluawotCQkvLyBmaWxlcyBhcmUgdXN1YWxseSBwcm92aWRlZCBieSBleHRlcm5hbCBpbnN0YWxsYXRpb24gcHJvZ3JhbXMuIFRoZXkgYXJlIGxvY2F0ZWQKLQkJLy8gcmVsYXRpdmUgdG8gdGhpcyBjb25maWd1cmF0aW9uIFVSTC4KLQkJLy8gTm90ZTogZG9uJ3QgZG8gaXQgZm9yIHNlbGYgaG9zdGluZwotCQlpZiAoIWlzVHJhbnNpZW50KCkpCi0JCQljb25maWd1cmVFeHRlcm5hbExpbmtzKCk7Ci0KLQkJLy8gVmFsaWRhdGUgc2l0ZXMgaW4gdGhlIGNvbmZpZ3VyYXRpb24uIENhdXNlcyBhbnkgc2l0ZXMgdGhhdCBkbyBub3QgZXhpc3QgdG8KLQkJLy8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBjb25maWd1cmF0aW9uCi0JCXZhbGlkYXRlU2l0ZXMoKTsKLQotCQkvLyBjb21wdXRlIGRpZmZlcmVuY2VzIGJldHdlZW4gY29uZmlndXJhdGlvbiBhbmQgYWN0dWFsIGNvbnRlbnQgb2YgdGhlIHNpdGVzCi0JCS8vIChiYXNlIHNpdGVzIGFuZCBsaW5rIHNpdGVzKQotCQkvLyBOb3RlOiB3aGVuIHRoZSBjb25maWcgaXMgdHJhbnNpZW50IChnZW5lcmF0ZWQgYnkgUERFLCBldGMuKSB3ZSBkb24ndCByZWNvbmNpbGUKLQkJaWYgKGlzVHJhbnNpZW50KCkpCi0JCQlyZXR1cm47Ci0JCQotCQljaGFuZ2VTdGFtcCA9IGNvbXB1dGVDaGFuZ2VTdGFtcCgpOwotCQlpZiAoY2hhbmdlU3RhbXAgPiBjb25maWcuZ2V0RGF0ZSgpLmdldFRpbWUoKSkKLQkJCXJlY29uY2lsZSgpOwotCX0KLQotCVBsYXRmb3JtQ29uZmlndXJhdGlvbihVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leHRlcm5hbExpbmtTaXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWluaXRpYWxpemUodXJsKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNjcmVhdGVTaXRlRW50cnkoVVJMLCBJU2l0ZVBvbGljeSkKLQkgKi8KLQlwdWJsaWMgSVNpdGVFbnRyeSBjcmVhdGVTaXRlRW50cnkoVVJMIHVybCwgSVNpdGVQb2xpY3kgcG9saWN5KSB7Ci0JCXJldHVybiBuZXcgU2l0ZUVudHJ5KHVybCwgcG9saWN5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNjcmVhdGVTaXRlUG9saWN5KGludCwgU3RyaW5nW10pCi0JICovCi0JcHVibGljIElTaXRlUG9saWN5IGNyZWF0ZVNpdGVQb2xpY3koaW50IHR5cGUsIFN0cmluZ1tdIGxpc3QpIHsKLQkJcmV0dXJuIG5ldyBTaXRlUG9saWN5KHR5cGUsIGxpc3QpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI2NyZWF0ZUZlYXR1cmVFbnRyeShTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBib29sZWFuLCBTdHJpbmcsIFVSTCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVFbnRyeSBjcmVhdGVGZWF0dXJlRW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHBsdWdpblZlcnNpb24sIGJvb2xlYW4gcHJpbWFyeSwgU3RyaW5nIGFwcGxpY2F0aW9uLCBVUkxbXSByb290KSB7Ci0JCXJldHVybiBuZXcgRmVhdHVyZUVudHJ5KGlkLCB2ZXJzaW9uLCBwbHVnaW5WZXJzaW9uLCBwcmltYXJ5LCBhcHBsaWNhdGlvbiwgcm9vdCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jY3JlYXRlRmVhdHVyZUVudHJ5KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsCi0JICogU3RyaW5nLCBib29sZWFuLCBTdHJpbmcsIFVSTCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVFbnRyeSBjcmVhdGVGZWF0dXJlRW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHBsdWdpbklkZW50aWZpZXIsIFN0cmluZyBwbHVnaW5WZXJzaW9uLCBib29sZWFuIHByaW1hcnksIFN0cmluZyBhcHBsaWNhdGlvbiwgVVJMW10gcm9vdCkgewotCQlyZXR1cm4gbmV3IEZlYXR1cmVFbnRyeShpZCwgdmVyc2lvbiwgcGx1Z2luSWRlbnRpZmllciwgcGx1Z2luVmVyc2lvbiwgcHJpbWFyeSwgYXBwbGljYXRpb24sIHJvb3QpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI2NvbmZpZ3VyZVNpdGUoSVNpdGVFbnRyeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVTaXRlKElTaXRlRW50cnkgZW50cnkpIHsKLQkJY29uZmlndXJlU2l0ZShlbnRyeSwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI2NvbmZpZ3VyZVNpdGUoSVNpdGVFbnRyeSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29uZmlndXJlU2l0ZShJU2l0ZUVudHJ5IGVudHJ5LCBib29sZWFuIHJlcGxhY2UpIHsKLQotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkKLQkJVVJMIHVybCA9IGVudHJ5LmdldFVSTCgpOwotCQlpZiAodXJsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGtleSA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotCQlpZiAoY29uZmlnLmdldFNpdGVFbnRyeShrZXkpICE9IG51bGwgJiYgIXJlcGxhY2UpCi0JCQlyZXR1cm47Ci0JCi0JCWlmIChlbnRyeSBpbnN0YW5jZW9mIFNpdGVFbnRyeSkKLQkJCWNvbmZpZy5hZGRTaXRlRW50cnkoa2V5LCAoU2l0ZUVudHJ5KWVudHJ5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiN1bmNvbmZpZ3VyZVNpdGUoSVNpdGVFbnRyeSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5jb25maWd1cmVTaXRlKElTaXRlRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJVVJMIHVybCA9IGVudHJ5LmdldFVSTCgpOwotCQlpZiAodXJsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlTdHJpbmcga2V5ID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7CQotCQlpZiAoZW50cnkgaW5zdGFuY2VvZiBTaXRlRW50cnkpCi0JCQljb25maWcucmVtb3ZlU2l0ZUVudHJ5KGtleSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jZ2V0Q29uZmlndXJlZFNpdGVzKCkKLQkgKi8KLQlwdWJsaWMgSVNpdGVFbnRyeVtdIGdldENvbmZpZ3VyZWRTaXRlcygpIHsKLQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJU2l0ZUVudHJ5WzBdOwotCQkKLQkJU2l0ZUVudHJ5W10gc2l0ZXMgPSBjb25maWcuZ2V0U2l0ZXMoKTsKLQkJQXJyYXlMaXN0IGVuYWJsZWRTaXRlcyA9IG5ldyBBcnJheUxpc3Qoc2l0ZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2l0ZXNbaV0uaXNFbmFibGVkKCkpCi0JCQkJZW5hYmxlZFNpdGVzLmFkZChzaXRlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChJU2l0ZUVudHJ5W10pZW5hYmxlZFNpdGVzLnRvQXJyYXkobmV3IElTaXRlRW50cnlbZW5hYmxlZFNpdGVzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI2ZpbmRDb25maWd1cmVkU2l0ZShVUkwpCi0JICovCi0JcHVibGljIElTaXRlRW50cnkgZmluZENvbmZpZ3VyZWRTaXRlKFVSTCB1cmwpIHsKLQkJcmV0dXJuIGZpbmRDb25maWd1cmVkU2l0ZSh1cmwsIHRydWUpOwotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdXJsIHNpdGUgdXJsCi0JICogQHBhcmFtIGNoZWNrUGxhdGZvcm1VUkwgaWYgdHJ1ZSwgY2hlY2sgZm9yIHVybCBmb3JtYXQgdGhhdCBpcyBwbGF0Zm9ybTovLi4uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTaXRlRW50cnkgZmluZENvbmZpZ3VyZWRTaXRlKFVSTCB1cmwsIGJvb2xlYW4gY2hlY2tQbGF0Zm9ybVVSTCkgewotCQlpZiAodXJsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGtleSA9IHVybC50b0V4dGVybmFsRm9ybSgpOwotCi0JCVNpdGVFbnRyeSByZXN1bHQgPSBjb25maWcuZ2V0U2l0ZUVudHJ5KGtleSk7CQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsgLy8gcmV0cnkgd2l0aCBkZWNvZGVkIFVSTCBzdHJpbmcKLQkJCXRyeSB7Ci0JCQkJa2V5ID0gVVJMRGVjb2Rlci5kZWNvZGUoa2V5LCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQlyZXN1bHQgPSBjb25maWcuZ2V0U2l0ZUVudHJ5KGtleSk7Ci0JCX0KLQkJCQotCQlpZiAocmVzdWx0ID09IG51bGwgJiYgY2hlY2tQbGF0Zm9ybVVSTCkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHQgPSBmaW5kQ29uZmlndXJlZFNpdGUoVXRpbHMuYXNQbGF0Zm9ybVVSTCh1cmwpLCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNjb25maWd1cmVGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY29uZmlndXJlRmVhdHVyZUVudHJ5KElGZWF0dXJlRW50cnkgZW50cnkpIHsKLQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldEZlYXR1cmVJZGVudGlmaWVyKCk7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyB3ZSBzaG91bGQgY2hlY2sgZWFjaCBzaXRlIGFuZCBmaW5kIHdoZXJlIHRoZSBmZWF0dXJlIGlzCi0JCS8vIGxvY2F0ZWQgYW5kIHRoZW4gY29uZmlndXJlIGl0Ci0JCWlmIChjb25maWcgPT0gbnVsbCkKLQkJCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCk7Ci0KLQkJU2l0ZUVudHJ5W10gc2l0ZXMgPSBjb25maWcuZ2V0U2l0ZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBmaW5kIG91dCB3aGF0IHNpdGUgY29udGFpbnMgdGhlIGZlYXR1cmUgYW5kIGNvbmZpZ3VyZSBpdAotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTChzaXRlc1tpXS5nZXRVUkwoKSwgRkVBVFVSRVMgKyAiLyIgKyBlbnRyeS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKyAiXyIgKyBlbnRyeS5nZXRGZWF0dXJlVmVyc2lvbigpICsgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAobmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZXhpc3RzKCkpCi0JCQkJCXNpdGVzW2ldLmFkZEZlYXR1cmVFbnRyeShlbnRyeSk7Ci0JCQkJZWxzZSAgewotCQkJCQl1cmwgPSBuZXcgVVJMKHNpdGVzW2ldLmdldFVSTCgpLCBGRUFUVVJFUyArICIvIiArIGVudHJ5LmdldEZlYXR1cmVJZGVudGlmaWVyKCkgKyAiLyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJaWYgKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmV4aXN0cygpKQotCQkJCQkJc2l0ZXNbaV0uYWRkRmVhdHVyZUVudHJ5KGVudHJ5KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jdW5jb25maWd1cmVGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5jb25maWd1cmVGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcga2V5ID0gZW50cnkuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKTsKLQkJaWYgKGtleSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNvbmZpZy51bmNvbmZpZ3VyZUZlYXR1cmVFbnRyeShlbnRyeSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jZ2V0Q29uZmlndXJlZEZlYXR1cmVFbnRyaWVzKCkKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVFbnRyeVtdIGdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpIHsKLQkJQXJyYXlMaXN0IGNvbmZpZ0ZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlTaXRlRW50cnlbXSBzaXRlcyA9IGNvbmZpZy5nZXRTaXRlcygpOwotCQlmb3IgKGludCBpPTA7IGk8c2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gc2l0ZXNbaV0uZ2V0RmVhdHVyZUVudHJpZXMoKTsKLQkJCWZvciAoaW50IGo9MDsgajxmZWF0dXJlcy5sZW5ndGg7IGorKykKLQkJCQljb25maWdGZWF0dXJlcy5hZGQoZmVhdHVyZXNbal0pOwotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVFbnRyeVtdKWNvbmZpZ0ZlYXR1cmVzLnRvQXJyYXkobmV3IEZlYXR1cmVFbnRyeVtjb25maWdGZWF0dXJlcy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNmaW5kQ29uZmlndXJlZEZlYXR1cmVFbnRyeShTdHJpbmcpCi0JICovCi0JcHVibGljIElGZWF0dXJlRW50cnkgZmluZENvbmZpZ3VyZWRGZWF0dXJlRW50cnkoU3RyaW5nIGlkKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU2l0ZUVudHJ5W10gc2l0ZXMgPSBjb25maWcuZ2V0U2l0ZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlRW50cnkgZiA9IHNpdGVzW2ldLmdldEZlYXR1cmVFbnRyeShpZCk7Ci0JCQlpZiAoZiAhPSBudWxsKQotCQkJCXJldHVybiBmOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI2dldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpCi0JICovCi0JcHVibGljIFVSTCBnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiBjb25maWdMb2NhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNnZXRDaGFuZ2VTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0Q2hhbmdlU3RhbXAoKSB7Ci0JCWlmIChjb25maWcuZ2V0TGlua2VkQ29uZmlnKCkgPT0gbnVsbCkKLQkJCXJldHVybiBjb25maWcuZ2V0RGF0ZSgpLmdldFRpbWUoKTsKLQkJZWxzZQotCQkJcmV0dXJuIE1hdGgubWF4KGNvbmZpZy5nZXREYXRlKCkuZ2V0VGltZSgpLCBjb25maWcuZ2V0TGlua2VkQ29uZmlnKCkuZ2V0RGF0ZSgpLmdldFRpbWUoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpCi0JICogQGRlcHJlY2F0ZWQgRG9uJ3QgdXNlIHRoaXMgbWV0aG9kCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jZ2V0UGx1Z2luc0NoYW5nZVN0YW1wKCkKLQkgKiBAZGVwcmVjYXRlZCBEb24ndCB1c2UgdGhpcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRQbHVnaW5zQ2hhbmdlU3RhbXAoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbklkZW50aWZpZXIoKSB7Ci0JCS8vIFJldHVybiB0aGUgYXBwIGlmIGRlZmluZWQgaW4gc3lzdGVtIHByb3BlcnRpZXMKLQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gU3lzdGVtLmdldFByb3BlcnR5KEVDTElQU0VfQVBQTElDQVRJT04pOwotCQlpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBhcHBsaWNhdGlvbjsKLQotCQkvLyBPdGhlcndpc2UsIHRyeSB0byBnZXQgaXQgZnJvbSB0aGUgcHJpbWFyeSBmZWF0dXJlIChha2EgcHJvZHVjdCkKLQkJU3RyaW5nIGZlYXR1cmUgPSBnZXRQcmltYXJ5RmVhdHVyZUlkZW50aWZpZXIoKTsKLQotCQkvLyBsb29rdXAgYXBwbGljYXRpb24gZm9yIGZlYXR1cmUgKHNwZWNpZmllZCBvciBkZWZhdWx0ZWQpCi0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCUlGZWF0dXJlRW50cnkgZmUgPSBmaW5kQ29uZmlndXJlZEZlYXR1cmVFbnRyeShmZWF0dXJlKTsKLQkJCWlmIChmZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGZlLmdldEZlYXR1cmVBcHBsaWNhdGlvbigpICE9IG51bGwpCi0JCQkJCXJldHVybiBmZS5nZXRGZWF0dXJlQXBwbGljYXRpb24oKTsKLQkJCX0KLQkJfQotCi0JCS8vIHJldHVybiBoYXJkY29kZWQgZGVmYXVsdCBpZiB3ZSBmYWlsZWQKLQkJcmV0dXJuIERFRkFVTFRfRkVBVFVSRV9BUFBMSUNBVElPTjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNnZXRQcmltYXJ5RmVhdHVyZUlkZW50aWZpZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUZlYXR1cmVJZGVudGlmaWVyKCkgewotCQkvLyBSZXR1cm4gdGhlIHByb2R1Y3QgaWYgZGVmaW5lZCBpbiBzeXN0ZW0gcHJvcGVydGllcwotCQlTdHJpbmcgcHJpbWFyeUZlYXR1cmVJZCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShFQ0xJUFNFX1BST0RVQ1QpOwotCQlpZiAocHJpbWFyeUZlYXR1cmVJZCA9PSBudWxsKQotCQkJcHJpbWFyeUZlYXR1cmVJZCA9IERFRkFVTFRfRkVBVFVSRV9JRDsgLy8gcmV0dXJuIGhhcmRjb2RlZCBkZWZhdWx0Ci0JCQotCQkvLyBjaGVjayBpZiBmZWF0dXJlIGV4aXN0cwotCQlpZiAoZmluZENvbmZpZ3VyZWRGZWF0dXJlRW50cnkocHJpbWFyeUZlYXR1cmVJZCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlCi0JCQlyZXR1cm4gcHJpbWFyeUZlYXR1cmVJZDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNnZXRQbHVnaW5QYXRoKCkKLQkgKi8KLQlwdWJsaWMgVVJMW10gZ2V0UGx1Z2luUGF0aCgpIHsKLQkJQXJyYXlMaXN0IHBhdGggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVV0aWxzLmRlYnVnKCJjb21wdXRlZCBwbHVnLWluIHBhdGg6Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlJU2l0ZUVudHJ5W10gc2l0ZXMgPSBnZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJVVJMIHBhdGhVUkw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIHBsdWdpbnMgPSBzaXRlc1tpXS5nZXRQbHVnaW5zKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBsdWdpbnMubGVuZ3RoOyBqKyspIHsKLQkJCQl0cnkgewotCQkJCQlwYXRoVVJMID0gbmV3IFVSTCgoKFNpdGVFbnRyeSkgc2l0ZXNbaV0pLmdldFJlc29sdmVkVVJMKCksIHBsdWdpbnNbal0pOwotCQkJCQlwYXRoLmFkZChwYXRoVVJMKTsKLQkJCQkJVXRpbHMuZGVidWcoIiAgICIgKyBwYXRoVVJMLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2tpcCBlbnRyeSAuLi4KLQkJCQkJVXRpbHMuZGVidWcoIiAgIGJhZCBVUkw6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKFVSTFtdKSBwYXRoLnRvQXJyYXkobmV3IFVSTFswXSk7Ci0JfQotCQotCi0JLyoKLQkgKiBBIHZhcmlhdGlvbiBvZiB0aGUgZ2V0UGx1Z2luUGF0aCwgYnV0IGl0IHJldHVybnMgdGhlIGFjdHVhbCBwbHVnaW4gZW50cmllcwotCSAqLwotCXB1YmxpYyBQbHVnaW5FbnRyeVtdIGdldFBsdWdpbnMoKSB7Ci0JCUFycmF5TGlzdCBhbGxQbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlVdGlscy5kZWJ1ZygiY29tcHV0ZWQgcGx1Zy1pbnM6Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlJU2l0ZUVudHJ5W10gc2l0ZXMgPSBnZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCEoc2l0ZXNbaV0gaW5zdGFuY2VvZiBTaXRlRW50cnkpKSB7Ci0JCQkJVXRpbHMuZGVidWcoIlNpdGUgIiArIHNpdGVzW2ldLmdldFVSTCgpICsgIiBpcyBub3QgYSBTaXRlRW50cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlQbHVnaW5FbnRyeVtdIHBsdWdpbnMgPSAoKFNpdGVFbnRyeSlzaXRlc1tpXSkuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwbHVnaW5zLmxlbmd0aDsgaisrKSB7Ci0JCQkJYWxsUGx1Z2lucy5hZGQocGx1Z2luc1tqXSk7Ci0JCQkJVXRpbHMuZGVidWcoIiAgICIgKyBwbHVnaW5zW2pdLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiAoUGx1Z2luRW50cnlbXSkgYWxsUGx1Z2lucy50b0FycmF5KG5ldyBQbHVnaW5FbnRyeVswXSk7Ci0JfQotCQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jZ2V0Qm9vdHN0cmFwUGx1Z2luSWRlbnRpZmllcnMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRCb290c3RyYXBQbHVnaW5JZGVudGlmaWVycygpIHsKLQkJcmV0dXJuIEJPT1RTVFJBUF9QTFVHSU5TOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI3NldEJvb3RzdHJhcFBsdWdpbkxvY2F0aW9uKFN0cmluZywgVVJMKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvb3RzdHJhcFBsdWdpbkxvY2F0aW9uKFN0cmluZyBpZCwgVVJMIGxvY2F0aW9uKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jaXNVcGRhdGVhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI2lzVHJhbnNpZW50KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJaWYgKGNvbmZpZyAhPSBudWxsKQotCQkJcmV0dXJuIGNvbmZpZy5pc1RyYW5zaWVudCgpOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jaXNUcmFuc2llbnQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpc1RyYW5zaWVudChib29sZWFuIHZhbHVlKSB7Ci0JCWlmICh0aGlzICE9IGdldEN1cnJlbnQoKSAmJiBjb25maWcgIT0gbnVsbCkKLQkJCWNvbmZpZy5zZXRUcmFuc2llbnQodmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWZyZXNoKCkgewotCQkvLyBSZXNldCBjb21wdXRlZCB2YWx1ZXMuIFdpbGwgYmUgbGF6aWx5IHJlZnJlc2hlZAotCQkvLyBvbiBuZXh0IGFjY2VzcwotCQlJU2l0ZUVudHJ5W10gc2l0ZXMgPSBnZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJLy8gcmVzZXQgc2l0ZSBlbnRyeQotCQkJICgoU2l0ZUVudHJ5KSBzaXRlc1tpXSkucmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jc2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpc1VwZGF0ZWFibGUoKSkKLQkJCXNhdmUoY29uZmlnTG9jYXRpb24pOwotCX0KLQotCS8qCi0JICogQHNlZSBJUGxhdGZvcm1Db25maWd1cmF0aW9uI3NhdmUoVVJMKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzYXZlKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImNmaWcudW5hYmxlVG9TYXZlLm5vVVJMIikpOyAvLyROT04tTkxTLTEkCi0KLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJaWYgKCF1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBub3QgYSBmaWxlIHByb3RvY29sIC0gYXR0ZW1wdCB0byBzYXZlIHRvIHRoZSBVUkwKLQkJCVVSTENvbm5lY3Rpb24gdWMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCXVjLnNldERvT3V0cHV0KHRydWUpOwotCQkJb3MgPSB1Yy5nZXRPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJc2F2ZUFzWE1MKG9zKTsKLQkJCQljb25maWcuc2V0RGlydHkoZmFsc2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXRpbHMubG9nKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQlVdGlscy5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiY2ZpZy51bmFibGVUb1NhdmUiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCW9zLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBmaWxlIHByb3RvY29sIC0gZG8gc2FmZSBpL28KLQkJCUZpbGUgY2ZpZ0ZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCWlmICghY2ZpZ0ZpbGUuZ2V0TmFtZSgpLmVxdWFscyhQTEFURk9STV9YTUwpKSB7Ci0JCQkJaWYgKGNmaWdGaWxlLmV4aXN0cygpICYmIGNmaWdGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJCVV0aWxzLmxvZyhNZXNzYWdlcy5nZXRTdHJpbmcoIlBsYXRmb3JtQ29uZmlndXJhdGlvbi5leHBlY3RpbmdQbGF0Zm9ybVhNTG9yRGlyZWN0b3J5IikgKyBjZmlnRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNmaWdGaWxlID0gY2ZpZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCX0KLQkJCQljZmlnRmlsZSA9IG5ldyBGaWxlKGNmaWdGaWxlLCBDT05GSUdfTkFNRSk7Ci0JCQl9Ci0JCQlGaWxlIHdvcmtpbmdEaXIgPSBjZmlnRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAod29ya2luZ0RpciAhPSBudWxsICYmICF3b3JraW5nRGlyLmV4aXN0cygpKQotCQkJCXdvcmtpbmdEaXIubWtkaXJzKCk7Ci0KLQkJCS8vIERvIHNhZmUgaS9vOiAKLQkJCS8vICAgIC0gYmFja3VwIGN1cnJlbnQgY29uZmlnLCBieSBtb3ZpbmcgaXQgdG8gdGhlIGhpc3RvcnkgZm9sZGVyCi0JCQkvLyAgICAtIHdyaXRlIG5ldyBjb25maWcgdG8gcGxhdGZvcm0ueG1sLnRtcCBmaWxlCi0JCQkvLyAgICAtIHJlbmFtZSB0aGUgdGVtcCBmaWxlIHRvIHBsYXRmb3JtLnhtbAotCQkJRmlsZSBjZmlnRmlsZU9yaWdpbmFsID0gbmV3IEZpbGUoY2ZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJRmlsZSBjZmlnVG1wID0gbmV3IEZpbGUoY2ZpZ0ZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyBDT05GSUdfRklMRV9URU1QX1NVRkZJWCk7Ci0JCQkKLQkJCS8vIEJhY2t1cCBvbGQgZmlsZQotCQkJaWYgKGNmaWdGaWxlLmV4aXN0cygpKXsKLQkJCQlGaWxlIGJhY2t1cERpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXIsIENPTkZJR19ISVNUT1JZKTsKLQkJCQlpZiAoIWJhY2t1cERpci5leGlzdHMoKSkKLQkJCQkJYmFja3VwRGlyLm1rZGlyKCk7Ci0JCQkJbG9uZyB0aW1lc3RhbXAgPSBjZmlnRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJCQlGaWxlIHByZXNlcnZlZEZpbGUgPSBuZXcgRmlsZShiYWNrdXBEaXIsIFN0cmluZy52YWx1ZU9mKHRpbWVzdGFtcCkrIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIElmIHRoZSB0YXJnZXQgZmlsZSBleGlzdHMsIGluY3JlbWVudCB0aGUgdGltZXN0YW1wLiBUcnkgYXQgbW9zdCAxMDAgdGltZXMuCi0JCQkJbG9uZyBpbmNyZW1lbnQgPSAxOwotCQkJCXdoaWxlIChwcmVzZXJ2ZWRGaWxlLmV4aXN0cygpICYmIGluY3JlbWVudCA8IDEwMCl7Ci0JCQkJCXByZXNlcnZlZEZpbGUgPSBuZXcgRmlsZShiYWNrdXBEaXIsIFN0cmluZy52YWx1ZU9mKHRpbWVzdGFtcCtpbmNyZW1lbnQrKykrIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAoIXByZXNlcnZlZEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJLy8gdHJ5IHJlbmFtaW5nIGN1cnJlbnQgY29uZmlnIHRvIGJhY2t1cCBjb3B5Ci0JCQkJCWlmICghY2ZpZ0ZpbGUucmVuYW1lVG8ocHJlc2VydmVkRmlsZSkpCi0JCQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90QmFja3VwQ29uZmlnIikpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBJZiBjb25maWcuaW5pIGRvZXMgbm90IGV4aXN0LCBnZW5lcmF0ZSBpdCBpbiB0aGUgY29uZmlndXJhdGlvbiBhcmVhCi0JCQl3cml0ZUNvbmZpZ0luaSh3b3JraW5nRGlyLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkKLQkJCS8vIGZpcnN0IHNhdmUgdGhlIGZpbGUgYXMgdGVtcAotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShjZmlnVG1wKTsKLQkJCXRyeSB7Ci0JCQkJc2F2ZUFzWE1MKG9zKTsKLQkJCQkvLyBUcnkgZmx1c2hpbmcgYW55IGludGVybmFsIGJ1ZmZlcnMsIGFuZCBzeW5jaHJvbml6ZSB3aXRoIHRoZSBkaXNrCi0JCQkJdHJ5IHsKLQkJCQkJb3MuZmx1c2goKTsKLQkJCQkJKChGaWxlT3V0cHV0U3RyZWFtKW9zKS5nZXRGRCgpLnN5bmMoKTsKLQkJCQl9IGNhdGNoIChTeW5jRmFpbGVkRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCVV0aWxzLmxvZyhlMi5nZXRNZXNzYWdlKCkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCVV0aWxzLmxvZyhlMi5nZXRNZXNzYWdlKCkpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlvcy5jbG9zZSgpOwotCQkJCQlvcyA9IG51bGw7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJVXRpbHMubG9nKE1lc3NhZ2VzLmdldFN0cmluZygiUGxhdGZvcm1Db25maWd1cmF0aW9uLmNhbm5vdENsb3NlU3RyZWFtIikgKyBjZmlnVG1wKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlVdGlscy5sb2coZTEuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJLy8gc2V0IGZpbGUgdGltZSBzdGFtcCB0byBtYXRjaCB0aGF0IG9mIHRoZSBjb25maWcgZWxlbWVudAotCQkJCWNmaWdUbXAuc2V0TGFzdE1vZGlmaWVkKGNvbmZpZy5nZXREYXRlKCkuZ2V0VGltZSgpKTsKLQkJCQkvLyBzZXQgdGhpcyBvbiBjb25maWcsIGluIGNhc2UgdGhlIHZhbHVlIHdhcyByb3VuZGVkIG9mZgotCQkJCWNvbmZpZy5zZXRMYXN0TW9kaWZpZWQoY2ZpZ1RtcC5sYXN0TW9kaWZpZWQoKSk7Ci0JCQkJLy8gbWFrZSB0aGUgY2hhbmdlIHN0YW1wIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBjb25maWcgZmlsZQotCQkJCWNoYW5nZVN0YW1wID0gY29uZmlnLmdldERhdGUoKS5nZXRUaW1lKCk7Ci0JCQkJY29uZmlnLnNldERpcnR5KGZhbHNlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoImNmaWcudW5hYmxlVG9TYXZlIiwgY2ZpZ1RtcC5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChvcyAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJb3MuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCVV0aWxzLmxvZyhNZXNzYWdlcy5nZXRTdHJpbmcoIlBsYXRmb3JtQ29uZmlndXJhdGlvbi5jYW5ub3RDbG9zZVRlbXBGaWxlIikgKyBjZmlnVG1wKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBvbGQgY29uZmlnIChpZiBleGlzdGVkKSBhcyAiYmFrIiBhbmQgdGhlCi0JCQkvLyBuZXcgY29uZmlnIGFzICJ0bXAiLgotCQkJYm9vbGVhbiBvayA9IGNmaWdUbXAucmVuYW1lVG8oY2ZpZ0ZpbGVPcmlnaW5hbCk7Ci0JCQlpZiAoIW9rKSB7Ci0JCQkJLy8gdGhpcyBjb2RlcGF0aCByZXByZXNlbnRzIGEgdGlueSBmYWlsdXJlIHdpbmRvdy4gVGhlIGxvYWQgcHJvY2Vzc2luZwotCQkJCS8vIG9uIHN0YXJ0dXAgd2lsbCBkZXRlY3QgbWlzc2luZyBjb25maWcgYW5kIHdpbGwgYXR0ZW1wdCB0byBzdGFydAotCQkJCS8vIHdpdGggInRtcCIgKGxhdGVzdCksIHRoZW4gImJhayIgKHRoZSBwcmV2aW91cykuIFdlIGNhbiBhbHNvIGVuZCB1cAotCQkJCS8vIGhlcmUgaWYgd2UgZmFpbGVkIHRvIHJlbmFtZSB0aGUgY3VycmVudCBjb25maWcgdG8gImJhayIuIEluIHRoYXQKLQkJCQkvLyBjYXNlIHdlIHdpbGwgcmVzdGFydCB3aXRoIHRoZSBwcmV2aW91cyBzdGF0ZS4KLQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90UmVuYW1lVGVtcEZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJjZmlnLnVuYWJsZVRvU2F2ZSIsIGNmaWdUbXAuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZUNvbmZpZ0luaShGaWxlIGNvbmZpZ0RpcikgewotCQl0cnkgewotCQkJRmlsZSBjb25maWdJbmkgPSBuZXcgRmlsZShjb25maWdEaXIsIENPTkZJR19JTkkpOwotCQkJaWYgKCFjb25maWdJbmkuZXhpc3RzKCkpIHsKLQkJCQlVUkwgY29uZmlnSW5pVVJMID0gQ29uZmlndXJhdGlvbkFjdGl2YXRvci5nZXRCdW5kbGVDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoQ09ORklHX0lOSSk7Ci0JCQkJY29weShjb25maWdJbmlVUkwsIGNvbmZpZ0luaSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZ2V0U3RyaW5nKCJjZmcudW5hYmxlVG9DcmVhdGVDb25maWcuaW5pIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFBsYXRmb3JtQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50KCkgewotCQlyZXR1cm4gY3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydHMgYSBwbGF0Zm9ybSBpbnN0YWxsZWQgYXQgc3BlY2lmaWVkIGluc3RhbGxVUkwgdXNpbmcgY29uZmlndXJhdGlvbiBsb2NhdGVkIGF0IHBsYXRmb3JtQ29uZmlnTG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydHVwKFVSTCBpbnN0YWxsVVJMLCBMb2NhdGlvbiBwbGF0Zm9ybUNvbmZpZ0xvY2F0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGxhdGZvcm1Db25maWd1cmF0aW9uLmluc3RhbGxVUkwgPSBpbnN0YWxsVVJMOwotCQotCQkvLyBjcmVhdGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0JCWlmIChjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gPSBuZXcgUGxhdGZvcm1Db25maWd1cmF0aW9uKHBsYXRmb3JtQ29uZmlnTG9jYXRpb24pOwotCQkJaWYgKGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY29uZmlnID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihNZXNzYWdlcy5nZXRTdHJpbmcoIlBsYXRmb3JtQ29uZmlndXJhdGlvbi5jYW5ub3RMb2FkQ29uZmlnIikgKyBwbGF0Zm9ybUNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY29uZmlnLmlzRGlydHkoKSkKLQkJCQkvLyBJZiB0aGlzIGlzIGEgdHJhbnNpZW50IGNvbmZpZyAoZ2VuZXJhdGVkIGJ5IFBERSksZG8gbm90aGluZwotCQkJCS8vIG90aGVyd2lzZSwgc2F2ZSB0aGUgY29uZmlndXJhdGlvbiB3aXRoIHByb3BlciBkYXRlCi0JCQkJaWYgKCFjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uLmlzVHJhbnNpZW50KCkpCi0JCQkJCWN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc2F2ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJLy8gc2F2ZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCi0JCVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjb25maWcgPSBnZXRDdXJyZW50KCk7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJLy8gb25seSBzYXZlIGlmIHRoZXJlIGFyZSBjaGFuZ2VzIGluIHRoZSBjb25maWcKLQkJCWlmIChjb25maWcuY29uZmlnLmlzRGlydHkoKSAmJiAhY29uZmlnLmlzVHJhbnNpZW50KCkpIHsKLQkJCQl0cnkgewotCQkJCQljb25maWcuc2F2ZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXRpbHMuZGVidWcoIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gIiArIGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gd2lsbCByZWNvdmVyIG9uIG5leHQgc3RhcnR1cAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplQ3VycmVudChMb2NhdGlvbiBwbGF0Zm9ybUNvbmZpZ0xvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCS8vIENvbmZpZ3VyYXRpb24gVVJMIHdhcyBpcyBzcGVjaWZpZWQgYnkgdGhlIE9TR2kgbGF5ZXIuIAotCQkvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGxvb2sKLQkJLy8gZm9yIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHNwZWNpZmllZCBtZXRhIGFyZWEuIElmIG5vdCBmb3VuZCwgbG9vawotCQkvLyBmb3IgcHJlLWluaXRpYWxpemVkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4KLQkJLy8gSWYgaXQgaXMgZm91bmQgaXQgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbCBjb25maWd1cmF0aW9uLiBPdGhlcndpc2UKLQkJLy8gYSBuZXcgY29uZmlndXJhdGlvbiBpcyBjcmVhdGVkLiBJbiBlaXRoZXIgY2FzZSB0aGUgcmVzdWx0aW5nCi0JCS8vIGNvbmZpZ3VyYXRpb24gaXMgd3JpdHRlbiBpbnRvIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBhcmVhLgotCi0JCVVSTCBjb25maWdGaWxlVVJMID0gbmV3IFVSTChwbGF0Zm9ybUNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpLCBDT05GSUdfTkFNRSk7Ci0JCXRyeSB7CQotCQkJLy8gY2hlY2sgY29uY3VycmVudCB1c2UgbG9jawotCQkJZ2V0Q29uZmlndXJhdGlvbkxvY2socGxhdGZvcm1Db25maWdMb2NhdGlvbi5nZXRVUkwoKSk7Ci0KLQkJCS8vIHRyeSBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uCi0JCQl0cnkgewotCQkJCWNvbmZpZyA9IGxvYWRDb25maWcoY29uZmlnRmlsZVVSTCk7Ci0JCQkJVXRpbHMuZGVidWcoIlVzaW5nIGNvbmZpZ3VyYXRpb24gIiArIGNvbmZpZ0ZpbGVVUkwudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gZmFpbGVkIHRvIGxvYWQsIHNlZSBpZiB3ZSBjYW4gZmluZCBwcmUtaW5pdGlhbGl6ZWQgY29uZmlndXJhdGlvbi4KLQkJCQl0cnkgewotCQkJCQlMb2NhdGlvbiBwYXJlbnRMb2NhdGlvbiA9IHBsYXRmb3JtQ29uZmlnTG9jYXRpb24uZ2V0UGFyZW50TG9jYXRpb24oKTsKLQkJCQkJaWYgKHBhcmVudExvY2F0aW9uID09IG51bGwpCi0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsgLy8gbm8gcGxhdGZvcm0ueG1sIGZvdW5kLCBuZWVkIHRvIGNyZWF0ZSBkZWZhdWx0IHNpdGUKLQkJCQkJCi0JCQkJCVVSTCBzaGFyZWRDb25maWdGaWxlVVJMID0gbmV3IFVSTChwYXJlbnRMb2NhdGlvbi5nZXRVUkwoKSwgQ09ORklHX05BTUUpOwotCQkJCQljb25maWcgPSBsb2FkQ29uZmlnKHNoYXJlZENvbmZpZ0ZpbGVVUkwpOwotCQkJCQkKLQkJCQkJLy8gcHJlLWluaXRpYWxpemVkIGNvbmZpZyBsb2FkZWQgT0sgLi4uIGNvcHkgYW55IHJlbWFpbmluZyB1cGRhdGUgbWV0YWRhdGEKLQkJCQkJLy8gT25seSBjb3B5IGlmIHRoZSBkZWZhdWx0IGNvbmZpZyBsb2NhdGlvbiBpcyBub3QgdGhlIGluc3RhbGwgbG9jYXRpb24KLQkJCQkJaWYgKCFzaGFyZWRDb25maWdGaWxlVVJMLmVxdWFscyhjb25maWdGaWxlVVJMKSkgewotCQkJCQkJLy8gbmVlZCB0byBsaW5rIGNvbmZpZyBpbmZvIGluc3RlYWQgb2YgdXNpbmcgYSBjb3B5Ci0JCQkJCQlsaW5rSW5pdGlhbGl6ZWRTdGF0ZShjb25maWcsIHBhcmVudExvY2F0aW9uLCBwbGF0Zm9ybUNvbmZpZ0xvY2F0aW9uKTsKLQkJCQkJCVV0aWxzLmRlYnVnKCJDb25maWd1cmF0aW9uIGluaXRpYWxpemVkIGZyb20gICAgIiArIHNoYXJlZENvbmZpZ0ZpbGVVUkwudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm47Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGlvZSkgewotCQkJCQlVdGlscy5kZWJ1ZygiQ3JlYXRpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZyb20gIiArIGNvbmZpZ0ZpbGVVUkwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb24oY29uZmlnRmlsZVVSTCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY29uZmlnTG9jYXRpb24gPSBjb25maWdGaWxlVVJMOwotCQkJaWYgKGNvbmZpZy5nZXRVUkwoKSA9PSBudWxsKQotCQkJCWNvbmZpZy5zZXRVUkwoY29uZmlnRmlsZVVSTCk7Ci0JCQl2ZXJpZnlQYXRoKGNvbmZpZ0xvY2F0aW9uKTsKLQkJCVV0aWxzLmRlYnVnKCJDcmVhdGluZyBjb25maWd1cmF0aW9uICIgKyBjb25maWdGaWxlVVJMLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyByZWxlYWVzIGNvbmN1cnJlbnQgdXNlIGxvY2sKLQkJCWNsZWFyQ29uZmlndXJhdGlvbkxvY2soKTsKLQkJfQotCX0KLQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaW5pdGlhbGl6ZShVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQljb25maWcgPSBsb2FkQ29uZmlnKHVybCk7CQotCQkJVXRpbHMuZGVidWcoIlVzaW5nIGNvbmZpZ3VyYXRpb24gIiArIHVybC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChjb25maWcgPT0gbnVsbCkgewotCQkJY29uZmlnID0gbmV3IENvbmZpZ3VyYXRpb24oKTsJCQotCQkJVXRpbHMuZGVidWcoIkNyZWF0aW5nIGVtcHR5IGNvbmZpZ3VyYXRpb24gb2JqZWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb25maWcuc2V0VVJMKHVybCk7Ci0JCWNvbmZpZ0xvY2F0aW9uID0gdXJsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvbihVUkwgdXJsKXRocm93cyBJT0V4Y2VwdGlvbnsKLQkJLy8gd2UgYXJlIGNyZWF0aW5nIG5ldyBjb25maWd1cmF0aW9uCi0JCWNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCk7Ci0JCWNvbmZpZy5zZXRVUkwodXJsKTsKLQkJU2l0ZUVudHJ5IGRlZmF1bHRTaXRlID0gKFNpdGVFbnRyeSlnZXRSb290U2l0ZSgpOwotCQljb25maWd1cmVTaXRlKGRlZmF1bHRTaXRlKTsKLQkJdHJ5IHsKLQkJCS8vIHBhcnNlIHRoZSBzaXRlIGRpcmVjdG9yeSB0byBkaXNjb3ZlciBmZWF0dXJlcwotCQkJZGVmYXVsdFNpdGUubG9hZEZyb21EaXNrKDApOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90TG9hZERlZmF1bHRTaXRlIikgKyBkZWZhdWx0U2l0ZS5nZXRSZXNvbHZlZFVSTCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JfQotCXByaXZhdGUgSVNpdGVFbnRyeSBnZXRSb290U2l0ZSgpIHsKLQkJLy8gY3JlYXRlIGRlZmF1bHQgc2l0ZSBlbnRyeSBmb3IgdGhlIHJvb3QKLQkJSVNpdGVQb2xpY3kgZGVmYXVsdFBvbGljeSA9IGNyZWF0ZVNpdGVQb2xpY3koREVGQVVMVF9QT0xJQ1lfVFlQRSwgREVGQVVMVF9QT0xJQ1lfTElTVCk7Ci0JCVVSTCBzaXRlVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNpdGVVUkwgPSBuZXcgVVJMKCJwbGF0Zm9ybTovYmFzZS8iKTsgLy8kTk9OLU5MUy0xJCAgLy8gdHJ5IHVzaW5nIHBsYXRmb3JtLXJlbGF0aXZlIFVSTAotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJc2l0ZVVSTCA9IGdldEluc3RhbGxVUkwoKTsgLy8gZW5zdXJlIHdlIGNvbWUgdXAgLi4uIHVzZSBhYnNvbHV0ZSBmaWxlIFVSTAotCQl9Ci0JCUlTaXRlRW50cnkgZGVmYXVsdFNpdGUgPSBjcmVhdGVTaXRlRW50cnkoc2l0ZVVSTCwgZGVmYXVsdFBvbGljeSk7Ci0JCXJldHVybiBkZWZhdWx0U2l0ZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0cyB0aGUgY29uZmlndXJhdGlvbiBsb2NrCi0JICogQHBhcmFtIHVybCBjb25maWd1cmF0aW9uIGRpcmVjdG9yeQotCSAqLwotCXByaXZhdGUgdm9pZCBnZXRDb25maWd1cmF0aW9uTG9jayhVUkwgdXJsKSB7Ci0JCWlmICghdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQlGaWxlIGxvY2tGaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSwgQ29uZmlndXJhdGlvbkFjdGl2YXRvci5OQU1FX1NQQUNFKyBGaWxlLnNlcGFyYXRvcitDT05GSUdfRklMRV9MT0NLX1NVRkZJWCk7Ci0JCXZlcmlmeVBhdGgodXJsKTsKLQkJdHJ5IHsKLQkJCVJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobG9ja0ZpbGUsICJydyIpOyAvLyROT04tTkxTLTEkCi0JCQlsb2NrID0gcmFmLmdldENoYW5uZWwoKS5sb2NrKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJbG9jayA9IG51bGw7Ci0JCX0JCi0JfQotCQotCXByaXZhdGUgdm9pZCBjbGVhckNvbmZpZ3VyYXRpb25Mb2NrKCkgewotCQlpZiAobG9jayAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWxvY2suY2hhbm5lbCgpLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJfQotCX0KLQkKLQotCXByaXZhdGUgbG9uZyBjb21wdXRlQ2hhbmdlU3RhbXAoKSB7Ci0JCWZlYXR1cmVzQ2hhbmdlU3RhbXAgPSBjb21wdXRlRmVhdHVyZXNDaGFuZ2VTdGFtcCgpOwotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSBjb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCk7Ci0JCWNoYW5nZVN0YW1wID0gTWF0aC5tYXgoZmVhdHVyZXNDaGFuZ2VTdGFtcCwgcGx1Z2luc0NoYW5nZVN0YW1wKTsKLQkJLy8gcm91bmQgb2ZmIHRvIHNlY29uZHMKLQkJY2hhbmdlU3RhbXAgPSAoY2hhbmdlU3RhbXAvMTAwMCkqMTAwMDsKLQkJcmV0dXJuIGNoYW5nZVN0YW1wOwotCX0KLQotCXByaXZhdGUgbG9uZyBjb21wdXRlRmVhdHVyZXNDaGFuZ2VTdGFtcCgpIHsKLQkJaWYgKGZlYXR1cmVzQ2hhbmdlU3RhbXBJc1ZhbGlkKQotCQkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7Ci0KLQkJbG9uZyByZXN1bHQgPSAwOwotCQlJU2l0ZUVudHJ5W10gc2l0ZXMgPSBjb25maWcuZ2V0U2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0ID0gTWF0aC5tYXgocmVzdWx0LCBzaXRlc1tpXS5nZXRGZWF0dXJlc0NoYW5nZVN0YW1wKCkpOwotCQl9Ci0JCWZlYXR1cmVzQ2hhbmdlU3RhbXAgPSByZXN1bHQ7Ci0JCWZlYXR1cmVzQ2hhbmdlU3RhbXBJc1ZhbGlkID0gdHJ1ZTsKLQkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVQbHVnaW5zQ2hhbmdlU3RhbXAoKSB7Ci0JCWlmIChwbHVnaW5zQ2hhbmdlU3RhbXBJc1ZhbGlkKQotCQkJcmV0dXJuIHBsdWdpbnNDaGFuZ2VTdGFtcDsKLQotCQlsb25nIHJlc3VsdCA9IDA7Ci0JCUlTaXRlRW50cnlbXSBzaXRlcyA9IGNvbmZpZy5nZXRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIHNpdGVzW2ldLmdldFBsdWdpbnNDaGFuZ2VTdGFtcCgpKTsKLQkJfQotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSByZXN1bHQ7Ci0JCXBsdWdpbnNDaGFuZ2VTdGFtcElzVmFsaWQgPSB0cnVlOwotCQlyZXR1cm4gcGx1Z2luc0NoYW5nZVN0YW1wOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVFeHRlcm5hbExpbmtzKCkgewotCQlVUkwgbGlua1VSTCA9IGdldEluc3RhbGxVUkwoKTsKLQkJaWYgKCFzdXBwb3J0c0RldGVjdGlvbihsaW5rVVJMKSkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJbGlua1VSTCA9IG5ldyBVUkwobGlua1VSTCwgTElOS1MgKyAiLyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBza2lwIGJhZCBsaW5rcyAuLi4KLQkJCVV0aWxzLmRlYnVnKCJVbmFibGUgdG8gb2J0YWluIGxpbmsgVVJMIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCUZpbGUgbGlua0RpciA9IG5ldyBGaWxlKGxpbmtVUkwuZ2V0RmlsZSgpKTsKLQkJRmlsZVtdIGxpbmtzID0gbGlua0Rpci5saXN0RmlsZXMoKTsKLQkJaWYgKGxpbmtzID09IG51bGwgfHwgbGlua3MubGVuZ3RoID09IDApIHsKLQkJCVV0aWxzLmRlYnVnKCJObyBsaW5rcyBkZXRlY3RlZCBpbiAiICsgbGlua1VSTC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxpbmtzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJY29udGludWU7Ci0JCQlVdGlscy5kZWJ1ZygiTGluayBmaWxlICIgKyBsaW5rc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJRmlsZUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGxpbmtzW2ldKTsKLQkJCQlwcm9wcy5sb2FkKGlzKTsKLQkJCQljb25maWd1cmVFeHRlcm5hbExpbmtTaXRlKGxpbmtzW2ldLCBwcm9wcyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gc2tpcCBiYWQgbGlua3MgLi4uCi0JCQkJVXRpbHMuZGVidWcoIiAgIHVuYWJsZSB0byBsb2FkIGxpbmsgZmlsZSAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlnbm9yZSAuLi4KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb25maWd1cmVFeHRlcm5hbExpbmtTaXRlKEZpbGUgbGlua0ZpbGUsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJU3RyaW5nIHBhdGggPSBwcm9wcy5nZXRQcm9wZXJ0eShMSU5LX1BBVEgpOwotCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQlVdGlscy5kZWJ1ZygiICAgbm8gcGF0aCBkZWZpbml0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0cmluZyBsaW5rOwotCQlib29sZWFuIHVwZGF0ZWFibGUgPSB0cnVlOwotCQlVUkwgc2l0ZVVSTDsKLQotCQkvLyBwYXJzZSBvdXQgbGluayBpbmZvcm1hdGlvbgotCQlpZiAocGF0aC5zdGFydHNXaXRoKExJTktfUkVBRCArICIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlYWJsZSA9IGZhbHNlOwotCQkJbGluayA9IHBhdGguc3Vic3RyaW5nKDIpLnRyaW0oKTsKLQkJfSBlbHNlIGlmIChwYXRoLnN0YXJ0c1dpdGgoTElOS19SRUFEX1dSSVRFICsgIiAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlsaW5rID0gcGF0aC5zdWJzdHJpbmcoMykudHJpbSgpOwotCQl9IGVsc2UgewotCQkJbGluayA9IHBhdGgudHJpbSgpOwotCQl9Ci0KLQkJLy8gCW1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgbGluayBzcGVjaWZpY2F0aW9uCi0JCXRyeSB7Ci0JCQlGaWxlIHNpdGVGaWxlID0gbmV3IEZpbGUobGluayk7Ci0JCQlzaXRlRmlsZSA9IG5ldyBGaWxlKHNpdGVGaWxlLCBFQ0xJUFNFKTsKLQkJCXNpdGVVUkwgPSBzaXRlRmlsZS50b1VSTCgpOwotCQkJaWYgKGZpbmRDb25maWd1cmVkU2l0ZShzaXRlVVJMLCB0cnVlKSAhPSBudWxsKQotCQkJCS8vIGxpbmtlZCBzaXRlIGlzIGFscmVhZHkga25vd24KLQkJCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUgYmFkIGxpbmtzIC4uLgotCQkJVXRpbHMuZGVidWcoIiAgYmFkIFVSTCAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gcHJvY2VzcyB0aGUgbGluawotCQlTaXRlRW50cnkgbGlua1NpdGUgPSAoU2l0ZUVudHJ5KSBleHRlcm5hbExpbmtTaXRlcy5nZXQoc2l0ZVVSTCk7Ci0JCWlmIChsaW5rU2l0ZSA9PSBudWxsKSB7Ci0JCQkvLyB0aGlzIGlzIGEgbGluayB0byBhIG5ldyB0YXJnZXQgc28gY3JlYXRlIHNpdGUgZm9yIGl0Ci0JCQlJU2l0ZVBvbGljeSBsaW5rU2l0ZVBvbGljeSA9IGNyZWF0ZVNpdGVQb2xpY3koREVGQVVMVF9QT0xJQ1lfVFlQRSwgREVGQVVMVF9QT0xJQ1lfTElTVCk7Ci0JCQlsaW5rU2l0ZSA9IChTaXRlRW50cnkpIGNyZWF0ZVNpdGVFbnRyeShzaXRlVVJMLCBsaW5rU2l0ZVBvbGljeSk7Ci0JCX0KLQkJLy8gdXBkYXRlIHNpdGUgZW50cnkgaWYgbmVlZGVkCi0JCWxpbmtTaXRlLnNldFVwZGF0ZWFibGUodXBkYXRlYWJsZSk7Ci0JCWxpbmtTaXRlLnNldExpbmtGaWxlTmFtZShsaW5rRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0KLQkJLy8gY29uZmlndXJlIHRoZSBuZXcgc2l0ZQotCQkvLyBOT1RFOiBkdXBsaWNhdGVzIGFyZSBub3QgcmVwbGFjZWQgKGZpcnN0IG9uZSBpbiB3aW5zKQotCQljb25maWd1cmVTaXRlKGxpbmtTaXRlKTsKLQkJLy8gdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIGNvbmZpZwotCQljb25maWcuc2V0RGlydHkodHJ1ZSk7Ci0JCVV0aWxzLmRlYnVnKCIgICAiICsgKHVwZGF0ZWFibGUgPyAiUi9XIC0+ICIgOiAiUi9PIC0+ICIpICsgc2l0ZVVSTC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVTaXRlcygpIHsKLQotCQkvLyBjaGVjayB0byBzZWUgaWYgYWxsIHNpdGVzIGFyZSB2YWxpZC4gUmVtb3ZlIGFueSBzaXRlcyB0aGF0IGRvIG5vdCBleGlzdC4KLQkJU2l0ZUVudHJ5W10gbGlzdCA9IGNvbmZpZy5nZXRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCVVSTCBzaXRlVVJMID0gbGlzdFtpXS5nZXRSZXNvbHZlZFVSTCgpOwotCQkJaWYgKCFzdXBwb3J0c0RldGVjdGlvbihzaXRlVVJMKSkKLQkJCQljb250aW51ZTsKLQotCQkJRmlsZSBzaXRlUm9vdCA9IG5ldyBGaWxlKHNpdGVVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCWlmICghc2l0ZVJvb3QuZXhpc3RzKCkpIHsKLQkJCQl1bmNvbmZpZ3VyZVNpdGUobGlzdFtpXSk7Ci0JCQkJVXRpbHMuZGVidWcoIlNpdGUgIiArIHNpdGVVUkwgKyAiIGRvZXMgbm90IGV4aXN0IC4uLiByZW1vdmluZyBmcm9tIGNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQkKLQkJCS8vIElmIG11bHRpcGxlIHBhdGhzIGFyZSBkZWZpbmVkIGluIHRoZSBzYW1lIGxpbmsgZmlsZQotCQkJLy8gb3IgaWYgdGhlIHBhdGggY2hhbmdlcywgdGhlIG9sZCBzaXRlIHdpbGwgc3RpbGwgYmUga2VwdC4KLQkJCS8vIEEgYmV0dGVyIGFsZ29yaXRobSBjb3VsZCBiZSBpbXBsZW1lbnRlZCBieSBrZWVwaW5nIHRyYWNrIAotCQkJLy8gb2YgdGhlIHByZXZpb3VzIGNvbnRlbnQgb2YgdGhlIGxpbmsgZmlsZS4KLQkJCS8vIFRPRE8gZG8gdGhlIGFib3ZlCi0JCQlTdHJpbmcgbGlua05hbWUgPSBsaXN0W2ldLmdldExpbmtGaWxlTmFtZSgpOwotCQkJaWYgKGxpbmtOYW1lICE9IG51bGwpIHsKLQkJCQlGaWxlIGxpbmtGaWxlID0gbmV3IEZpbGUobGlua05hbWUpOwotCQkJCWlmICghbGlua0ZpbGUuZXhpc3RzKCkpICB7Ci0JCQkJCXVuY29uZmlndXJlU2l0ZShsaXN0W2ldKTsKLQkJCQkJY29uZmlnLnNldERpcnR5KHRydWUpOwotCQkJCQlVdGlscy5kZWJ1ZygiU2l0ZSAiICsgc2l0ZVVSTCArICIgaXMgbm8gbG9uZ2VyIGxpbmtlZCAuLi4gcmVtb3ZpbmcgZnJvbSBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGxpbmtJbml0aWFsaXplZFN0YXRlKENvbmZpZ3VyYXRpb24gc2hhcmVkQ29uZmlnLCBMb2NhdGlvbiBzaGFyZWRDb25maWdMb2NhdGlvbiwgTG9jYXRpb24gbmV3Q29uZmlnTG9jYXRpb24pIHsKLQkJdHJ5IHsKLQkJCVVSTCBuZXdDb25maWdJbmlVUkwgPSBuZXcgVVJMKG5ld0NvbmZpZ0xvY2F0aW9uLmdldFVSTCgpLCBDT05GSUdfSU5JKTsKLQkJCWlmICghbmV3Q29uZmlnSW5pVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47IC8vIG5lZWQgdG8gYmUgYWJsZSB0byBkbyB3cml0ZQotCi0JCQkvLyBtb2RpZnkgY29uZmlnLmluaSBhbmQgcGxhdGZvcm0ueG1sIHRvIG9ubHkgbGluayBvcmlnaW5hbCBmaWxlcwotCQkJRmlsZSBjb25maWdJbmkgPSBuZXcgRmlsZShuZXdDb25maWdJbmlVUkwuZ2V0RmlsZSgpKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcHMucHV0KCJvc2dpLnNoYXJlZENvbmZpZ3VyYXRpb24uYXJlYSIsIHNoYXJlZENvbmZpZ0xvY2F0aW9uLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCQlwcm9wcy5zdG9yZShuZXcgRmlsZU91dHB1dFN0cmVhbShjb25maWdJbmkpLCAiTGlua2VkIGNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCi0JCQljb25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihuZXcgRGF0ZSgpKTsKLQkJCWNvbmZpZy5zZXRVUkwobmV3IFVSTChuZXdDb25maWdMb2NhdGlvbi5nZXRVUkwoKSwgQ09ORklHX05BTUUpKTsKLQkJCWNvbmZpZy5zZXRMaW5rZWRDb25maWcoc2hhcmVkQ29uZmlnKTsKLQkJCWNvbmZpZy5zZXREaXJ0eSh0cnVlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gdGhpcyBpcyBhbiBvcHRpbWlzdGljIGNvcHkuIElmIHdlIGZhaWwsIHRoZSBzdGF0ZSB3aWxsIGJlIHJlY29uY2lsZWQKLQkJCS8vIHdoZW4gdGhlIHVwZGF0ZSBtYW5hZ2VyIGlzIHRyaWdnZXJlZC4KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNvcHkoVVJMIHNyYywgRmlsZSB0Z3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gc3JjLm9wZW5TdHJlYW0oKTsKLQkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGd0KTsKLQkJCWJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMTAyNF07Ci0JCQlpbnQgY291bnQgPSBpcy5yZWFkKGJ1ZmYpOwotCQkJd2hpbGUgKGNvdW50ICE9IC0xKSB7Ci0JCQkJb3Mud3JpdGUoYnVmZiwgMCwgY291bnQpOwotCQkJCWNvdW50ID0gaXMucmVhZChidWZmKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUgLi4uCi0JCQkJfQotCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJb3MuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZSAuLi4KLQkJCQl9Ci0JCX0KLQl9CQkKLQkKLQlwcml2YXRlIENvbmZpZ3VyYXRpb24gbG9hZENvbmZpZyhVUkwgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VzLmdldFN0cmluZygiY2ZpZy51bmFibGVUb0xvYWQubm9VUkwiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0cnkgdG8gbG9hZCBzYXZlZCBjb25maWd1cmF0aW9uIGZpbGUgKHdhdGNoIGZvciBmYWlsZWQgcHJpb3Igc2F2ZSgpKQotCQlDb25maWd1cmF0aW9uUGFyc2VyIHBhcnNlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIgPSBuZXcgQ29uZmlndXJhdGlvblBhcnNlcigpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IChFeGNlcHRpb24pZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJY29uZmlnID0gbnVsbDsKLQkJRXhjZXB0aW9uIG9yaWdpbmFsRXhjZXB0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbmZpZyA9IHBhcnNlci5wYXJzZSh1cmwpOwotCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90RmluZENvbmZpZ0ZpbGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBjaGVjayBmb3Igc2F2ZSBmYWlsdXJlcywgc28gb3BlbiB0ZW1wIGFuZCBiYWNrdXAgY29uZmlndXJhdGlvbnMKLQkJCW9yaWdpbmFsRXhjZXB0aW9uID0gZTE7Ci0JCQl0cnkgewotCQkJCVVSTCB0ZW1wVVJMID0gbmV3IFVSTCh1cmwudG9FeHRlcm5hbEZvcm0oKStDT05GSUdfRklMRV9URU1QX1NVRkZJWCk7Ci0JCQkJY29uZmlnID0gcGFyc2VyLnBhcnNlKHRlbXBVUkwpOyAKLQkJCQlpZiAoY29uZmlnID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oKTsKLQkJCQllbHNlCi0JCQkJCWNvbmZpZy5zZXREaXJ0eSh0cnVlKTsgLy8gZm9yY2Ugc2F2aW5nIHRvIHBsYXRmb3JtLnhtbAotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gY2hlY2sgdGhlIGJhY2t1cAotCQkJCQlpZiAoImZpbGUiLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJRmlsZSBjZmlnRmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcikpOwotCQkJCQkJRmlsZSB3b3JraW5nRGlyID0gY2ZpZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQkJaWYgKHdvcmtpbmdEaXIgIT0gbnVsbCAmJiB3b3JraW5nRGlyLmV4aXN0cygpKSB7Ci0JCQkJCQkJRmlsZVtdIGJhY2t1cHMgPSB3b3JraW5nRGlyLmxpc3RGaWxlcyhuZXcgRmlsZUZpbHRlcigpewotCQkJCQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJCQkJCQkJcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgiLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX19KTsKLQkJCQkJCQlpZiAoYmFja3VwcyAhPSBudWxsICYmIGJhY2t1cHMubGVuZ3RoID4gMCkgewotCQkJCQkJCQlVUkwgYmFja3VwVXJsID0gYmFja3Vwc1tiYWNrdXBzLmxlbmd0aC0xXS50b1VSTCgpOwotCQkJCQkJCQljb25maWcgPSBwYXJzZXIucGFyc2UoYmFja3VwVXJsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCQkJdGhyb3cgb3JpZ2luYWxFeGNlcHRpb247IC8vIHdlIHRyaWVkLCBidXQgbm8gY29uZmlnIGhlcmUgLi4uCi0JCQkJCWVsc2UKLQkJCQkJCWNvbmZpZy5zZXREaXJ0eSh0cnVlKTsgLy8gZm9yY2Ugc2F2aW5nIHRvIHBsYXRmb3JtLnhtbAotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUzKSB7Ci0JCQkJCXRocm93IG9yaWdpbmFsRXhjZXB0aW9uOyAvLyB3ZSB0cmllZCwgYnV0IG5vIGNvbmZpZyBoZXJlIC4uLgotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzRGV0ZWN0aW9uKFVSTCB1cmwpIHsKLQkJU3RyaW5nIHByb3RvY29sID0gdXJsLmdldFByb3RvY29sKCk7Ci0JCWlmIChwcm90b2NvbC5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKHByb3RvY29sLmVxdWFscygicGxhdGZvcm0iKSkgewotCQkJVVJMIHJlc29sdmVkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVzb2x2ZWQgPSByZXNvbHZlUGxhdGZvcm1VUkwodXJsKTsgLy8gMTk1MzYKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7IC8vIHdlIHRyaWVkIGJ1dCBmYWlsZWQgdG8gcmVzb2x2ZSB0aGUgcGxhdGZvcm0gVVJMCi0JCQl9Ci0JCQlyZXR1cm4gcmVzb2x2ZWQuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVBhdGgoVVJMIHVybCkgewotCQlTdHJpbmcgcHJvdG9jb2wgPSB1cmwuZ2V0UHJvdG9jb2woKTsKLQkJU3RyaW5nIHBhdGggPSBudWxsOwotCQlpZiAocHJvdG9jb2wuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXBhdGggPSB1cmwuZ2V0RmlsZSgpOwotCQllbHNlIGlmIChwcm90b2NvbC5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8gJE5PTi1OTFMtMSQKLQkJCVVSTCByZXNvbHZlZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXJlc29sdmVkID0gcmVzb2x2ZVBsYXRmb3JtVVJMKHVybCk7IC8vIDE5NTM2Ci0JCQkJaWYgKHJlc29sdmVkLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcGF0aCA9IHJlc29sdmVkLmdldEZpbGUoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjb250aW51ZSAuLi4KLQkJCX0KLQkJfQotCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUocGF0aCkuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGRpciAhPSBudWxsKQotCQkJCWRpci5ta2RpcnMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIHJlc29sdmVQbGF0Zm9ybVVSTChVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyAxOTUzNgotCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vICROT04tTkxTLTEkOwotCQkJdXJsID0gUGxhdGZvcm0uYXNMb2NhbFVSTCh1cmwpOwotCQkJLy8gVE9ETyBVUkwgcmVzb2x1dGlvbiBieSBwbGF0Zm9ybSByZXR1cm5zIHVybCBmaWxlOmQ6L3BhdGggYXMgb3Bwb3NlZCB0byBmaWxlOi9kOi9wYXRoCi0JCQlGaWxlIGYgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJCXVybCA9IGYudG9VUkwoKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRJbnN0YWxsVVJMKCkgewotCQlyZXR1cm4gaW5zdGFsbFVSTDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNhdmVBc1hNTChPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7CQotCQlTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCURvY3VtZW50QnVpbGRlciBkb2NCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJCURvY3VtZW50IGRvYyA9IGRvY0J1aWxkZXIubmV3RG9jdW1lbnQoKTsKLQotCQkJaWYgKGNvbmZpZyA9PSBudWxsKQotCQkJCXRocm93IFV0aWxzLm5ld0NvcmVFeGNlcHRpb24oTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90U2F2ZU5vbkV4aXN0aW5nQ29uZmlnIiksbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJY29uZmlnLnNldERhdGUobmV3IERhdGUoKSk7Ci0JCQlkb2MuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNvbW1lbnQoIkNyZWF0ZWQgb24gIiArIGNvbmZpZy5nZXREYXRlKCkudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlFbGVtZW50IGNvbmZpZ0VsZW1lbnQgPSBjb25maWcudG9YTUwoZG9jKTsKLQkJCWRvYy5hcHBlbmRDaGlsZChjb25maWdFbGVtZW50KTsKLQotCQkJLy8gV3JpdGUgb3V0IHRvIGEgZmlsZQotCQkJCi0JCQlUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcj10cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuRU5DT0RJTkcsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQl0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZShkb2MpOwotCQkJcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChzdHJlYW0pOwotCi0JCQl0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLHJlc3VsdCk7Ci0JCQkvL3dpbGwgY2xvc2UgdGhlIHN0cmVhbSBpbiB0aGUgY2FsbGVyCi0JCQkvL3N0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbHMubmV3Q29yZUV4Y2VwdGlvbigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3VsdC5zZXRPdXRwdXRTdHJlYW0obnVsbCk7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWNvbmNpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWxvbmcgbGFzdENoYW5nZSA9IGNvbmZpZy5nZXREYXRlKCkuZ2V0VGltZSgpOwotCQlTaXRlRW50cnlbXSBzaXRlcyA9IGNvbmZpZy5nZXRTaXRlcygpOwotCQlmb3IgKGludCBzPTA7IHM8c2l0ZXMubGVuZ3RoOyBzKyspIHsKLQkJCWxvbmcgc2l0ZVRpbWVzdGFtcCA9IHNpdGVzW3NdLmdldENoYW5nZVN0YW1wKCk7Ci0JCQlpZiAoc2l0ZVRpbWVzdGFtcCA+IGxhc3RDaGFuZ2UpCi0JCQkJc2l0ZXNbc10ubG9hZEZyb21EaXNrKGxhc3RDaGFuZ2UpOwotCQl9Ci0JCWNvbmZpZy5zZXREaXJ0eSh0cnVlKTsKLQl9Ci0JCi0JcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYzQ0NTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci0KLQotCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1Db25maWd1cmF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb25GYWN0b3J5IHsKLQlwdWJsaWMgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBnZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkgewotCQlyZXR1cm4gUGxhdGZvcm1Db25maWd1cmF0aW9uLmdldEN1cnJlbnQoKTsKLQl9Ci0JcHVibGljIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFBsYXRmb3JtQ29uZmlndXJhdGlvbih1cmwpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotCQkJCXRocm93IChJT0V4Y2VwdGlvbillOwotCQkJZWxzZQotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5FbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGx1Z2luRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2YTZkMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9QbHVnaW5FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFBsdWdpbkVudHJ5IHsKLQotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpblZlcnNpb247Ci0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklkOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQkKLQlwdWJsaWMgUGx1Z2luRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB1cmwgcmVsYXRpdmUgdG8gdGhlIHNpdGUgbG9jYXRpb246IHBsdWdpbnMvb3JnLmVjbGlwc2UuZm9vL3BsdWdpbi54bWwKLQkgKiBOb3RlOiB0byBkbzogd2Ugc2hvdWxkIHByb2JhYmx5IG9ubHkgdXNlIHBsdWdpbnMvb3JnLmVjbGlwc2UuZm9vLyBpbiB0aGUgZnV0dXJlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCQotCS8qKgotCSAqIHVybCBpcyByZWxhdGl2ZSB0byB0aGUgc2l0ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gaWRlbnRpZmllciBmb3IgdGhpcyBlbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZGVudGlmaWVyKCkgewotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Zy1pbiB2ZXJzaW9uIGZvciB0aGlzIGVudHJ5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblZlcnNpb24oKSB7Ci0JCXJldHVybiBwbHVnaW5WZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbnRyeSBkZXNjcmliZXMgYSBmdWxsIHBsdWctaW4sIG9yIAotCSAqIGEgcGx1Zy1pbiBmcmFnbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBhIHBsdWctaW4gZnJhZ21lbnQsIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgYSBwbHVnLWluCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiBpZGVudGlmaWVyLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIGVudHJ5IGlkZW50aWZpZXIuCi0JICovCi0Jdm9pZCBzZXRQbHVnaW5JZGVudGlmaWVyKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiB2ZXJzaW9uLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gcGx1Z2luVmVyc2lvbiB0aGUgZW50cnkgdmVyc2lvbi4KLQkgKi8KLQl2b2lkIHNldFBsdWdpblZlcnNpb24oU3RyaW5nIHBsdWdpblZlcnNpb24pIHsKLQkJdGhpcy5wbHVnaW5WZXJzaW9uID0gcGx1Z2luVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGVudHJ5IHJlcHJlc2VudHMgYSBmcmFnbWVudCBvciBwbHVnLWluLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gaXNGcmFnbWVudCBmcmFnbWVudCBzZXR0aW5nCi0JICovCi0JcHVibGljIHZvaWQgaXNGcmFnbWVudChib29sZWFuIGlzRnJhZ21lbnQpIHsKLQkJdGhpcy5pc0ZyYWdtZW50ID0gaXNGcmFnbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIG1zZyA9IChnZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpP2dldFBsdWdpbklkZW50aWZpZXIoKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSBnZXRQbHVnaW5WZXJzaW9uKCkhPW51bGw/IiAiK2dldFBsdWdpblZlcnNpb24oKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbXNnICs9IGlzRnJhZ21lbnQoKT8iIGZyYWdtZW50IjoiIHBsdWdpbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gbXNnOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHBsdWdpbiBlbnRyeQotCSAqLwotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7Ci0JCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkKLQkJCXJldHVybiB2ZXJzaW9uSWQ7Ci0KLQkJU3RyaW5nIGlkID0gZ2V0UGx1Z2luSWRlbnRpZmllcigpOwotCQlTdHJpbmcgdmVyID0gZ2V0UGx1Z2luVmVyc2lvbigpOwotCQlpZiAoaWQgIT0gbnVsbCAmJiB2ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyKTsKLQkJCQlyZXR1cm4gdmVyc2lvbklkOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJQbHVnaW5FbnRyeS52ZXJzaW9uRXJyb3IiLCBpZCwgdmVyKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0KLQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHZlcnNpb25JZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgcGx1Z2luIGVudHJ5LiAKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKSB7Ci0JCXNldFBsdWdpbklkZW50aWZpZXIoaWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpOwotCQlzZXRQbHVnaW5WZXJzaW9uKGlkZW50aWZpZXIuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCX0JCi0KLQkvKioKLQkgKiBDb21wYXJlcyB0d28gcGx1Z2luIGVudHJpZXMgZm9yIGVxdWFsaXR5Ci0JICogCi0JICogQHBhcmFtIG9iamVjdCBwbHVnaW4gZW50cnkgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBlbnRyaWVzIGFyZSBlcXVhbCwgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJUGx1Z2luRW50cnkgZSA9IChQbHVnaW5FbnRyeSkgb2JqZWN0OwotCQlyZXR1cm4gZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1BsdWdpblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGx1Z2luUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNjNhZWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUGx1Z2luUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLio7Ci0KLS8qKgotICogUGFyc2UgZGVmYXVsdCBmZWF0dXJlLnhtbAotICovCi0KLXB1YmxpYyBjbGFzcyBQbHVnaW5QYXJzZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzIElDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPQotCQlTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7Ci0KLQlwcml2YXRlIGNsYXNzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gewotCQlwdWJsaWMgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbihTdHJpbmcgYXJnMCkgewotCQkJc3VwZXIoYXJnMCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdEZlYXR1cmVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgUGx1Z2luUGFyc2VyKCkgewotCQlzdXBlcigpOwotCQl0cnkgewotCQkJcGFyc2VyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQbHVnaW5FbnRyeSBwYXJzZShGaWxlIHBsdWdpbkZpbGUpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGluID0gbnVsbDs7Ci0JCXRyeXsKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwbHVnaW5GaWxlKTsKLQkJCXJldHVybiBwYXJzZShpbiwgUExVR0lOUyArICIvIiArIHBsdWdpbkZpbGUuZ2V0UGFyZW50RmlsZSgpLmdldE5hbWUoKSArICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9ZmluYWxseXsKLQkJCWlmIChpbiAhPSBudWxsKXsKLQkJCQl0cnl7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfWNhdGNoKElPRXhjZXB0aW9uIGUpewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQbHVnaW5FbnRyeSBwYXJzZShJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIGJ1bmRsZVVybCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKLQkJCXBsdWdpbkVudHJ5LnNldFVSTChidW5kbGVVcmwpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwotCQl9IGNhdGNoIChQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkLCB3ZSBzdG9wcGVkIHRoZSBwYXJzaW5nIHdoZW4gd2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZAotCQkJLy8vIG5vIG5lZWQgdG8gcHVyc3VlIHRoZSBwYXJzaW5nCi0JCX0KLQkJcmV0dXJuIHBsdWdpbkVudHJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgdGFnID0gbG9jYWxOYW1lLnRyaW0oKTsKLQotCQlpZiAodGFnLmVxdWFsc0lnbm9yZUNhc2UoQ0ZHX1BMVUdJTikpIHsKLQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQoZmFsc2UpOwkJCQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0YWcuZXF1YWxzSWdub3JlQ2FzZShDRkdfRlJBR01FTlQpKSB7Ci0JCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KHRydWUpOwkJCQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKiAKLQkgKiBwcm9jZXNzIHBsdWdpbiBlbnRyeSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlpZCA9ICJfbm9faWRfIjsgLy8kTk9OLU5MUy0xJAotCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXJzaW9uKSk7Ci0JCQotCQkvLyBzdG9wIHBhcnNpbmcgbm93Ci0JCXRocm93IG5ldyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uKCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1Byb2R1Y3RQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUHJvZHVjdFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjN2YxOTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvUHJvZHVjdFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLQotLyoqCi0gKiBNYXBzIHByaW1hcnkgZmVhdHVyZXMgdG8gSVByb2R1Y3QKLSAqLwotcHVibGljIGNsYXNzIFByb2R1Y3RQcm92aWRlciBpbXBsZW1lbnRzIElQcm9kdWN0UHJvdmlkZXJ7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9kdWN0UHJvdmlkZXIjZ2V0UHJvZHVjdHMoKQotCSAqLwotCXB1YmxpYyBJUHJvZHVjdFtdIGdldFByb2R1Y3RzKCkgewotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElQcm9kdWN0WzBdOwotCQllbHNlIHsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkRmVhdHVyZUVudHJpZXMoKTsKLQkJCUFycmF5TGlzdCBwcmltYXJ5RmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGZlYXR1cmVzW2ldLmNhbkJlUHJpbWFyeSgpKQotCQkJCQlwcmltYXJ5RmVhdHVyZXMuYWRkKGZlYXR1cmVzW2ldKTsKLQkJCS8vIFRPRE8gaGFuZGxlIHVubWFuYWdlZCBwbHVnaW5zIGxhdGVyCi0JCQlyZXR1cm4gKElQcm9kdWN0W10pcHJpbWFyeUZlYXR1cmVzLnRvQXJyYXkobmV3IElQcm9kdWN0W3ByaW1hcnlGZWF0dXJlcy5zaXplKCldKTsKLQkJfQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2R1Y3RQcm92aWRlciNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5nZXRTdHJpbmcoIlByb2R1Y3RQcm92aWRlciIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZUVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EwODkwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9TaXRlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLnczYy5kb20uKjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi0KLXB1YmxpYyBjbGFzcyBTaXRlRW50cnkgaW1wbGVtZW50cyBJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnksIElDb25maWd1cmF0aW9uQ29uc3RhbnRzewkKLQlwcml2YXRlIFVSTCB1cmw7IC8vIHRoaXMgaXMgdGhlIGV4dGVybmFsIFVSTCBmb3IgdGhlIHNpdGUKLQlwcml2YXRlIFVSTCByZXNvbHZlZFVSTDsgLy8gdGhpcyBpcyB0aGUgcmVzb2x2ZWQgVVJMIHVzZWQgaW50ZXJuYWxseQotCXByaXZhdGUgSVNpdGVQb2xpY3kgcG9saWN5OwotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVhYmxlID0gdHJ1ZTsKLQlwcml2YXRlIE1hcCBmZWF0dXJlRW50cmllczsKLQlwcml2YXRlIEFycmF5TGlzdCBwbHVnaW5FbnRyaWVzOwotCXByaXZhdGUgbG9uZyBjaGFuZ2VTdGFtcDsKLQlwcml2YXRlIGxvbmcgZmVhdHVyZXNDaGFuZ2VTdGFtcDsKLQlwcml2YXRlIGxvbmcgcGx1Z2luc0NoYW5nZVN0YW1wOwotCXByaXZhdGUgU3RyaW5nIGxpbmtGaWxlTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmZpZzsKLQkKLQlwcml2YXRlIHN0YXRpYyBGZWF0dXJlUGFyc2VyIGZlYXR1cmVQYXJzZXIgPSBuZXcgRmVhdHVyZVBhcnNlcigpOwotCXByaXZhdGUgc3RhdGljIFBsdWdpblBhcnNlciBwbHVnaW5QYXJzZXIgPSBuZXcgUGx1Z2luUGFyc2VyKCk7Ci0KLQlwdWJsaWMgU2l0ZUVudHJ5KFVSTCB1cmwpIHsKLQkJdGhpcyh1cmwsbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBTaXRlRW50cnkoVVJMIHVybCwgSVNpdGVQb2xpY3kgcG9saWN5KSB7Ci0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTCgicGxhdGZvcm06L2Jhc2UvIik7IC8vJE5PTi1OTFMtMSQgdHJ5IHVzaW5nIHBsYXRmb3JtLXJlbGF0aXZlIFVSTAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQl1cmwgPSBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uZ2V0SW5zdGFsbFVSTCgpOyAvLyBlbnN1cmUgd2UgY29tZSB1cCAuLi4gdXNlIGFic29sdXRlIGZpbGUgVVJMCi0JCQl9Ci0JCQkKLQkJaWYgKHBvbGljeSA9PSBudWxsKQotCQkJcG9saWN5ID0gbmV3IFNpdGVQb2xpY3koREVGQVVMVF9QT0xJQ1lfVFlQRSwgREVGQVVMVF9QT0xJQ1lfTElTVCk7Ci0KLQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJLy8gVE9ETyByZW1vdmUgdGhpcyB3aGVuIHBsYXRmb3JtIGZpeGVzIGxvY2FsIGZpbGUgdXJsJ3MKLQkJCQl0aGlzLnVybCA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLnRvVVJMKCk7IAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJdGhpcy51cmwgPSB1cmw7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJdGhpcy51cmwgPSB1cmw7Ci0JCQotCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKLQkJdGhpcy5yZXNvbHZlZFVSTCA9IHRoaXMudXJsOwotCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJwbGF0Zm9ybSIpKSB7IC8vICROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCXJlc29sdmVkVVJMID0gUGxhdGZvcm1Db25maWd1cmF0aW9uLnJlc29sdmVQbGF0Zm9ybVVSTCh1cmwpOyAvLyAxOTUzNgotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHdpbGwgdXNlIHRoZSBiYXNlbGluZSBVUkwgLi4uCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25maWcoQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZygpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjZ2V0VVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLQkvKgotCSogQHNlZSBJU2l0ZUVudHJ5I2dldFNpdGVQb2xpY3koKQotCSovCi0JcHVibGljIElTaXRlUG9saWN5IGdldFNpdGVQb2xpY3koKSB7Ci0JCXJldHVybiBwb2xpY3k7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjc2V0U2l0ZVBvbGljeShJU2l0ZVBvbGljeSkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2l0ZVBvbGljeShJU2l0ZVBvbGljeSBwb2xpY3kpIHsKLQkJaWYgKHBvbGljeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVFbnRyeSNnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEZlYXR1cmVzKCkgewotCQlyZXR1cm4gZ2V0RGV0ZWN0ZWRGZWF0dXJlcygpOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUVudHJ5I2dldFBsdWdpbnMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5zKCkgewotCi0JCUlTaXRlUG9saWN5IHBvbGljeSA9IGdldFNpdGVQb2xpY3koKTsKLQotCQlpZiAocG9saWN5LmdldFR5cGUoKSA9PSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpCi0JCQlyZXR1cm4gcG9saWN5LmdldExpc3QoKTsKLQotCQlpZiAocG9saWN5LmdldFR5cGUoKSA9PSBJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUpIHsKLQkJCUFycmF5TGlzdCBkZXRlY3RlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZ2V0RGV0ZWN0ZWRQbHVnaW5zKCkpKTsKLQkJCVN0cmluZ1tdIGV4Y2x1ZGVkUGx1Z2lucyA9IHBvbGljeS5nZXRMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVkUGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChkZXRlY3RlZFBsdWdpbnMuY29udGFpbnMoZXhjbHVkZWRQbHVnaW5zW2ldKSkKLQkJCQkJZGV0ZWN0ZWRQbHVnaW5zLnJlbW92ZShleGNsdWRlZFBsdWdpbnNbaV0pOwotCQkJfQotCQkJcmV0dXJuIChTdHJpbmdbXSkgZGV0ZWN0ZWRQbHVnaW5zLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCX0KLQotCQkvLyBiYWQgcG9saWN5IHR5cGUKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotCi0JcHVibGljIFBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsKLQkJU3RyaW5nW10gcGx1Z2luVVJMcyA9IGdldFBsdWdpbnMoKTsKLQkJLy8gaGFzaCB0aGUgYXJyYXksIGZvciBmYXN0ZXIgbG9va3VwcwotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKHBsdWdpblVSTHMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpblVSTHMubGVuZ3RoOyBpKyspCi0JCQltYXAucHV0KHBsdWdpblVSTHNbaV0sIHBsdWdpblVSTHNbaV0pOwotCQkKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkKLQkJCQlkZXRlY3RQbHVnaW5zKCk7Ci0JCQotCQlBcnJheUxpc3QgcGx1Z2lucyA9IG5ldyBBcnJheUxpc3QocGx1Z2luVVJMcy5sZW5ndGgpOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luRW50cmllcy5zaXplKCk7IGkrKykgewotCQkJUGx1Z2luRW50cnkgcCA9IChQbHVnaW5FbnRyeSlwbHVnaW5FbnRyaWVzLmdldChpKTsKLQkJCWlmIChtYXAuY29udGFpbnNLZXkocC5nZXRVUkwoKSkpCi0JCQkJcGx1Z2lucy5hZGQocCk7Ci0JCX0KLQkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKXBsdWdpbnMudG9BcnJheShuZXcgUGx1Z2luRW50cnlbcGx1Z2lucy5zaXplKCldKTsKLQl9Ci0JCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjZ2V0Q2hhbmdlU3RhbXAoKQotCSAqLwotCXB1YmxpYyBsb25nIGdldENoYW5nZVN0YW1wKCkgewotCQlpZiAoY2hhbmdlU3RhbXAgPT0gMCkKLQkJCWNvbXB1dGVDaGFuZ2VTdGFtcCgpOwotCQlyZXR1cm4gY2hhbmdlU3RhbXA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0RmVhdHVyZXNDaGFuZ2VTdGFtcCgpIHsKLQkJaWYgKGZlYXR1cmVzQ2hhbmdlU3RhbXAgPT0gMCkKLQkJCWNvbXB1dGVGZWF0dXJlc0NoYW5nZVN0YW1wKCk7Ci0JCXJldHVybiBmZWF0dXJlc0NoYW5nZVN0YW1wOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUVudHJ5I2dldFBsdWdpbnNDaGFuZ2VTdGFtcCgpCi0JICovCi0JcHVibGljIGxvbmcgZ2V0UGx1Z2luc0NoYW5nZVN0YW1wKCkgewotCQlpZiAocGx1Z2luc0NoYW5nZVN0YW1wID09IDApCi0JCQljb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCk7Ci0JCXJldHVybiBwbHVnaW5zQ2hhbmdlU3RhbXA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTaXRlRW50cnkjaXNVcGRhdGVhYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKSB7Ci0JCXJldHVybiB1cGRhdGVhYmxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVhYmxlKGJvb2xlYW4gdXBkYXRlYWJsZSkgewotCQl0aGlzLnVwZGF0ZWFibGUgPSB1cGRhdGVhYmxlOwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZUVudHJ5I2lzTmF0aXZlbHlMaW5rZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlbHlMaW5rZWQoKSB7Ci0JCXJldHVybiBpc0V4dGVybmFsbHlMaW5rZWRTaXRlKCk7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRSZXNvbHZlZFVSTCgpIHsKLQkJcmV0dXJuIHJlc29sdmVkVVJMOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlY3QgbmV3IGZlYXR1cmVzICh0aW1lc3RhbXAgPiBjdXJyZW50IHNpdGUgdGltZXN0YW1wKQotCSAqIGFuZCB2YWxpZGF0ZXMgZXhpc3RpbmcgZmVhdHVyZXMgKHRoZXkgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRldGVjdEZlYXR1cmVzKCkgewotCi0JCWlmIChmZWF0dXJlRW50cmllcyAhPSBudWxsKQotCQkJdmFsaWRhdGVGZWF0dXJlRW50cmllcygpOwotCQllbHNlCi0JCQlmZWF0dXJlRW50cmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKCFQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc3VwcG9ydHNEZXRlY3Rpb24ocmVzb2x2ZWRVUkwpKQotCQkJcmV0dXJuOwotCi0JCS8vIGxvY2F0ZSBmZWF0dXJlIGVudHJpZXMgb24gc2l0ZQotCQlGaWxlIHNpdGVSb290ID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJRmlsZSBmZWF0dXJlc0RpciA9IG5ldyBGaWxlKHNpdGVSb290LCBGRUFUVVJFUyk7Ci0JCWlmIChmZWF0dXJlc0Rpci5leGlzdHMoKSkgewotCQkJLy8gaGFuZGxlIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMgdW5kZXIgdGhlIGZlYXR1cmVzIGRpcmVjdG9yeQotCQkJRmlsZVtdIGRpcnMgPSBmZWF0dXJlc0Rpci5saXN0RmlsZXMobmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZikgewotCQkJCQlib29sZWFuIHZhbGlkID0gZi5pc0RpcmVjdG9yeSgpICYmIChuZXcgRmlsZShmLEZFQVRVUkVfWE1MKS5leGlzdHMoKSk7Ci0JCQkJCWlmICghdmFsaWQpCi0JCQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaXRlRW50cnkuY2Fubm90RmluZEZlYXR1cmVJbkRpciIsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gdmFsaWQ7Ci0JCQkJfQotCQkJfSk7Ci0JCQotCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpcnMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZSBmZWF0dXJlWE1MID0gbmV3IEZpbGUoZGlyc1tpbmRleF0sIEZFQVRVUkVfWE1MKTsKLQkJCQkJaWYgKGZlYXR1cmVYTUwubGFzdE1vZGlmaWVkKCkgPD0gZmVhdHVyZXNDaGFuZ2VTdGFtcCAmJgotCQkJCQkJZGlyc1tpbmRleF0ubGFzdE1vZGlmaWVkKCkgPD0gZmVhdHVyZXNDaGFuZ2VTdGFtcCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlVUkwgZmVhdHVyZVVSTCA9IGZlYXR1cmVYTUwudG9VUkwoKTsKLQkJCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmVFbnRyeSA9IGZlYXR1cmVQYXJzZXIucGFyc2UoZmVhdHVyZVVSTCk7Ci0JCQkJCWlmIChmZWF0dXJlRW50cnkgIT0gbnVsbCkKLQkJCQkJCWFkZEZlYXR1cmVFbnRyeShmZWF0dXJlRW50cnkpOwotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVV0aWxzLmxvZyhNZXNzYWdlcy5nZXRTdHJpbmcoIkluc3RhbGxlZFNpdGVQYXJzZXIuVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlIiwgZmVhdHVyZXNEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlVdGlscy5kZWJ1ZyhyZXNvbHZlZFVSTC50b1N0cmluZygpICsgIiBsb2NhdGVkICAiICsgZmVhdHVyZUVudHJpZXMuc2l6ZSgpICsgIiBmZWF0dXJlKHMpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBEZXRlY3QgbmV3IHBsdWdpbnMgKHRpbWVzdGFtcCA+IGN1cnJlbnQgc2l0ZSB0aW1lc3RhbXApCi0JICogYW5kIHZhbGlkYXRlcyBleGlzdGluZyBwbHVnaW5zICh0aGV5IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkKQotCSAqLwotCXByaXZhdGUgdm9pZCBkZXRlY3RQbHVnaW5zKCkgewotCQlib29sZWFuIGNvbXBhcmVUaW1lU3RhbXBzID0gZmFsc2U7Ci0JCWlmIChwbHVnaW5FbnRyaWVzICE9IG51bGwpIHsKLQkJCXZhbGlkYXRlUGx1Z2luRW50cmllcygpOwotCQkJY29tcGFyZVRpbWVTdGFtcHMgPSB0cnVlOyAvLyBvbmx5IHBpY2sgdXAgbmV3ZXIgcGx1Z2lucwotCQl9IGVsc2UKLQkJCXBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJaWYgKCFQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uc3VwcG9ydHNEZXRlY3Rpb24ocmVzb2x2ZWRVUkwpKQotCQkJcmV0dXJuOwotCi0JCS8vIGxvY2F0ZSBwbHVnaW4gZW50cmllcyBvbiBzaXRlCi0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKSwgUExVR0lOUyk7Ci0JCQotCQlpZiAocGx1Z2luc0Rpci5leGlzdHMoKSAmJiBwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IHBsdWdpbnNEaXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSl7Ci0JCQkJCWRldGVjdFVucGFja2VkUGx1Z2luKGZpbGVzW2ldLCBjb21wYXJlVGltZVN0YW1wcyk7Ci0JCQkJfWVsc2UgaWYoZmlsZXNbaV0uZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpeyAvLyROT04tTkxTLTEkCi0JCQkJCWRldGVjdFBhY2tlZFBsdWdpbihmaWxlc1tpXSwgY29tcGFyZVRpbWVTdGFtcHMpOwotCQkJCX1lbHNlewotCQkJCQkvLyBub3QgYnVuZGxlIGZpbGUKLQkJCQl9Ci0JCQl9Ci0JCX0gCi0JCQotCQlVdGlscy5kZWJ1ZyhyZXNvbHZlZFVSTC50b1N0cmluZygpICsgIiBsb2NhdGVkICAiICsgcGx1Z2luRW50cmllcy5zaXplKCkgKyAiIHBsdWdpbihzKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZSBhIHBsdWdpbiBqYXIKLQkgKiBAcGFyYW0gY29tcGFyZVRpbWVTdGFtcHMgc2V0IHRvIHRydWUgd2hlbiBsb29raW5nIGZvciBwbHVnaW5zIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lIHRoZXkgd2VyZSBkZXRlY3RlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZXRlY3RQYWNrZWRQbHVnaW4oRmlsZSBmaWxlLCBib29sZWFuIGNvbXBhcmVUaW1lU3RhbXBzKSB7Ci0JCS8vIHBsdWdpbiB0byBydW4gZGlyZWN0bHkgZnJvbSBqYXIKLQkJaWYgKGNvbXBhcmVUaW1lU3RhbXBzICYmIGZpbGUubGFzdE1vZGlmaWVkKCkgPD0gcGx1Z2luc0NoYW5nZVN0YW1wKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGVudHJ5TmFtZSA9IE1FVEFfTUFOSUZFU1RfTUY7Ci0JCVppcEZpbGUgeiA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGJ1bmRsZU1hbmlmZXN0SW4gPSBudWxsOwotCQlJbnB1dFN0cmVhbSBwbHVnaW5NYW5pZmVzdEluID0gbnVsbDsKLQkJU3RyaW5nIHBsdWdpblVSTCA9IFBMVUdJTlMgKyAiLyIgKyBmaWxlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJLy8gRmlyc3QsIGNoZWNrIGlmIGhhcyB2YWxpZCBidW5kbGUgbWFuaWZlc3QKLQkJCXogPSBuZXcgWmlwRmlsZShmaWxlKTsKLQkJCWlmICh6LmdldEVudHJ5KGVudHJ5TmFtZSkgIT0gbnVsbCkgewotCQkJCWJ1bmRsZU1hbmlmZXN0SW4gPSB6LmdldElucHV0U3RyZWFtKG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpKTsKLQkJCQlCdW5kbGVNYW5pZmVzdCBtYW5pZmVzdCA9IG5ldyBCdW5kbGVNYW5pZmVzdChidW5kbGVNYW5pZmVzdEluLAotCQkJCQkJcGx1Z2luVVJMKTsKLQkJCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQkJYWRkUGx1Z2luRW50cnkobWFuaWZlc3QuZ2V0UGx1Z2luRW50cnkoKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBubyBidW5kbGUgbWFuaWZlc3QsIGNoZWNrIGZvciBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbAotCQkJZW50cnlOYW1lID0gUExVR0lOX1hNTDsKLQkJCWlmICh6LmdldEVudHJ5KGVudHJ5TmFtZSkgPT0gbnVsbCkgewotCQkJCWVudHJ5TmFtZSA9IEZSQUdNRU5UX1hNTDsKLQkJCX0KLQkJCWlmICh6LmdldEVudHJ5KGVudHJ5TmFtZSkgIT0gbnVsbCkgewotCQkJCXBsdWdpbk1hbmlmZXN0SW4gPSB6LmdldElucHV0U3RyZWFtKG5ldyBaaXBFbnRyeShlbnRyeU5hbWUpKTsKLQkJCQlQbHVnaW5FbnRyeSBlbnRyeTEgPSBwbHVnaW5QYXJzZXIucGFyc2UocGx1Z2luTWFuaWZlc3RJbiwKLQkJCQkJCXBsdWdpblVSTCk7Ci0JCQkJYWRkUGx1Z2luRW50cnkoZW50cnkxKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTUpIHsKLQkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nMiA9IHBsdWdpblVSTCArICIhIiArIGVudHJ5TmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJVXRpbHMubG9nKE1lc3NhZ2VzLmdldFN0cmluZygiSW5zdGFsbGVkU2l0ZVBhcnNlci5FcnJvckFjY2Vzc2luZyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJcGx1Z2luRmlsZVN0cmluZzIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZTMpIHsKLQkJCVN0cmluZyBwbHVnaW5GaWxlU3RyaW5nMSA9IHBsdWdpblVSTCArICIhIiArIGVudHJ5TmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJVXRpbHMubG9nKE1lc3NhZ2VzLmdldFN0cmluZygKLQkJCQkJIkluc3RhbGxlZFNpdGVQYXJzZXIuRXJyb3JQYXJzaW5nRmlsZSIsIHBsdWdpbkZpbGVTdHJpbmcxKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidW5kbGVNYW5pZmVzdEluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlidW5kbGVNYW5pZmVzdEluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTQpIHsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGx1Z2luTWFuaWZlc3RJbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcGx1Z2luTWFuaWZlc3RJbi5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHogIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXouY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gZmlsZSBhIHBsdWdpbiBkaXJlY3RvcnkKLQkgKiBAcGFyYW0gY29tcGFyZVRpbWVTdGFtcHMgc2V0IHRvIHRydWUgd2hlbiBsb29raW5nIGZvciBwbHVnaW5zIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lIHRoZXkgd2VyZSBkZXRlY3RlZAotCSAqLwotCXByaXZhdGUgdm9pZCBkZXRlY3RVbnBhY2tlZFBsdWdpbihGaWxlIGZpbGUsIGJvb2xlYW4gY29tcGFyZVRpbWVTdGFtcHMpIHsKLQkJLy8gdW5wYWNrZWQgcGx1Z2luCi0JCWxvbmcgZGlyVGltZXN0YW1wID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoZmlsZSwgTUVUQV9NQU5JRkVTVF9NRik7Ci0JCXRyeSB7Ci0JCQkvLyBGaXJzdCwgY2hlY2sgaWYgaGFzIHZhbGlkIGJ1bmRsZSBtYW5pZmVzdAotCQkJQnVuZGxlTWFuaWZlc3QgYnVuZGxlTWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QocGx1Z2luRmlsZSk7Ci0JCQlpZiAoYnVuZGxlTWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQlpZiAoY29tcGFyZVRpbWVTdGFtcHMKLQkJCQkJCSYmIGRpclRpbWVzdGFtcCA8PSBwbHVnaW5zQ2hhbmdlU3RhbXAKLQkJCQkJCSYmIHBsdWdpbkZpbGUubGFzdE1vZGlmaWVkKCkgPD0gcGx1Z2luc0NoYW5nZVN0YW1wKQotCQkJCQlyZXR1cm47Ci0JCQkJUGx1Z2luRW50cnkgZW50cnkgPSBidW5kbGVNYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpOwotCQkJCWFkZFBsdWdpbkVudHJ5KGVudHJ5KTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbm8gYnVuZGxlIG1hbmlmZXN0LCBjaGVjayBmb3IgcGx1Z2luLnhtbCBvciBmcmFnbWVudC54bWwKLQkJCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoZmlsZSwgUExVR0lOX1hNTCk7Ci0JCQkJaWYgKCFwbHVnaW5GaWxlLmV4aXN0cygpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGZpbGUsIEZSQUdNRU5UX1hNTCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKHBsdWdpbkZpbGUuZXhpc3RzKCkgJiYgIXBsdWdpbkZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQkvLyBUT0RPIGluIHRoZSBmdXR1cmUsIGFzc3VtZSB0aGF0IHRoZSB0aW1lc3RhbXBzIGFyZSBub3QKLQkJCQkJLy8gcmVsaWFibGUsCi0JCQkJCS8vIG9yIHRoYXQgdGhlIHVzZXIgbWFudWFsbHkgbW9kaWZpZWQgYW4gZXhpc3RpbmcgcGx1Z2luLAotCQkJCQkvLyBzbwotCQkJCQkvLyB0aGUgYXBwYXJlbnRseSBtb2RpZmVkIHBsdWdpbiBtYXkgYWN0dWFsbHkgYmUgY29uZmlndXJlZAotCQkJCQkvLyBhbHJlYWR5LgotCQkJCQkvLyBXZSB3aWxsIG5lZWQgdG8gZG91YmxlIGNoZWNrIGZvciB0aGlzLiBFTkQgdG8gZG8uCi0JCQkJCWlmIChjb21wYXJlVGltZVN0YW1wcyAKLQkJCQkJCQkmJiBkaXJUaW1lc3RhbXAgPD0gcGx1Z2luc0NoYW5nZVN0YW1wCi0JCQkJCQkJJiYgcGx1Z2luRmlsZS5sYXN0TW9kaWZpZWQoKSA8PSBwbHVnaW5zQ2hhbmdlU3RhbXApCi0JCQkJCQlyZXR1cm47Ci0JCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gcGx1Z2luUGFyc2VyLnBhcnNlKHBsdWdpbkZpbGUpOwotCQkJCQlhZGRQbHVnaW5FbnRyeShlbnRyeSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcGx1Z2luRmlsZVN0cmluZyA9IHBsdWdpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykKLQkJCQlVdGlscy5sb2coVXRpbHMubmV3U3RhdHVzKE1lc3NhZ2VzLmdldFN0cmluZygKLQkJCQkJCSJJbnN0YWxsZWRTaXRlUGFyc2VyLkVycm9yUGFyc2luZ0ZpbGUiLCBwbHVnaW5GaWxlU3RyaW5nKSwgZSkpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbnN0YWxsZWRTaXRlUGFyc2VyLkVycm9yQWNjZXNzaW5nIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGx1Z2luRmlsZVN0cmluZykpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgcGx1Z2luRmlsZVN0cmluZyA9IHBsdWdpbkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKAotCQkJCQkiSW5zdGFsbGVkU2l0ZVBhcnNlci5FcnJvclBhcnNpbmdGaWxlIiwgcGx1Z2luRmlsZVN0cmluZykpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgb2YgZmVhdHVyZSB1cmwncyAocmVsYXRpdmUgdG8gc2l0ZSkKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBTdHJpbmdbXSBnZXREZXRlY3RlZEZlYXR1cmVzKCkgewotCQlpZiAoZmVhdHVyZUVudHJpZXMgPT0gbnVsbCkKLQkJCWRldGVjdEZlYXR1cmVzKCk7Ci0JCVN0cmluZ1tdIGZlYXR1cmVzID0gbmV3IFN0cmluZ1tmZWF0dXJlRW50cmllcy5zaXplKCldOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVFbnRyaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCWZlYXR1cmVzW2ldID0gKChGZWF0dXJlRW50cnkpaXRlcmF0b3IubmV4dCgpKS5nZXRVUkwoKTsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCBvZiBwbHVnaW4gdXJsJ3MgKHJlbGF0aXZlIHRvIHNpdGUpCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nW10gZ2V0RGV0ZWN0ZWRQbHVnaW5zKCkgewotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQotCQkJZGV0ZWN0UGx1Z2lucygpOwotCQkKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbcGx1Z2luRW50cmllcy5zaXplKCldOwotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2lucy5sZW5ndGg7IGkrKykKLQkJCXBsdWdpbnNbaV0gPSAoKFBsdWdpbkVudHJ5KXBsdWdpbkVudHJpZXMuZ2V0KGkpKS5nZXRVUkwoKTsKLQkJcmV0dXJuIHBsdWdpbnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVDaGFuZ2VTdGFtcCgpIHsKLQkJY2hhbmdlU3RhbXAgPSBNYXRoLm1heChjb21wdXRlRmVhdHVyZXNDaGFuZ2VTdGFtcCgpLCBjb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCkpOwotLy8JCWNoYW5nZVN0YW1wSXNWYWxpZCA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbG9uZyBjb21wdXRlRmVhdHVyZXNDaGFuZ2VTdGFtcCgpIHsKLQkJaWYgKGZlYXR1cmVzQ2hhbmdlU3RhbXAgPiAwKQotCQkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7Ci0JCQotCQlsb25nIHN0YXJ0ID0gMDsKLQkJaWYgKENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuREVCVUcpCi0JCQlzdGFydCA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Ci0JCVN0cmluZ1tdIGZlYXR1cmVzID0gZ2V0RmVhdHVyZXMoKTsKLQkKLQkJLy8gY29tcHV0ZSBzdGFtcCBmb3IgdGhlIGZlYXR1cmVzIGRpcmVjdG9yeQotCQlsb25nIGRpclN0YW1wID0gMDsKLQkJaWYgKFBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCkpIHsKLQkJCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUocm9vdCwgRkVBVFVSRVMpOwotCQkJZGlyU3RhbXAgPSBmZWF0dXJlc0Rpci5sYXN0TW9kaWZpZWQoKTsKLQkJfQotCQlmZWF0dXJlc0NoYW5nZVN0YW1wID0gTWF0aC5tYXgoZGlyU3RhbXAsIGNvbXB1dGVTdGFtcChmZWF0dXJlcykpOwotCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykgewotCQkJbG9uZyBlbmQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCQkJVXRpbHMuZGVidWcocmVzb2x2ZWRVUkwudG9TdHJpbmcoKSArICIgZmVhdHVyZSBzdGFtcDogIiArIGZlYXR1cmVzQ2hhbmdlU3RhbXAgKyAiIGluICIgKyAoZW5kIC0gc3RhcnQpICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JCX0KLQkJcmV0dXJuIGZlYXR1cmVzQ2hhbmdlU3RhbXA7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgbG9uZyBjb21wdXRlUGx1Z2luc0NoYW5nZVN0YW1wKCkgewotCQlpZiAocGx1Z2luc0NoYW5nZVN0YW1wID4gMCkKLQkJCXJldHVybiBwbHVnaW5zQ2hhbmdlU3RhbXA7Ci0JCQotCQlpZiAoIVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCkpIHsKLQkJCVV0aWxzLmxvZyhNZXNzYWdlcy5nZXRTdHJpbmcoIlNpdGVFbnRyeS5jb21wdXRlUGx1Z2luU3RhbXAiLCByZXNvbHZlZFVSTC50b0V4dGVybmFsRm9ybSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAwOwotCQl9Ci0JCWxvbmcgc3RhcnQgPSAwOwotCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykKLQkJCXN0YXJ0ID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLQkJLy8gY29tcHV0ZSBzdGFtcCBmb3IgdGhlIHBsdWdpbnMgZGlyZWN0b3J5Ci0JCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHJvb3QsIFBMVUdJTlMpOwotCQlpZiAoIXBsdWdpbnNEaXIuZXhpc3RzKCkgfHwgIXBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJVXRpbHMubG9nKE1lc3NhZ2VzLmdldFN0cmluZygiU2l0ZUVudHJ5LnBsdWdpbnNEaXIiLCBwbHVnaW5zRGlyLmdldEFic29sdXRlUGF0aCgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLy8gQ29tcHV0ZSB0aGUgcGx1Z2lucyBsaXN0Ci0JCVN0cmluZ1tdIHBsdWdpbnMgPSBudWxsOwotCQlJU2l0ZVBvbGljeSBwb2xpY3kgPSBnZXRTaXRlUG9saWN5KCk7Ci0JCWlmIChwb2xpY3kuZ2V0VHlwZSgpID09IElTaXRlUG9saWN5LlVTRVJfSU5DTFVERSkKLQkJCXBsdWdpbnMgPSBwb2xpY3kuZ2V0TGlzdCgpOwotCQllbHNlIGlmIChwb2xpY3kuZ2V0VHlwZSgpID09IElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSkgewotCQkJRmlsZVtdIGZpbGVzID0gcGx1Z2luc0Rpci5saXN0RmlsZXMoKTsKLQkJCUFycmF5TGlzdCBkZXRlY3RlZFBsdWdpbnMgPSBuZXcgQXJyYXlMaXN0KGZpbGVzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJZGV0ZWN0ZWRQbHVnaW5zLmFkZChQTFVHSU5TICsgIi8iICsgZmlsZXNbaV0uZ2V0TmFtZSgpICsgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZWxzZSBpZihmaWxlc1tpXS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlkZXRlY3RlZFBsdWdpbnMuYWRkKFBMVUdJTlMgKyAiLyIgKyBmaWxlc1tpXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IAotCQkJCi0JCQlTdHJpbmdbXSBleGNsdWRlZFBsdWdpbnMgPSBwb2xpY3kuZ2V0TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleGNsdWRlZFBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZGV0ZWN0ZWRQbHVnaW5zLmNvbnRhaW5zKGV4Y2x1ZGVkUGx1Z2luc1tpXSkpCi0JCQkJCWRldGVjdGVkUGx1Z2lucy5yZW1vdmUoZXhjbHVkZWRQbHVnaW5zW2ldKTsKLQkJCX0KLQkJCXBsdWdpbnMgPSAoU3RyaW5nW10pZGV0ZWN0ZWRQbHVnaW5zLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCX0KLQotCQkKLQkJbG9uZyBkaXJTdGFtcCA9IHBsdWdpbnNEaXIubGFzdE1vZGlmaWVkKCk7Ci0JCXBsdWdpbnNDaGFuZ2VTdGFtcCA9IE1hdGgubWF4KGRpclN0YW1wLCBjb21wdXRlU3RhbXAocGx1Z2lucykpOwotCQlpZiAoQ29uZmlndXJhdGlvbkFjdGl2YXRvci5ERUJVRykgewotCQkJbG9uZyBlbmQgPSAobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCQkJVXRpbHMuZGVidWcocmVzb2x2ZWRVUkwudG9TdHJpbmcoKSArICIgcGx1Z2luIHN0YW1wOiAiICsgcGx1Z2luc0NoYW5nZVN0YW1wICsgIiBpbiAiICsgKGVuZCAtIHN0YXJ0KSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCQl9Ci0JCXJldHVybiBwbHVnaW5zQ2hhbmdlU3RhbXA7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVTdGFtcChTdHJpbmdbXSB0YXJnZXRzKSB7Ci0KLQkJbG9uZyByZXN1bHQgPSAwOwotCQlpZiAoIVBsYXRmb3JtQ29uZmlndXJhdGlvbi5zdXBwb3J0c0RldGVjdGlvbihyZXNvbHZlZFVSTCkpIHsKLQkJCS8vIE5PVEU6ICB0aGlzIHBhdGggc2hvdWxkIG5vdCBiZSBleGVjdXRlZCB1bnRpbCB3ZSBzdXBwb3J0IHJ1bm5pbmcKLQkJCS8vICAgICAgICBmcm9tIGFuIGFyYml0cmFyeSBVUkwgKGluIHBhcnRpY3VsYXIgZnJvbSBodHRwIHNlcnZlcikuIEZvcgotCQkJLy8gICAgICAgIG5vdyBqdXN0IGNvbXB1dGUgc3RhbXAgYWNyb3NzIHRoZSBsaXN0IG9mIG5hbWVzLiBFdmVudHVhbGx5Ci0JCQkvLyAgICAgICAgd2hlbiBnZW5lcmFsIFVSTHMgYXJlIHN1cHBvcnRlZCB3ZSBuZWVkIHRvIGRvIGJldHRlciAoZmFjdG9yCi0JCQkvLyAgICAgICAgaW4gYXQgbGVhc3QgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdGFyZ2V0KS4gSG93ZXZlciwgZ2l2ZW4gdGhpcwotCQkJLy8gICAgICAgIGNvZGUgZXhlY3V0ZXMgZWFybHkgb24gdGhlIHN0YXJ0dXAgc2VxdWVuY2Ugd2UgbmVlZCB0byBiZQotCQkJLy8gICAgICAgIGV4dHJlbWVseSBtaW5kZnVsIG9mIHBlcmZvcm1hbmNlIGlzc3Vlcy4KLQkJCS8vIEluIGZhY3QsIHdlIHNob3VsZCBnZXQgdGhlIGxhc3QgbW9kaWZpZWQgZnJvbSB0aGUgY29ubmVjdGlvbgotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKQotCQkJCXJlc3VsdCBePSB0YXJnZXRzW2ldLmhhc2hDb2RlKCk7Ci0JCQlVdGlscy5kZWJ1ZygiKldBUk5JTkcqIGNvbXB1dGluZyBzdGFtcCB1c2luZyBVUkwgaGFzaGNvZGVzIG9ubHkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJLy8gY29tcHV0ZSBzdGFtcCBhY3Jvc3MgbG9jYWwgdGFyZ2V0cwotCQkJRmlsZSByb290RmlsZSA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQlpZiAocm9vdEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlIGYgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0cy5sZW5ndGg7IGkrKykgewotCQkJCQlmID0gbmV3IEZpbGUocm9vdEZpbGUsIHRhcmdldHNbaV0pOwotCQkJCQlpZiAoZi5leGlzdHMoKSkKLQkJCQkJCXJlc3VsdCA9IE1hdGgubWF4KHJlc3VsdCwgZi5sYXN0TW9kaWZpZWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGlua0ZpbGVOYW1lKFN0cmluZyBsaW5rRmlsZU5hbWUpIHsKLQkJdGhpcy5saW5rRmlsZU5hbWUgPSBsaW5rRmlsZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gbGlua0ZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXh0ZXJuYWxseUxpbmtlZFNpdGUoKSB7Ci0JCXJldHVybiAobGlua0ZpbGVOYW1lICE9IG51bGwgJiYgIWxpbmtGaWxlTmFtZS50cmltKCkuZXF1YWxzKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJLy8gcmVzZXQgY29tcHV0ZWQgdmFsdWVzLiBXaWxsIGJlIHVwZGF0ZWQgb24gbmV4dCBhY2Nlc3MuCi0JCWZlYXR1cmVzQ2hhbmdlU3RhbXAgPSAwOwotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSAwOwotCQljaGFuZ2VTdGFtcCA9IDA7Ci0JCWZlYXR1cmVFbnRyaWVzID0gbnVsbDsKLQkJcGx1Z2luRW50cmllcyA9IG51bGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hQbHVnaW5zKCkgewotCQkvLyByZXNldCBjb21wdXRlZCB2YWx1ZXMuIFdpbGwgYmUgdXBkYXRlZCBvbiBuZXh0IGFjY2Vzcy4KLQkJcGx1Z2luc0NoYW5nZVN0YW1wID0gMDsKLQkJY2hhbmdlU3RhbXAgPSAwOwotCQlwbHVnaW5FbnRyaWVzID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZUVudHJ5KElGZWF0dXJlRW50cnkgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZUVudHJpZXMgPT0gbnVsbCkKLQkJCWZlYXR1cmVFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gTWFrZSBzdXJlIHdlIGtlZXAgdGhlIGxhcmdlciB2ZXJzaW9uIG9mIHNhbWUgZmVhdHVyZQotCQlJRmVhdHVyZUVudHJ5IGV4aXN0aW5nID0gKEZlYXR1cmVFbnRyeSlmZWF0dXJlRW50cmllcy5nZXQoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZXhpc3RpbmdWZXJzaW9uID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoZXhpc3RpbmcuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSwgZXhpc3RpbmcuZ2V0RmVhdHVyZVZlcnNpb24oKSk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIG5ld1ZlcnNpb24gPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCksIGZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSk7Ci0JCQlpZiAoZXhpc3RpbmdWZXJzaW9uLmNvbXBhcmVWZXJzaW9uKG5ld1ZlcnNpb24pID09IFZlcnNpb25lZElkZW50aWZpZXIuTEVTU19USEFOKSB7Ci0JCQkJZmVhdHVyZUVudHJpZXMucHV0KGZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSwgZmVhdHVyZSk7Ci0JCQkJcGx1Z2luc0NoYW5nZVN0YW1wID0gMDsKLQkJCX0gZWxzZSBpZiAoZXhpc3RpbmdWZXJzaW9uLmVxdWFscyhuZXdWZXJzaW9uKSkgewotCQkJCS8vIGxvZyBlcnJvciBpZiBzYW1lIGZlYXR1cmUgdmVyc2lvbi9pZCBidXQgYSBkaWZmZXJlbnQgdXJsCi0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBGZWF0dXJlRW50cnkgJiYgZXhpc3RpbmcgaW5zdGFuY2VvZiBGZWF0dXJlRW50cnkgJiYKLQkJCQkJCSEoKEZlYXR1cmVFbnRyeSlmZWF0dXJlKS5nZXRVUkwoKS5lcXVhbHMoKChGZWF0dXJlRW50cnkpZXhpc3RpbmcpLmdldFVSTCgpKSkKLQkJCQlVdGlscy5sb2coTWVzc2FnZXMuZ2V0U3RyaW5nKCJTaXRlRW50cnkuZHVwbGljYXRlRmVhdHVyZSIsZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgZXhpc3RpbmcuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZlYXR1cmVFbnRyaWVzLnB1dChmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCksIGZlYXR1cmUpOwotCQkJcGx1Z2luc0NoYW5nZVN0YW1wID0gMDsKLQkJfQotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIEZlYXR1cmVFbnRyeSkKLQkJCSgoRmVhdHVyZUVudHJ5KWZlYXR1cmUpLnNldFNpdGUodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBGZWF0dXJlRW50cnlbXSBnZXRGZWF0dXJlRW50cmllcygpIHsKLQkJaWYgKGZlYXR1cmVFbnRyaWVzID09IG51bGwpCi0JCQlkZXRlY3RGZWF0dXJlcygpOwotCQkKLQkJaWYgKGZlYXR1cmVFbnRyaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEZlYXR1cmVFbnRyeVswXTsKLQkJZWxzZQotCQkJcmV0dXJuIChGZWF0dXJlRW50cnlbXSlmZWF0dXJlRW50cmllcy52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlRW50cnlbZmVhdHVyZUVudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KFBsdWdpbkVudHJ5IHBsdWdpbikgewotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsKQotCQkJcGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTm90ZTogd2UgY291bGQgdXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgc2FtZSBwbHVnaW4sIGxpa2Ugd2UgZG8gZm9yIGZlYXR1cmVzLCBidXQgd2UgbGV0IHRoZSBydW50aW1lIGZpZ3VyZSBpdCBvdXQKLQkJcGx1Z2luRW50cmllcy5hZGQocGx1Z2luKTsKLQl9Ci0JCi0JcHVibGljIFBsdWdpbkVudHJ5W10gZ2V0QWxsUGx1Z2luRW50cmllcygpIHsKLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkKLQkJCWRldGVjdFBsdWdpbnMoKTsKLQkJcmV0dXJuIChQbHVnaW5FbnRyeVtdKXBsdWdpbkVudHJpZXMudG9BcnJheShuZXcgUGx1Z2luRW50cnlbcGx1Z2luRW50cmllcy5zaXplKCldKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9hZEZyb21EaXNrKGxvbmcgbGFzdENoYW5nZSkgdGhyb3dzIENvcmVFeGNlcHRpb257Ci0JCWZlYXR1cmVzQ2hhbmdlU3RhbXAgPSBsYXN0Q2hhbmdlOwotCQlwbHVnaW5zQ2hhbmdlU3RhbXAgPSBsYXN0Q2hhbmdlOwotCQlkZXRlY3RGZWF0dXJlcygpOwotCQlkZXRlY3RQbHVnaW5zKCk7Ci0JfQotCQotCS8qKgotCSAqIFNhdmVzIHN0YXRlIGFzIHhtbCBjb250ZW50IGluIGEgZ2l2ZW4gcGFyZW50IGVsZW1lbnQKLQkgKiBAcGFyYW0gZG9jCi0JICovCi0JcHVibGljIEVsZW1lbnQgdG9YTUwoRG9jdW1lbnQgZG9jKSB7Ci0KLQkJRWxlbWVudCBzaXRlRWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KENGR19TSVRFKTsKLQkJCi0JCWlmIChnZXRVUkwoKS50b1N0cmluZygpICE9IG51bGwpCi0JCQlzaXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1VSTCwgZ2V0VVJMKCkudG9TdHJpbmcoKSk7Ci0KLQkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19FTkFCTEVELCBpc0VuYWJsZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJc2l0ZUVsZW1lbnQuc2V0QXR0cmlidXRlKENGR19VUERBVEVBQkxFLCBpc1VwZGF0ZWFibGUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKGlzRXh0ZXJuYWxseUxpbmtlZFNpdGUoKSkgCi0JCQlzaXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX0xJTktfRklMRSwgZ2V0TGlua0ZpbGVOYW1lKCkudHJpbSgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpKTsgCi0KLQkJaW50IHR5cGUgPSBnZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpOwotCQlTdHJpbmcgdHlwZVN0cmluZyA9IENGR19QT0xJQ1lfVFlQRV9VTktOT1dOOwotCQl0cnkgewotCQkJdHlwZVN0cmluZyA9IENGR19QT0xJQ1lfVFlQRVt0eXBlXTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUgYmFkIGF0dHJpYnV0ZSAuLi4KLQkJfQotCQlzaXRlRWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0ZHX1BPTElDWSwgdHlwZVN0cmluZyk7IAotCQlTdHJpbmdbXSBsaXN0ID0gZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKTsKLQkJaWYgKGxpc3QubGVuZ3RoID4gMCkgewotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigyNTYpOwotCQkJZm9yIChpbnQgaT0wOyBpPGxpc3QubGVuZ3RoLTE7IGkrKykgewotCQkJCXNiLmFwcGVuZChsaXN0W2ldKTsKLQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChsaXN0W2xpc3QubGVuZ3RoLTFdKTsKLQkJCXNpdGVFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfTElTVCwgc2IudG9TdHJpbmcoKSk7Ci0JCX0KLS8vCQkvLyBub3RlOiB3ZSBkb24ndCBzYXZlIGZlYXR1cmVzIGluc2lkZSB0aGUgc2l0ZSBlbGVtZW50LgotCQkKLQkJLy8gY29sbGVjdCBmZWF0dXJlIGVudHJpZXMKLS8vCQljb25maWdFbGVtZW50LnNldEF0dHJpYnV0ZShDRkdfRkVBVFVSRV9FTlRSWV9ERUZBVUxULCBkZWZhdWx0RmVhdHVyZSk7Ci0JCUZlYXR1cmVFbnRyeVtdIGZlYXRzID0gZ2V0RmVhdHVyZUVudHJpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0cy5sZW5ndGg7IGkrKykgewotCQkJRWxlbWVudCBmZWF0dXJlRWxlbWVudCA9IGZlYXRzW2ldLnRvWE1MKGRvYyk7Ci0JCQlzaXRlRWxlbWVudC5hcHBlbmRDaGlsZChmZWF0dXJlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzaXRlRWxlbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRmVhdHVyZUVudHJpZXMoKSB7Ci0JCUZpbGUgcm9vdCA9IG5ldyBGaWxlKHJlc29sdmVkVVJMLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZmVhdHVyZUVudHJpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvbiBkZWxldGVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJRmVhdHVyZUVudHJ5IGZlYXR1cmUgPSAoRmVhdHVyZUVudHJ5KWl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vIE5vdGU6IGluIHRoZSBmdXR1cmUsIHdlIGNhbiBjaGVjayBmb3IgYWJzb2x1dGUgdXJsIGFzIHdlbGwuCi0JCQkvLyAgICAgICBGb3Igbm93LCBmZWF0dXJlIHVybCBpcyBmZWF0dXJlcy9vcmcuZWNsaXBzZS5mb28vZmVhdHVyZS54bWwKLQkJCUZpbGUgZmVhdHVyZVhNTCA9IG5ldyBGaWxlKHJvb3QsIGZlYXR1cmUuZ2V0VVJMKCkpOwotCQkJaWYgKCFmZWF0dXJlWE1MLmV4aXN0cygpKQotCQkJCWRlbGV0ZWRGZWF0dXJlcy5hZGQoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJfQotCQlmb3IoSXRlcmF0b3IgaXQ9ZGVsZXRlZEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJZmVhdHVyZUVudHJpZXMucmVtb3ZlKGl0Lm5leHQoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUGx1Z2luRW50cmllcygpIHsKLQkJRmlsZSByb290ID0gbmV3IEZpbGUocmVzb2x2ZWRVUkwuZ2V0RmlsZSgpLnJlcGxhY2UoJy8nLCBGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJQ29sbGVjdGlvbiBkZWxldGVkUGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbkVudHJpZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVBsdWdpbkVudHJ5IHBsdWdpbiA9IChQbHVnaW5FbnRyeSlwbHVnaW5FbnRyaWVzLmdldChpKTsKLQkJCS8vIE5vdGU6IGluIHRoZSBmdXR1cmUsIHdlIGNhbiBjaGVjayBmb3IgYWJzb2x1dGUgdXJsIGFzIHdlbGwuCi0JCQkvLyAgICAgICBGb3Igbm93LCBmZWF0dXJlIHVybCBpcyBwbHVnaW5zL29yZy5lY2xpcHNlLmZvby9wbHVnaW4ueG1sCi0JCQlGaWxlIHBsdWdpbkxvY2F0aW9uID0gbmV3IEZpbGUocm9vdCwgcGx1Z2luLmdldFVSTCgpKTsKLQkJCWlmICghcGx1Z2luTG9jYXRpb24uZXhpc3RzKCkpCi0JCQkJZGVsZXRlZFBsdWdpbnMuYWRkKHBsdWdpbik7Ci0JCX0KLQkJZm9yKEl0ZXJhdG9yIGl0PWRlbGV0ZWRQbHVnaW5zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspewotCQkJcGx1Z2luRW50cmllcy5yZW1vdmUoaXQubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVFbnRyeSBnZXRGZWF0dXJlRW50cnkoU3RyaW5nIGlkKSB7Ci0JCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gZ2V0RmVhdHVyZUVudHJpZXMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZlYXR1cmVzW2ldLmdldEZlYXR1cmVJZGVudGlmaWVyKCkuZXF1YWxzKGlkKSkgCi0JCQkJcmV0dXJuIGZlYXR1cmVzW2ldOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIGJvb2xlYW4gdW5jb25maWd1cmVGZWF0dXJlRW50cnkoSUZlYXR1cmVFbnRyeSBmZWF0dXJlKSB7Ci0JCUZlYXR1cmVFbnRyeSBleGlzdGluZ0ZlYXR1cmUgPSBnZXRGZWF0dXJlRW50cnkoZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJaWYgKGV4aXN0aW5nRmVhdHVyZSAhPSBudWxsKQotCQkJZmVhdHVyZUVudHJpZXMucmVtb3ZlKGV4aXN0aW5nRmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJcmV0dXJuIGV4aXN0aW5nRmVhdHVyZSAhPSBudWxsOwotCX0KLQkKLQkvKgotCSAqIFRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLgotCSAqIFdoZW4gbm8gZmVhdHVyZXMgd2VyZSBhZGRlZCB0byB0aGUgc2l0ZSwgYnV0IHRoZSBzaXRlIGlzIGluaXRpYWxpemVkIGZyb20gcGxhdGZvcm0ueG1sIAotCSAqIHdlIG5lZWQgdG8gc2V0IHRoZSBmZWF0dXJlIHNldCB0byBlbXB0eSwgc28gd2UgZG9uJ3QgdHJ5IHRvIGRldGVjdCB0aGVtLgotCSAqLwotCXZvaWQgaW5pdGlhbGl6ZWQoKSB7IAotCQlpZiAoZmVhdHVyZUVudHJpZXMgPT0gbnVsbCkKLQkJCWZlYXR1cmVFbnRyaWVzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZVBvbGljeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvU2l0ZVBvbGljeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTkyZmM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1NpdGVQb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsKLQotCi1wdWJsaWMgY2xhc3MgU2l0ZVBvbGljeSBpbXBsZW1lbnRzIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgewotCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQlwcml2YXRlIFN0cmluZ1tdIGxpc3Q7Ci0KLQlwdWJsaWMgU2l0ZVBvbGljeSgpIHsKLQl9Ci0JcHVibGljIFNpdGVQb2xpY3koaW50IHR5cGUsIFN0cmluZ1tdIGxpc3QpIHsKLQkJaWYgKHR5cGUgIT0gSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFICYmIHR5cGUgIT0gSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCi0JCWlmIChsaXN0ID09IG51bGwpCi0JCQl0aGlzLmxpc3QgPSBuZXcgU3RyaW5nWzBdOwotCQllbHNlCi0JCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZVBvbGljeSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qCi0JKiBAc2VlIElTaXRlUG9saWN5I2dldExpc3QoKQotCSovCi0JcHVibGljIFN0cmluZ1tdIGdldExpc3QoKSB7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogQHNlZSBJU2l0ZVBvbGljeSNzZXRMaXN0KFN0cmluZ1tdKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRMaXN0KFN0cmluZ1tdIGxpc3QpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXRoaXMubGlzdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWVsc2UKLQkJCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVXRpbHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZTUxNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubG9nLio7Ci0KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVGSVggPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RPVUJMRV9QUkVGSVggPSAiJSUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIEZyYW1ld29ya0xvZyBsb2c7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBzKSB7Ci0JCWlmIChDb25maWd1cmF0aW9uQWN0aXZhdG9yLkRFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQbGF0Zm9ybUNvbmZpZzogIiArIHMpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb3JlRXhjZXB0aW9uIGZyb20gc29tZSBvdGhlciBleGNlcHRpb24uCi0JICogVGhlIHR5cGUgb2YgdGhlIENvcmVFeGNlcHRpb24gaXMgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4KLQkgKiBJZiB0aGUgZXhjZXB0aW9uIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBpcyBhbHNvIGEgQ29yZUV4Y2VwdGlvbiwKLQkgKiB0aGUgbmV3IENvcmVFeGNlcHRpb24gd2lsbCBjb250YWluIGFsbCB0aGUgc3RhdHVzIG9mIHRoZSBwYXNzZWQKLQkgKiBDb3JlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNFUlJPUgotCSAqIEBwYXJhbSBzIGV4Y2VwdGlvbiBzdHJpbmcKLQkgKiBAcGFyYW0gZSBhY3R1YWwgZXhjZXB0aW9uIGJlaW5nIHJlcG9ydGVkCi0JICogQHJldHVybiBhIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB7Ci0KLQkJLy8gY2hlY2sgdGhlIGNhc2Ugb2YgYSBtdWx0aXN0YXR1cwotCQlJU3RhdHVzIHN0YXR1czsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlpZiAocyA9PSBudWxsKQotCQkJCXMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKCJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIiwgMCwgcywgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlTdGF0dXMgY2hpbGRyZW5TdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJKChNdWx0aVN0YXR1cykgc3RhdHVzKS5hZGQoY2hpbGRyZW5TdGF0dXMpOwotCQkJKChNdWx0aVN0YXR1cykgc3RhdHVzKS5hZGRBbGwoY2hpbGRyZW5TdGF0dXMpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChzICE9IG51bGwpCi0JCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKHMpOwotCQkJaWYgKGUgIT0gbnVsbCkgewotCQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiIFsiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtc2cgPSBlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQobXNnIT1udWxsP21zZzplLnRvU3RyaW5nKCkpOwotCQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzdGF0dXMgPSBuZXdTdGF0dXMoY29tcGxldGVTdHJpbmcudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgbmV3U3RhdHVzKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciIsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGUpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJbG9nKG5ld1N0YXR1cyhtZXNzYWdlLCBudWxsKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKGxvZyAhPSBudWxsKSB7Ci0JCQlsb2cubG9nKG5ldyBGcmFtZXdvcmtMb2dFbnRyeShDb25maWd1cmF0aW9uQWN0aXZhdG9yLlBJX0NPTkZJR1VSQVRPUiwgc3RhdHVzLmdldE1lc3NhZ2UoKSwgMCwgc3RhdHVzLmdldEV4Y2VwdGlvbigpLCBudWxsKSk7Ci0JCX0gZWxzZSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQlpZiAoc3RhdHVzLmdldEV4Y2VwdGlvbigpICE9IG51bGwpCi0JCQkJc3RhdHVzLmdldEV4Y2VwdGlvbigpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybCBhcyBhIHBsYXRmb3JtOi8gdXJsLCBpZiBwb3NzaWJsZSwgZWxzZSBsZWF2ZXMgaXQgdW5jaGFuZ2VkCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBhc1BsYXRmb3JtVVJMKFVSTCB1cmwpIHsKLQkJdHJ5IHsKLQkJCVVSTCBwbGF0Zm9ybVVSTCA9IG5ldyBVUkwoInBsYXRmb3JtOi9iYXNlLyIpOyAvLyROT04tTkxTLTEkICAvLyB0cnkgdXNpbmcgcGxhdGZvcm0tcmVsYXRpdmUgVVJMCi0JCQlVUkwgcmVzb2x2ZWRQbGF0Zm9ybVVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwocGxhdGZvcm1VUkwpOwotCQkJLy8gVE9ETyB3b3JrYXJvdW5kIGJ1ZyBpbiBwbGF0Zm9ybSB1cmwgcmVzb2x1dGlvbgotCQkJaWYgKHJlc29sdmVkUGxhdGZvcm1VUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJlc29sdmVkUGxhdGZvcm1VUkwgPSBuZXcgRmlsZShyZXNvbHZlZFBsYXRmb3JtVVJMLmdldEZpbGUoKSkudG9VUkwoKTsKLQkJCVN0cmluZyBwbGF0Zm9ybVVSTEFzU3RyaW5nID0gcmVzb2x2ZWRQbGF0Zm9ybVVSTC50b0V4dGVybmFsRm9ybSgpOwotCQkJU3RyaW5nIHVybEFzU3RyaW5nID0gdXJsLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlpZiAodXJsQXNTdHJpbmcuc3RhcnRzV2l0aChwbGF0Zm9ybVVSTEFzU3RyaW5nKSkKLQkJCQlyZXR1cm4gbmV3IFVSTChwbGF0Zm9ybVVSTC50b0V4dGVybmFsRm9ybSgpICsgdXJsQXNTdHJpbmcuc3Vic3RyaW5nKHBsYXRmb3JtVVJMQXNTdHJpbmcubGVuZ3RoKCkpICk7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHVybDsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQl9Ci0JCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEVudmlyb25tZW50KFN0cmluZyBvcywgU3RyaW5nIHdzLCBTdHJpbmcgYXJjaCwgU3RyaW5nIG5sKSB7Ci0JCWlmIChvcyE9bnVsbCAmJiAhaXNNYXRjaGluZyhvcywgUGxhdGZvcm0uZ2V0T1MoKSkpIHJldHVybiBmYWxzZTsKLQkJaWYgKHdzIT1udWxsICYmICFpc01hdGNoaW5nKHdzLCBQbGF0Zm9ybS5nZXRXUygpKSkgcmV0dXJuIGZhbHNlOwotCQlpZiAoYXJjaCE9bnVsbCAmJiAhaXNNYXRjaGluZyhhcmNoLCBQbGF0Zm9ybS5nZXRPU0FyY2goKSkpIHJldHVybiBmYWxzZTsKLQkJaWYgKG5sIT1udWxsICYmICFpc01hdGNoaW5nTG9jYWxlKG5sLCBQbGF0Zm9ybS5nZXROTCgpKSkgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nKFN0cmluZyBjYW5kaWRhdGVWYWx1ZXMsIFN0cmluZyBzaXRlVmFsdWVzKSB7Ci0JCWlmIChzaXRlVmFsdWVzPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0JCWlmICgiKiIuZXF1YWxzSWdub3JlQ2FzZShjYW5kaWRhdGVWYWx1ZXMpKSByZXR1cm4gdHJ1ZTsgLy8kTk9OLU5MUy0xJAotCQlzaXRlVmFsdWVzID0gc2l0ZVZhbHVlcy50b1VwcGVyQ2FzZSgpOwkJCi0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihjYW5kaWRhdGVWYWx1ZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdG9rLm5leHRUb2tlbigpLnRvVXBwZXJDYXNlKCk7Ci0JCQlpZiAoc2l0ZVZhbHVlcy5pbmRleE9mKHRva2VuKSE9LTEpIHJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNYXRjaGluZ0xvY2FsZShTdHJpbmcgY2FuZGlkYXRlVmFsdWVzLCBTdHJpbmcgbG9jYWxlKSB7Ci0JCWlmIChsb2NhbGU9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJaWYgKCIqIi5lcXVhbHNJZ25vcmVDYXNlKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCQotCQlsb2NhbGUgPSBsb2NhbGUudG9VcHBlckNhc2UoKTsKLQkJY2FuZGlkYXRlVmFsdWVzID0gY2FuZGlkYXRlVmFsdWVzLnRvVXBwZXJDYXNlKCk7CQotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2FuZGlkYXRlVmFsdWVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIGNhbmRpZGF0ZSA9IHN0b2submV4dFRva2VuKCk7Ci0JCQlpZiAobG9jYWxlLmluZGV4T2YoY2FuZGlkYXRlKSA9PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKGNhbmRpZGF0ZS5pbmRleE9mKGxvY2FsZSkgPT0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTG9jYWxlIGdldERlZmF1bHRMb2NhbGUoKSB7Ci0JCVN0cmluZyBubCA9IFBsYXRmb3JtLmdldE5MKCk7Ci0JCS8vIHNhbml0eSB0ZXN0Ci0JCWlmIChubCA9PSBudWxsKQotCQkJcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JCQotCQkvLyBicmVhayB0aGUgc3RyaW5nIGludG8gdG9rZW5zIHRvIGdldCB0aGUgTG9jYWxlIG9iamVjdAotCQlTdHJpbmdUb2tlbml6ZXIgbG9jYWxlcyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmwsIl8iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobG9jYWxlcy5jb3VudFRva2VucygpID09IDEpCi0JCQlyZXR1cm4gbmV3IExvY2FsZShsb2NhbGVzLm5leHRUb2tlbigpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZSBpZiAobG9jYWxlcy5jb3VudFRva2VucygpID09IDIpCi0JCQlyZXR1cm4gbmV3IExvY2FsZShsb2NhbGVzLm5leHRUb2tlbigpLCBsb2NhbGVzLm5leHRUb2tlbigpKTsKLQkJZWxzZSBpZiAobG9jYWxlcy5jb3VudFRva2VucygpID09IDMpCi0JCQlyZXR1cm4gbmV3IExvY2FsZShsb2NhbGVzLm5leHRUb2tlbigpLCBsb2NhbGVzLm5leHRUb2tlbigpLCBsb2NhbGVzLm5leHRUb2tlbigpKTsKLQkJZWxzZQotCQkJcmV0dXJuIExvY2FsZS5nZXREZWZhdWx0KCk7Ci0JfQotCQotCQotCS8qKgotCSAqIFJldHVybnMgYSByZXNvdXJjZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXJndW1lbnQgCi0JICogdmFsdWUgYW5kIGJ1bmRsZS4KLQkgKiBJZiB0aGUgYXJndW1lbnQgdmFsdWUgc3BlY2lmaWVzIGEgcmVzb3VyY2Uga2V5LCB0aGUgc3RyaW5nCi0JICogaXMgbG9va2VkIHVwIGluIHRoZSBnaXZlbiByZXNvdXJjZSBidW5kbGUuIElmIHRoZSBhcmd1bWVudCBkb2VzIG5vdAotCSAqIHNwZWNpZnkgYSB2YWxpZCBrZXksIHRoZSBhcmd1bWVudCBpdHNlbGYgaXMgcmV0dXJuZWQgYXMgdGhlCi0JICogcmVzb3VyY2Ugc3RyaW5nLiBUaGUga2V5IGxvb2t1cCBpcyBwZXJmb3JtZWQgYWdhaW5zdCB0aGUKLQkgKiBzcGVjaWZpZWQgcmVzb3VyY2UgYnVuZGxlLiBJZiBhIHJlc291cmNlIHN0cmluZyAKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSByZXNvdXJjZSBidW5kbGUKLQkgKiB0aGUga2V5IHZhbHVlLCBvciBhbnkgZGVmYXVsdCB0ZXh0IGZvbGxvd2luZyB0aGUga2V5IGluIHRoZQotCSAqIGFyZ3VtZW50IHZhbHVlIGlzIHJldHVybmVkIGFzIHRoZSByZXNvdXJjZSBzdHJpbmcuCi0JICogQSBrZXkgaXMgaWRlbnRpZmllZCBhcyBhIHN0cmluZyBiZWdpbmluZyB3aXRoIHRoZSAiJSIgY2hhcmFjdGVyLgotCSAqIE5vdGUgdGhhdCB0aGUgIiUiIGNoYXJhY3RlciBpcyBzdHJpcHBlZCBvZmYgcHJpb3IgdG8gbG9va3VwCi0JICogaW4gdGhlIHJlc291cmNlIGJ1bmRsZS4KLQkgKiA8cD4KLQkgKiBGb3IgZXhhbXBsZSwgYXNzdW1lIHJlc291cmNlIGJ1bmRsZSBwbHVnaW4ucHJvcGVydGllcyBjb250YWlucwotCSAqIG5hbWUgPSBQcm9qZWN0IE5hbWUKLQkgKiA8cHJlPgotCSAqICAgICByZXNvbHZlTkxTdHJpbmcoYiwiSGVsbG8gV29ybGQiKSByZXR1cm5zICJIZWxsbyBXb3JsZCI8L2xpPgotCSAqICAgICByZXNvbHZlTkxTdHJpbmcoYiwiJW5hbWUiKSByZXR1cm5zICJQcm9qZWN0IE5hbWUiPC9saT4KLQkgKiAgICAgcmVzb2x2ZU5MU3RyaW5nKGIsIiVuYW1lIEhlbGxvIFdvcmxkIikgcmV0dXJucyAiUHJvamVjdCBOYW1lIjwvbGk+Ci0JICogICAgIHJlc29sdmVOTFN0cmluZyhiLCIlYWJjZCBIZWxsbyBXb3JsZCIpIHJldHVybnMgIkhlbGxvIFdvcmxkIjwvbGk+Ci0JICogICAgIHJlc29sdmVOTFN0cmluZyhiLCIlYWJjZCIpIHJldHVybnMgIiVhYmNkIjwvbGk+Ci0JICogICAgIHJlc29sdmVOTFN0cmluZyhiLCIlJW5hbWUiKSByZXR1cm5zICIlbmFtZSI8L2xpPgotCSAqIDwvcHJlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VCdW5kbGUgcmVzb3VyY2UgYnVuZGxlLgotCSAqIEBwYXJhbSBzdHJpbmcgdHJhbnNsYXRhYmxlIHN0cmluZyBmcm9tIG1vZGVsCi0JICogQHJldHVybiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBTdHJpbmcgc3RyaW5nKSB7Ci0KLQkJaWYgKHN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHMgPSBzdHJpbmcudHJpbSgpOwotCi0JCWlmIChzLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBzdHJpbmc7Ci0KLQkJaWYgKCFzLnN0YXJ0c1dpdGgoS0VZX1BSRUZJWCkpCi0JCQlyZXR1cm4gc3RyaW5nOwotCi0JCWlmIChzLnN0YXJ0c1dpdGgoS0VZX0RPVUJMRV9QUkVGSVgpKQotCQkJcmV0dXJuIHMuc3Vic3RyaW5nKDEpOwotCi0JCWludCBpeCA9IHMuaW5kZXhPZigiICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBrZXkgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZygwLCBpeCk7Ci0JCVN0cmluZyBkZmx0ID0gaXggPT0gLTEgPyBzIDogcy5zdWJzdHJpbmcoaXggKyAxKTsKLQotCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybiBkZmx0OwotCi0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleS5zdWJzdHJpbmcoMSkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGRmbHQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBdXRvbWF0aWNhbGx5U3RhcnRlZEJ1bmRsZShTdHJpbmcgYnVuZGxlVVJMKSB7Ci0JCWlmIChidW5kbGVVUkwuaW5kZXhPZigib3JnLmVjbGlwc2Uub3NnaSIpICE9IC0xKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJCi0JCVN0cmluZyBvc2dpQnVuZGxlcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3NnaS5idW5kbGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihvc2dpQnVuZGxlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpbnQgaW5kZXggPSB0b2tlbi5pbmRleE9mKCdAJyk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCxpbmRleCk7Ci0JCQlpZiAodG9rZW4uc3RhcnRzV2l0aCgicmVmZXJlbmNlOmZpbGU6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCUZpbGUgZiA9IG5ldyBGaWxlKHRva2VuLnN1YnN0cmluZygxNSkpOwotCQkJCWlmIChidW5kbGVVUkwuaW5kZXhPZihmLmdldE5hbWUoKSkgIT0gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKGJ1bmRsZVVSTC5pbmRleE9mKHRva2VuKSAhPSAtMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjZTI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL1ZlcnNpb25lZElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbmVkSWRlbnRpZmllciB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWRlbnRpZmllciA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBpbnQgbWFqb3IgPSAwOwotCXByaXZhdGUgaW50IG1pbm9yID0gMDsKLQlwcml2YXRlIGludCBzZXJ2aWNlID0gMDsKLQlwcml2YXRlIFN0cmluZyBxdWFsaWZpZXIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSX1NFUEFSQVRPUiA9ICIuIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9TRVBBUkFUT1IgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFU1NfVEhBTiA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVRVUFMID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUVVJVkFMRU5UID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01QQVRJQkxFID0gMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHUkVBVEVSX1RIQU4gPSAzOwotCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCB8fCAocyA9IHMudHJpbSgpKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxvYyA9IHMubGFzdEluZGV4T2YoSURfU0VQQVJBVE9SKTsKLQkJaWYgKGxvYyAhPSAtMSkgewotCQkJdGhpcy5pZGVudGlmaWVyID0gcy5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCXZlcnNpb24gPSBzLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCXBhcnNlVmVyc2lvbih2ZXJzaW9uKTsKLQkJfSBlbHNlCi0JCQl0aGlzLmlkZW50aWZpZXIgPSBzOwotCX0KLQkKLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllcihTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRoaXMoaWQrSURfU0VQQVJBVE9SK3ZlcnNpb24pOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFsSWRlbnRpZmllcnMoVmVyc2lvbmVkSWRlbnRpZmllciBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBpZGVudGlmaWVyID09IG51bGw7Ci0JCWVsc2UKLQkJCXJldHVybiBpZC5pZGVudGlmaWVyLmVxdWFscyhpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVWZXJzaW9uKFZlcnNpb25lZElkZW50aWZpZXIgaWQpIHsKLQotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWYgKG1ham9yID09IDAgJiYgbWlub3IgPT0gMCAmJiBzZXJ2aWNlID09IDApCi0JCQkJcmV0dXJuIC0xOwotCQkJZWxzZQotCQkJCXJldHVybiAxOwotCQl9Ci0KLQkJaWYgKG1ham9yID4gaWQubWFqb3IpCi0JCQlyZXR1cm4gR1JFQVRFUl9USEFOOwotCQlpZiAobWFqb3IgPCBpZC5tYWpvcikKLQkJCXJldHVybiBMRVNTX1RIQU47Ci0JCWlmIChtaW5vciA+IGlkLm1pbm9yKQotCQkJcmV0dXJuIENPTVBBVElCTEU7Ci0JCWlmIChtaW5vciA8IGlkLm1pbm9yKQotCQkJcmV0dXJuIExFU1NfVEhBTjsKLQkJaWYgKHNlcnZpY2UgPiBpZC5zZXJ2aWNlKQotCQkJcmV0dXJuIEVRVUlWQUxFTlQ7Ci0JCWlmIChzZXJ2aWNlIDwgaWQuc2VydmljZSkKLQkJCXJldHVybiBMRVNTX1RIQU47Ci0JCXJldHVybiBjb21wYXJlUXVhbGlmaWVycyhxdWFsaWZpZXIsIGlkLnF1YWxpZmllcik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcGFyZVF1YWxpZmllcnMoU3RyaW5nIHExLCBTdHJpbmcgcTIpIHsKLQkJaW50IHJlc3VsdCA9IHExLmNvbXBhcmVUbyhxMik7Ci0JCWlmIChyZXN1bHQgPCAwKQotCQkJcmV0dXJuIExFU1NfVEhBTjsKLQkJZWxzZSBpZiAocmVzdWx0ID4gMCkKLQkJCXJldHVybiBFUVVJVkFMRU5UOwotCQllbHNlCi0JCQlyZXR1cm4gRVFVQUw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlVmVyc2lvbihTdHJpbmcgdikgewotCQlpZiAodiA9PSBudWxsIHx8ICh2ID0gdi50cmltKCkpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih2LCBWRVJfU0VQQVJBVE9SKTsKLQkJCUFycmF5TGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoNCk7Ci0KLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQllbGVtZW50cy5hZGQoc3QubmV4dFRva2VuKCkpOwotCQkJfQotCi0JCQlpZiAoZWxlbWVudHMuc2l6ZSgpID49IDEpCi0JCQkJdGhpcy5tYWpvciA9IChuZXcgSW50ZWdlcigoU3RyaW5nKSBlbGVtZW50cy5nZXQoMCkpKS5pbnRWYWx1ZSgpOwotCQkJaWYgKGVsZW1lbnRzLnNpemUoKSA+PSAyKQotCQkJCXRoaXMubWlub3IgPSAobmV3IEludGVnZXIoKFN0cmluZykgZWxlbWVudHMuZ2V0KDEpKSkuaW50VmFsdWUoKTsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPj0gMykKLQkJCQl0aGlzLnNlcnZpY2UgPSAobmV3IEludGVnZXIoKFN0cmluZykgZWxlbWVudHMuZ2V0KDIpKSkuaW50VmFsdWUoKTsKLQkJCWlmIChlbGVtZW50cy5zaXplKCkgPj0gNCkKLQkJCQl0aGlzLnF1YWxpZmllciA9IHJlbW92ZVdoaXRlU3BhY2UoKFN0cmluZykgZWxlbWVudHMuZ2V0KDMpKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gdXNlIHdoYXQgd2UgZ290IHNvIGZhciAuLi4KLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHJlbW92ZVdoaXRlU3BhY2UoU3RyaW5nIHMpIHsKLQkJY2hhcltdIGNoYXJzID0gcy50cmltKCkudG9DaGFyQXJyYXkoKTsKLQkJYm9vbGVhbiB3aGl0ZXNwYWNlID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGNoYXJzW2ldKSkgewotCQkJCWNoYXJzW2ldID0gJ18nOwotCQkJCXdoaXRlc3BhY2UgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiB3aGl0ZXNwYWNlID8gbmV3IFN0cmluZyhjaGFycykgOiBzOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBWZXJzaW9uZWRJZGVudGlmaWVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0JCVZlcnNpb25lZElkZW50aWZpZXIgb3RoZXIgPSAoVmVyc2lvbmVkSWRlbnRpZmllcilvYmo7Ci0JCXJldHVybiBlcXVhbElkZW50aWZpZXJzKG90aGVyKSAmJgotCQkJdGhpcy5tYWpvciA9PSBvdGhlci5tYWpvciAmJgotCQkJdGhpcy5taW5vciA9PSBvdGhlci5taW5vciAmJgotCQkJdGhpcy5zZXJ2aWNlID09IG90aGVyLnNlcnZpY2UgJiYKLQkJCWNvbXBhcmVRdWFsaWZpZXJzKHRoaXMucXVhbGlmaWVyLCBvdGhlci5xdWFsaWZpZXIpID09IEVRVUFMOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9BYm91dEluZm8uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0Fib3V0SW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E3YTMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0Fib3V0SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotCi0vKioKLSAqIFRoZSBpbmZvcm1hdGlvbiB3aXRoaW4gdGhpcyBvYmplY3QgaXMgb2J0YWluZWQgZnJvbSB0aGUgYWJvdXQgSU5JIGZpbGUuCi0gKiBUaGlzIGZpbGUgcmVzaWRlcyB3aXRoaW4gYW4gaW5zdGFsbCBjb25maWd1cmF0aW9ucyBkaXJlY3RvcnkgYW5kIG11c3QgYmUgYSAKLSAqIHN0YW5kYXJkIGphdmEgcHJvcGVydHkgZmlsZS4gIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQWJvdXRJbmZvIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5JX0ZJTEVOQU1FID0gImFib3V0LmluaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUFJPUEVSVElFU19GSUxFTkFNRSA9ICJhYm91dC5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBNQVBQSU5HU19GSUxFTkFNRSA9ICJhYm91dC5tYXBwaW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uSWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVQbHVnaW5MYWJlbDsKLQlwcml2YXRlIFN0cmluZyBwcm92aWRlck5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwTmFtZTsKLQlwcml2YXRlIFVSTCB3aW5kb3dJbWFnZVVSTDsKLQlwcml2YXRlIFVSTFtdIHdpbmRvd0ltYWdlc1VSTHM7Ci0JcHJpdmF0ZSBVUkwgYWJvdXRJbWFnZVVSTDsKLQlwcml2YXRlIFVSTCBmZWF0dXJlSW1hZ2VVUkw7Ci0JcHJpdmF0ZSBVUkwgd2VsY29tZVBhZ2VVUkw7Ci0JcHJpdmF0ZSBTdHJpbmcgYWJvdXRUZXh0OwotCXByaXZhdGUgU3RyaW5nIHdlbGNvbWVQZXJzcGVjdGl2ZTsKLQlwcml2YXRlIFN0cmluZyB0aXBzQW5kVHJpY2tzSHJlZjsKLQotCi0JLyoKLQkgKiBDcmVhdGUgYSBuZXcgYWJvdXQgaW5mbyBmb3IgYSBmZWF0dXJlIHdpdGggdGhlIGdpdmVuIGlkLgotCSAqLwotCS8qIHBhY2thZ2UgKi8gQWJvdXRJbmZvKFN0cmluZyBmZWF0dXJlSWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUgd2l0aCB0aGUgCi0JICogZ2l2ZW4gaWQuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVJZCB0aGUgZmVhdHVyZSBpZAotCSAqIEBwYXJhbSB2ZXJzaW9uSWQgdGhlIHZlcnNpb24gaWQgKG9mIHRoZSBmZWF0dXJlKQotCSAqIEBwYXJhbSBwbHVnaW5JZCB0aGUgcGx1Zy1pbiBpZAotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlCi0JICovCi0JcHVibGljIHN0YXRpYyBBYm91dEluZm8gcmVhZEZlYXR1cmVJbmZvKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyB2ZXJzaW9uSWQsIFN0cmluZyBwbHVnaW5JZCkgewotLy8JCUFzc2VydC5pc05vdE51bGwoZmVhdHVyZUlkKTsKLS8vCQlBc3NlcnQuaXNOb3ROdWxsKHZlcnNpb25JZCk7Ci0vLwkJQXNzZXJ0LmlzTm90TnVsbChwbHVnaW5JZCk7Ci0JCUluaUZpbGVSZWFkZXIgcmVhZGVyID0gbmV3IEluaUZpbGVSZWFkZXIoZmVhdHVyZUlkLCBwbHVnaW5JZCwgSU5JX0ZJTEVOQU1FLCBQUk9QRVJUSUVTX0ZJTEVOQU1FLCBNQVBQSU5HU19GSUxFTkFNRSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gcmVhZGVyLmxvYWQoKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkvL3JldHVybiBudWxsOwotCQkJcmV0dXJuIG5ldyBBYm91dEluZm8oZmVhdHVyZUlkKTsgLy8gZHVtbXkgYWJvdXQgaW5mbwotCQl9Ci0JCQotCQlBYm91dEluZm8gaW5mbyA9IG5ldyBBYm91dEluZm8oZmVhdHVyZUlkKTsKLQkJSGFzaHRhYmxlIHJ1bnRpbWVNYXBwaW5ncyAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXJ1bnRpbWVNYXBwaW5ncy5wdXQoIntmZWF0dXJlVmVyc2lvbn0iLCB2ZXJzaW9uSWQpOyAvLyROT04tTkxTLTEkCi0JCWluZm8udmVyc2lvbklkID0gdmVyc2lvbklkOwotCQlpbmZvLmZlYXR1cmVQbHVnaW5MYWJlbCA9IHJlYWRlci5nZXRGZWF0dXJlUGx1Z2luTGFiZWwoKTsKLQkJaW5mby5wcm92aWRlck5hbWUgPSByZWFkZXIuZ2V0UHJvdmlkZXJOYW1lKCk7Ci0JCWluZm8uYXBwTmFtZSA9IHJlYWRlci5nZXRTdHJpbmcoImFwcE5hbWUiLCB0cnVlLCBydW50aW1lTWFwcGluZ3MpOyAvLyROT04tTkxTLTEkCi0JCWluZm8uYWJvdXRUZXh0ID0gcmVhZGVyLmdldFN0cmluZygiYWJvdXRUZXh0IiwgdHJ1ZSwgcnVudGltZU1hcHBpbmdzKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZvLndpbmRvd0ltYWdlVVJMID0gcmVhZGVyLmdldFVSTCgid2luZG93SW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBsb29rIGZvciB0aGUgbmV3ZXIgYXJyYXksIGJ1dCBpZiBpdHMgbm90IHRoZXJlIHRoZW4gdXNlIHRoZSBvbGRlciwKLQkJLy8gc2luZ2xlIGltYWdlIGRlZmluaXRpb24KLQkJaW5mby53aW5kb3dJbWFnZXNVUkxzID0gcmVhZGVyLmdldFVSTHMoIndpbmRvd0ltYWdlcyIpOyAvLyROT04tTkxTLTEkCi0JCWluZm8uYWJvdXRJbWFnZVVSTCA9IHJlYWRlci5nZXRVUkwoImFib3V0SW1hZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmZvLmZlYXR1cmVJbWFnZVVSTCA9IHJlYWRlci5nZXRVUkwoImZlYXR1cmVJbWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCWluZm8ud2VsY29tZVBhZ2VVUkwgPSByZWFkZXIuZ2V0VVJMKCJ3ZWxjb21lUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCWluZm8ud2VsY29tZVBlcnNwZWN0aXZlID0gcmVhZGVyLmdldFN0cmluZygid2VsY29tZVBlcnNwZWN0aXZlIiwgZmFsc2UsIHJ1bnRpbWVNYXBwaW5ncyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby50aXBzQW5kVHJpY2tzSHJlZiA9IHJlYWRlci5nZXRTdHJpbmcoInRpcHNBbmRUcmlja3NIcmVmIiwgZmFsc2UsIHJ1bnRpbWVNYXBwaW5ncyk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGluZm87Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBmb3IgYW4gaW1hZ2Ugd2hpY2ggY2FuIGJlIHNob3duIGluIGFuICJhYm91dCIgZGlhbG9nIAotCSAqIGZvciB0aGlzIHByb2R1Y3QuIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgCi0JICogaGF2ZSBzdWNoIGFuIGltYWdlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgYW4gYWJvdXQgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgVVJMIGdldEFib3V0SW1hZ2VVUkwoKSB7Ci0JCXJldHVybiBhYm91dEltYWdlVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFVSTCBmb3IgYW4gaW1hZ2Ugd2hpY2ggY2FuIGJlIHNob3duIGluIGFuICJhYm91dCBmZWF0dXJlcyIgCi0JICogZGlhbG9nLiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhbiBpbWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBVUkwgZm9yIGEgZmVhdHVyZSBpbWFnZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBVUkwgZ2V0RmVhdHVyZUltYWdlVVJMKCkgewotCQlyZXR1cm4gZmVhdHVyZUltYWdlVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbXBsZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGltYWdlIGZpbGUuCi0JICogCi0JICogQHJldHVybiB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlIGZlYXR1cmUgaW1hZ2UgZmlsZSwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSW1hZ2VOYW1lKCkgewotCQlpZiAoZmVhdHVyZUltYWdlVVJMICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmZWF0dXJlSW1hZ2VVUkwuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgbGFiZWwgZm9yIHRoZSBmZWF0dXJlIHBsdWduLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVMYWJlbCgpIHsKLQkJcmV0dXJuIGZlYXR1cmVQbHVnaW5MYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCBmb3IgdGhpcyBmZWF0dXJlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJZCgpIHsKLQkJcmV0dXJuIGZlYXR1cmVJZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCB0byBzaG93IGluIGFuICJhYm91dCIgZGlhbG9nIGZvciB0aGlzIHByb2R1Y3QuCi0JICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggdGV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhYm91dCB0ZXh0LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBYm91dFRleHQoKSB7Ci0JCXJldHVybiBhYm91dFRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXBwbGljYXRpb24gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBOb3RlIHRoaXMgaXMgbmV2ZXIgc2hvd24gdG8gdGhlIHVzZXIuCi0JICogSXQgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBTV1QgRGlzcGxheS4KLQkgKiA8cD4KLQkgKiBPbiBNb3RpZiwgZm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQKLQkgKiB0byBzZXQgdGhlIG5hbWUgdXNlZCBmb3IgcmVzb3VyY2UgbG9va3VwLgotCSAqIDwvcD4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGFwcGxpY2F0aW9uIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRBcHBOYW1lKCkgewotCQlyZXR1cm4gYXBwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9kdWN0IG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogVGhpcyBpcyBzaG93biBpbiB0aGUgd2luZG93IHRpdGxlIGFuZCB0aGUgQWJvdXQgYWN0aW9uLgotCSAqCi0JICogQHJldHVybiB0aGUgcHJvZHVjdCBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKSB7Ci0JCXJldHVybiBmZWF0dXJlUGx1Z2luTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvdmlkZXIgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm92aWRlck5hbWUoKSB7Ci0JCXJldHVybiBwcm92aWRlck5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSB2ZXJzaW9uIGlkLgotCSAqCi0JICogQHJldHVybiB0aGUgdmVyc2lvbiBpZCBvZiB0aGUgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbklkKCkgewotCQlyZXR1cm4gdmVyc2lvbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSA8Y29kZT5VUkw8L2NvZGU+IGZvciB0aGUgd2VsY29tZSBwYWdlLgotCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIHBhZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgd2VsY29tZSBwYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFVSTCBnZXRXZWxjb21lUGFnZVVSTCgpIHsKLQkJcmV0dXJuIHdlbGNvbWVQYWdlVVJMOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIG9mIGEgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdG8gc2hvdyB0aGUgd2VsY29tZSBwYWdlLgotCSAqIE1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB3ZWxjb21lIHBhZ2UgcGVyc3BlY3RpdmUgaWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdlbGNvbWVQZXJzcGVjdGl2ZUlkKCkgewotCQlyZXR1cm4gd2VsY29tZVBlcnNwZWN0aXZlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IGZvciB0aGUgdGlwcyBhbmQgdHJpY2sgaHJlZi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0aXBzIGFuZCB0cmlja3MgaHJlZiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGlwc0FuZFRyaWNrc0hyZWYoKSB7Ci0JCXJldHVybiB0aXBzQW5kVHJpY2tzSHJlZjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSB1cmwgZm9yIHRoZSB3aW5kb3cgaW1hZ2UgdG8gdXNlIGZvciB0aGlzIHByb2R1Y3QuCi0JICogUHJvZHVjdHMgZGVzaWduZWQgdG8gcnVuICJoZWFkbGVzcyIgdHlwaWNhbGx5IHdvdWxkIG5vdCBoYXZlIHN1Y2ggYW4gaW1hZ2UuCi0JICogCi0JICogQHJldHVybiB0aGUgaW1hZ2UgdXJsIGZvciB0aGUgd2luZG93IGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFVSTCBnZXRXaW5kb3dJbWFnZVVSTCgpIHsKLQkJcmV0dXJuIHdpbmRvd0ltYWdlVVJMOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgaW1hZ2UgVVJMcyBmb3IgdGhlIHdpbmRvdyBpbWFnZXMgdG8gdXNlIGZvcgotCSAqIHRoaXMgcHJvZHVjdC4gVGhlIGV4cGVjdGF0aW9ucyBpcyB0aGF0IHRoZSBlbGVtZW50cyB3aWxsIGJlIHRoZSBzYW1lCi0JICogaW1hZ2UgcmVuZGVyZWQgYXQgZGlmZmVyZW50IHNpemVzLiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIgotCSAqIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGltYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpbWFnZSBkZXNjcmlwdG9ycyBmb3IgdGhlIHdpbmRvdyBpbWFnZXMsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBVUkxbXSBnZXRXaW5kb3dJbWFnZXNVUkxzKCkgewotCQlyZXR1cm4gd2luZG93SW1hZ2VzVVJMczsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JQnVuZGxlR3JvdXBDb25zdGFudHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0lCdW5kbGVHcm91cENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTE3OWMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0lCdW5kbGVHcm91cENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLmJyYW5kaW5nOwotCi0vKioKLSAqIFRoZXNlIGNvbnN0YW50cyBkZWZpbmUgdGhlIHNldCBvZiBwcm9wZXJ0aWVzIHRoYXQgdGhlIFVJIGV4cGVjdHMgdG8KLSAqIGJlIGF2YWlsYWJsZSB2aWEgPGNvZGU+SUJ1bmRsZUdyb3VwLmdldFByb3BlcnR5KFN0cmluZyk8L2NvZGU+LgotICogCi0gKiBAc2luY2UgMy4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQnVuZGxlR3JvdXAjZ2V0UHJvcGVydHkoU3RyaW5nKQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCdW5kbGVHcm91cENvbnN0YW50cyB7Ci0JLyoqCi0JICogQW4gaW1hZ2Ugd2hpY2ggY2FuIGJlIHNob3duIGluIGFuICJhYm91dCBmZWF0dXJlcyIgZGlhbG9nICgzMngzMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9JTUFHRSA9ICJmZWF0dXJlSW1hZ2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGhlbHAgcmVmZXJlbmNlIGZvciB0aGUgZmVhdHVyZSdzIHRpcHMgYW5kIHRyaWNrcyBwYWdlIChvcHRpb25hbCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElQU19BTkRfVFJJQ0tTX0hSRUYgPSAidGlwc0FuZFRyaWNrc0hyZWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIFVSTCBmb3IgdGhlIGZlYXR1cmUncyB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSAgICAgKiAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKS4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhIHBhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9QQUdFID0gIndlbGNvbWVQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkIG9mIGEgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdG8gc2hvdyB0aGUgd2VsY29tZSBwYWdlCi0JICogKG9wdGlvbmFsKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUxDT01FX1BFUlNQRUNUSVZFID0gIndlbGNvbWVQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgVVJMIG9mIHRoZSBsaWNlbnNlIHBhZ2UgZm9yIHRoZSBmZWF0dXJlCi0JICogKG9wdGlvbmFsKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFX0hSRUYgPSAibGljZW5zZUhyZWYiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSVByb2R1Y3RDb25zdGFudHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29uZmlndXJhdG9yL2JyYW5kaW5nL0lQcm9kdWN0Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWVmNTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSVByb2R1Y3RDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKLQotLyoqCi0gKiBUaGVzZSBjb25zdGFudHMgZGVmaW5lIHRoZSBzZXQgb2YgcHJvcGVydGllcyB0aGF0IHRoZSBVSSBleHBlY3RzIHRvCi0gKiBiZSBhdmFpbGFibGUgdmlhIDxjb2RlPklQcm9kdWN0LmdldFByb3BlcnR5KFN0cmluZyk8L2NvZGU+LgotICogCi0gKiBAc2luY2UgMy4wCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdCNnZXRQcm9wZXJ0eShTdHJpbmcpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3RDb25zdGFudHMgewotCS8qKgotCSAqIFRoZSBhcHBsaWNhdGlvbiBuYW1lLCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIFNXVCBEaXNwbGF5LiAgVGhpcwotCSAqIHZhbHVlIGlzIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZyBkaXNwbGF5ZWQgaW4gdGhlIGFwcGxpY2F0aW9uCi0JICogdGl0bGUgYmFyLgotCSAqIDxwPgotCSAqIEUuZy4sIE9uIG1vdGlmLCB0aGlzIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbmFtZSB1c2VkIGZvcgotCSAqIHJlc291cmNlIGxvb2t1cC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQX05BTUUgPSAiYXBwTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB0ZXh0IHRvIHNob3cgaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMgcHJvZHVjdC4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90Ci0JICogaGF2ZSBzdWNoIHRleHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfVEVYVCA9ICJhYm91dFRleHQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBpbWFnZSB3aGljaCBjYW4gYmUgc2hvd24gaW4gYW4gImFib3V0IiBkaWFsb2cgZm9yIHRoaXMKLQkgKiBwcm9kdWN0LiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IAotCSAqIGhhdmUgc3VjaCBhbiBpbWFnZS4KLQkgKiA8cD4KLSAgICAgKiBBIGZ1bGwtc2l6ZWQgcHJvZHVjdCBpbWFnZSAobm8gbGFyZ2VyIHRoYW4gNTAweDMzMCBwaXhlbHMpIGlzCi0gICAgICogc2hvd24gd2l0aG91dCB0aGUgImFib3V0VGV4dCIgYmx1cmIuICBBIGhhbGYtc2l6ZWQgcHJvZHVjdCBpbWFnZQotICAgICAqIChubyBsYXJnZXIgdGhhbiAyNTB4MzMwIHBpeGVscykgaXMgc2hvd24gd2l0aCB0aGUgImFib3V0VGV4dCIKLSAgICAgKiBibHVyYiBiZXNpZGUgaXQuCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUJPVVRfSU1BR0UgPSAiYWJvdXRJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGltYWdlIHRvIGJlIHVzZWQgYXMgdGhlIHdpbmRvdyBpY29uIGZvciB0aGlzIHByb2R1Y3QgKDE2eDE2KS4gIAotCSAqIFByb2R1Y3RzIGRlc2lnbmVkIHRvIHJ1biAiaGVhZGxlc3MiIHR5cGljYWxseSB3b3VsZCBub3QgaGF2ZSBzdWNoIGFuIGltYWdlLgotCSAqIDxwPgotCSAqIElmIHRoZSA8Y29kZT5XSU5ET1dfSU1BR0VTPC9jb2RlPiBwcm9wZXJ0eSBpcyBnaXZlbiwgdGhlbiBpdCBzdXBlcmNlZGVzCi0JICogdGhpcyBvbmUuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19JTUFHRSA9ICJ3aW5kb3dJbWFnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIG9uZSBvciBtb3JlIGltYWdlcyB0byBiZSB1c2VkIGZvciB0aGlzIHByb2R1Y3QuICBUaGUKLQkgKiBleHBlY3RhdGlvbiBpcyB0aGF0IHRoZSBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgaW1hZ2UgcmVuZGVyZWQKLQkgKiBhdCBkaWZmZXJlbnQgc2l6ZXMgKDE2eDE2IGFuZCAzMngzMikuICAKLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBpbWFnZXMuCi0JICogPHA+Ci0JICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBnaXZlbiwgdGhlbiBpdCBzdXBlcmNlZGVzIDxjb2RlPldJTkRPV19JTUFHRTwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTkRPV19JTUFHRVMgPSAid2luZG93SW1hZ2VzIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgVVJMIGZvciB0aGUgcHJvZHVjdHMncyB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLQkgKiAoJG5sJC8gcHJlZml4IHRvIHBlcm1pdCBsb2NhbGUtc3BlY2lmaWMgdHJhbnNsYXRpb25zIG9mIGVudGlyZSBmaWxlKS4KLQkgKiBQcm9kdWN0cyBkZXNpZ25lZCB0byBydW4gImhlYWRsZXNzIiB0eXBpY2FsbHkgd291bGQgbm90IGhhdmUgc3VjaCBhIHBhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VMQ09NRV9QQUdFID0gIndlbGNvbWVQYWdlIjsgIC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JbmlGaWxlUmVhZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9icmFuZGluZy9JbmlGaWxlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMmYxZTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvYnJhbmRpbmcvSW5pRmlsZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZzsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFJlYWRzIHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhbiAiSU5JIiBmaWxlLiBUaGlzIGZpbGUgbXVzdCBiZSBpbiBhCi0gKiBzdGFuZGFyZCBKYXZhIHByb3BlcnRpZXMgZm9ybWF0LiBBIHByb3BlcnRpZXMgZmlsZSBtYXkgYWxzbyBiZSBwcm92aWRlZAotICogdG8gTkwgdmFsdWVzIGluIHRoZSBJTkkgZmlsZSAtIHZhbHVlcyBtdXN0IHN0YXJ0IHdpdGggdGhlICUgcHJlZml4LiBBCi0gKiBtYXBwaW5nIGZpbGUgbWF5IGFsc28gYmUgcHJvdmlkZWQgdGhhdCBjb250YWlucyAiZmlsbC1pbnMiIGZvciB0aGUKLSAqIHByb3BlcnRpZXMgZmlsZSAtIGZvcm1hdCBiZWluZyAibiA9IHNvbWUgdGV4dCIsIHdoZXJlIG4gaXMgYSBudW1iZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmlGaWxlUmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElEID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdHVzIE9LX1NUQVRVUyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUElELCAwLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRUZJWCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRE9VQkxFX1BSRUZJWCA9ICIlJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkxTX1RBRyA9ICIkbmwkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIGluaUZpbGVuYW1lOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnRpZXNGaWxlbmFtZTsKLQlwcml2YXRlIFN0cmluZyBtYXBwaW5nc0ZpbGVuYW1lOwotCXByaXZhdGUgUHJvcGVydGllcyBpbmkgPSBudWxsOwotCXByaXZhdGUgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBwcm9wZXJ0aWVzID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ1tdIG1hcHBpbmdzID0gbnVsbDsKLQlwcml2YXRlIEJ1bmRsZSBidW5kbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIElOSSBmaWxlIHJlYWRlciB0aGF0IGNhbiBwYXJzZSB0aGUgY29udGVudHMgaW50byBrZXksdmFsdWUgcGFpcnMuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVJZCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGZlYXR1cmUsIG11c3Qgbm90IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHBsdWdpbklkIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmVhdHVyZSBwbHVnLWluLCBtdXN0IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBpbmlGaWxlbmFtZSB0aGUgSU5JIGZpbGUgbmFtZSwgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gcHJvcGVydGllc0ZpbGVuYW1lIHRoZSBwcm9wZXJ0aWVzIGZpbGVuYW1lLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlcXVpcmVkCi0JICogQHBhcmFtIG1hcHBpbmdzRmlsZW5hbWUgdGhlIG1hcHBpbmdzIGZpbGVuYW1lLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHJlcXVpcmVkCi0JICovCi0JcHVibGljIEluaUZpbGVSZWFkZXIoU3RyaW5nIGZlYXR1cmVJZCwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgaW5pRmlsZW5hbWUsIFN0cmluZyBwcm9wZXJ0aWVzRmlsZW5hbWUsIFN0cmluZyBtYXBwaW5nc0ZpbGVuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCQotCQlpZiAoZmVhdHVyZUlkID09IG51bGwgfHwgcGx1Z2luSWQgPT0gbnVsbCB8fCBpbmlGaWxlbmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJCQotCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCQl0aGlzLmluaUZpbGVuYW1lID0gaW5pRmlsZW5hbWU7Ci0JCXRoaXMucHJvcGVydGllc0ZpbGVuYW1lID0gcHJvcGVydGllc0ZpbGVuYW1lOwotCQl0aGlzLm1hcHBpbmdzRmlsZW5hbWUgPSBtYXBwaW5nc0ZpbGVuYW1lOwotCX0KLQotCS8qKgotCSAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBJTkksIHByb3BlcnRpZXMsIGFuZCBtYXBwaW5ncyBmaWxlcy4KLQkgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnRlbnQgaGFzIGFscmVhZHkgYmVlbiByZWFkIGFuZCBwYXJzZWQuCi0JICogCi0JICogQHJldHVybiBhbiA8Y29kZT5JU3RhdHVzPC9jb2RlPiBpbmRpY2F0aW5nIHRoZSBzdWNjZXNzIG9yIGZhaWx1cmUKLQkgKiAJb2YgcmVhZGluZyBhbmQgcGFyc2luZyB0aGUgSU5JIGZpbGUgY29udGVudAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGxvYWQoKSB7Ci0JCWlmIChpbmkgIT0gbnVsbCkKLQkJCXJldHVybiBPS19TVEFUVVM7Ci0JCQkKLQkJLy8gYXR0ZW1wdCB0byBsb2NhdGUgdGhlIGNvcnJlc3BvbmRpbmcgcGx1Z2luCi0JCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUgPT0gbnVsbCB8fCBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuVU5JTlNUQUxMRUQgfHwgYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLklOU1RBTExFRCkgewotCQkJYnVuZGxlID0gbnVsbDsgLy8gbWFrZSBpdCBudWxsIGZvciBvdGhlciB0ZXN0IGRvd24gdGhlIHJvYWQKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbmlGaWxlUmVhZGVyLk1pc3NpbmdEZXNjIiwgZmVhdHVyZUlkKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBEZXRlcm1pbmUgdGhlIGluaSBmaWxlIGxvY2F0aW9uCi0JCVVSTCBpbmlVUkwgPSBudWxsOwotCQlJT0V4Y2VwdGlvbiBpb2UgPSBudWxsOwotCQl0cnkgewotCQkJaW5pVVJMID0gUGxhdGZvcm0uZmluZChidW5kbGUsIG5ldyBQYXRoKE5MU19UQUcpLmFwcGVuZChpbmlGaWxlbmFtZSkpOwotCQkJaWYgKGluaVVSTCAhPSBudWxsKQotCQkJCWluaVVSTCA9IFBsYXRmb3JtLnJlc29sdmUoaW5pVVJMKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW9lID0gZTsKLQkJfQotCQlpZiAoaW5pVVJMID09IG51bGwpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbmlGaWxlUmVhZGVyLk9wZW5JTklFcnJvciIsIGluaUZpbGVuYW1lKTsgIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgaW9lKTsKLQkJfQotCQkKLQkJLy8gRGV0ZXJtaW5lIHRoZSBwcm9wZXJ0aWVzIGZpbGUgbG9jYXRpb24KLQkJVVJMIHByb3BlcnRpZXNVUkwgPSBudWxsOwotCQlpZiAocHJvcGVydGllc0ZpbGVuYW1lICE9IG51bGwgJiBwcm9wZXJ0aWVzRmlsZW5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCXByb3BlcnRpZXNVUkwgPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoTkxTX1RBRykuYXBwZW5kKHByb3BlcnRpZXNGaWxlbmFtZSkpOwotCQkJCWlmIChwcm9wZXJ0aWVzVVJMICE9IG51bGwpCi0JCQkJCXByb3BlcnRpZXNVUkwgPSBQbGF0Zm9ybS5yZXNvbHZlKHByb3BlcnRpZXNVUkwpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbmlGaWxlUmVhZGVyLk9wZW5Qcm9wRXJyb3IiLCBwcm9wZXJ0aWVzRmlsZW5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElELCAwLCBtZXNzYWdlLCBlKTsKLQkJCX0KLQkJfQotCi0JCS8vIERldGVybWluZSB0aGUgbWFwcGluZ3MgZmlsZSBsb2NhdGlvbgotCQlVUkwgbWFwcGluZ3NVUkwgPSBudWxsOwotCQlpZiAobWFwcGluZ3NGaWxlbmFtZSAhPSBudWxsICYmIG1hcHBpbmdzRmlsZW5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQl0cnkgewotCQkJCW1hcHBpbmdzVVJMID0gUGxhdGZvcm0uZmluZChidW5kbGUsIG5ldyBQYXRoKE5MU19UQUcpLmFwcGVuZChtYXBwaW5nc0ZpbGVuYW1lKSk7Ci0JCQkJaWYgKG1hcHBpbmdzVVJMICE9IG51bGwpCi0JCQkJCW1hcHBpbmdzVVJMID0gUGxhdGZvcm0ucmVzb2x2ZShtYXBwaW5nc1VSTCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlcy5nZXRTdHJpbmcoIkluaUZpbGVSZWFkZXIuT3Blbk1hcEVycm9yIiwgbWFwcGluZ3NGaWxlbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSUQsIDAsIG1lc3NhZ2UsIGUpOwotCQkJfQotCQl9Ci0KLQkJLy8gT0sgdG8gcGFzcyBudWxsIHByb3BlcnRpZXMgYW5kL29yIG1hcHBpbmcgZmlsZQotCQlyZXR1cm4gbG9hZChpbmlVUkwsIHByb3BlcnRpZXNVUkwsIG1hcHBpbmdzVVJMKTsKLQl9Ci0JCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogVGhlIHN0cmluZyB2YWx1ZSBpcyBOTFMgaWYgcmVxdWVzdGVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5LCBib29sZWFuIGRvTmxzLCBIYXNodGFibGUgcnVudGltZU1hcHBpbmdzKSB7Ci0JCWlmIChpbmkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBpbmkuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgZG9ObHMpCi0JCQlyZXR1cm4gZ2V0UmVzb3VyY2VTdHJpbmcodmFsdWUsIHJ1bnRpbWVNYXBwaW5ncyk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYSBVUkwgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gYSBVUkwgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoU3RyaW5nIGtleSkgewotCQlpZiAoaW5pID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGZpbGVOYW1lID0gaW5pLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmIChmaWxlTmFtZSAhPSBudWxsKSB7Ci0JCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl1cmwgPSBQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoZmlsZU5hbWUpKTsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgYXJyYXkgb2YgVVJMIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4gVGhlCi0JICogcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdXJscywgdG9rZW5zIGZvcgotCSAqIHdoaWNoIGJ1bmRsZSBjYW5ub3QgYnVpbGQgYW4gdXJsIHdpbGwgaGF2ZSBhIG51bGwgZW50cnkuCi0JICogCi0JICogQHBhcmFtIGtleSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSByZXF1ZXN0ZWQgdXJscwotCSAqIEByZXR1cm4gYSBVUkwgZm9yIHRoZSBnaXZlbiBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHNpbmNlIDMuMAotCSAqLwotCXB1YmxpYyBVUkxbXSBnZXRVUkxzKFN0cmluZyBrZXkpIHsKLQkJaWYgKGluaSA9PSBudWxsIHx8IGJ1bmRsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gaW5pLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJQXJyYXlMaXN0IGFycmF5ID0gbmV3IEFycmF5TGlzdCgxMCk7Ci0JCXdoaWxlICh0b2tlbnMuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgc3RyID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWFycmF5LmFkZChQbGF0Zm9ybS5maW5kKGJ1bmRsZSwgbmV3IFBhdGgoc3RyKSkpOwotCQl9Ci0KLQkJVVJMW10gdXJscyA9IG5ldyBVUkxbYXJyYXkuc2l6ZSgpXTsKLQkJYXJyYXkudG9BcnJheSh1cmxzKTsKLQkJcmV0dXJuIHVybHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBwbHVnaW4gbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgcGx1Z2luIGxhYmxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZVBsdWdpbkxhYmVsKCkgewotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gKFN0cmluZylidW5kbGUuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX05BTUUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3ZpZGVyIG5hbWUgZm9yIHRoaXMgZmVhdHVyZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvdmlkZXIgbmFtZSBmb3IgdGhpcyBmZWF0dXJlLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgewotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gKFN0cmluZylidW5kbGUuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFTkRPUik7Ci0JCX0KLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm5zIGEgcmVzb3VyY2Ugc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IAotCSAqIHZhbHVlIGFuZCBidW5kbGUuCi0JICogSWYgdGhlIGFyZ3VtZW50IHZhbHVlIHNwZWNpZmllcyBhIHJlc291cmNlIGtleSwgdGhlIHN0cmluZwotCSAqIGlzIGxvb2tlZCB1cCBpbiB0aGUgZ2l2ZW4gcmVzb3VyY2UgYnVuZGxlLiBJZiB0aGUgYXJndW1lbnQgZG9lcyBub3QKLQkgKiBzcGVjaWZ5IGEgdmFsaWQga2V5LCB0aGUgYXJndW1lbnQgaXRzZWxmIGlzIHJldHVybmVkIGFzIHRoZQotCSAqIHJlc291cmNlIHN0cmluZy4gVGhlIGtleSBsb29rdXAgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlCi0JICogc3BlY2lmaWVkIHJlc291cmNlIGJ1bmRsZS4gSWYgYSByZXNvdXJjZSBzdHJpbmcgCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlCi0JICogdGhlIGtleSB2YWx1ZSwgb3IgYW55IGRlZmF1bHQgdGV4dCBmb2xsb3dpbmcgdGhlIGtleSBpbiB0aGUKLQkgKiBhcmd1bWVudCB2YWx1ZSBpcyByZXR1cm5lZCBhcyB0aGUgcmVzb3VyY2Ugc3RyaW5nLgotCSAqIEEga2V5IGlzIGlkZW50aWZpZWQgYXMgYSBzdHJpbmcgYmVnaW5pbmcgd2l0aCB0aGUgIiUiIGNoYXJhY3Rlci4KLQkgKiBOb3RlIHRoYXQgdGhlICIlIiBjaGFyYWN0ZXIgaXMgc3RyaXBwZWQgb2ZmIHByaW9yIHRvIGxvb2t1cAotCSAqIGluIHRoZSByZXNvdXJjZSBidW5kbGUuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGFzc3VtZSByZXNvdXJjZSBidW5kbGUgcGx1Z2luLnByb3BlcnRpZXMgY29udGFpbnMKLQkgKiBuYW1lID0gUHJvamVjdCBOYW1lCi0JICogPHByZT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCJIZWxsbyBXb3JsZCIpIHJldHVybnMgIkhlbGxvIFdvcmxkIjwvbGk+Ci0JICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJW5hbWUiKSByZXR1cm5zICJQcm9qZWN0IE5hbWUiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlbmFtZSBIZWxsbyBXb3JsZCIpIHJldHVybnMgIlByb2plY3QgTmFtZSI8L2xpPgotCSAqICAgICA8bGk+Z2V0UmVzb3VyY2VTdHJpbmcoIiVhYmNkIEhlbGxvIFdvcmxkIikgcmV0dXJucyAiSGVsbG8gV29ybGQiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKCIlYWJjZCIpIHJldHVybnMgIiVhYmNkIjwvbGk+Ci0JICogICAgIDxsaT5nZXRSZXNvdXJjZVN0cmluZygiJSVuYW1lIikgcmV0dXJucyAiJW5hbWUiPC9saT4KLQkgKiAgICAgPGxpPmdldFJlc291cmNlU3RyaW5nKDxjb2RlPm51bGw8L2NvZGU+KSByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+PC9saT4KLQkgKiA8L3ByZT4KLQkgKiA8L3A+Ci0JICoKLQkgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHJ1bnRpbWVNYXBwaW5ncyBydW50aW1lIG1hcHBpbmdzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiB0aGUgcmVzb3VyY2Ugc3RyaW5nCi0JICovCi0JIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIHZhbHVlLCBIYXNodGFibGUgcnVudGltZU1hcHBpbmdzKSB7Ci0JCQotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcyA9IHZhbHVlLnRyaW0oKTsKLQotCQlpZiAoIXMuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkKLQkJCXJldHVybiBzOwotCi0JCWlmIChzLnN0YXJ0c1dpdGgoS0VZX0RPVUJMRV9QUkVGSVgpKQotCQkJcmV0dXJuIHMuc3Vic3RyaW5nKDEpOwotCi0JCWludCBpeCA9IHMuaW5kZXhPZigiICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBrZXkgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZygwLCBpeCk7Ci0JCVN0cmluZyBkZmx0ID0gaXggPT0gLTEgPyBzIDogcy5zdWJzdHJpbmcoaXggKyAxKTsKLQotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuIGRmbHQ7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBwcm9wZXJ0aWVzLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBkZmx0OwotCQl9Ci0JCWlmIChydW50aW1lTWFwcGluZ3MgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gcnVudGltZU1hcHBpbmdzLmtleXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcga2V5VmFsdWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaW50IGkgPSByZXN1bHQuaW5kZXhPZihrZXlWYWx1ZSk7Ci0JCQkJaWYgKGkgIT0gLTEpIHsKLQkJCQkJU3RyaW5nIHMxID0gcmVzdWx0LnN1YnN0cmluZygwLGkpOwotCQkJCQlTdHJpbmcgczIgPSAoU3RyaW5nKSBydW50aW1lTWFwcGluZ3MuZ2V0KGtleVZhbHVlKTsKLQkJCQkJU3RyaW5nIHMzID0gcmVzdWx0LnN1YnN0cmluZyhpK2tleVZhbHVlLmxlbmd0aCgpKTsKLQkJCQkJcmVzdWx0ID0gczEgKyBzMiArIHMzOwotCQkJCX0KLQkJCX0KLQkJfQotCQotCQlpZiAocmVzdWx0LmluZGV4T2YoJ3snKSAhPSAtMSkgewotCQkJLy8gV2UgdGVzdCBmb3IgdGhlIGN1cmx5IGJyYWNlcyBzaW5jZSBkdWUgdG8gTkwgaXNzdWVzIHdlIGRvIG5vdAotCQkJLy8gd2FudCB0byB1c2UgTWVzc2FnZUZvcm1hdCB1bmxlc3Mgd2UgaGF2ZSB0by4KLQkJCXJlc3VsdCA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KHJlc3VsdCwgbWFwcGluZ3MpOwotCQl9Ci0JCQotCQlyZXR1cm4gcmVzdWx0OwkKLQl9Ci0KLQkvKgotCSAqIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmksIHByb3BlcnRpZXMsIGFuZCBtYXBwaW5ncyBmaWxlcy4KLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgbG9hZChVUkwgaW5pVVJMLCBVUkwgcHJvcGVydGllc1VSTCwgVVJMIG1hcHBpbmdzVVJMKSB7Ci0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJaXMgPSBpbmlVUkwub3BlblN0cmVhbSgpOwotCQkJaW5pID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCWluaS5sb2FkKGlzKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaW5pID0gbnVsbDsKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZXMuZ2V0U3RyaW5nKCJJbmlGaWxlUmVhZGVyLlJlYWRJbmlFcnJvciIsIGluaVVSTC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUElELCAwLCBtZXNzYWdlLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcGVydGllc1VSTCAhPSBudWxsKSB7Ci0JCQlpcyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlzID0gcHJvcGVydGllc1VSTC5vcGVuU3RyZWFtKCk7Ci0JCQkJcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGlzKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlwcm9wZXJ0aWVzID0gbnVsbDsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmdldFN0cmluZygiSW5pRmlsZVJlYWRlci5SZWFkUHJvcEVycm9yIiwgcHJvcGVydGllc1VSTC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJUHJvcGVydHlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQlpZiAobWFwcGluZ3NVUkwgIT0gbnVsbCkgewotCQkJaXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpcyA9IG1hcHBpbmdzVVJMLm9wZW5TdHJlYW0oKTsKLQkJCQlidW5kbGUgPSBuZXcgUHJvcGVydHlSZXNvdXJjZUJ1bmRsZShpcyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJYnVuZGxlID0gbnVsbDsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VzLmdldFN0cmluZygiSW5pRmlsZVJlYWRlci5SZWFkTWFwRXJyb3IiLCBtYXBwaW5nc1VSTC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJRCwgMCwgbWVzc2FnZSwgZSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQXJyYXlMaXN0IG1hcHBpbmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0JCQlib29sZWFuIGZvdW5kID0gdHJ1ZTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChmb3VuZCkgewotCQkJCXRyeSB7Ci0JCQkJCW1hcHBpbmdzTGlzdC5hZGQoYnVuZGxlLmdldFN0cmluZyhJbnRlZ2VyLnRvU3RyaW5nKGkpKSk7Ci0JCQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCQkJZm91bmQgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JCW1hcHBpbmdzID0gKFN0cmluZ1tdKW1hcHBpbmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbWFwcGluZ3NMaXN0LnNpemUoKV0pOwotCQkKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb25maWd1cmF0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhMDRhZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvbmZpZ3VyYXRvci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIyBCb290IHBsdWdpbiBtZXNzYWdlIGNhdGFsb2cKLQotb2sgPSBPSwotCi0jIyMgVVJMCi11cmwuYmFkVmFyaWFudD1VbnN1cHBvcnRlZCBcInBsYXRmb3JtOlwiIHByb3RvY29sIHZhcmlhdGlvbiB7MH0KLXVybC5pbnZhbGlkVVJMPUludmFsaWQgInBsYXRmb3JtOiIgVVJMIHswfQotdXJsLmNyZWF0ZUNvbm5lY3Rpb249VW5hYmxlIHRvIGNyZWF0ZSBjb25uZWN0aW9uIHswfQotdXJsLm5vYWNjZXNzPVVuYWJsZSB0byBhY2Nlc3MgVVJMIGFzIGxvY2FsIHswfS4KLQotIyMjIFBsYXRmb3JtIENvbmZpZ3VyYXRpb24KLWNmaWcuaW5Vc2U9XG5Db25maWd1cmF0aW9uIGZpbGUgXCJ7MH1cIiBpcyBpbiB1c2UgYnkgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgcGxhdGZvcm0sIFxuXAotCW9yIHRoZXJlIHdhcyBhIGZhaWx1cmUgaW4gZGVsZXRpbmcgdGhlIG9sZCBsb2NrIGZpbGUuICBJZiBubyBvdGhlciBwbGF0Zm9ybSBpbnN0YW5jZXMgYXJlIHJ1bm5pbmcsIFxuXAotCWRlbGV0ZSBmaWxlIFwiezF9XCIgYW5kIHRyeSBzdGFydGluZyB0aGUgcGxhdGZvcm0gYWdhaW4uCi1jZmlnLmZhaWxDcmVhdGVMb2NrPUZhaWxlZCB0byBjcmVhdGUgbG9jayBmb3IgY29uZmlndXJhdGlvbiBmaWxlIFwiezB9XCIKLWNmaWcuYmFkVXJsQXJnPUJhZCAtY29uZmlndXJhdGlvbiBhcmd1bWVudCBcInswfVwiCi1jZmlnLnVuYWJsZVRvTG9hZC5pbmNvbXBsZXRlPVVuYWJsZSB0byBsb2FkIHswfQotY2ZpZy51bmFibGVUb0xvYWQubm9VUkw9Q29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uIG5vdCBzcGVjaWZpZWQKLWNmaWcudW5hYmxlVG9TYXZlLm5vVVJMPUNvbmZpZ3VyYXRpb24gZmlsZSBzYXZlIGxvY2F0aW9uIG5vdCBzcGVjaWZpZWQKLWNmaWcudW5hYmxlVG9TYXZlPVVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gZmlsZSBcInswfVwiCi1jZmlnLmJhZFZlcnNpb249VW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbiB2ZXJzaW9uIFwiezB9XCIKLWNmZy51bmFibGVUb0NyZWF0ZUNvbmZpZy5pbmkgPSBVbmFibGUgdG8gY3JlYXRlIGNvbmZpZy5pbmkKLQotcGxhdGZvcm0ucnVubmluZz1UaGUgUGxhdGZvcm0gaXMgYWxyZWFkeSBydW5uaW5nLgotcGxhdGZvcm0ubXVzdE5vdEJlUnVubmluZz1UaGUgUGxhdGZvcm0gbXVzdCBub3QgYmUgcnVubmluZy4KLXBsYXRmb3JtLm5vdFJ1bm5pbmc9VGhlIFBsYXRmb3JtIGlzIG5vdCBydW5uaW5nLgotCi1pZ25vcmUucGx1Z2luPUlnbm9yaW5nIGludmFsaWQgcGx1Zy1pbiBsb2NhdGlvbjogezB9LgotYXBwbGljYXRpb24ubm90Rm91bmQ9QXBwbGljYXRpb24gbm90IGZvdW5kOiB7MH0uCi1lcnJvci5mYXRhbD1GYXRhbCBFcnJvcjogVW5hYmxlIHRvIGRldGVybWluZSBwbGF0Zm9ybSBpbnN0YWxsYXRpb24gVVJMIHswfS4KLWVycm9yLmJvb3Q9RmF0YWwgRXJyb3I6IFVuYWJsZSB0byBsb2NhdGUgYm9vdC54bWwgZmlsZSBmb3IgZXhlY3V0aW5nIG9yZy5lY2xpcHNlLmNvcmUuYm9vdC4KLWVycm9yLnJ1bnRpbWU9RmF0YWwgRXJyb3I6IFVuYWJsZSB0byBsb2NhdGUgbWF0Y2hpbmcgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIHBsdWctaW4uCi1lcnJvci54ZXJjZXM9RmF0YWwgRXJyb3I6IFVuYWJsZSB0byBsb2NhdGUgbWF0Y2hpbmcgb3JnLmFwYWNoZS54ZXJjZXMgcGx1Zy1pbi4KLWVycm9yLmJhZE5MPUJhZCB2YWx1ZTogXCJ7MH1cIiBmb3IgTkwuIFVzaW5nIHN5c3RlbSBkZWZhdWx0LgotCi1JbnN0YWxsZWRTaXRlUGFyc2VyLkRpcmVjdG9yeURvZXNOb3RFeGlzdD1UaGUgZGlyZWN0b3J5IFwiezB9XCIgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGZpbGUgc3lzdGVtLgotSW5zdGFsbGVkU2l0ZVBhcnNlci5VbmFibGVUb0NyZWF0ZVVSTD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLUluc3RhbGxlZFNpdGVQYXJzZXIuRmlsZURvZXNOb3RFeGlzdD0gVGhlIGZpbGUgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdC4KLUluc3RhbGxlZFNpdGVQYXJzZXIuVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1JbnN0YWxsZWRTaXRlUGFyc2VyLkVycm9yUGFyc2luZ0ZpbGU9IFVuYWJsZSB0byBwYXJzZSBmaWxlIFwiezB9XCIuCi1JbnN0YWxsZWRTaXRlUGFyc2VyLkVycm9yQWNjZXNzaW5nPSBVbmFibGUgdG8gYWNjZXNzIGZpbGUgXCJ7MH1cIi4KLUluc3RhbGxlZFNpdGVQYXJzZXIuZGF0ZSA9IEludmFsaWQgZGF0ZSBhdHRyaWJ1dGUgezB9Ci1CdW5kbGVNYW5pZmVzdC5ub1ZlcnNpb24gPSB7MH0gYXR0cmlidXRlIG5vdCBmb3VuZCBpbiBtYW5pZmVzdCBmb3IgYnVuZGxlIFwiezF9XCIuICBCdW5kbGUgd2lsbCBiZSBpZ25vcmVkLgotCi1GZWF0dXJlUGFyc2VyLklkT3JWZXJzaW9uSW52YWxpZD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9yIHRoZSB2ZXJzaW9uIGlzIG51bGwgb3IgZW1wdHk6IHVuaXF1ZSBpZGVudGlmaWVyPVwiezB9XCIgdmVyc2lvbj1cInsxfVwiLgotCi1CdW5kbGVHcm91cFByb3ZpZGVyPVVwZGF0ZSBNYW5hZ2VyIENvbmZpZ3VyYXRvcgotUHJvZHVjdFByb3ZpZGVyPVVwZGF0ZSBNYW5hZ2VyIENvbmZpZ3VyYXRvcgotCi1BYm91dEluZm8ubm90U3BlY2lmaWVkPVVuc3BlY2lmaWVkCi1Db25maWd1cmF0aW9uQWN0aXZhdG9yLmluaXRpYWxpemU9Q2Fubm90IGluaXRpYWxpemUgdGhlIFVwZGF0ZSBDb25maWd1cmF0b3IKLUNvbmZpZ3VyYXRpb25BY3RpdmF0b3IuY3JlYXRlQ29uZmlnPUNhbm5vdCBjcmVhdGUgY29uZmlndXJhdGlvbiBpbiB7MH0KLUNvbmZpZ3VyYXRpb25BY3RpdmF0b3IudW5pbnN0YWxsQnVuZGxlPUNvdWxkIG5vdCB1bmluc3RhbGwgdW51c2VkIGJ1bmRsZSB7MH0gCi1Db25maWd1cmF0aW9uUGFyc2VyLmNhbm5vdExvYWRTaGFyZWRJbnN0YWxsPUNvdWxkIG5vdCBsb2FkIGZyb20gc2hhcmVkIGluc3RhbGwKLUNvbmZpZ3VyYXRpb25BY3RpdmF0b3IuaW5zdGFsbEJ1bmRsZT1Db3VsZCBub3QgaW5zdGFsbCBidW5kbGUgezB9Ci1QbHVnaW5FbnRyeS52ZXJzaW9uRXJyb3I9VW5hYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uZWQgaWRlbnRpZmllcjogezB9IHsxfQotCi1JbmlGaWxlUmVhZGVyLk1pc3NpbmdEZXNjID0gQ2Fubm90IGZpbmQgcGx1Z2luIGZvciBmZWF0dXJlIHswfQotSW5pRmlsZVJlYWRlci5PcGVuSU5JRXJyb3IgPSBDYW5ub3Qgb3BlbiBicmFuZGluZyBmaWxlIHswfQotSW5pRmlsZVJlYWRlci5PcGVuUHJvcEVycm9yID0gQ2Fubm90IG9wZW4gYnJhbmRpbmcgcHJvcGVydGllcyBmaWxlIHswfQotSW5pRmlsZVJlYWRlci5PcGVuTWFwRXJyb3IgPSBDYW5ub3Qgb3BlbiBtYXBwaW5nIGZpbGUgezB9Ci1JbmlGaWxlUmVhZGVyLlJlYWRJbmlFcnJvciA9IEVycm9yIHJlYWRpbmcgYnJhbmRpbmcgZmlsZSB7MH0KLUluaUZpbGVSZWFkZXIuUmVhZFByb3BFcnJvciA9IEVycm9yIHJlYWRpbmcgYnJhbmRpbmcgcHJvcGVydGllcyBmaWxlIHswfQotSW5pRmlsZVJlYWRlci5SZWFkTWFwRXJyb3IgPSBFcnJvciByZWFkaW5nIG1hcHBpbmcgZmlsZXMgezB9Ci0KLVNpdGVFbnRyeS5jb21wdXRlUGx1Z2luU3RhbXAgPSBDYW5ub3QgY29tcHV0ZSBwbHVnaW5zIGNoYW5nZSBzdGFtcCBmb3Igc2l0ZSB7MH0gYmVjYXVzZSBpdCBkb2VzIG5vdCBzdXBwb3J0IHBsdWdpbiBkZXRlY3Rpb24uCi1TaXRlRW50cnkuY2Fubm90RmluZEZlYXR1cmVJbkRpcj1VbmFibGUgdG8gZmluZCBmZWF0dXJlLnhtbCBpbiBkaXJlY3Rvcnk6IHswfQotU2l0ZUVudHJ5LmR1cGxpY2F0ZUZlYXR1cmU9RHVwbGljYXRlIGZlYXR1cmUgZm91bmQgb24gc2l0ZSB7MH0gOiB7MX0KLVNpdGVFbnRyeS5wbHVnaW5zRGlyID0gezB9IGlzIG5vdCBhIHZhbGlkIHBsdWdpbnMgZGlyZWN0b3J5LgotUGxhdGZvcm1Db25maWd1cmF0aW9uLmV4cGVjdGluZ1BsYXRmb3JtWE1Mb3JEaXJlY3Rvcnk9RWl0aGVyIHNwZWNpZnkgdGhlIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5IG9yIGEgZmlsZSBuYW1lZCBwbGF0Zm9ybS54bWwgCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90QmFja3VwQ29uZmlnPUNhbm5vdCBiYWNrdXAgY3VycmVudCBjb25maWd1cmF0aW9uCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90Q2xvc2VTdHJlYW09Q291bGQgbm90IGNsb3NlIG91dHB1dCBzdHJlYW0gZm9yIAotUGxhdGZvcm1Db25maWd1cmF0aW9uLmNhbm5vdENsb3NlVGVtcEZpbGU9Q291bGQgbm90IGNsb3NlIG91dHB1dCBzdHJlYW0gZm9yIHRlbXAgZmlsZSAKLVBsYXRmb3JtQ29uZmlndXJhdGlvbi5jYW5ub3RSZW5hbWVUZW1wRmlsZT1Db3VsZCBub3QgcmVuYW1lIGNvbmZpZ3VyYXRpb24gdGVtcCBmaWxlCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90TG9hZENvbmZpZz1DYW5ub3QgbG9hZCBjb25maWd1cmF0aW9uIGZyb20gCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90TG9hZERlZmF1bHRTaXRlPUNhbm5vdCBsb2FkIGRlZmF1bHQgc2l0ZSAKLVBsYXRmb3JtQ29uZmlndXJhdGlvbi5jYW5ub3RGaW5kQ29uZmlnRmlsZT1QbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGUgY2Fubm90IGJlIGZvdW5kCi1QbGF0Zm9ybUNvbmZpZ3VyYXRpb24uY2Fubm90U2F2ZU5vbkV4aXN0aW5nQ29uZmlnPUNvbmZpZ3VyYXRpb24gY2Fubm90IGJlIHNhdmVkIGJlY2F1c2UgaXQgZG9lcyBub3QgZXhpc3QKLUh0dHBSZXNwb25zZS5yYW5nZUV4cGVjdGVkPVNlcnZlciByZXR1cm5lZCBmdWxsIGNvbnRlbnQgaW5zdGVhZCBvZiBhIHJhbmdlLgotSHR0cFJlc3BvbnNlLndyb25nUmFuZ2U9U2VydmVyIHJldHVybmVkIHdyb25nIHJhbmdlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ4MjQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OGUyYjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eDwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3I8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUuY29yZTwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZDQxNGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIG9zLyxcCi0gICAgICAgICAgICAgICBmcmFnbWVudC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IHNyYy8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9mcmFnbWVudC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQwNjg0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9mcmFnbWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPGZyYWdtZW50Ci0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgiCi0gICBuYW1lPSIlZnJhZ21lbnROYW1lTGludXgiCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBwbHVnaW4taWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIgotICAgcGx1Z2luLXZlcnNpb249IjMuMC4wIgotICAgbWF0Y2g9ImNvbXBhdGlibGUiPgotCi0gICA8cnVudGltZT4KLSAgIDwvcnVudGltZT4KLQotCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni9saWJ1cGRhdGUuc28gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvb3MvbGludXgveDg2L2xpYnVwZGF0ZS5zbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwYTllOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvb3MvbGludXgveDg2L2xpYnVwZGF0ZS5zbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDRlYWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGRsaWJyYXJ5IiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiAKLSAgCi0gIDwhLS0gVGhlIHByb3BlcnRpZXMgJHtlY2xpcHNlLWhvbWV9ICR7amRrLXBhdGh9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLSAgPHByb3BlcnR5IG5hbWU9Impkay1wYXRoIiB2YWx1ZT0iJHtqYXZhLmhvbWV9Ii8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImRlc3RpbmF0aW9uIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L29zL2xpbnV4L3g4Ni8iLz4KLSAgPHByb3BlcnR5IG5hbWU9Im9iai1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy8iLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy8iLz4gIAotICAKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1uYW1lIiB2YWx1ZT0ibGlidXBkYXRlIi8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktcGxhdGZvcm0iIHZhbHVlPSJzbyIvPiAgICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7bGlicmFyeS1uYW1lfS4ke2xpYnJhcnktcGxhdGZvcm19Ii8+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGFsbCBpbml0aWFsaXphdGlvbiBjb2RlIHRoYXQgbmVlZHMgdG8gYmUgZG9uZSBmb3IgLS0+Ci0gIDwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImluaXQiPgotICAgIDx0c3RhbXAvPgotICAgIDxkZWxldGU+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LWZpbGV9Ii8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9Lm8iLz4KLSAgICA8L2RlbGV0ZT4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPgotICA8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0gICAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vIi8+Ci0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgYnVpbGQuIC0tPgotICA8dGFyZ2V0IG5hbWU9InJ1biIgZGVwZW5kcz0iaW5pdCxidWlsZCxjbGVhbnVwIj4KLSAgPC90YXJnZXQ+Ci0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IGJ1aWxkIHRoZSBsaWJyYXJ5IC0tPgotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyAke2xpYnJhcnktZmlsZX0iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItcGF0aCIgdmFsdWU9IiR7amRrLXBhdGh9Ly4uL2luY2x1ZGUiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyLWxpbnV4LXBhdGgiIHZhbHVlPSIke2hlYWRlci1wYXRofS9saW51eCIgLz4KLQotCTxlY2hvIG1lc3NhZ2U9ImdjYyAtbyAgJHtsaWJyYXJ5LWZpbGV9IC1zaGFyZWQgLUkke3NyYy1wYXRofSAtSSR7aGVhZGVyLWxpbnV4LXBhdGh9ICR7bGlicmFyeS1maWxlfSAtc3RhdGljIC1sYyIvPgotCi0gICAgPGFwcGx5IGV4ZWN1dGFibGU9ImdjYyIgZGVzdD0iJHtlY2xpcHNlLWhvbWV9LyIgcGFyYWxsZWw9ImZhbHNlIj4KLSAgICAgIDxhcmcgdmFsdWU9Ii1vIi8+Ci0gICAgICA8YXJnIHZhbHVlPSIke2xpYnJhcnktZmlsZX0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1zaGFyZWQiLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtzcmMtcGF0aH0iLz4KLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItcGF0aH0iLz4gICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1JJHtoZWFkZXItbGludXgtcGF0aH0iLz4gIAotCSAgPHNyY2ZpbGUvPgotCSAgPGFyZyB2YWx1ZT0iLXN0YXRpYyIvPiAgICAgICAgICAgCi0gICAgICA8YXJnIHZhbHVlPSItbGMiLz4JICAKLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtzcmMtcGF0aH0iIGluY2x1ZGVzPSIqLmMiLz4KLSAgICAgIDxtYXBwZXIgdHlwZT0iZ2xvYiIgZnJvbT0iKi5jIiB0bz0iKi5vIi8+Ci0gICAgPC9hcHBseT4KLSAgICAKLQk8bW92ZSBmaWxlPSIke2xpYnJhcnktZmlsZX0iIHRvZGlyPSIke2Rlc3RpbmF0aW9ufSIvPgotICA8L3RhcmdldD4KLSAgCi0gIAotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvdXBkYXRlLmMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXgvc3JjL3VwZGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWNiM2E0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvdXBkYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLSMgaW5jbHVkZSA8c3lzL3R5cGVzLmg+DQotIyBpbmNsdWRlIDxzeXMvc3RhdGZzLmg+DQotIyBpbmNsdWRlIDx1cGRhdGUuaD4NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQotICovDQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IGNoYXIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIExpbnV4IFBhcmFtZXRlcnMNCi0Jc3RydWN0IHN0YXRmcyBidWZmZXI7DQotDQotCS8vIHRoZSByZXN1bHQNCi0JamxvbmcgcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTjsNCi0NCi0JY2xzID0gKCpqbmllbnYpIC0+IEdldE9iamVjdENsYXNzKGpuaWVudiwgZmlsZSk7DQotCWlkID0gKCpqbmllbnYpIC0+IEdldE1ldGhvZElEKGpuaWVudiwgY2xzLCAiZ2V0QWJzb2x1dGVQYXRoIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7DQotCW9iaiA9ICgqam5pZW52KSAtPiBDYWxsT2JqZWN0TWV0aG9kKGpuaWVudiwgZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSAoKmpuaWVudikgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoam5pZW52LCAoanN0cmluZykgb2JqLCAwKTsNCi0NCi0JLy8gY2FzdCBvbmUgYXJndW1lbnQgYXMgamxvbmcgdG8gaGF2ZSBhIGpsb25nIHJlc3VsdA0KLQlpbnQgZXJyID0gc3RhdGZzKGxwRGlyZWN0b3J5TmFtZSwmYnVmZmVyKTsNCi0JaWYgKGVycj09MCl7DQotCQlsb25nIHNpemUgPSBidWZmZXIuZl9ic2l6ZTsNCi0JCWpsb25nIGZyZWUgPSBidWZmZXIuZl9iZnJlZTsNCi0JCXJlc3VsdCA9IHNpemUqZnJlZTsNCi0JfQ0KLQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRMYWJlbA0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUxqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqc3RyaW5nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0TGFiZWwoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgY2hhciAqIGxwRGlyZWN0b3J5TmFtZTsNCi0NCi0JLy8gb2J0YWluIHRoZSBTdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyDQotCWNscyA9ICgqam5pZW52KSAtPiBHZXRPYmplY3RDbGFzcyhqbmllbnYsIGZpbGUpOw0KLQlpZCA9ICgqam5pZW52KSAtPiBHZXRNZXRob2RJRChqbmllbnYsIGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSAoKmpuaWVudikgLT4gQ2FsbE9iamVjdE1ldGhvZChqbmllbnYsIGZpbGUsIGlkKTsNCi0JbHBEaXJlY3RvcnlOYW1lID0gKCpqbmllbnYpIC0+IEdldFN0cmluZ1VURkNoYXJzKGpuaWVudiwgKGpzdHJpbmcpIG9iaiwgMCk7DQotDQotCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCi0NCi0JLy8gTGludXggaW1wbGVtZW50YXRpb24gZm9sbG93aW5nDQotDQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IGNoYXIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIG9idGFpbiB0aGUgU3RyaW5nIGZyb20gdGhlIHBhcmFtZXRlcg0KLQljbHMgPSAoKmpuaWVudikgLT4gR2V0T2JqZWN0Q2xhc3Moam5pZW52LCBmaWxlKTsNCi0JaWQgPSAoKmpuaWVudikgLT4gR2V0TWV0aG9kSUQoam5pZW52LCBjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gKCpqbmllbnYpIC0+IENhbGxPYmplY3RNZXRob2Qoam5pZW52LCBmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9ICgqam5pZW52KSAtPiBHZXRTdHJpbmdVVEZDaGFycyhqbmllbnYsIChqc3RyaW5nKSBvYmosIDApOw0KLQ0KLQlpbnQgcmVzdWx0Ow0KLQkNCi0JLy8gTGludXggaW1wbGVtYW50YXRpb24NCi0NCi0JcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEg7DQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUxpc3RNb3VudFBvaW50cw0KLSAqIFNpZ25hdHVyZTogKClbTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpvYmplY3RBcnJheSBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUxpc3RNb3VudFBvaW50cygNCi0JSk5JRW52ICogam5pZW52LA0KLQlqY2xhc3MgamF2YUNsYXNzKSB7DQotDQotCS8vDQotCWludCBkcml2ZTsNCi0JY2hhciBkcml2ZU5hbWVbMTAwXTsNCi0Jam9iamVjdEFycmF5IHJldHVybkFycmF5Ow0KLQlpbnQgbkRyaXZlID0gMDsNCi0NCi0JLy8gDQotCWpjbGFzcyBzdHJpbmdDbGFzczsNCi0Jam9iamVjdCBlbXB0eTsNCi0JaW50IGluZGV4ID0gMDsNCi0Jam9iamVjdCBzdHI7DQotDQotCS8vIExpbnV4IGltcGxlbWVudGF0aW9uDQotCS8vIGZpbmQgbW91bnQgcG9pbnRzDQotDQotCWRyaXZlID0gMDsNCi0Jc3RyaW5nQ2xhc3MgPSAoKmpuaWVudikgLT4gRmluZENsYXNzKGpuaWVudiwgImphdmEvbGFuZy9TdHJpbmciKTsNCi0JZW1wdHkgPSAoKmpuaWVudikgLT4gTmV3U3RyaW5nVVRGKGpuaWVudiwgIiIpOw0KLQkvL3JldHVybkFycmF5ID0gKCpqbmllbnYpIC0+IE5ld09iamVjdEFycmF5KGpuaWVudiwgbkRyaXZlLCBzdHJpbmdDbGFzcywgZW1wdHkpOw0KLQ0KLQkvLyBmb3Igbm93IHJldHVybiBudWxsIGFzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQNCi0JcmV0dXJuQXJyYXkgPSBOVUxMOw0KLQ0KLQlpbnQgaTsNCi0JZm9yIChpID0gMDsgaSA8IGRyaXZlOyBpKyspIHsNCi0JCS8vIExpbnV4IGltcGxlbWVudGF0aW9uLCBjcmVhdGUgU3RyaW5nIGZvciBlYWNoIG1vdW50IHBvaW50DQotDQotCQlzdHIgPSAoKmpuaWVudikgLT4gTmV3U3RyaW5nVVRGKGpuaWVudiwgZHJpdmVOYW1lKTsNCi0JCSgqam5pZW52KSAtPiBTZXRPYmplY3RBcnJheUVsZW1lbnQoam5pZW52LCByZXR1cm5BcnJheSwgaW5kZXgsIHN0cik7DQotDQotCQlpbmRleCsrOw0KLQl9DQotDQotCXJldHVybiByZXR1cm5BcnJheTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5saW51eC9zcmMvdXBkYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjAzNDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4L3NyYy91cGRhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qIERPIE5PVCBFRElUIFRISVMgRklMRSAtIGl0IGlzIG1hY2hpbmUgZ2VuZXJhdGVkICovDQotDQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLSANCi0jaW5jbHVkZSA8am5pLmg+DQotLyogSGVhZGVyIGZvciBjbGFzcyBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8gKi8NCi0NCi0jaWZuZGVmIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jaWZkZWYgX19jcGx1c3BsdXMNCi1leHRlcm4gIkMiIHsNCi0jZW5kaWYNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTg0KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dODQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1VOS05PV04gLTFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIDQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSCAtMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVkFCTEUNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFIDFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQgMkwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SRU1PVEUNCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1RFIDNMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00NCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00gNEwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9SQU1ESVNLDQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sgNUwNCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBsaXN0ZW5lcnMgKi8NCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBoYXNOYXRpdmVzICovDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0RnJlZVNwYWNlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSg0KLSAqLw0KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldEZyZWVTcGFjZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOw0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldExhYmVsDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspTGphdmEvbGFuZy9TdHJpbmc7DQotICovDQotSk5JRVhQT1JUIGpzdHJpbmcgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRMYWJlbA0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOw0KLQ0KLS8qDQotICogQ2xhc3M6ICAgICBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0gKiBNZXRob2Q6ICAgIG5hdGl2ZUdldFR5cGUNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylJDQotICovDQotSk5JRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVHZXRUeXBlDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICAoSk5JRW52ICosIGpjbGFzcyk7DQotDQotI2lmZGVmIF9fY3BsdXNwbHVzDQotfQ0KLQ0KLSNlbmRpZg0KLSNlbmRpZg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM5YjI4Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljZDU1Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmcmFnbWVudC54bWwsXAotICAgICAgICAgICAgICAgb3MvLFwKLSAgICAgICAgICAgICAgIGZyYWdtZW50LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotc3JjLmluY2x1ZGVzID0gZnJhZ21lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc3JjLwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2ZyYWdtZW50LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9mcmFnbWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDhlN2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL2ZyYWdtZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08ZnJhZ21lbnQKLSAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMiIKLSAgIG5hbWU9IiVmcmFnbWVudE5hbWVXaW4iCi0gICB2ZXJzaW9uPSIzLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICBwbHVnaW4taWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIgotICAgcGx1Z2luLXZlcnNpb249IjMuMC4wIgotICAgbWF0Y2g9ImNvbXBhdGlibGUiPgotCi0gICA8cnVudGltZT4KLSAgIDwvcnVudGltZT4KLQotCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL29zL3dpbjMyL3g4Ni91cGRhdGUuZGxsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjhlNjBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi94ODYvdXBkYXRlLmRsbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMjg2YjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy9idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0iYnVpbGRsaWJyYXJ5IiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiAKLSAgCi0gIDwhLS0gVGhlIHByb3BlcnRpZXMgJHtlY2xpcHNlLWhvbWV9ICR7amRrLXBhdGh9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBUaGUgUGF0aCBzaG91bGQgcG9pbnQgdG8gdGhlIGJpbiBkaXJlY3Rvcnkgb2YgQkNDNTUgLS0+Ci0gIDwhLS0gaHR0cDovL3d3dy5ib3JsYW5kLmNvbS9wcm9kdWN0cy9kb3dubG9hZHMvZG93bmxvYWRfY2J1aWxkZXIuaHRtbCAtLT4KLSAgCi0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlLWhvbWUiIHZhbHVlPSIke2Jhc2VkaXJ9Ly4uLy4uIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJqZGstcGF0aCIgdmFsdWU9IiR7amF2YS5ob21lfSIvPiAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJkZXN0aW5hdGlvbiIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9vcy93aW4zMi94ODYvIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJvYmotcGF0aCIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMiLz4KLSAgPHByb3BlcnR5IG5hbWU9InNyYy1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy8iLz4gIAotICAKLSAgPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIC0tPgotICA8cHJvcGVydHkgbmFtZT0ibGlicmFyeS1uYW1lIiB2YWx1ZT0idXBkYXRlIi8+ICAKLSAgPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktcGxhdGZvcm0iIHZhbHVlPSJkbGwiLz4gICAgCi0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2xpYnJhcnktbmFtZX0uJHtsaWJyYXJ5LXBsYXRmb3JtfSIvPgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1maWxlfSIvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke29iai1wYXRofSIgaW5jbHVkZXM9IiR7bGlicmFyeS1uYW1lfS5vYmoiLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0udGRzIi8+ICAgICAgICAgICAgCi0gICAgPC9kZWxldGU+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICAgICAgPGRlbGV0ZT4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktZmlsZX0iLz4KLSAgICAgIDxmaWxlc2V0IGRpcj0iJHtvYmotcGF0aH0iIGluY2x1ZGVzPSIke2xpYnJhcnktbmFtZX0ub2JqIi8+Ci0gICAgICA8ZmlsZXNldCBkaXI9IiR7b2JqLXBhdGh9IiBpbmNsdWRlcz0iJHtsaWJyYXJ5LW5hbWV9LnRkcyIvPiAgICAgICAgICAgIAotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgCi0gIAotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLSAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsYnVpbGQsY2xlYW51cCI+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBidWlsZCB0aGUgZGxsIC0tPgotICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJCdWlsZGluZyAke2xpYnJhcnktZmlsZX0iLz4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXItcGF0aCIgdmFsdWU9IiR7amRrLXBhdGh9L2luY2x1ZGUiLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyLXdpbmRvd3MtcGF0aCIgdmFsdWU9IiR7aGVhZGVyLXBhdGh9L3dpbjMyIiAvPgotCi0JPGVjaG8gbWVzc2FnZT0iYmNjMzIgLUkke3NyYy1wYXRofSAtSSR7aGVhZGVyLXdpbmRvd3MtcGF0aH0gLVdEIi8+Ci0KLSAgICA8YXBwbHkgZXhlY3V0YWJsZT0iYmNjMzIiIGRlc3Q9IiR7ZWNsaXBzZS1ob21lfS8iIHBhcmFsbGVsPSJmYWxzZSI+Ci0gICAgICA8YXJnIHZhbHVlPSItSSR7c3JjLXBhdGh9Ii8+Ci0gICAgICA8YXJnIHZhbHVlPSItSSR7aGVhZGVyLXBhdGh9Ii8+ICAgICAgCi0gICAgICA8YXJnIHZhbHVlPSItSSR7aGVhZGVyLXdpbmRvd3MtcGF0aH0iLz4gCi0gICAgICA8IS0tIGFyZyB2YWx1ZT0iLURVTklDT0RFIiAtLT4gCi0JICA8YXJnIHZhbHVlPSItdy04MDU3Ii8+ICAgICAgICAgICAKLSAgICAgIDxhcmcgdmFsdWU9Ii1XRCIvPgotCSAgPHNyY2ZpbGUvPgotICAgICAgPGZpbGVzZXQgZGlyPSIke3NyYy1wYXRofSIgaW5jbHVkZXM9IiouY3BwIi8+Ci0gICAgICA8bWFwcGVyIHR5cGU9Imdsb2IiIGZyb209IiouY3BwIiB0bz0iKi5vYmoiLz4KLSAgICA8L2FwcGx5PgotICAgIAotCTxtb3ZlIGZpbGU9IiR7bGlicmFyeS1maWxlfSIgdG9kaXI9IiR7ZGVzdGluYXRpb259Ii8+Ci0gIDwvdGFyZ2V0PgotICAKLSAgCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuY3BwIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLndpbjMyL3NyYy91cGRhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjI3ZmQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotIyBpbmNsdWRlIDx1cGRhdGUuaD4NCi0jIGluY2x1ZGUgPHdpbmRvd3MuaD4NCi0jIGluY2x1ZGUgPHdpbmlvY3RsLmg+IC8vIElPQ1RMIGNvZGVzOiBNZWRpYVR5cGUNCi0NCi0vLyBXaW5kb3dzIFZlcnNpb24NCi1pbnQgV0lOOTggPSAwOw0KLWludCBXSU5OVCA9IDE7DQotaW50IFdJTk1FID0gMjsNCi1pbnQgV0lOMjAwMCA9IDM7DQotaW50IFdJTlhQID0gNDsNCi0NCi0vLyBzZXQgdG8gMSBmb3IgREVCVUcNCi1pbnQgREVCVUcgPSAwOw0KLQ0KLS8vIHNldCB0byAwIHRvIHJ1biBvbiBXaW5kb3dzIDk1ICpVbnN1cHBvcnRlZCoNCi1pbnQgTk9XSU45NSA9IDE7DQotDQotDQotLy8gR0xPQkFMIE1FVEhPRFMNCi0vLyAtLS0tLS0tLS0tLS0tLS0NCi0NCi0vKg0KLSAqDQotICovDQotanN0cmluZyBXaW5kb3dzVG9qc3RyaW5nKCBKTklFbnYqIGpuaWVudiwgY2hhciogYnVmICkNCi17DQotICBqc3RyaW5nIHJ0biA9IDA7DQotICB3Y2hhcl90KiBidWZmZXIgPSAwOw0KLSAgaW50IGJ1ZmZlckxlbiA9IHN0cmxlbihidWYpOyAgDQotICBpZiggYnVmZmVyTGVuID09IDAgKXsNCi0gICAgcnRuID0gam5pZW52IC0+TmV3U3RyaW5nVVRGKGJ1Zik7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiV2luZG93c1RvSlN0cmluZyBCdWZmZXIgaXMgZW1wdHlcbiIpOyAgICANCi0gIH0gZWxzZSB7DQotICAgIGludCBsZW5ndGggPSBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIChMUENTVFIpYnVmLCBidWZmZXJMZW4sIE5VTEwsIDAgKTsNCi0gICAgYnVmZmVyID0gKHdjaGFyX3QqKW1hbGxvYyggbGVuZ3RoKjIgKyAxICk7DQotICAgIGlmKGludCBlcnI9TXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCAoTFBDU1RSKWJ1ZiwgYnVmZmVyTGVuLCAoTFBXU1RSKWJ1ZmZlciwgbGVuZ3RoICkgPjAgKXsNCi0gICAgICBydG4gPSBqbmllbnYtPk5ld1N0cmluZygoamNoYXIqKWJ1ZmZlciwgbGVuZ3RoICk7DQotICAgIH0gZWxzZSB7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJNdWx0aUJ5dGVUb1dpZGVDaGFyICVpXG4iLGVycik7ICAgIA0KLSAgICB9DQotICB9DQotICBpZiggYnVmZmVyICkNCi0gICBmcmVlKCBidWZmZXIgKTsNCi0gIHJldHVybiBydG47DQotfQ0KLQ0KLQ0KLQ0KLS8qDQotICogY2FsbHMgR2V0Vm9sdW1lSW5mb3JtYXRpb24gdG8gcmV0cml2ZSB0aGUgbGFiZWwgb2YgdGhlIHZvbHVtZQ0KLSAqIFJldHVybnMgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMNCi0gKiBAcGFyYW0gZHJpdmVMZXR0ZXIgcGF0aCB0byB0aGUgZHJpdmUgImM6XFwiDQotICogQHByYW1hIGpuaWVudiBKTklFbnZpcm9ubWVudA0KLSAqLw0KLWpzdHJpbmcgZ2V0TGFiZWwoVENIQVIgZHJpdmVMZXR0ZXJbXSxKTklFbnYgKiBqbmllbnYpew0KLQ0KLQlqc3RyaW5nIHJlc3VsdCA9IE5VTEw7DQotCVRDSEFSIGJ1ZlsxMjhdOwkNCi0JDQotCS8vIGFsd2F5cyByZXR1cm4gbnVsbCBhcyBVTklDT0RFIGlzIG5vdCBpbXBsZW1lbnRlZA0KLQkvLyBob3cgY2FuIHdlIGdldCB0aGUgbGFiZWwgb2YgYSB2b2x1bWUgYXMgVU5JQ09ERSBjaGFyID8NCi0JcmV0dXJuIHJlc3VsdDsNCi0JDQotCWludCBlcnIgPSBHZXRWb2x1bWVJbmZvcm1hdGlvbigNCi0JCWRyaXZlTGV0dGVyLA0KLQkJYnVmLA0KLQkJc2l6ZW9mKGJ1ZikgLSAxLA0KLQkJTlVMTCwNCi0JCU5VTEwsDQotCQlOVUxMLA0KLQkJTlVMTCwNCi0JCTApOw0KLQlpZiAoZXJyKXsNCi0JCXJlc3VsdCA9IFdpbmRvd3NUb2pzdHJpbmcoam5pZW52LCBidWYpOw0KLQl9IGVsc2Ugew0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiRXJyb3IgR2V0Vm9sdW1lSW5mb3JtYXRpb24gJWlcbiIsZXJyKTsJCQkJDQotIAl9DQotCXJldHVybiByZXN1bHQ7DQotfQ0KLQ0KLS8qDQotICogcmV0dXJucyB0aGUgVmVyc2lvbiBvZiBXaW5kb3dzDQotICogaW50IDAgV0lOOTg7DQotICogaW50IDEgV0lOTlQ7DQotICogaW50IDIgV0lOTUU7DQotICogaW50IDMgV0lOMjAwMDsNCi0gKiBpbnQgNCBXSU5YUDsNCi0gKiByZXR1cm5zIC0xIG90aGVyd2lzZQ0KLSAqLw0KLWludCBnZXRXaW5kb3dzVmVyc2lvbigpew0KLQlPU1ZFUlNJT05JTkZPRVggb3N2aTsNCi0JaW50IFVOS05PV04gPSAtMTsNCi0JDQotCVplcm9NZW1vcnkoJm9zdmksIHNpemVvZihPU1ZFUlNJT05JTkZPRVgpKTsNCi0Jb3N2aS5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk9FWCk7DQotCQ0KLQlpZighKEdldFZlcnNpb25FeCgoT1NWRVJTSU9OSU5GTyAqKSZvc3ZpKSkpew0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiVU5LTk9XTiBWRVJTSU9OOiBDYW5ub3QgZXhlY3V0ZSBHZXRWZXJzaW9uRXhcbiIpOw0KLQkJLy8gaWYgT1NWRVJTSU9ORVggZG9lc24ndCB3b3JrLCB0cnkgT1NWRVJTSU9OSU5GTw0KLQkJb3N2aS5kd09TVmVyc2lvbkluZm9TaXplID0gc2l6ZW9mKE9TVkVSU0lPTklORk8pOwkJCSAJDQotCQlpZighKEdldFZlcnNpb25FeCgoT1NWRVJTSU9OSU5GTyAqKSZvc3ZpKSkpew0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiVU5LTk9XTiBWRVJTSU9OOiBDYW5ub3QgZXhlY3V0ZSBHZXRWZXJzaW9uRXhcbiIpOw0KLQkJCXJldHVybiBVTktOT1dOOw0KLQkJfQ0KLQl9DQotCQ0KLQlzd2l0Y2gob3N2aS5kd1BsYXRmb3JtSWQpew0KLQkJY2FzZSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ6DQotCQkJaWYgKERFQlVHKQ0KLQkJCQlwcmludGYoIlZFUlNJT04gTlQ6IE1haiAlaSBNaW4gJWlcbiIsb3N2aS5kd01ham9yVmVyc2lvbixvc3ZpLmR3TWlub3JWZXJzaW9uKTsJCQkJIAkNCi0JCQlpZihvc3ZpLmR3TWFqb3JWZXJzaW9uPD00KQ0KLQkJCQlyZXR1cm4gV0lOTlQ7DQotCQkJaWYob3N2aS5kd01ham9yVmVyc2lvbj09NSl7DQotCQkJCWlmIChvc3ZpLmR3TWlub3JWZXJzaW9uPT0wKQ0KLQkJCQkJcmV0dXJuIFdJTjIwMDA7DQotCQkJCWlmIChvc3ZpLmR3TWlub3JWZXJzaW9uPT0xKQ0KLQkJCQkJcmV0dXJuIFdJTlhQOw0KLQkJCX0gZWxzZSB7DQotCQkJCXJldHVybiBVTktOT1dOOw0KLQkJCX07DQotCQkJYnJlYWs7DQotCQljYXNlIFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTOg0KLQkJCWlmIChERUJVRykNCi0JCQkJcHJpbnRmKCJWRVJTSU9OIE5vbiBOVDogTWFqICVpIE1pbiAlaVxuIixvc3ZpLmR3TWFqb3JWZXJzaW9uLG9zdmkuZHdNaW5vclZlcnNpb24pOwkJCQkgCQ0KLQkJCWlmKG9zdmkuZHdNYWpvclZlcnNpb249PTQpew0KLQkJCQlpZiAob3N2aS5kd01pbm9yVmVyc2lvbj09MTApDQotCQkJCQlyZXR1cm4gV0lOOTg7DQotCQkJCWlmIChvc3ZpLmR3TWlub3JWZXJzaW9uPT05MCkNCi0JCQkJCXJldHVybiBXSU5NRTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlyZXR1cm4gVU5LTk9XTjsNCi0JCQl9DQotCQkJYnJlYWs7DQotCQlkZWZhdWx0Og0KLQkJCWlmIChERUJVRykNCi0JCQkJcHJpbnRmKCJWRVJTSU9OIFVOS05PV046IE1haiAlaSBNaW4gJWlcbiIsb3N2aS5kd01ham9yVmVyc2lvbixvc3ZpLmR3TWlub3JWZXJzaW9uKTsJCQkJIAkNCi0JCQlyZXR1cm4gVU5LTk9XTjsNCi0JfQ0KLQlyZXR1cm4gVU5LTk9XTjsNCi19IA0KLQ0KLS8qDQotICogUmV0dXJucyB0aGUgdHlwZSBvZiBSZW1vdmFibGUgRHJpdmUgDQotICogUmV0dXJucyANCi0gKiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zDQotICogb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfNQ0KLSAqIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFDQotICovDQotamxvbmcgZ2V0RmxvcHB5KFRDSEFSIGRyaXZlTGV0dGVyW10pew0KLQ0KLQlUQ0hBUiBmbG9wcHlQYXRoWzhdOw0KLQlIQU5ETEUgaGFuZGxlOw0KLQlESVNLX0dFT01FVFJZIGdlb21ldHJ5WzIwXTsNCi0JRFdPUkQgZHc7DQotCWpsb25nIFVOS05PV04gPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9WQUJMRTsNCi0NCi0Jc3ByaW50ZihmbG9wcHlQYXRoLCAiXFxcXC5cXCVjOiIsIGRyaXZlTGV0dGVyWzBdKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJQYXRoICVzXG4iLGZsb3BweVBhdGgpOw0KLQkvLyBCVUcgMjU3MTkNCi0gICAgU2V0RXJyb3JNb2RlKCBTRU1fRkFJTENSSVRJQ0FMRVJST1JTICk7IAkJDQotCWhhbmRsZT1DcmVhdGVGaWxlKGZsb3BweVBhdGgsMCxGSUxFX1NIQVJFX1JFQUQsTlVMTCxPUEVOX0FMV0FZUywwLE5VTEwpOw0KLQlpZiAoaGFuZGxlPT1JTlZBTElEX0hBTkRMRV9WQUxVRSl7DQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJJbnZhbGlkIEhhbmRsZSAlc1xuIixmbG9wcHlQYXRoKTsNCi0JCXJldHVybiBVTktOT1dOOw0KLQl9IGVsc2Ugew0KLQkJaWYoRGV2aWNlSW9Db250cm9sKGhhbmRsZSwNCi0JCQlJT0NUTF9ESVNLX0dFVF9NRURJQV9UWVBFUywwLDAsDQotCQkJZ2VvbWV0cnksc2l6ZW9mKGdlb21ldHJ5KSwmZHcsMCkgDQotCQkJJiYgZHc+MCkgew0KLQkJCXN3aXRjaChnZW9tZXRyeVswXS5NZWRpYVR5cGUpew0KLQkJCSBjYXNlIEY1XzE2MF81MTI6DQotCQkJIGNhc2UgRjVfMTgwXzUxMjoNCi0JCQkgY2FzZSBGNV8zMjBfNTEyOg0KLQkJCSBjYXNlIEY1XzMyMF8xMDI0Og0KLQkJCSBjYXNlIEY1XzM2MF81MTI6DQotCQkJIGNhc2UgRjVfMVB0Ml81MTI6DQotCQkJCWlmIChERUJVRykNCi0JCQkJCXByaW50ZigiRm91bmQgNSAxLzQgRHJpdmVcbiIpOwkJCQkgCQ0KLQkJCSAJcmV0dXJuIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzU7DQotCQkJIGNhc2UgRjNfNzIwXzUxMjoJCQkgCQkJCSAJCQkJIAkJCQkgCQkJCSANCi0JCQkgY2FzZSBGM18xUHQ0NF81MTI6DQotCQkJIGNhc2UgRjNfMlB0ODhfNTEyOg0KLQkJCSBjYXNlIEYzXzIwUHQ4XzUxMjoJCQkJIAkJCQkgCQkJCSANCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJGb3VuZCAzIDEvMiBEcml2ZVxuIik7CQkJCSAJDQotCQkJIAlyZXR1cm4gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GTE9QUFlfMzsNCi0JCQkgZGVmYXVsdDoNCi0JCQkgCXJldHVybiBVTktOT1dOOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlyZXR1cm4gVU5LTk9XTjsJDQotfQ0KLQ0KLS8qDQotICogUmV0dXJucyB0aGUgVU5DIG5hbWUgb2YgYSByZW1vdGUgZHJpdmUNCi0gKiAoXFxNYWNoaW5lXHBhdGhccGF0aDFccGF0aDIkKQ0KLSAqIHJldHVybnMgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMNCi0gKi8NCi0ganN0cmluZyBnZXRSZW1vdGVOZXR3b3JrTmFtZShUQ0hBUiBkcml2ZUxldHRlcltdLEpOSUVudiAqIGpuaWVudil7DQotIAkNCi0gCXVuc2lnbmVkIGxvbmcgc2l6ZSA9MjU2Ow0KLSAJVENIQVIgYnVmWzI1Nl07CQ0KLSAJVENIQVIgZHJpdmVQYXRoWzJdOw0KLSAJRFdPUkQgZXJyOw0KLSAJanN0cmluZyByZXN1bHQgPSBOVUxMOw0KLSAJDQotIAkvLyBhbHdheXMgcmV0dXJuIE5VTEwgYXMgVU5JQ09ERSBub3QgaW1wbGVtZW50ZWQNCi0JLy8gaG93IGNhbiB3ZSBnZXQgdGhlIGxhYmVsIG9mIGEgcmVtb3RlIG5ldHdvcmsgbmFtZSBhcyBVTklDT0RFIGNoYXIgPyAJDQotIAlyZXR1cm4gcmVzdWx0Ow0KLSAJDQotCXNwcmludGYoZHJpdmVQYXRoLCAiJWM6IiwgZHJpdmVMZXR0ZXJbMF0pOyAJDQotIAllcnIgPSBXTmV0R2V0Q29ubmVjdGlvbihkcml2ZVBhdGgsYnVmLCZzaXplKTsNCi0gCQ0KLSAJaWYgKGVycj09V05fU1VDQ0VTUyl7DQotCQlyZXN1bHQgPSBXaW5kb3dzVG9qc3RyaW5nKGpuaWVudixidWYpOw0KLQl9IGVsc2Ugew0KLQkJaWYgKERFQlVHKQ0KLQkJCXByaW50ZigiRXJyb3IgV05FdEdldENvbm5lY3Rpb24gJWkiLGVycik7CQkJCQ0KLSAJfQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLSB9DQotDQotDQotLy8gSk5JIE1FVEhPRFMNCi0vLyAtLS0tLS0tLS0tLS0tLS0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRGcmVlU3BhY2UNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylKDQotICovDQotSk5JRVhQT1JUIGpsb25nIEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0RnJlZVNwYWNlKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IFRDSEFSICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBXaW5kb3dzIFBhcmFtZXRlcnMNCi0JX19pbnQ2NCBpNjRGcmVlQnl0ZXNBdmFpbGFibGVUb0NhbGxlcjsNCi0JX19pbnQ2NCBpNjRUb3RhbE51bWJlck9mQnl0ZXM7DQotCV9faW50NjQgaTY0VG90YWxOdW1iZXJPZkZyZWVCeXRlczsNCi0NCi0JLy8gdGhlIHJlc3VsdA0KLQlqbG9uZyByZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fU0laRV9VTktOT1dOOw0KLQ0KLQkvLyBmaXJzdCwgb2J0YWluIHRoZSBQYXRoIGZyb20gdGhlIGphdmEuaW8uRmlsZSBwYXJhbWV0ZXINCi0JY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KLQlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQotDQotCWlmIChpbnQgd2luID0gKGludClnZXRXaW5kb3dzVmVyc2lvbigpPDAgJiYgTk9XSU45NSl7DQotCQkvLyB3aW5kb3dzIDk1IG9yIG90aGVyDQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJVbnN1cHBvcnRlZCBXaW5kb3dzOiAlaVxuIix3aW4pOwkJDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCWludCBlcnIgPSBHZXREaXNrRnJlZVNwYWNlRXgoDQotCQkJCWxwRGlyZWN0b3J5TmFtZSwNCi0JCQkJKFBVTEFSR0VfSU5URUdFUikgJiBpNjRGcmVlQnl0ZXNBdmFpbGFibGVUb0NhbGxlciwNCi0JCQkJKFBVTEFSR0VfSU5URUdFUikgJiBpNjRUb3RhbE51bWJlck9mQnl0ZXMsDQotCQkJCShQVUxBUkdFX0lOVEVHRVIpICYgaTY0VG90YWxOdW1iZXJPZkZyZWVCeXRlcyk7DQotCQkJDQotCWlmIChlcnIpIHsNCi0JCXJlc3VsdCA9IChqbG9uZykgaTY0RnJlZUJ5dGVzQXZhaWxhYmxlVG9DYWxsZXI7DQotCX0NCi0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsKA0KLQlKTklFbnYgKiBqbmllbnYsDQotCWpjbGFzcyBqYXZhQ2xhc3MsDQotCWpvYmplY3QgZmlsZSkgew0KLQ0KLQkvLyB0byByZXRyaXZlIHRoZSBTdHJpbmcNCi0JamNsYXNzIGNsczsNCi0Jam1ldGhvZElEIGlkOw0KLQlqb2JqZWN0IG9iajsNCi0NCi0JLy8gamF2YS5pby5GaWxlLmdldEFic29sdXRlUGF0aCgpDQotCWNvbnN0IFRDSEFSICogbHBEaXJlY3RvcnlOYW1lOw0KLQ0KLQkvLyBvYnRhaW4gdGhlIFN0cmluZyBmcm9tIHRoZSBwYXJhbWV0ZXINCi0JY2xzID0gam5pZW52IC0+IEdldE9iamVjdENsYXNzKGZpbGUpOw0KLQlpZCA9IGpuaWVudiAtPiBHZXRNZXRob2RJRChjbHMsICJnZXRBYnNvbHV0ZVBhdGgiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsNCi0Jb2JqID0gam5pZW52IC0+IENhbGxPYmplY3RNZXRob2QoZmlsZSwgaWQpOw0KLQlscERpcmVjdG9yeU5hbWUgPSBqbmllbnYgLT4gR2V0U3RyaW5nVVRGQ2hhcnMoKGpzdHJpbmcpIG9iaiwgMCk7DQotCWlmIChERUJVRykNCi0JCXByaW50ZigiRGlyZWN0b3J5OiBbJXNdXG4iLGxwRGlyZWN0b3J5TmFtZSk7DQotDQotCS8vDQotCWpzdHJpbmcgcmVzdWx0ID0gTlVMTDsNCi0JaW50IGZsb3BweTsNCi0JDQotCWlmIChpbnQgd2luID0gKGludClnZXRXaW5kb3dzVmVyc2lvbigpPDAgJiYgTk9XSU45NSl7DQotCQkvLyB3aW5kb3dzIDk1IG9yIG90aGVyDQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJVbnN1cHBvcnRlZCBXaW5kb3dzOiAlaVxuIix3aW4pOwkJDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotCQkNCi0JLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBTdHJpbmcgb2YgdGhlIEZvcm06IDxsZXR0ZXI+Og0KLQlpZiAoJzonID09IGxwRGlyZWN0b3J5TmFtZVsxXSkgew0KLQkJVENIQVIgZHJpdmVMZXR0ZXJbNF07IC8vIGkuZS4gLT4gQzpcXA0KLQkJbWVtY3B5KGRyaXZlTGV0dGVyLCBscERpcmVjdG9yeU5hbWUsIDIpOw0KLQkJc3RyY3B5KGRyaXZlTGV0dGVyICsgMiwgIlxcIik7DQotCQlzd2l0Y2ggKEdldERyaXZlVHlwZShkcml2ZUxldHRlcikpIHsNCi0JCQljYXNlIERSSVZFX1JFTU9URSA6DQotCQkJCS8vIGNoZWNrIG5hbWUgb2YgbWFjaGluZSBhbmQgcGF0aCBvZiByZW1vdGUNCi0JCQkJaWYgKERFQlVHKQ0KLQkJCQkJcHJpbnRmKCJSZW1vdGUgRHJpdmUiKTsNCi0JCQkJcmVzdWx0ID0gZ2V0UmVtb3RlTmV0d29ya05hbWUoZHJpdmVMZXR0ZXIsam5pZW52KTsJCQkJDQotCQkJCWJyZWFrOw0KLQkJCWRlZmF1bHQgOg0KLQkJCQlpZiAoREVCVUcpDQotCQkJCQlwcmludGYoIkFub3RoZXIgRHJpdmUgYXQgJXMiLCBkcml2ZUxldHRlcik7DQotCQkJCXJlc3VsdCA9IGdldExhYmVsKGRyaXZlTGV0dGVyLGpuaWVudik7DQotCQkJCWJyZWFrOw0KLQkJfSANCi0JfSANCi0NCi0JcmV0dXJuIHJlc3VsdDsNCi19DQotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0VHlwZQ0KLSAqIFNpZ25hdHVyZTogKExqYXZhL2lvL0ZpbGU7KUkNCi0gKi8NCi1KTklFWFBPUlQgamludCBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldFR5cGUoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcywNCi0Jam9iamVjdCBmaWxlKSB7DQotDQotCS8vIHRvIHJldHJpdmUgdGhlIFN0cmluZw0KLQlqY2xhc3MgY2xzOw0KLQlqbWV0aG9kSUQgaWQ7DQotCWpvYmplY3Qgb2JqOw0KLQ0KLQkvLyBqYXZhLmlvLkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkNCi0JY29uc3QgVENIQVIgKiBscERpcmVjdG9yeU5hbWU7DQotDQotCS8vIG9idGFpbiB0aGUgU3RyaW5nIGZyb20gdGhlIHBhcmFtZXRlcg0KLQljbHMgPSBqbmllbnYgLT4gR2V0T2JqZWN0Q2xhc3MoZmlsZSk7DQotCWlkID0gam5pZW52IC0+IEdldE1ldGhvZElEKGNscywgImdldEFic29sdXRlUGF0aCIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIpOw0KLQlvYmogPSBqbmllbnYgLT4gQ2FsbE9iamVjdE1ldGhvZChmaWxlLCBpZCk7DQotCWxwRGlyZWN0b3J5TmFtZSA9IGpuaWVudiAtPiBHZXRTdHJpbmdVVEZDaGFycygoanN0cmluZykgb2JqLCAwKTsNCi0JaWYgKERFQlVHKQ0KLQkJcHJpbnRmKCJEaXJlY3Rvcnk6IFslc11cbiIsbHBEaXJlY3RvcnlOYW1lKTsNCi0NCi0JaW50IHJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTjsNCi0JaWYgKGludCB3aW4gPSAoaW50KWdldFdpbmRvd3NWZXJzaW9uKCk8MCAmJiBOT1dJTjk1KXsNCi0JCS8vIHdpbmRvd3MgOTUgb3Igb3RoZXINCi0JCWlmIChERUJVRykNCi0JCQlwcmludGYoIlVuc3VwcG9ydGVkIFdpbmRvd3M6ICVpXG4iLHdpbik7CQkNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0JDQotCS8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgU3RyaW5nIG9mIHRoZSBGb3JtOiA8bGV0dGVyPjoNCi0JaWYgKCc6JyA9PSBscERpcmVjdG9yeU5hbWVbMV0pIHsNCi0JCVRDSEFSIGRyaXZlTGV0dGVyWzRdOyAvL0M6XFwNCi0JCW1lbWNweShkcml2ZUxldHRlciwgbHBEaXJlY3RvcnlOYW1lLCAyKTsNCi0JCXN0cmNweShkcml2ZUxldHRlciArIDIsICJcXCIpOw0KLQ0KLQkJc3dpdGNoIChHZXREcml2ZVR5cGUoZHJpdmVMZXR0ZXIpKSB7DQotCQkJY2FzZSBEUklWRV9SRU1PVkFCTEUgOg0KLQkJCQkvLyBjaGVjayBpZiBmbG9wcHkgMy41LCBmbG9wcHkgNS4yNQkNCi0JCQkJLy8gb3Igb3RoZXIgcmVtb3ZhYmxlIGRldmljZSAoVVNCLFBDTUNJQSAuLi4pDQotCQkJCWlmIChERUJVRykNCi0JCQkJCXByaW50ZigiUmVtb3ZhYmxlIERldmljZSIpOw0KLQkJCQlyZXN1bHQgPSBnZXRGbG9wcHkoZHJpdmVMZXR0ZXIpOwkJCQkJDQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgRFJJVkVfQ0RST00gOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0NEUk9NOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX0ZJWEVEIDoNCi0JCQkJcmVzdWx0ID0gb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRDsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBEUklWRV9SRU1PVEUgOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URTsNCi0JCQkJYnJlYWs7DQotCQkJY2FzZSBEUklWRV9OT19ST09UX0RJUiA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfSU5WQUxJRF9QQVRIOw0KLQkJCQlicmVhazsNCi0JCQljYXNlIERSSVZFX1JBTURJU0sgOg0KLQkJCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0s7DQotCQkJCWJyZWFrOwkJCQ0KLQkJCWNhc2UgRFJJVkVfVU5LTk9XTiA6DQotCQkJZGVmYXVsdCA6DQotCQkJCXJlc3VsdCA9IG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTjsNCi0JCQkJYnJlYWs7DQotCQl9DQotCX0gZWxzZSB7DQotCQlyZXN1bHQgPSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0lOVkFMSURfUEFUSDsNCi0JfQ0KLQ0KLQlyZXR1cm4gcmVzdWx0Ow0KLX0NCi0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVMaXN0TW91bnRQb2ludHMNCi0gKiBTaWduYXR1cmU6ICgpW0xqYXZhL2xhbmcvU3RyaW5nOw0KLSAqLw0KLUpOSUVYUE9SVCBqb2JqZWN0QXJyYXkgSk5JQ0FMTCBKYXZhX29yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19uYXRpdmVMaXN0TW91bnRQb2ludHMoDQotCUpOSUVudiAqIGpuaWVudiwNCi0JamNsYXNzIGphdmFDbGFzcykgew0KLQ0KLQkvLw0KLQlEV09SRCBsb2dEcml2ZXM7DQotCVVJTlQgZHJpdmU7DQotCVRDSEFSIGRyaXZlTmFtZVsxMDBdOw0KLQlqb2JqZWN0QXJyYXkgcmV0dXJuQXJyYXk7DQotCWludCBuRHJpdmUgPSAwOw0KLQ0KLQkvLyANCi0JamNsYXNzIHN0cmluZ0NsYXNzOw0KLQlqb2JqZWN0IGVtcHR5Ow0KLQlpbnQgaW5kZXggPSAwOw0KLQlqb2JqZWN0IHN0cjsNCi0NCi0NCi0JbG9nRHJpdmVzID0gR2V0TG9naWNhbERyaXZlcygpOw0KLQlmb3IgKGRyaXZlID0gMDsgZHJpdmUgPCAzMjsgZHJpdmUrKykgew0KLQkJaWYgKGxvZ0RyaXZlcyAmICgxIDw8IGRyaXZlKSkgew0KLQkJCW5Ecml2ZSsrOw0KLQkJfQ0KLQl9DQotDQotCXN0cmluZ0NsYXNzID0gam5pZW52IC0+IEZpbmRDbGFzcygiamF2YS9sYW5nL1N0cmluZyIpOw0KLQllbXB0eSA9IGpuaWVudiAtPiBOZXdTdHJpbmdVVEYoIiIpOw0KLQlyZXR1cm5BcnJheSA9IGpuaWVudiAtPiBOZXdPYmplY3RBcnJheShuRHJpdmUsIHN0cmluZ0NsYXNzLCBlbXB0eSk7DQotDQotCWlmIChpbnQgd2luID0gKGludClnZXRXaW5kb3dzVmVyc2lvbigpPDAgJiYgTk9XSU45NSl7DQotCQkvLyB3aW5kb3dzIDk1IG9yIG90aGVyDQotCQlpZiAoREVCVUcpDQotCQkJcHJpbnRmKCJVbnN1cHBvcnRlZCBXaW5kb3dzOiAlaVxuIix3aW4pOwkNCi0JCXJldHVybiBOVUxMOw0KLQl9DQotDQotCWZvciAoZHJpdmUgPSAwOyBkcml2ZSA8IDMyOyBkcml2ZSsrKSB7DQotCQlpZiAobG9nRHJpdmVzICYgKDEgPDwgZHJpdmUpKSB7DQotCQkJc3ByaW50Zihkcml2ZU5hbWUsICIlYzpcXCIsIGRyaXZlICsgJ0EnKTsNCi0JCQlzdHIgPSBqbmllbnYgLT4gTmV3U3RyaW5nVVRGKGRyaXZlTmFtZSk7DQotCQkJam5pZW52IC0+IFNldE9iamVjdEFycmF5RWxlbWVudChyZXR1cm5BcnJheSwgaW5kZXgsIHN0cik7DQotCQkJaW5kZXgrKzsNCi0JCX0NCi0JfQ0KLQ0KLQlyZXR1cm4gcmV0dXJuQXJyYXk7DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIvc3JjL3VwZGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTY3M2QxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMi9zcmMvdXBkYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKiBETyBOT1QgRURJVCBUSElTIEZJTEUgLSBpdCBpcyBtYWNoaW5lIGdlbmVyYXRlZCAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8am5pLmg+DQotLyogSGVhZGVyIGZvciBjbGFzcyBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8gKi8KLQotI2lmbmRlZiBfSW5jbHVkZWRfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvCi0jZGVmaW5lIF9JbmNsdWRlZF9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm8NCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19TSVpFX1VOS05PV04KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1NJWkVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9VTktOT1dOCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfVU5LTk9XTiAtMUwNCi0jdW5kZWYgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEgKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9JTlZBTElEX1BBVEggLTJMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkVNT1ZBQkxFIDFMDQotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRklYRUQKLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9GSVhFRCAyTA0KLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URQotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JFTU9URSAzTAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfQ0RST00KLSNkZWZpbmUgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX1ZPTFVNRV9DRFJPTSA0TAotI3VuZGVmIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfUkFNRElTSwotI2RlZmluZSBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX1JBTURJU0sgNUwKLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV81Ci0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzUgNkwKLSN1bmRlZiBvcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fVk9MVU1FX0ZMT1BQWV8zCi0jZGVmaW5lIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mb19WT0xVTUVfRkxPUFBZXzMgN0wNCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBsaXN0ZW5lcnMgKi8NCi0vKiBJbmFjY2Vzc2libGUgc3RhdGljOiBoYXNOYXRpdmVzICovDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0RnJlZVNwYWNlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSg0KLSAqLw0KLUpOSUVYUE9SVCBqbG9uZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldEZyZWVTcGFjZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOwotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlR2V0TGFiZWwNCi0gKiBTaWduYXR1cmU6IChMamF2YS9pby9GaWxlOylMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQganN0cmluZyBKTklDQUxMIEphdmFfb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvX25hdGl2ZUdldExhYmVsDQotICAoSk5JRW52ICosIGpjbGFzcywgam9iamVjdCk7Ci0NCi0vKg0KLSAqIENsYXNzOiAgICAgb3JnX2VjbGlwc2VfdXBkYXRlX2NvbmZpZ3VyYXRpb25fTG9jYWxTeXN0ZW1JbmZvDQotICogTWV0aG9kOiAgICBuYXRpdmVHZXRUeXBlDQotICogU2lnbmF0dXJlOiAoTGphdmEvaW8vRmlsZTspSQ0KLSAqLw0KLUpOSUVYUE9SVCBqaW50IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlR2V0VHlwZQ0KLSAgKEpOSUVudiAqLCBqY2xhc3MsIGpvYmplY3QpOwotDQotLyoNCi0gKiBDbGFzczogICAgIG9yZ19lY2xpcHNlX3VwZGF0ZV9jb25maWd1cmF0aW9uX0xvY2FsU3lzdGVtSW5mbw0KLSAqIE1ldGhvZDogICAgbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICogU2lnbmF0dXJlOiAoKVtMamF2YS9sYW5nL1N0cmluZzsNCi0gKi8NCi1KTklFWFBPUlQgam9iamVjdEFycmF5IEpOSUNBTEwgSmF2YV9vcmdfZWNsaXBzZV91cGRhdGVfY29uZmlndXJhdGlvbl9Mb2NhbFN5c3RlbUluZm9fbmF0aXZlTGlzdE1vdW50UG9pbnRzDQotICAoSk5JRW52ICosIGpjbGFzcyk7Ci0NCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLQotI2VuZGlmDQotI2VuZGlmDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5vcHRpb25zIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmY2MTk3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWc9dHJ1ZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmc9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9wYXJzaW5nPWZhbHNlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbD1mYWxzZQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb249ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy90eXBlPWZhbHNlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvd2ViPWZhbHNlDQotb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXI9ZmFsc2UNCi1vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9yZWNvbmNpbGVyPWZhbHNlDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBjNmEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvcHJvamVjdD4NCi0JPC9wcm9qZWN0cz4NCi0JPGJ1aWxkU3BlYz4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQk8L2J1aWxkU3BlYz4NCi0JPG5hdHVyZXM+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPg0KLQk8L25hdHVyZXM+DQotPC9wcm9qZWN0RGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL1NjcmFwYm9vay5qcGFnZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9TY3JhcGJvb2suanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNjMzYWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL1NjcmFwYm9vay5qcGFnZQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0JCWphdmEudXRpbC5FbnVtZXJhdGlvbiBlbnVtID0gIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkua2V5cygpOw0KLQkJU3RyaW5nIGtleSA9IG51bGw7DQotCQl3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSl7DQotCQkJa2V5ID0gKFN0cmluZyllbnVtLm5leHRFbGVtZW50KCk7DQotCQkJU3lzdGVtLm91dC5wcmludChrZXkpOw0KLQkJCWZvciAoaW50IGkgPTA7aTwoMzAta2V5Lmxlbmd0aCgpKTtpKyspU3lzdGVtLm91dC5wcmludCgiICIpOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLT4iK1N5c3RlbS5nZXRQcm9wZXJ0eShrZXkpKTsNCi0JCX0NCi0NCi0NCi1uZXcgamF2YS5uZXQuVVJMKCJmaWxlOi8vQzovdGVtcC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMV8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphciIpLm9wZW5TdHJlYW0oKQ0KLQ0KLShuZXcgamF2YS5pby5GaWxlKCJDOlxcY2hyaXMgY2hyaXNcaGVsbG9cXCIpKS5ta2RpcnMoKTsNCi0NCi1qYXZhLm5ldC5VUkwgYSA9ICBuZXcgamF2YS5uZXQuVVJMKCJodHRwIiwid3d3Lm90aS5jb20iLCIvZmVhdHVyZS9ibGFoLmphciIpOw0KLWphdmEubmV0LlVSTCBiID0gIG5ldyBqYXZhLm5ldC5VUkwoImphciIsbnVsbCxhLnRvRXh0ZXJuYWxGb3JtKCkrIiEvaGVsbG8udHh0Iik7DQotYg0KLQ0KLW5ldyBqYXZhLm5ldC5VUkwoImZpbGUiLG51bGwsU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsNCi1uZXcgamF2YS5uZXQuVVJMKCJmaWxlIixudWxsLFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5ob21lIikpOw0KLQ0KLVN0cmluZyB0ZW1wRGlyID0gImM6XFxURU1QXFxmZWF0dXJlczIuamFyIjsNCi1qYXZhLm5ldC5VUkwgVEVNUF9TSVRFID0gbmV3IGphdmEubmV0LlVSTCgiZmlsZSIsbnVsbCx0ZW1wRGlyKTsNCi1qYXZhLm5ldC5VUkwgZmlsZSA9IG5ldyBqYXZhLm5ldC5VUkwoImphciIsbnVsbCxURU1QX1NJVEUudG9FeHRlcm5hbEZvcm0oKSsiIS9mZWF0dXJlLnhtbCIpOw0KLWZpbGUub3BlblN0cmVhbSgpOw0KLWZpbGUNCi0NCi1qYXZhLmlvLkZpbGUgZiA9ICBuZXcgamF2YS5pby5GaWxlKCJjOlxcdGVtcFxceHRmXFxmaWxlLmphciIpOw0KLWYubWtkaXJzKCkNCi0NCi1qYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKQ0KLWphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZQ0KLQ0KLWphdmEubmV0LlVSTCB1cmwgPSBuZXcgamF2YS5uZXQuVVJMKCJmaWxlIixudWxsLCJDOlxccGF0aCIramF2YS5pby5GaWxlLnNlcGFyYXRvcik7DQotdXJsLmdldFBhdGgoKS5lbmRzV2l0aCgiLyIpOw0KLXVybA0KLQ0KLWphdmEubmV0LlVSTCB1cmwgPSBuZXcgamF2YS5uZXQuVVJMKCJodHRwOi8vbWFjaGluZTo4MDgwL3BhdGggc3BhY2UvZmlsZS5hYmMjaGVsbG8iKTsNCi1qYXZhLm5ldC5VUkwgdXJsMiA9IG5ldyBqYXZhLm5ldC5VUkwodXJsLCIvICIpOw0KLXVybDIuZ2V0UGF0aCgpDQotDQotamF2YS5sYW5nLkNsYXNzTG9hZGVyIGwgPSBuZXcgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXIobmV3IGphdmEubmV0LlVSTFtdIHtuZXcgamF2YS5uZXQuVVJMKCJmaWxlIixudWxsLCJjOlxcb3RpXFx3c3cyMDVcXGVjbGlwc2VcXGluc3RhbGxcXGZlYXR1cmVzXFxvcmcuZWNsaXBzZS5oZWxwLmZlYXR1cmVfMS4wLjQvIikgfSwgbnVsbCk7DQotamF2YS51dGlsLlJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImZlYXR1cmUiLCBqYXZhLnV0aWwuTG9jYWxlLmdldERlZmF1bHQoKSwgbCk7DQotYnVuZGxlDQotDQotU3RyaW5nW10gc3MgPSB7ImEiLCAiYiJ9OyANCi1qYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoMCk7DQotbGlzdC5hZGRBbGwoamF2YS51dGlsLkFycmF5cy5hc0xpc3Qoc3MpKTsgDQotbGlzdC5hZGQoImMiKTsNCi1saXN0LnNpemUoKTsNCi0NCi1qYXZhLnV0aWwuTGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoMCk7DQotbGlzdC5hZGQoIjEiKTsNCi1saXN0LmFkZCgiMiIpOw0KLWxpc3QuYWRkKCIzIik7DQotbGlzdC5hZGQoIjQiKTsNCi1saXN0LmFkZCgiNSIpOw0KLWxpc3QuYWRkKCI2Iik7DQotbGlzdC5hZGQoIjciKTsNCi13aGlsZSAobGlzdC5zaXplKCk+NSl7DQotCWxpc3QucmVtb3ZlKDApOw0KLX0NCi1saXN0LmdldCgwKQ0KLQ0KLQ0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eS5LZXlTdG9yZXMgayA9IG5ldyBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHkuS2V5U3RvcmVzKCk7DQotd2hpbGUgKGsuaGFzTmV4dCgpKXsNCi0Jb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlY3VyaXR5LktleXN0b3JlSGFuZGxlIGhhbmRsZSA9IChvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHkuS2V5c3RvcmVIYW5kbGUpIGsubmV4dCgpOw0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIktleVN0b3JlOiIraGFuZGxlLmdldExvY2F0aW9uKCkrIjoiK2hhbmRsZS5nZXRUeXBlKCkpOw0KLX0NCi0NCi1pbnQgaSA9ICgxMy8zKTsNCi1pDQotDQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi1PTEQgRmVhdHVyZSBDb2RlDQotDQotDQotCS8qKg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkQXJjaGl2ZXNMb2NhbGx5KElTaXRlIHRlbXBTaXRlLCBTdHJpbmdbXSBhcmNoaXZlSURUb0luc3RhbGwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCBzb3VyY2VVUkw7DQotCQlTdHJpbmcgbmV3RmlsZTsNCi0JCVVSTCBuZXdVUkw7DQotDQotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJbW9uaXRvci5iZWdpblRhc2soIkRvd25sb2FkIGFyY2hpdmVzIGJ1bmRsZXMgdG8gVGVtcG9yYXJ5IFNwYWNlIiwgYXJjaGl2ZUlEVG9JbnN0YWxsLmxlbmd0aCk7DQotCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyY2hpdmVJRFRvSW5zdGFsbC5sZW5ndGg7IGkrKykgew0KLQ0KLQkJCS8vIHRyYW5zZm9ybSB0aGUgaWQgYnkgYXNraW5nIHRoZSBzaXRlIHRvIG1hcCB0aGVtIHRvIHJlYWwgVVJMIGluc2lkZSB0aGUgU0lURQ0KLQkJCWlmIChnZXRTaXRlKCkgIT0gbnVsbCkgew0KLQkJCQlzb3VyY2VVUkwgPSBnZXRTaXRlKCkuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpLmdldEFyY2hpdmVzUmVmZXJlbmNlcyhhcmNoaXZlSURUb0luc3RhbGxbaV0pOw0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLnN1YlRhc2soIi4uLiIgKyBhcmNoaXZlSURUb0luc3RhbGxbaV0pOw0KLQkJCQl9DQotCQkJCS8vIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGluIHRoZSB0ZW1wIGRpcmVjdG9yeQ0KLQkJCQkvLyBzaG91bGQgYmUgdGhlIHJlZ3VsYXIgcGx1Z2lucy9wbHVnaW5JRF92ZXIgYXMgdGhlIFRlbXAgc2l0ZSBpcyBPVVIgc2l0ZQ0KLQkJCQluZXdGaWxlID0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgYXJjaGl2ZUlEVG9JbnN0YWxsW2ldOw0KLQkJCQluZXdVUkwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMucmVzb2x2ZUFzTG9jYWwoc291cmNlVVJMLCBuZXdGaWxlLCBtb25pdG9yKTsNCi0NCi0JCQkJLy8gdHJhbnNmZXIgdGhlIHBvc3NpYmxlIG1hcHBpbmcgdG8gdGhlIHRlbXAgc2l0ZQkJCQkJCQ0KLQkJCQkgKChTaXRlKSB0ZW1wU2l0ZSkuYWRkQXJjaGl2ZShuZXcgVVJMRW50cnkoYXJjaGl2ZUlEVG9JbnN0YWxsW2ldLCBuZXdVUkwpKTsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQl0aHJvdyBDQU5DRUxfRVhDRVBUSU9OOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gdGhlIHNpdGUgb2YgdGhpcyBmZWF0dXJlIG5vdyBiZWNvbWVzIHRoZSBURU1QIGRpcmVjdG9yeQ0KLQkJLy8gRklYTUU6IG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBvdGhlciBpc3N1ZQ0KLQkJLy8gbGlrZSBhc2tpbmcgZm9yIHN0dWZmIHRoYXQgaGFzbid0IGJlZW4gY29waWVkDQotCQkvLyBvciByZXVzaW5nIHRoaXMgZmVhdHVyZQ0KLQkJLy8gb2YgaGF2aW5nIGFuIHVuLW1hbmFnZWFibGUgdGVtcCBzaXRlDQotDQotCQl0aGlzLnNldFNpdGUodGVtcFNpdGUpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGRvd25sb2FkRGF0YUxvY2FsbHkoSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwgSU5vblBsdWdpbkVudHJ5W10gZGF0YVRvSW5zdGFsbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gew0KLQ0KLQkJVVJMIHNvdXJjZVVSTDsNCi0JCS8vIGFueSBvdGhlciBkYXRhDQotCQlJTm9uUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJaWYgKGVudHJpZXMgIT0gbnVsbCkgew0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIkluc3RhbGxpbmcgT3RoZXIgRGF0YSBpbmZvcm1hdGlvbiIsIGRhdGFUb0luc3RhbGwubGVuZ3RoKTsNCi0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQl0aHJvdyBDQU5DRUxfRVhDRVBUSU9OOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykgew0KLQkJCQlTdHJpbmcgbmFtZSA9IGRhdGFUb0luc3RhbGxbal0uZ2V0SWRlbnRpZmllcigpOw0KLQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQltb25pdG9yLnN1YlRhc2soIi4uLiIgKyBuYW1lKTsNCi0JCQkJfQ0KLQ0KLQkJCQkvLyB0aGUgaWQgaXMgVVJMIGZvcm1hdCB3aXRoICIvIg0KLQkJCQlTdHJpbmcgZGF0YUVudHJ5SWQgPSBTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIICsgZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyAiLyIgKyBuYW1lOw0KLQkJCQkvLyB0cmFuc2Zvcm0gdGhlIGlkIGJ5IGFza2luZyB0aGUgc2l0ZSB0byBtYXAgdGhlbSB0byByZWFsIFVSTCBpbnNpZGUgdGhlIFNJVEUNCi0JCQkJaWYgKGdldFNpdGUoKSAhPSBudWxsKSB7DQotCQkJCQlzb3VyY2VVUkwgPSBnZXRTaXRlKCkuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpLmdldEFyY2hpdmVzUmVmZXJlbmNlcyhkYXRhRW50cnlJZCk7DQotCQkJCQkoKFNpdGUpIHRhcmdldEZlYXR1cmUuZ2V0U2l0ZSgpKS5zdG9yZUZlYXR1cmVJbmZvKGdldElkZW50aWZpZXIoKSwgbmFtZSwgc291cmNlVVJMLm9wZW5TdHJlYW0oKSk7DQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9Ly8gZ2V0U2l0ZT09bnVsbA0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkNCi0JDQotCQkvKioNCi0JCSAqIE1ldGhvZCBpbnN0YWxsLg0KLQkJICogQHBhcmFtIHRhcmdldEZlYXR1cmUNCi0JCSAqIEBwYXJhbSBtb25pdG9yDQotCQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JCSAqLw0KLQlwdWJsaWMgdm9pZCBvbGRfaW5zdGFsbChJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUlQbHVnaW5FbnRyeVtdIHNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzID0gZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJSVBsdWdpbkVudHJ5W10gdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSB0YXJnZXRGZWF0dXJlLmdldFNpdGUoKS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlTaXRlIHRlbXBTaXRlID0gKFNpdGUpIFNpdGVNYW5hZ2VyLmdldFRlbXBTaXRlKCk7DQotDQotCQkvLyBkZXRlcm1pbmUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwNCi0JCS8vIGZpbmQgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSB0d28gYXJyYXlzIG9mIElQbHVnaW5FbnRyeS4uLg0KLQkJLy8gVGhlIG9uZSB0ZWggc2l0ZSBjb250YWlucyBhbmQgdGVoIG9uZSB0aGUgZmVhdHVyZSBjb250YWlucw0KLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvSW5zdGFsbCA9IGludGVyc2VjdGlvbihzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcywgdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMpOw0KLQ0KLQkJLy8gcHJpdmF0ZSBhYnN0cmFjdCAtIERldGVybWluZSBsaXN0IG9mIGNvbnRlbnQgcmVmZXJlbmNlcyBpZCAvYXJjaGl2ZXMgaWQgL2J1bmRsZXMgaWQgdGhhdCANCi0JCS8vIG1hcCB0aGUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwNCi0JCVN0cmluZ1tdIGFyY2hpdmVJRFRvSW5zdGFsbCA9IGdldENvbnRlbnRSZWZlcmVuY2VUb0luc3RhbGwocGx1Z2luc1RvSW5zdGFsbCk7DQotDQotCQl0cnkgew0KLQkJCS8vIGRvd25sb2FkIGFuZCBpbnN0YWxsIGRhdGEgYnVuZGxlcw0KLQkJCS8vIGJlZm9yZSB3ZSBzZXQgdGhlIHNpdGUgb2YgdGVoIGZlYXR1cmUgdG8gdGhlIFRFTVAgc2l0ZQ0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIGRhdGFFbnRyaWVzID0gZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJCWlmIChkYXRhRW50cmllcy5sZW5ndGggPiAwKSB7DQotCQkJCWRvd25sb2FkRGF0YUxvY2FsbHkodGFyZ2V0RmVhdHVyZSwgZGF0YUVudHJpZXMsIG1vbml0b3IpOw0KLQkJCX0NCi0NCi0JCQkvLyBvcHRtaXphdGlvbiwgbWF5IGJlIHByaXZhdGUgdG8gaW1wbGVtZW50YXRpb24NCi0JCQkvLyBjb3B5ICpibG9icy9jb250ZW50IHJlZmVyZW5jZXMvYXJjaGl2ZXMvYnVuZGxlcyogaW4gVEVNUCBzcGFjZQ0KLQkJCWlmICgoKFNpdGUpIGdldFNpdGUoKSkub3B0aW1pemUoKSkgew0KLQkJCQlpZiAoYXJjaGl2ZUlEVG9JbnN0YWxsICE9IG51bGwpIHsNCi0JCQkJCWRvd25sb2FkQXJjaGl2ZXNMb2NhbGx5KHRlbXBTaXRlLCBhcmNoaXZlSURUb0luc3RhbGwsIG1vbml0b3IpOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIG9idGFpbiB0aGUgbGlzdCBvZiAqU3RyZWFtYWJsZSBTdG9yYWdlIFVuaXQqDQotCQkJLy8gZnJvbSB0aGUgYXJjaGl2ZQ0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJaW50IHRvdGFsID0gcGx1Z2luc1RvSW5zdGFsbCA9PSBudWxsID8gMSA6IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoICsgMTsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIkluc3RhbGwgZmVhdHVyZSAiICsgZ2V0TGFiZWwoKSwgdG90YWwpOw0KLQkJCX0NCi0JCQlpZiAocGx1Z2luc1RvSW5zdGFsbCAhPSBudWxsKSB7DQotCQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQkJbW9uaXRvci5zdWJUYXNrKCJJbnN0YWxsaW5nIHBsdWctaW46ICIgKyBwbHVnaW5zVG9JbnN0YWxsW2ldKTsNCi0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCQl9DQotCQkJCQl9DQotDQotCQkJCQlvcGVuKHBsdWdpbnNUb0luc3RhbGxbaV0pOw0KLQkJCQkJU3RyaW5nW10gbmFtZXMgPSBnZXRTdG9yYWdlVW5pdE5hbWVzKHBsdWdpbnNUb0luc3RhbGxbaV0pOw0KLQkJCQkJaWYgKG5hbWVzICE9IG51bGwpIHsNCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG5hbWVzLmxlbmd0aDsgaisrKSB7DQotCQkJCQkJCWlmICgoaW5TdHJlYW0gPSBnZXRJbnB1dFN0cmVhbUZvcihwbHVnaW5zVG9JbnN0YWxsW2ldLCBuYW1lc1tqXSkpICE9IG51bGwpDQotCQkJCQkJCQl0YXJnZXRGZWF0dXJlLnN0b3JlKHBsdWdpbnNUb0luc3RhbGxbaV0sIG5hbWVzW2pdLCBpblN0cmVhbSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQkJY2xvc2UocGx1Z2luc1RvSW5zdGFsbFtpXSk7DQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIGluc3RhbGwgdGhlIEZlYXR1cmUgaW5mbw0KLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsNCi0JCQlTdHJpbmdbXSBuYW1lcyA9IGdldFN0b3JhZ2VVbml0TmFtZXModGhpcyk7DQotCQkJaWYgKG5hbWVzICE9IG51bGwpIHsNCi0JCQkJb3BlbkZlYXR1cmUoKTsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci5zdWJUYXNrKCJJbnN0YWxsaW5nIEZlYXR1cmUgaW5mb3JtYXRpb24iKTsNCi0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgew0KLQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQl9DQotCQkJCX0NCi0NCi0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBuYW1lcy5sZW5ndGg7IGorKykgew0KLQkJCQkJaWYgKChpblN0cmVhbSA9IGdldElucHV0U3RyZWFtRm9yKHRoaXMsIG5hbWVzW2pdKSkgIT0gbnVsbCkNCi0JCQkJCQkgKChTaXRlKSB0YXJnZXRGZWF0dXJlLmdldFNpdGUoKSkuc3RvcmVGZWF0dXJlSW5mbyhnZXRJZGVudGlmaWVyKCksIG5hbWVzW2pdLCBpblN0cmVhbSk7DQotCQkJCX0NCi0JCQkJY2xvc2VGZWF0dXJlKCk7DQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQ0KLQkJCX0NCi0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlTdHJpbmcgaWQgPSBVcGRhdGVNYW5hZ2VyUGx1Z2luLmdldFBsdWdpbigpLmdldERlc2NyaXB0b3IoKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGlkLCBJU3RhdHVzLk9LLCAiRXJyb3IgZHVyaW5nIEluc3RhbGwiLCBlKTsNCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQkvL2RvIG5vdCBjbGVhbiB1cCBURU1QIGRyaXZlDQotCQkJLy8gYXMgb3RoZXIgZmVhdHVyZSBtYXkgYmUgdGhlcmUuLi4gY2xlYW4gdXAgd2hlbiBleGl0aW5nIHRoZSBwbHVnaW4NCi0JCX0NCi0JfQ0KLQkNCi0JDQotCQkvKioNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI3N0b3JlKElQbHVnaW5FbnRyeSwgU3RyaW5nLCBJbnB1dFN0cmVhbSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgU3RyaW5nIGNvbnRlbnRLZXksIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkvLyBjaGVjayBpZiBwbHVnaW5FbnRyeSBhbHJlYWR5IGV4aXN0cyBiZWZvcmUgcGFzc2luZyB0byB0aGUgc2l0ZQ0KLQkJLy8gYW55dGhpbmcgZWxzZSA/DQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCQlpbnQgaSA9IDA7DQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJd2hpbGUgKGkgPCBlbnRyaWVzLmxlbmd0aCAmJiAhZm91bmQpIHsNCi0JCQlpZiAoZW50cmllc1tpXS5lcXVhbHMocGx1Z2luRW50cnkpKSB7DQotCQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQl9DQotCQkJaSsrOw0KLQkJfQ0KLQkJaWYgKCFmb3VuZCkgew0KLQkJCVN0cmluZyBpZCA9IFVwZGF0ZU1hbmFnZXJQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgaWQsIElTdGF0dXMuT0ssICJUaGUgcGx1Z2luOiIgKyBwbHVnaW5FbnRyeS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArICIgaXMgbm90IHBhcnQgb2YgdGhlIHBsdWdpbnMgb2YgdGhlIGZlYXR1cmU6IiArIHRoaXMuZ2V0SWRlbnRpZmllcigpLnRvU3RyaW5nKCksIG51bGwpOw0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7DQotCQl9DQotCQlnZXRTaXRlKCkuc3RvcmUocGx1Z2luRW50cnksIGNvbnRlbnRLZXksIGluU3RyZWFtKTsNCi0JfQ0KLQkNCi0JCS8qKg0KLQkgKiBwZXJmb3JtIHByZSBwcm9jZXNzaW5nIGJlZm9yZSBvcGVuaW5nIGEgcGx1Z2luIGFyY2hpdmUNCi0JICogQHBhcmFtIGVudHJ5IHRoZSBwbHVnaW4gYWJvdXQgdG8gYmUgb3BlbmVkDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBvcGVuKElQbHVnaW5FbnRyeSBlbnRyeSkgew0KLQl9Ow0KLQ0KLQkvKioNCi0JICogcGVyZm9ybSBwb3N0IHByb2Nlc3NpbmcgdG8gY2xvc2UgYSBwbHVnaW4gYXJjaGl2ZQ0KLQkgKiBAcGFyYW0gZW50cnkgdGhlIHBsdWdpbiBhYm91dCB0byBiZSBjbG9zZWQNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGNsb3NlKElQbHVnaW5FbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JfTsNCi0NCi0JLyoqDQotCSAqIHBlcmZvcm0gcHJlIHByb2Nlc3NpbmcgYmVmb3JlIG9wZW5pbmcgdGhlIGZlYXR1cmUgYXJjaGl2ZQ0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkZlYXR1cmUoKSB7DQotCX07DQotDQotCS8qKg0KLQkgKiBwZXJmb3JtIHBvc3QgcHJvY2Vzc2luZyB0byBjbG9zZSBhIGZlYXR1cmUgYXJjaGl2ZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2xvc2VGZWF0dXJlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JfTsNCi0JDQotCQ0KLQkJLyoqDQotCSAqIHJldHVybiB0aGUgbGlzdCBvZiBGSUxFIHRvIGJlIHRyYW5zZmVyZWQgZm9yIGEgUGx1Z2luDQotCSAqLw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3RvcmFnZVVuaXROYW1lcyhJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogcmV0dXJuIHRoZSBsaXN0IG9mIEZJTEUgdG8gYmUgdHJhbnNmZXJlZCBmcm9tIHdpdGhpbiB0aGUgRmVhdHVyZQ0KLQkgKi8NCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFN0b3JhZ2VVbml0TmFtZXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiByZXR1cm4gdGhlIFN0cmVhbSBvZiB0aGUgRklMRSB0byBiZSB0cmFuc2ZlcmVkIGZvciBhIFBsdWdpbg0KLQkgKi8NCi0JcHJvdGVjdGVkIGFic3RyYWN0IElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtRm9yKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgU3RyaW5nIG5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogcmV0dXJuIHRoZSBTdHJlYW0gb2YgRklMRSB0byBiZSB0cmFuc2ZlcmVkIGZyb20gd2l0aGluIHRoZSBGZWF0dXJlDQotCSAqLw0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW1Gb3IoSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIHJldHVybnMgdGhlIGxpc3Qgb2YgYXJjaGl2ZSB0byB0cmFuc2Zlci9pbnN0YWxsDQotCSAqIGluIG9yZGVyIHRvIGluc3RhbGwgdGhlIGxpc3Qgb2YgcGx1Z2lucw0KLQkgKiANCi0JICogQHBhcmFtIHBsdWdpbnNUb0luc3RhbGwgbGlzdCBvZiBwbHVnaW4gdG8gaW5zdGFsbCANCi0JICovDQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmdbXSBnZXRDb250ZW50UmVmZXJlbmNlVG9JbnN0YWxsKElQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb0luc3RhbGwpOw0KLQkNCi0JDQotCQkvKioNCi0JICogcmVtb3ZlIG15c2VsZi4uLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgb2xkX3JlbW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBhbmQgdGhlIHBsdWdpbnMgaWYgdGhleSBhcmUgbm90IHVzZWQgYW5kIG5vdCBhY3RpdmF0ZWQNCi0NCi0JCS8vIGdldCB0aGUgcGx1Z2lucyBmcm9tIHRoZSBmZWF0dXJlDQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9SZW1vdmUgPSAoKFNpdGVMb2NhbCkgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldERlbHRhUGx1Z2luRW50cmllcyh0aGlzKTsNCi0NCi0JCXRyeSB7DQotDQotCQkJLy8gb2J0YWluIHRoZSBsaXN0IG9mICpTdHJlYW1hYmxlIFN0b3JhZ2UgVW5pdCoNCi0JCQkvLyBmcm9tIHRoZSBhcmNoaXZlDQotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQlpbnQgdG90YWwgPSBwbHVnaW5zVG9SZW1vdmUgPT0gbnVsbCA/IDEgOiBwbHVnaW5zVG9SZW1vdmUubGVuZ3RoICsgMTsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIlVuaW5zdGFsbCBmZWF0dXJlICIgKyBnZXRMYWJlbCgpLCB0b3RhbCk7DQotCQkJfQ0KLQkJCWlmIChwbHVnaW5zVG9SZW1vdmUgIT0gbnVsbCkgew0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb1JlbW92ZS5sZW5ndGg7IGkrKykgew0KLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzaygiUmVtb3ZpbmcgcGx1Zy1pbjogIiArIHBsdWdpbnNUb1JlbW92ZVtpXSk7DQotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJcmVtb3ZlKHBsdWdpbnNUb1JlbW92ZVtpXSk7DQotDQotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJCXRocm93IENBTkNFTF9FWENFUFRJT047DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIHJlbW92ZSB0aGUgRmVhdHVyZSBpbmZvDQotCQkJU3RyaW5nW10gbmFtZXMgPSBnZXRTdG9yYWdlVW5pdE5hbWVzKHRoaXMpOw0KLQkJCWlmIChuYW1lcyAhPSBudWxsKSB7DQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCW1vbml0b3Iuc3ViVGFzaygiUmVtb3ZpbmcgRmVhdHVyZSBpbmZvcm1hdGlvbiIpOw0KLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJdGhyb3cgQ0FOQ0VMX0VYQ0VQVElPTjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQ0KLQkJCQkoKFNpdGUpIHRoaXMuZ2V0U2l0ZSgpKS5yZW1vdmVGZWF0dXJlSW5mbyhnZXRJZGVudGlmaWVyKCkpOw0KLQ0KLQkJCQljbG9zZUZlYXR1cmUoKTsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQl0aHJvdyBDQU5DRUxfRVhDRVBUSU9OOw0KLQkJCQkJfQ0KLQkJCQl9DQotDQotCQkJfQ0KLQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCVN0cmluZyBpZCA9IFVwZGF0ZU1hbmFnZXJQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgaWQsIElTdGF0dXMuT0ssICJFcnJvciBkdXJpbmcgVW5pbnN0YWxsIiwgZSk7DQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsNCi0JCX0NCi0JfQ0KLQkNCi0JU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKGphdmEubGFuZy5TdHJpbmcpIC90bXANCi0JDQotCXRydWVeZmFsc2UNCi0JdHJ1ZV50cnVlDQotDQotCQ0KLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBwMT0gKG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aCgiL3BhdGgxL3BhdGgyLyoudHh0IikpOw0KLW9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aCBwMj0gKG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aCgiL3BhdGgxL3BhdGgyL2EudHh0IikpOw0KLXAxLmVxdWFscyhwMik7DQotDQotDQotb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2Rlci5lbmNvZGUobmV3IGphdmEubmV0LlVSTCgiaHR0cDovL3d3dy5vdXJ3ZWJzaXRlLmNvbS9zZXJ2bGV0L3VwZGF0ZT9qYXI9c29tZWZlYXR1cmVqYXJmaWxlIikpOyhqYXZhLm5ldC5VUkwpIGh0dHA6Ly93d3cub3Vyd2Vic2l0ZS5jb20vc2VydmxldC91cGRhdGU/amFyPXNvbWVmZWF0dXJlamFyZmlsZQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWU1MzVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UudXBkYXRlY29yZS5qYXIgPSBzcmMvDQotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgICouamFyLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwNCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcDQotICAgICAgICAgICAgICAgb3MvDQotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbCxcDQotICAgICAgICAgICAgICAgc2NoZW1hLw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU0MzJlZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSMgDQotIyBDb250cmlidXRvcnM6DQotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLXBsdWdpbk5hbWU9IEluc3RhbGwvVXBkYXRlIENvcmUNCi1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnDQotZnJhZ21lbnROYW1lV2luPSBJbnN0YWxsL1VwZGF0ZSBDb3JlIGZvciBXaW5kb3dzDQotZnJhZ21lbnROYW1lTGludXg9IEluc3RhbGwvVXBkYXRlIENvcmUgZm9yIExpbnV4DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4ZjNlMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/Pg0KLTxwbHVnaW4NCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiDQotICAgbmFtZT0iJXBsdWdpbk5hbWUiDQotICAgdmVyc2lvbj0iMy4wLjAiDQotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSINCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlQ29yZSI+DQotDQotICAgPHJ1bnRpbWU+DQotICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRlY29yZS5qYXIiPg0KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICAgICAgIDxwYWNrYWdlcyBwcmVmaXhlcz0ib3JnLmVjbGlwc2UudXBkYXRlIi8+DQotICAgICAgPC9saWJyYXJ5Pg0KLSAgIDwvcnVudGltZT4NCi0gICA8cmVxdWlyZXM+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0NCi0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJmZWF0dXJlVHlwZXMiIG5hbWU9Ikluc3RhbGwvVXBkYXRlIENvbmNyZXRlIEZlYXR1cmUgVHlwZSBJbXBsZW1lbnRhdGlvbiBGYWN0b3J5IiBzY2hlbWE9InNjaGVtYS9mZWF0dXJlVHlwZXMuZXhzZCIvPg0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InNpdGVUeXBlcyIgbmFtZT0iSW5zdGFsbC9VcGRhdGUgQ29uY3JldGUgU2l0ZSBUeXBlIEltcGxlbWVudGF0aW9uIEZhY3RvcnkiIHNjaGVtYT0ic2NoZW1hL3NpdGVUeXBlcy5leHNkIi8+DQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iaW5zdGFsbEhhbmRsZXJzIiBuYW1lPSJJbnN0YWxsL1VwZGF0ZSBHbG9iYWwgSW5zdGFsbCBIYW5kbGVycyIgc2NoZW1hPSJzY2hlbWEvaW5zdGFsbEhhbmRsZXJzLmV4c2QiLz4NCi0gICA8IS0tIFRoZSBkZWx0YUhhbmRsZXIgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQuIERvIG5vdCB1c2UgaXQgLS0+DQotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZGVsdGFIYW5kbGVyIiBuYW1lPSJJbnN0YWxsL1VwZGF0ZSBEZWx0YSBIYW5kbGVyIi8+DQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJwcmVmZXJlbmNlSW5pdGlhbGl6ZXIiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+DQotICAgICAgPGluaXRpYWxpemVyIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyIi8+DQotICAgPC9leHRlbnNpb24+DQotDQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJwYWNrYWdlZCINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzIj4NCi0gICAgICA8ZmVhdHVyZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVQYWNrYWdlZEZhY3RvcnkiPg0KLSAgICAgIDwvZmVhdHVyZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0iaW5zdGFsbGVkIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMiPg0KLSAgICAgIDxmZWF0dXJlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5Ij4NCi0gICAgICA8L2ZlYXR1cmUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9Imh0dHAiDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyI+DQotICAgICAgPHNpdGUtZmFjdG9yeQ0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlVVJMRmFjdG9yeSI+DQotICAgICAgPC9zaXRlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJmaWxlIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMiPg0KLSAgICAgIDxzaXRlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuU2l0ZUZpbGVGYWN0b3J5Ij4NCi0gICAgICA8L3NpdGUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9IkRlZmF1bHRJbnN0YWxsSGFuZGxlciINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaW5zdGFsbEhhbmRsZXJzIj4NCi0gICAgICA8aW5zdGFsbC1oYW5kbGVyDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkRlZmF1bHRJbnN0YWxsSGFuZGxlciI+DQotICAgICAgPC9pbnN0YWxsLWhhbmRsZXI+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJEZWx0YUluc3RhbGxIYW5kbGVyIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5pbnN0YWxsSGFuZGxlcnMiPg0KLSAgICAgIDxpbnN0YWxsLWhhbmRsZXINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRGVsdGFJbnN0YWxsSGFuZGxlciI+DQotICAgICAgPC9pbnN0YWxsLWhhbmRsZXI+DQotICAgPC9leHRlbnNpb24+DQotICAgPGV4dGVuc2lvbg0KLSAgICAgICAgIGlkPSJzdGFuZGFsb25lVXBkYXRlIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4NCi0gICAgICA8YXBwbGljYXRpb24+DQotICAgICAgICAgPHJ1bg0KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZS5TdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24iPg0KLSAgICAgICAgIDwvcnVuPg0KLSAgICAgIDwvYXBwbGljYXRpb24+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3ByZWZlcmVuY2VzLmluaSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9wcmVmZXJlbmNlcy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MzZlN2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3ByZWZlcmVuY2VzLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotIyBUaGUgcG9ydCBudW1iZXIgb24gd2hpY2ggdGhlIHNldmVyIGxpc3RlbnMgZm9yIGh0dHAgcmVxdWVzdHMuCi0jIElmIHRoZSBwb3J0IGlzIDAgYW5kIGFyYml0cmFyeSBwb3J0IGlzIHBpY2tlZCBieSB0aGUgc3lzdGVtLgotCi0jIERlZmluZXMgdGhlIHBvbGljeSB1cmwgdGhhdCBjb250YWlucyBkaXJlY3RpdmVzIGZvciByZWRpcmVjdGluZyAKLSMgdXBkYXRlcyB0byBkaWZmZXJlbnQgdXBkYXRlIHNpdGVzLgotI3VwZGF0ZVBvbGljeVVSTD0KLQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9mZWF0dXJlVHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyOWE2YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2ZlYXR1cmVUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIiBpZD0iZmVhdHVyZVR5cGVzIiBuYW1lPSJGZWF0dXJlIFR5cGUgRmFjdG9yeSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgcGxhdGZvcm0gdXBkYXRlIG1lY2hhbmlzbSBzdXBwb3J0cyBwbHVnZ2FibGUgZmVhdHVyZSB0eXBlCi1pbXBsZW1lbnRhdGlvbnMuIEEgbmV3IGZlYXR1cmUgdHlwZSBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBvcmRlcgotdG8gc3VwcG9ydAotYWx0ZXJuYXRlIHBhY2thZ2luZyBhbmQgdmVyaWZpY2F0aW9uIHNjaGVtZXMuCi0mbHQ7cCZndDsKLVRoZSAmbHQ7Y29kZSZndDtmZWF0dXJlVHlwZXMmbHQ7L2NvZGUmZ3Q7Ci1leHRlbnNpb24gcG9pbnQgYWxsb3dzIGFsdGVybmF0ZSBmZWF0dXJlIGltcGxlbWVudGF0aW9ucyB0byBiZQotcmVnaXN0ZXJlZCB1c2luZyBhIHN5bWJvbGljIHR5cGUgaWRlbnRpZmllci4gV2hlbmV2ZXIgdGhlIAotdHlwZSBpcyByZWZlcmVuY2VkIHVzaW5nIHRoaXMgaWRlbnRpZmllciwgdGhlIHN1cHBsaWVkIGZhY3RvcnkKLWlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZWN0IGNvbmNyZXRlIGZlYXR1cmUgaW1wbGVtZW50YXRpb24uCi0mbHQ7L3AmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmZWF0dXJlLWZhY3RvcnkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4NCi0gICAgICAgICA8L3NlcXVlbmNlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQgYXMgJmx0O2ImZ3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzJmx0Oy9iJmd0Ow0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZC4gSWRlbnRpZmllcyB0aGUgbmV3IGZlYXR1cmUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgbmV3IGZlYXR1cmUgdHlwZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZmVhdHVyZS1mYWN0b3J5Ij4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZmFjdG9yeSBjbGFzcyBmb3IgdGhlIGlkZW50aWZpZWQgZmVhdHVyZSB0eXBlDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbERlbHRhSGFuZGxlciIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgbmV3IGZlYXR1cmUgdHlwZSByZWdpc3RyYXRpb246Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICBpZD0mcXVvdDtjdXN0b20mcXVvdDsKLSAgICAgIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlcyZxdW90OwotICAgICAgbmFtZT0mcXVvdDtDdXN0b20gcGFja2FnZWQgZmVhdHVyZSZxdW90OyZndDsKLSAgICAgICZsdDtmZWF0dXJlLWZhY3RvcnkKLSAgICAgICAgICBjbGFzcz0mcXVvdDtjb20ueHl6LnVwZGF0ZS5DdXN0b21GZWF0dXJlRmFjdG9yeSZxdW90OyZndDsKLSAgICAgICZsdDsvZmVhdHVyZS1mYWN0b3J5Jmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBSZWdpc3RlcmVkIGZhY3RvcnkgY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKLSZsdDtjb2RlJmd0OyZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlRmFjdG9yeSZsdDsvYiZndDsmbHQ7L2NvZGUmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBwbGF0Zm9ybSBzdXBwbGllcyB0d28gc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIG9mIGZlYXR1cmUKLXR5cGVzLiBPbmUgcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0IHBhY2thZ2VkIGZlYXR1cmUgdHlwZSwgYW5kCi10aGUgb3RoZXIgcmVwcmVzZW50aW5nIGFuIGluc3RhbGxlZCBmZWF0dXJlIHR5cGUuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi1BbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCZsdDsvYSZndDsuDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi08L3NjaGVtYT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2luc3RhbGxIYW5kbGVycy5leHNkIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NjaGVtYS9pbnN0YWxsSGFuZGxlcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhkZDgzMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL2luc3RhbGxIYW5kbGVycy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+DQotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4NCi08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIiBpZD0iaW5zdGFsbEhhbmRsZXJzIiBuYW1lPSJHbG9iYWwgSW5zdGFsbCBIYW5kbGVycyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgZm9yIHJlZ2lzdGVyaW5nIGdsb2JhbCBpbnN0YWxsIGhhbmRsZXJzLiBHbG9iYWwKLWluc3RhbGwgaGFuZGxlcnMgY2FuIGJlIHJlZmVyZW5jZWQgYnkgZmVhdHVyZXMgCi0odXNpbmcgdGhlICZsdDtjb2RlJmd0OyZhbXA7bHQ7ZmVhdHVyZSZhbXA7Z3Q7ICZhbXA7bHQ7aW5zdGFsbC1oYW5kbGVyJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7Ci10YWdzKSB3aXRob3V0IGhhdmluZyB0byBpbmNsdWRlIGEgY29weSBvZiB0aGUgaGFuZGxlciBjb2RlIGFzCi1wYXJ0IG9mIHRoZSBkb3dubG9hZGFibGUgZmVhdHVyZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Imluc3RhbGwtaGFuZGxlciIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBtdXN0IGJlIHNwZWNpZmllZCBhcyAmbHQ7YiZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5pbnN0YWxsSGFuZGxlcnMmbHQ7L2ImZ3Q7DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkLiBJZGVudGlmaWVzIHRoZSBuZXcgaW5zdGFsbCBoYW5kbGVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBuZXcgaW5zdGFsbCBoYW5kbGVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJpbnN0YWxsLWhhbmRsZXIiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBoYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGUgaWRlbnRpZmllZAotaW5zdGFsbCBoYW5kbGVyDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhhbXBsZSBvZiBuZXcgZ2xvYmFsIGluc3RhbGwgaGFuZGxlciByZWdpc3RyYXRpb246Ci0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgIGlkPSZxdW90O2N1c3RvbSZxdW90OwotICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5pbnN0YWxsSGFuZGxlcnMmcXVvdDsKLSAgICAgICAgbmFtZT0mcXVvdDtDdXN0b20gaW5zdGFsbCBoYW5kbGVyJnF1b3Q7Jmd0OwotICAgICAmbHQ7aW5zdGFsbC1oYW5kbGVyCi0gICAgICAgIGNsYXNzPSZxdW90O2NvbS54eXoudXBkYXRlLkN1c3RvbUluc3RhbGxIYW5kbGVyJnF1b3Q7Jmd0OwotICAgICAmbHQ7L2luc3RhbGwtaGFuZGxlciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgUmVnaXN0ZXJlZCBpbnN0YWxsIGhhbmRsZXIgY2xhc3NlcyBtdXN0IGltcGxlbWVudCAKLSZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlciZsdDsvY29kZSZndDsgaW50ZXJmYWNlLgotSW1wbGVtZW50ZXJzIHNob3VsZCBleHRlbmQgYmFzZSBjbGFzcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlSW5zdGFsbEhhbmRsZXImbHQ7L2NvZGUmZ3Q7Lg0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgcGxhdGZvcm0gc3VwcGxpZXMgYSBzaW1wbGUgaW5zdGFsbCBoYW5kbGVyIHRoYXQgaXMgcmVnaXN0ZXJlZCBhcyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5EZWZhdWx0SW5zdGFsbEhhbmRsZXImbHQ7L2NvZGUmZ3Q7LiBJZiB1c2VkLCBpdCB3aWxsIGNvcHkgYW55IG5vbi1wbHVnLWluIGRhdGEgZW50cmllcyBwcm92aWRlZCB3aXRoIHRoZSBmZWF0dXJlIGludG8gdGhlIGZlYXR1cmUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sJmx0Oy9hJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvc2l0ZVR5cGVzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc2NoZW1hL3NpdGVUeXBlcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzQ4OTU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zY2hlbWEvc2l0ZVR5cGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGlkPSJzaXRlVHlwZXMiIG5hbWU9IlNpdGUgVHlwZSBGYWN0b3J5Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFRoZSBwbGF0Zm9ybSB1cGRhdGUgbWVjaGFuaXNtIHN1cHBvcnRzIHBsdWdnYWJsZSBzaXRlIHR5cGUKLWltcGxlbWVudGF0aW9ucy4gQSBuZXcgc2l0ZSB0eXBlIGNhbiBiZSByZWdpc3RlcmVkIGluIG9yZGVyCi10byBzdXBwb3J0IGFsdGVybmF0ZSBzaXRlIGxheW91dCBzY2hlbWVzLgotJmx0O3AmZ3Q7Ci1UaGUgJmx0O2NvZGUmZ3Q7c2l0ZVR5cGVzJmx0Oy9jb2RlJmd0OwotZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhbHRlcm5hdGUgc2l0ZSBpbXBsZW1lbnRhdGlvbnMgdG8gYmUKLXJlZ2lzdGVyZWQgdXNpbmcgYSBzeW1ib2xpYyB0eXBlIGlkZW50aWZpZXIuIFdoZW5ldmVyIHRoZSAKLXR5cGUgaXMgcmVmZXJlbmNlZCB1c2luZyB0aGlzIGlkZW50aWZpZXIsIHRoZSBzdXBwbGllZCBmYWN0b3J5Ci1pcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29ycmVjdCBjb25jcmV0ZSBzaXRlIGltcGxlbWVudGF0aW9uLgotJmx0Oy9wJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2l0ZS1mYWN0b3J5IiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIG11c3QgYmUgc3BlY2lmaWVkIGFzICZsdDtiJmd0O29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnNpdGVUeXBlcyZsdDsvYiZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzcGVjaWZpZWQuIElkZW50aWZpZXMgdGhlIG5ldyBzaXRlIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBvcHRpb25hbCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIG5ldyBzaXRlIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InNpdGUtZmFjdG9yeSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZhY3RvcnkgY2xhc3MgZm9yIHRoZSBpZGVudGlmaWVkCi1zaXRlIHR5cGUNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIG5ldyBzaXRlIHR5cGUgcmVnaXN0cmF0aW9uLgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotICAgJmx0O2V4dGVuc2lvbgotICAgICAgICBpZD0mcXVvdDtjdXN0b20mcXVvdDsKLSAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzJnF1b3Q7Ci0gICAgICAgIG5hbWU9JnF1b3Q7Q3VzdG9tIHNpdGUmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7c2l0ZS1mYWN0b3J5Ci0gICAgICAgICAgY2xhc3M9JnF1b3Q7Y29tLnh5ei51cGRhdGUuQ3VzdG9tU2l0ZUZhY3RvcnkmcXVvdDsmZ3Q7Ci0gICAgICAmbHQ7L3NpdGUtZmFjdG9yeSZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7DQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgUmVnaXN0ZXJlZCBmYWN0b3J5IGNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgCi0mbHQ7Y29kZSZndDsmbHQ7YiZndDtvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZUZhY3RvcnkmbHQ7L2ImZ3Q7Jmx0Oy9jb2RlJmd0Ow0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGUgcGxhdGZvcm0gc3VwcGxpZXMgdHdvIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBvZiBzaXRlCi10eXBlcy4gT25lIHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCB1cGRhdGUgc2VydmVyIHR5cGUsIGFuZAotdGhlIG90aGVyIHJlcHJlc2VudGluZyB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gc2l0ZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSBocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sJmx0Oy9hJmd0Oy4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUFjdGl2aXR5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lBY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDMxNTJmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogSW5zdGFsbCBhY3Rpdml0eS4KLSAqIFJlcHJlc2VudHMgYSByZWNvcmQgb2YgYW4gaW5zdGFsbGF0aW9uIGFjdGlvbiBwZXJmb3JtZWQKLSAqIG9uIGEgcGFydGljdWxhciBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbi4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JSW5zdGFsbENvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQWN0aXZpdHkgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCS8qKgotCSAqIEluZGljYXRlcyBmZWF0dXJlIGluc3RhbGxhdGlvbiBhY3Rpb24KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTCA9IDE7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgZmVhdHVyZSByZW1vdmFsICh1bmluc3RhbGxhdGlvbikgYWN0aW9uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9GRUFUVVJFX1JFTU9WRSA9IDI7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgYW4gYWRkaXRpb24gb2YgYSBzaXRlIHRvIGEgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0lURV9JTlNUQUxMID0gMzsKLQotCS8qKgotCSAqIEluZGljYXRlcyByZW1vdmFsIG9mIGEgc2l0ZSBmcm9tIGEgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fU0lURV9SRU1PVkUgPSA0OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGZlYXR1cmUgdW5jb25maWd1cmF0aW9uIGFjdGlvbgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fVU5DT05GSUdVUkUgPSA1OwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGZlYXR1cmUgY29uZmlndXJhdGlvbiBhY3Rpb24KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUNUSU9OX0NPTkZJR1VSRSA9IDY7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgcmV2ZXJ0aW5nIHRvIGEgcHJpb3IgY29uZmlndXJhdGlvbiBzdGF0ZQotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQ1RJT05fUkVWRVJUID0gNzsKLQotCS8qKgotCSAqIEluZGljYXRlcyByZWNvbmNpbGxpYXRpb24gd2l0aCBjaGFuZ2VzIG1hZGUgZGlyZWN0bHkgdG8gdGhlIHNpdGUKLQkgKiBpbnN0YWxsYXRpb24gZGlyZWN0b3J5Ci0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9SRUNPTkNJTElBVElPTiA9IDg7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgYWRkaW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIGEgcHJlc2VydmVkIHN0YXRlCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFDVElPTl9BRERfUFJFU0VSVkVEID0gOTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGFjdGlvbiBjb21wbGV0ZWQgY3Vzc2Vzc2Z1bGx5Ci0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19PSyA9IDA7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGFjdGlvbiBkaWQgbm90IGNvbXBsZXRlIHN1Y2Nlc3NmdWxseQotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9LID0gMTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiBjb2RlIGZvciB0aGlzIGFjdGl2aXR5Ci0JICogCi0JICogQHNlZSAjQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTAotCSAqIEBzZWUgI0FDVElPTl9GRUFUVVJFX1JFTU9WRQotCSAqIEBzZWUgI0FDVElPTl9TSVRFX0lOU1RBTEwKLQkgKiBAc2VlICNBQ1RJT05fU0lURV9SRU1PVkUKLQkgKiBAc2VlICNBQ1RJT05fVU5DT05GSUdVUkUKLQkgKiBAc2VlICNBQ1RJT05fQ09ORklHVVJFCi0JICogQHNlZSAjQUNUSU9OX1JFVkVSVAotCSAqIEBzZWUgI0FDVElPTl9SRUNPTkNJTElBVElPTgotCSAqIEByZXR1cm4gYWN0aW9uIGNvZGUsIGFzIGRlZmluZWQgaW4gdGhpcyBpbnRlcmZhY2UKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoaXMgYWN0aW9uCi0JICogCi0JICogQHJldHVybiBkaXBsYXlhYmxlIGxhYmVsIGZvciBhY3Rpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoaXMgYWN0aXZpdHkKLQkgKiAKLQkgKiBAcmV0dXJuIGFjdGl2aXR5IGRhdGUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgRGF0ZSBnZXREYXRlKCk7Ci0KLQkvKiogCi0JICogUmV0dXJucyB0aGUgYWN0aXZpdHkgY29tcGxldGlvbiBzdGF0dXMKLQkgKiAKLQkgKiBAc2VlICNTVEFUVVNfT0sKLQkgKiBAc2VlICNTVEFUVVNfTk9LCi0JICogQHJldHVybiBjb21wbGV0aW9uIHN0YXR1cywgYXMgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbiB0aGF0IHdhcyB0aGUgcmVzdWx0IG9mIAotCSAqIHRoaXMgYWN0aW9uCi0JICogCi0JICogQHJldHVybiBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJlZFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUNvbmZpZ3VyZWRTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDAwNGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JQ29uZmlndXJlZFNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBDb25maWd1cmVkIFNpdGUuCi0gKiBSZXByZXNlbnRzIGFuIGluc3RhbGxhdGlvbiBzaXRlICJmaWx0ZXJlZCIgYnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KLSAqIENvbmZpZ3VyZWQgc2l0ZSBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBmZWF0dXJlIHVwZGF0ZSBvcGVyYXRpb25zIChpbnN0YWxsCi0gKiBmZWF0dXJlLCByZW1vdmUgZmVhdHVyZSwgY29uZmlndXJlIGZlYXR1cmUsIHVuY29uZmlndXJlIGZlYXR1cmUpLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGUgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgInVuZmlsdGVyZWQiIHNpdGUuCi0JICogCi0JICogQHJldHVybiB0aGUgdW5kZXJseWluZyBzaXRlIAotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCk7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB1cGRhdGVzIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBzaXRlLgotCSAqIAotCSAqIDxjb2RlPklTdGF0dXMuaXNPaygpPC9jb2RlPiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgc2l0ZSBjYW4gYmUgdXBkYXRlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBJZiB1cGRhdGVzIGNhbm5vdCBiZSBhcGxpZWQsIHRoZSBzdGF0dXMgY29udGFpbnMgdGhlIGVycm9yIG1lc3NhZ2UsIGFuZAotCSAqIHRoZSBwb3NzaWJsZSBleGNlcHRpb24uIAotCSAqIAotCSAqIEBzZWUgSVN0YXR1cwotCSAqIEByZXR1cm4gYW4gSVN0YXR1cwotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdXBkYXRlcyBjYW4gYmUgYXBwbGllZCB0byB0aGUgc2l0ZS4KLQkgKiAKLQkgKiBBIGNvbmZpZ3VyYXRpb24gc2l0ZSBpcyB0YWdnZWQgYSBub24tdXBkYXRhYmxlIGJ5IHJlYWRpbmcKLQkgKiB0aGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBmb3IgdGhpcyBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNpdGUgY2FuIGJlIHVwZGF0ZWQsIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpOwotCi0JLyoqCi0JICogSW5zdGFsbCB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgdG8gaW5zdGFsbAotCSAqIEBwYXJhbSB2ZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb24gbGlzdGVuZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuCi0JICogT25seSB0aGUgc3BlY2lmaWVkIG9wdGlvbmFsIGZlYXR1cmVzIHdpbGwgYmUgaW5zdGFsbGVkCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZSB0byBpbnN0YWxsCi0JICogQHBhcmFtIG9wdGlvbmFsRmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbAotCSAqIEBwYXJhbSB2ZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb24gbGlzdGVuZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogUmVtb3ZlICh1bmluc3RhbGwpIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBmcm9tIHRoaXMgc2l0ZQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgdG8gcmVtb3ZlCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaXMgImJyb2tlbiIuIEEgZmVhdHVyZSBpcyBjb25zaWRlcmVkCi0JICogdG8gYmUgYnJva2VuIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgc2l0ZSwgaWYgc29tZSBvZiB0aGUgcGx1Zy1pbnMKLQkgKiByZWZlcmVuY2VkIGJ5IHRoZSBmZWF0dXJlIGFyZSBub3QgaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBUaGUgc3RhdHVzIGNvZGUgaXMgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4gaWYgdGhlIGZlYXR1cmUgaXMgY29uc2lkZXJlZAotCSAqIGJyb2tlbi4gVGhlIFN0YXR1cyBtYXkgY29udGFpbiB0aGUgcmVhc29uIHdoeSB0aGUgZmVhdHVyZSBpcyBicm9rZW4uCi0JICogVGhlIHN0YXR1cyBjb2RlIGlzIDxjb2RlPklTdGF0dXMuT0s8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBjb25zaWRlcmVkCi0JICogYnJva2VuLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlCi0JICogQHJldHVybiB0aGUgc3RhdHVzIGZvciB0aGlzIGZlYXR1cmUgb24gdGhpcyBjb25maWd1cmVkIHNpdGUKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEJyb2tlblN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgaXMgY29uZmlndXJlZCBvbiB0aGlzIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpOwotCi0JLyoqCi0JICogQ29uZmlndXJlIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuIFRoZSBjb25maWd1cmVkCi0JICogZmVhdHVyZSB3aWxsIGJlIGluY2x1ZGVkIG9uIG5leHQgc3RhcnR1cC4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFVuY29uZmlndXJlIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBmcm9tIHRoaXMgc2l0ZS4gVGhlIHVuY29uZmlndXJlZAotCSAqIGZlYXR1cmUgd2lsbCBiZSBvbWl0dGVkIG9uIHRoZSBuZXh0IHN0YXJ0dXAuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bmNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiByZWZlcmVuY2VzIHRvIGZlYXR1cmVzIGNvbmZpZ3VyZWQgb24gdGhpcyBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgZmVhdHVyZXMgaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZSAoY29uZmlndXJlZCBhcyB3ZWxsCi0JICogYXMgdW5jb25maWd1cmVkKS4gTm90ZSwgdGhhdCBpZiB0aGUgc2l0ZSByZXF1aXJlcyByZWNvbmNpbGlhdGlvbiwKLQkgKiB0aGUgcmVzdWx0IG1heSBub3QgbWF0Y2ggdGhlIHJlc3VsdCBvZiB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QKLQkgKiBvbiB0aGUgdW5kZXJseWluZyBzaXRlLgotCSAqIAotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2l0ZSBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRoaXMgc2l0ZSBpcyBwYXJ0IG9mLgotCSAqIAotCSAqIEByZXR1cm4gaW5zdGFsbCBjb25maWd1cmF0aW9uIG9iamVjdAotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpOwotCi0JLyoqCi0JICogQWRkcyBhIGNoYW5nZSBsaXN0ZW5lciB0byB0aGUgY29uZmlndXJlZCBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gYWRkCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgYSBjaGFuZ2UgbGlzdGVuZXIgZnJvbSB0aGUgY29uZmlndXJlZCBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgc2l0ZSBpcyBhbiBleHRlbnNpb24gc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzaXRlIGlzIGFuIGV4dGVuc2lvbiBzaXRlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uU2l0ZSgpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzaXRlIGlzIGEgcHJvZHVjdCBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNpdGUgaXMgYSBwcm9kdWN0IHNpdGUsCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9kdWN0U2l0ZSgpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBzaXRlIGlzIGEgcHJpdmF0ZSBzaXRlLgotCSAqIFRoaXMgZG9lcyBub3QgY2hlY2sgaWYgdGhpcyBwcml2YXRlIHNpdGUgYmVsb25ncyB0byB0aGUKLQkgKiBwcm9kdWN0IHRoYXQgaXMgcnVubmluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzaXRlIGlzIGEgcHJpdmF0ZSBzaXRlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqIEBkZXByZWNhdGVkIHByaXZhdGUgc2l0ZSBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBhcyBleHRlbnNpb24gc2l0ZSAoMy4wKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVNpdGUoKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgc2l0ZSBoYXMgYmVlbiBsaW5rZWQgYnkgYSBuYXRpdmUKLQkgKiBpbnN0YWxsZXIuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2l0ZSBpcyBhIG5hdGl2ZWx5IGxpbmtlZCBzaXRlLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTmF0aXZlbHlMaW5rZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFNldHMgaWYgdGhlIHNpdGUgaXMgZW5hYmxlZAotCSAqIAotCSAqIEBwYXJlbSA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc2l0ZSBpcyBlbmFibGUsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqIEBzaW5jZSAyLjEKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiB0aGUgc2l0ZSBpcyBlbmFibGVkLiAKLQkgKiBJZiBhIHNpdGUgaXMgbm90IGVuYWJsZSwgYWxsIHRlaCBmZWF0dXJlcyBhcmUgY29uc2lkZXJlZCBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzaXRlIGlzIGVuYWJsZSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICogQHNpbmNlIDIuMQotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzYzNGMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGNoYW5nZSBsaXN0ZW5lci4gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIHNwZWNpZmllZCBmZWF0dXJlIHdhcyBpbnN0YWxsZWQuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUgdGhlIGZlYXR1cmUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpOwotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgd2FzIHJlbW92ZWQgKHVuaW5zdGFsbGVkKQotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSk7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSB3YXMgY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGZlYXR1cmVDb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpOwotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgd2FzIHVuY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxDb25maWd1cmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lJbnN0YWxsQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDBhMzdkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIEluc3RhbGxhdGlvbiBjb25maWd1cmF0aW9uLgotICogUmVwcmVzZW50cyBhIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb2YgYSBudW1iZXIgb2Ygc2l0ZXMgYXMgYSBwb2ludAotICogaW4gdGltZS4gTWFpbnRhaW5zIGEgcmVjb3JkIG9mIHRoZSBzcGVjaWZpYyBhY3Rpdml0aWVzIHRoYXQgcmVzdWx0ZWQKLSAqIGluIHRoaXMgY29uZmlndXJhdGlvbi4gQ3VycmVudCBpbnN0YWxsYXRpb24gY29uZmlndXJhdGlvbiBpcwotICogdGhlIGNvbmZpZ3VyYXRpb24gdGhlIHBsYXRmb3JtIHdhcyBzdGFydGVkIHdpdGguCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoaXMgaXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1cnJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l0ZXMgdGhhdCBhcmUgcGFydCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb25maWd1cmVkIHNpdGVzLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlW10gZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgaW5zdGFsbGF0aW9uIHNpdGUsIGJhc2VkIG9uIGEgbG9jYWwgZmlsZSAKLQkgKiBzeXN0ZW0gZGlyZWN0b3J5LiBOb3RlLCB0aGUgc2l0ZSBpcyBub3QgYWRkZWQgdG8gdGhlCi0JICogY29uZmlndXJhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzIGNhbGwuCi0JICogCi0JICogQHBhcmFtIGRpcmVjdG9yeSBmaWxlIGRpcmVjdG9yeQotCSAqIEByZXR1cm4gbmV3IHNpdGUKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGNyZWF0ZUNvbmZpZ3VyZWRTaXRlKEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBsaW5rZWQgc2l0ZSwgYmFzZWQgb24gYSBsb2NhbCBmaWxlIAotCSAqIHN5c3RlbSBkaXJlY3RvcnkuIE5vdGUsIHRoZSBzaXRlIGlzIG5vdCBhZGRlZCB0byB0aGUKLQkgKiBjb25maWd1cmF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoaXMgY2FsbC4KLQkgKiBUaGUgbGlua2VkIHNpdGUgaXMgb25seSBjcmVhdGVkIGlmIHRoZSBkaXJlY3RvcnkgaXMgYW4KLQkgKiBhbHJlYWR5IGV4aXN0aW5nIGV4dGVuc2lvbiBzaXRlIGFuZCBpZiBpdCBpcyBub3QgYWxyZWFkeQotCSAqIG5hdGl2ZWx5IGxpbmtlZCB0byB0aGUgbG9jYWwgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyZWN0b3J5IGZpbGUgZGlyZWN0b3J5Ci0JICogQHJldHVybiBuZXcgbGlua2VkIHNpdGUKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGNyZWF0ZUxpbmtlZENvbmZpZ3VyZWRTaXRlKEZpbGUgZGlyZWN0b3J5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBzaXRlIHRvIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc2l0ZSBuZXcgc2l0ZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBzaXRlIGZyb20gdGhpcyBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzaXRlIHNpdGUgdG8gcmVtb3ZlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29uZmlndXJlZFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpOwotCi0JLyoqCi0JICogQWRkcyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVyLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGFjdGl2aXRpZXMgdGhhdCByZXN1bHRlZCBpbiB0aGlzIGNvbmZpZ3VyYXRpb24uCi0JICogVGhlcmUgaXMgYWx3YXlzIGF0IGxlYXN0IG9uZSBhY3Rpdml0eQotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYWN0aXZpdGllcwotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJQWN0aXZpdHlbXSBnZXRBY3Rpdml0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXRydW4gdGhlIGRhdGUgdGhlIGNvbmZpZ3VyYXRpb24gd2FzIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybiBjcmVhdGUgZGF0ZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25maWd1cmF0aW9uIGxhYmVsLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gbGFiZWwuIElmIHRoZSBjb25maWd1cmF0aW9uIGxhYmVsIHdhcyBub3QKLQkgKiBleHBsaWNpdGx5IHNldCwgYSBkZWZhdWx0IGxhYmVsIGlzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgY3JlYXRpb24KLQkgKiBkYXRlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgY29uZmlndXJhdGlvbiBsYWJlbC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIHN0YW1wIGNyZWF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBjb25maWd1cmF0aW9uIHRpbWUgbGluZS4KLQkgKiBUaW1lIGxpbmUgaXMgc3RhcnRlZCB3aGVuIGNvbmZpZ3VyYXRpb24gc3RhdGUgaXMgY3JlYXRlZCBieSBhIGZ1bGwgZmlsZSBzeXN0ZW0gcmVjb25jaWxpYXRpb24uIEFsbCBjb25maWd1cmF0aW9ucwotCSAqIHN1YnNlcXVlbnRseSBjcmVhdGVkIHdpbGwgaGF2ZSB0aGUgc2FtZSB0aW1lIGxpbmUgdW50aWwgdGhlIG5leHQgZnVsbCByZWNvbmNpbGlhdGlvbi4gQ2VydGFpbiBvcGVyYXRpb25zCi0gCSAqIChlLmcuIHJldmVydCkgbWFrZSBzZW5zZSBvbmx5IGJldHdlZW4gb2JqZWN0cyB0aGF0IGJlbG9uZyB0byB0aGUgc2FtZSB0aW1lIGxpbmUuCi0gCSAqIAotCSAqIEBzaW5jZSAyLjAuMgotCSAqIEByZXR1cm4gdGhlIHRpbWUgc3RhbXAgb2YgdGhlIGZ1bGwgc3lzdGVtIHJlY29uY2lsaWF0aW9uCi0JICogCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBsb25nIGdldFRpbWVsaW5lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzBhODc0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVyLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgewotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgc3BlY2lmaWVkIHNpdGUgd2FzIGFkZGVkIHRvIHRoZSBjb25maWd1cmF0aW9uCi0JICogCi0JICogQHBhcmFtIHNpdGUgdGhlIHNpdGUKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQl2b2lkIGluc3RhbGxTaXRlQWRkZWQoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpOwotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgc3BlY2lmaWVkIHNpdGUgd2FzIHJlbW92ZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzaXRlIHRoZSBzaXRlCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBpbnN0YWxsU2l0ZVJlbW92ZWQoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lJbnN0YWxsRGVsdGFIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb25maWd1cmF0aW9uL0lJbnN0YWxsRGVsdGFIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2IxNzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JSW5zdGFsbERlbHRhSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBJbnN0YWxsIERlbHRhIEhhbmRsZXIuCi0gKiBQcmVzZW50cyB0aGUgY2hhbmdlcyB0aGUgcmVjb25jaWxlciBmb3VuZCB0byB0aGUgdXNlcgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UuIFRoZSBleHRlbnNpb24gcG9pbnQgZGVsdGFIYW5kbGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxEZWx0YUhhbmRsZXJ7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsaXN0IG9mIHNlc3Npb24gZGVsdGEgdG8gcHJlc2VudCB0byB0aGUgdXNlcgotCSAqIAotCSAqIEBwYXJhbSBkZWx0YXMgYW4gQXJyYXkgb2YgPGNvZGU+SVNlc3Npb25EZWx0YTwvY29kZT4KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElTZXNzaW9uRGVsdGFbXSBkZWx0YXMpOwotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBvciB1bmNvbmZpZ3VyZQotCSAqIG5ldyBmZWF0dXJlcyBmb3VuZCBkdXJpbmcgcmVjb25jaWxpYXRpb24KLQkgKiAKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUxvY2FsU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Y2FjMTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogTG9jYWwgU2l0ZS4KLSAqIFJlcHJlc2VudHMgdGhlIGxvY2FsIGluc3RhbGxhdGlvbi4gSXQgY29uc2lzdHMgb2YgdGhlIGN1cnJlbnQKLSAqIGNvbmZpZ3VyYXRpb24gYW5kIHRoZSBjb25maWd1cmF0aW9uIGhpc3RvcnkuIEEgbG9jYWwgc2l0ZQotICogbWFuYWdlcyB0aGUgbnVtYmVyIG9mIGNvbmZpZ3VyYXRpb24gaGlzdG9yaWVzIGtlcHQuIEl0IGFsc28gYWxsb3dzCi0gKiBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGhpc3RvcmllcyB0byBiZSBzYXZlZC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+IAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NhbFNpdGUgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gY3VycmVudCBjb25maWd1cmF0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gY29uZmlndXJhdGlvbiBoaXN0b3J5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29uZmlndXJhdGlvbnMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCi0JLyoqCi0JICogUmV2ZXJ0cyB0aGUgbG9jYWwgc2l0ZSB0byB1c2UgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLgotCSAqIFRoZSByZXN1bHQgb2YgdGhpcyBvcGVyYXRpb24gaXMgYSBuZXcgY29uZmlndXJhdGlvbiB0aGF0Ci0JICogY29udGFpbnMgdGhlIHNhbWUgY29uZmlndXJlZCBmZWF0dXJlcyBhcyB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uCi0JICogVGhlIG5ldyBjb25maWd1cmF0aW9uIGJlY29tZXMgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uIHN0YXRlIHRvIHJldmVydCB0bwotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcGFyYW0gaGFuZGxlciBwcm9ibGVtIGhhbmRsZXIKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXZlcnRUbygKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJSVByb2JsZW1IYW5kbGVyIGhhbmRsZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb25maWd1cmF0aW9uIGNvbnRhaW5pbmcgdGhlIHNhbWUgc3RhdGUgYXMgdGhlIAotCSAqIHNwZWNpZmllZCBjb25maWd1cmF0aW9uLiBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgbm90IGFkZGVkIHRvCi0JICogdGhpcyBsaWNhbCBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gY2xvbmVkIGNvbmZpZ3VyYXRpb24KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIHRvIHRoaXMgbG9jYWwgc2l0ZS4KLQkgKiBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gYmVjb21lcyB0aGUgY3VycmVudCBvbmUuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZyB0aGUgY29uZmlndXJhdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb24oSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyk7Ci0KLQkvKioKLQkgKiBTYXZlcyB0aGUgbG9jYWwgc2l0ZSBzdGF0ZQotCSAqIAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIHJlc3RhcnQgaXMgbmVlZGVkLiBUaGlzIHJldHVybiBjb2RlIHdhcyBhZGRlZCBpbiAzLjAuCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGhvdyBtYW55IGNvbmZpZ3VyYXRpb24gaGlzdG9yaWVzIHNob3VsZCBiZSBtYWludGFpbmVkLgotCSAqIEhpc3RvcmllcyBiZXlvbmQgdGhlIHNwZWNpZmllZCBjb3VudCBhcmUgYXV0b21hdGljYWxseSBkZWxldGVkLgotCSAqIAotCSAqIEByZXR1cm4gbnVtYmVyIG9mIHBhc3QgY29uZmlndXJhdGlvbnMgdG8ga2VlcCBhcyBoaXN0b3J5Ci0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBnZXRNYXhpbXVtSGlzdG9yeUNvdW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgcGFzdCBjb25maWd1cmF0aW9ucyB0byBrZWVwIGluIGhpc3RvcnkKLQkgKiAKLQkgKiBAcGFyYW0gaGlzdG9yeSBudW1iZXIgb2YgY29uZmlndXJhdGlvbiB0byBrZWVwCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQgaGlzdG9yeSk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgc2l0ZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHNpdGUgbGlzdGVuZXIKLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogU2F2ZSB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uIFNhdmVkIGNvbmZpZ3VyYXRpb25zIGFyZSAKLQkgKiBub3QgZGVsZXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yeSBjb3VudC4gVGhleSBtdXN0IGJlIGV4cGxpY2l0bHkKLQkgKiByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHNhdmUKLQkgKiBAcmV0dXJuIHRoZSBwcmVzZXJ2ZWQgY29uZmlndXJhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29uZmlndXJhdGlvbiB0byBzYXZlIGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBhZGRUb1ByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIGxpc3Qgb2YgcHJldmlvdXNseQotCSAqIHNhdmVkIGNvbmZpZ3VyYXRpb25zLgotCSAqIAotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBjb25maWd1cmF0aW9uIHRvIHJlbW92ZQotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygc2F2ZWQgY29uZmlndXJhdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb25zLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGhlICdzdGF0ZScgb2YgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGFuZCBpdHMgY2hpbGRyZW4gZmVhdHVyZXMuCi0JICogCi0JICogQSBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgdG8gYmUgJ3VuaGFwcHknIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgc2l0ZSwKLQkgKiBpZiBzb21lIG9mIHRoZSBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoZSBmZWF0dXJlLCBvciBhbnkgb2YgaXRzIGNoaWxkcmVuLAotCSAqICBhcmUgbm90IGluc3RhbGxlZCBvbiB0aGlzIHNpdGUuCi0JICogCi0JICogQSBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgdG8gYmUgJ2hhcHB5JyBpbiB0aGUgY29udGV4dCBvZiBhIGxvY2FsIHNpdGUKLQkgKiBpZiBhbGwgdGhlIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhlIGZlYXR1cmUsIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4sCi0JICogYXJlIGluc3RhbGxlZCBvbiB0aGUgc2l0ZSBhbmQgbm8gb3RoZXIgdmVyc2lvbiBvZiBhbnkgb2YgdGhlIHBsdWctaW5zCi0JICogYXJlIGluc3RhbGxlZCBvbiBhbnkgb3RoZXIgc2l0ZSBvZiB0aGUgbG9jYWwgc2l0ZS4KLQkgKiAKLQkgKiBBIGZlYXR1cmUgaXMgY29uc2lkZXJlZCB0byBiZSAnYW1iaWd1b3VzJyBpbiB0aGUgY29udGV4dCBvZiBhIGxvY2FsIHNpdGUKLQkgKiBpZiBhbGwgdGhlIHBsdWctaW5zIHJlZmVyZW5jZWQgYnkgdGhlIGZlYXR1cmUsIG9yIGFueSBvZiBpdHMgY2hpbGRyZW4sCi0JICogYXJlIGluc3RhbGxlZCBvbiB0aGUgc2l0ZSBhbmQgb3RoZXIgdmVyc2lvbiBvZiBhbnkgb2YgdGhlIHBsdWctaW5zCi0JICogYXJlIGluc3RhbGxlZCBvbiBhbnkgb3RoZXIgc2l0ZSBvZiB0aGUgbG9jYWwgc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgZmVhdHVyZQotCSAqIEBzZWUgSUZlYXR1cmUjU1RBVFVTX0hBUFBZCi0JICogQHNlZSBJRmVhdHVyZSNTVEFUVVNfVU5IQVBQWQotCSAqIEBzZWUgSUZlYXR1cmUjU1RBVFVTX0FNQklHVU9VUwotCSAqIEByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBmZWF0dXJlCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRGZWF0dXJlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIDsJCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTE2MmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOwotCi0vKioKLSAqIExvY2FsIHNpdGUgY2hhbmdlIGxpc3RlbmVyLiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lciB7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaGFzIGNoYW5nZWQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGN1cnJlbnQgY3VuZmlndXJhdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGN1cnJlbnRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwotCQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gd2FzIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIGNvbmZpZ3VyYXRpb24KLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29uZmlndXJhdGlvblJlbW92ZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YWI2MmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uOw0KLSANCi0NCi0NCi0vKioNCi0gKiBMb2NhbCBzeXN0ZW0gY2hhbmdlIGxpc3RlbmVyIGludGVyZmFjZS4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBMb2NhbFN5c3RlbUluZm8jYWRkSW5mb0xpc3RlbmVyKElMb2NhbFN5c3RlbUluZm9MaXN0ZW5lcikNCi0gKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNyZW1vdmVJbmZvTGlzdGVuZXIoSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyKQ0KLSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI2ZpcmVTeXN0ZW1JbmZvQ2hhbmdlZChJVm9sdW1lLGludCkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJTG9jYWxTeXN0ZW1JbmZvTGlzdGVuZXIgew0KLQkNCi0JLyoqDQotCSAqIFZvbHVtZSBjaGFuZ2Ugbm90aWZpY2F0aW9uLg0KLQkgKiBDYWxsZWQgZWFjaCB0aW1lIHRoZXJlIGFyZSByZWxldmFudCB2b2x1bWUgY2hhbmdlcw0KLQkgKiBkZXRlY3RlZC4gVGhpcyBzcGVjaWZpY2FsbHkgaW5jbHVkZXMgY2hhbmdlcyB0byB0aGUNCi0JICogZmlsZSBzeXN0ZW0gc3RydWN0dXJlIGFzIGEgcmVzdWx0IG9mIHJlbW92YWJsZSBkcml2ZS8gbWVkaWENCi0JICogb3BlcmF0aW9ucyAoZWcuIENEIGluc2VydGlvbiksIGFuZCBjaGFuZ2VzIHRvIHZvbHVtZSANCi0JICogbW91bnQgc3RydWN0dXJlLg0KLQkgKiBAcGFyYW0gdm9sdW1lIHZvbHVtZSBvZiB0aGUgY2hhbmdlZCBmaWxlDQotCSAqIHN5c3RlbSBzdHJ1Y3R1cmUuIEFueSBjdXJyZW50IHBhdGhzIGJleW9uZA0KLQkgKiB0aGUgc3BlY2lmaWVkICdyb290JyBmaWxlIG9mIHRoZSB2b2x1bWUgYXJlIGFzc3VtZWQgdG8gYmUgaW52YWxpZGF0ZWQuDQotCSAqIEBwYXJhbSBjaGFuZ2VUeXBlIHR5cGUgb2YgdGhlIGNoYW5nZSB0aGF0IG9jY3VyZWQuDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9BRERFRA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfUkVNT1ZFRA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfQ0hBTkdFRA0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3lzdGVtSW5mb0NoYW5nZWQoSVZvbHVtZSB2b2x1bWUsIGludCBjaGFuZ2VUeXBlKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JUHJvYmxlbUhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSVByb2JsZW1IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MWU5ZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JUHJvYmxlbUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb247Ci0gCi0vKioKLSAqIEdlbmVyaWMgcHJvYmxlbSBoYW5kbGVyLiBVc2VkIHRvIHJlcG9ydCBzdGF0dXMgZnJvbSBzcGVjaWZpYwotICogaW5zdGFsbCBvcGVyYXRpb25zLiBUaGUgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSB0aGlzIGludGVyZmFjZQotICogYXJlIGNhbGxiYWNrcyBmcm9tIHRoZSB1cGRhdGUgc3VwcG9ydCB0byB0aGUgY2FsbGVyIG9mIHRoZSB1cGRhdGUKLSAqIG1ldGhvZHMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9ibGVtSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBSZXBvcnQgcHJvYmxlbS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvYmxlbVRleHQgcHJvYmxlbSB0ZXh0Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3BlcmF0aW9uIHNob3VsZCBjb250aW51ZSwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FuY2VsbGVkCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JYm9vbGVhbiByZXBvcnRQcm9ibGVtKFN0cmluZyBwcm9ibGVtVGV4dCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSVNlc3Npb25EZWx0YS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JU2Vzc2lvbkRlbHRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjA0ZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JU2Vzc2lvbkRlbHRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBJbnN0YWxsYXRpb24gQ2hhbmdlLgotICogUmVwcmVzZW50cyB0aGUgY2hhbmdlcyB0aGUgcmVjb25jaWxlciBmb3VuZC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKiBAZGVwcmVjYXRlZCBEbyBub3QgdXNlIHRoaXMgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNlc3Npb25EZWx0YSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogSW5kaWNhdGVzIGEgcHJvY2Vzc2luZyB0eXBlIHRvIGVuYWJsZSB0aGUgZmVhdHVyZXMKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBFTkFCTEUgPSAxOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGEgcHJvY2Vzc2luZyB0eXBlIHRvIGRpc2FibGUgdGhlIGZlYXR1cmVzCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotIAlwdWJsaWMgaW50IERJU0FCTEUgPSAyOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBGZWF0dXJlcyBmb3VuZCBkdXJpbmcgcmVjb25jaWxpYXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcywgb3IgYW4gZW1wdHkgYXJyYXkKLQkgKiBAc2luY2UgMi4wIAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGF0ZSB0aGUgcmVjb25jaWxpYXRpb24gb2NjdXJlZAotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRhdGUgb2YgdGhlIHJlY29uY2lsaWF0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIERhdGUgZ2V0RGF0ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcHJvY2Vzc2luZyB0eXBlCi0JICogdGhhdCB3aWxsIGFmZmVjdCBhbGwgdGhlIGFzc29jaWF0ZWQgZmVhdHVyZXMuIAotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2Nlc3NpbmcgdHlwZQotCSAqIEBzZWUgSVNlc3Npb25EZWx0YSNFTkFCTEUKLQkgKiBAc2VlIElTZXNzaW9uRGVsdGEjRElTQUJMRQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGFsbCB0aGUgZmVhdHVyZSByZWZlcmVuY2VzIG9mIHRoZSAKLQkgKiBTZXNzaW9uIERlbHRhLiAKLQkgKiBSZW1vdmVzIHRoZSBTZXNzaW9uIERlbHRhIGZyb20gdGhlIGZpbGUgc3lzdGVtIGFmdGVyIHByb2Nlc3NpbmcgaXQuCi0JICogCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuIAotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIHByb2Nlc3MoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgc2VsZWN0ZWQgZmVhdHVyZSByZWZlcmVuY2VzIG9mIHRoZSBTZXNzaW9uIERlbHRhLgotCSAqIFJlbW92ZXMgdGhlIFNlc3Npb24gRGVsdGEgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gYWZ0ZXIgcHJvY2Vzc2luZyBpdC4KLQkgKgotCSAqIEBwYXJhbSBzZWxlY3RlZCBsaXN0IG9mIHNlbGVjdGVkIGZlYXR1cmUgcmVmZXJlbmNlcyB0byBiZSBwcm9jZXNzZWQKLQkgKiBAcGFyYW0gbW9uaXRvciB0aGUgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnMuCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9jZXNzKElGZWF0dXJlUmVmZXJlbmNlIFtdIHNlbGVjdGVkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIFNlc3Npb24gRGVsdGEgZnJvbSB0aGUgZmlsZSBzeXN0ZW0gd2l0aG91dCBwcm9jZXNzaW5nIGl0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAgCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpOwkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vSVZvbHVtZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JVm9sdW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZmQyYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9JVm9sdW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIExvY2FsIFZvbHVtZSBJbmZvLgotICogUmVwcmVzZW50cyBsb2NhbCBmaWxlIHN5c3RlbSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB2b2x1bWUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uTG9jYWxTeXN0ZW1JbmZvCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZvbHVtZSBleHRlbmRzIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIGZyZWUgc3BhY2Ugb24gdGhpcyB2b2x1bWUuCi0JICogUmV0dXJucyB0aGUgYW1vdW50IG9mIGZyZWUgc3BhY2UgYXZhaWxhYmxlIHRvIHRoaXMKLQkgKiB1c2VyIG9uIHRoZSB2b2x1bWUuIFRoZQotCSAqIG1ldGhvZCB0YWtlcyBpbnRvIGFjY291bnQgYW55IHNwYWNlIHF1b3RhcyBvciBvdGhlcgotCSAqIG5hdGl2ZSBtZWNoYW5pc21zIHRoYXQgbWF5IHJlc3RyaWN0IHNwYWNlIHVzYWdlCi0JICogb24gYSBnaXZlbiB2b2x1bWUuCi0JICogQHJldHVybiB0aGUgYW1vdW50IG9mIGZyZWUgc3BhY2UgYXZhaWxhYmxlIChpbiB1bml0cwotCSAqIG9mIEtieXRlKSwgb3IgYW4gaW5kaWNhdGlvbiB0aGUgc2l6ZSBpcyBub3Qga25vd24gCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jU0laRV9VTktOT1dOCi0JICogQHNpbmNlIDIuMAotCSAqIDxwPgotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRGcmVlU3BhY2UoKTsKLQkKLQkvKioKLQkgKiByZXR1cm5zIHZvbHVtZSBsYWJlbC4KLQkgKiBSZXR1cm5zIHRoZSBsYWJlbCBvZiB0aGUgdm9sdW1lLgotCSAqIEByZXR1cm4gdm9sdW1lIGxhYmVsIChhcyBzdHJpbmcpLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBsYWJlbCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHZvbHVtZSB0eXBlLgotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHZvbHVtZS4KLQkgKiBAcmV0dXJuIHZvbHVtZSB0eXBlCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1VOS05PV04KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfSU5WQUxJRF9QQVRICi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1JFTU9WQUJMRQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9GSVhFRAotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9SRU1PVEUKLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfQ0RST00KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfRkxPUFBZXzMKLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfRkxPUFBZXzUKLQkgKiBAc2luY2UgMi4wCi0JICogPHA+Ci0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZvbHVtZSBwYXRoLgotCSAqIFJldHVybnMgdGhlIHBhdGggdGhhdCByZXByZXNlbnRzIHRoZSBtb3VudCBwb2ludCBvZiB0aGUgdm9sdW1lLgotCSAqIEByZXR1cm4gbW91bnQgcG9pbnQgZmlsZQotCSAqIEBzaW5jZSAyLjAKLQkgKiA8cD4KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIEZpbGUgZ2V0RmlsZSgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9Mb2NhbFN5c3RlbUluZm8uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vTG9jYWxTeXN0ZW1JbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MTZkOWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9Mb2NhbFN5c3RlbUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbjsNCi0gDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotIA0KLS8qKg0KLSAqIFV0aWxpdHkgY2xhc3MgcHJvdmlkaW5nIGxvY2FsIGZpbGUgc3lzdGVtIGluZm9ybWF0aW9uLg0KLSAqIFRoZSBjbGFzcyBhdHRlbXB0cyB0byBsb2FkIGEgbmF0aXZlIGxpYnJhcnkgaW1wbGVtZW50YXRpb24NCi0gKiBvZiBpdHMgbWV0aG9kcy4gSWYgc3VjY2Vzc2Z1bCwgdGhlIG1ldGhvZCBjYWxscyBhcmUgZGVsZWdhdGVkDQotICogdG8gdGhlIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gT3RoZXJ3aXNlIGEgZGVmYXVsdCBub24tbmF0aXZlDQotICogaW1wbGVtZW50YXRpb24gaXMgdXNlZC4gICogDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBMb2NhbFN5c3RlbUluZm8gew0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgYW1vdW50IG9mIGF2YWlsYWJsZSBmcmVlIHNwYWNlIGlzIG5vdCBrbm93bg0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0RnJlZVNwYWNlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBTSVpFX1VOS05PV04gPSAtMTsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgdGhlIHZvbHVtZSB0eXBlIGlzIG5vdCBrbm93bg0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVU5LTk9XTiA9IC0xOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgdm9sdW1lIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGZyb20gcGF0aA0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfSU5WQUxJRF9QQVRIID0gLTI7DQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHRoZSB2b2x1bWUgaXMgcmVtb3ZhYmxlIChvdGhlciB0aGFuIGZsb3BweSBkaXNrKQ0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfUkVNT1ZBQkxFID0gMTsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgdGhlIHZvbHVtZSBpcyBmaXhlZCAoaGFyZCBkcml2ZSkNCi0JICogDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI2dldFR5cGUoRmlsZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0ZJWEVEID0gMjsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSByZW1vdGUgKG5ldHdvcmspIHZvbHVtZQ0KLQkgKiANCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jZ2V0VHlwZShGaWxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfUkVNT1RFID0gMzsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgYSBjZHJvbSB2b2x1bWUgKGNvbXBhY3QgZGlzYykNCi0JICogDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI2dldFR5cGUoRmlsZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0NEUk9NID0gNDsJDQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgcmFtZGlzayB2b2x1bWUgKG1lbW9yeSkNCi0JICogDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI2dldFR5cGUoRmlsZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1JBTURJU0sgPSA1OwkNCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgdm9sdW1lIGlzIHJlbW92YWJsZSAoZmxvcHB5IGRpc2sgNSAxLzQpDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRUeXBlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9GTE9QUFlfNSA9IDY7CQ0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyB0aGUgdm9sdW1lIGlzIHJlbW92YWJsZSAoZmxvcHB5IGRpc2sgMyAxLzIpDQotCSAqIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNnZXRUeXBlKEZpbGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIGZpZWxkIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPTFVNRV9GTE9QUFlfMyA9IDc7DQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgbmV3IHZvbHVtZSBoYXMgYmVlbiBhZGRlZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBmaWVsZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfQURERUQgPSAwOw0KLQkJCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgdm9sdW1lIGhhcyBiZWVuIHJlbW92ZWQNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1JFTU9WRUQgPSAxOw0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgdm9sdW1lIGhhcyBiZWVuIGNoYW5nZWQNCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgZmllbGQgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX0NIQU5HRUQgPSAyOw0KLQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoKTsJDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTmF0aXZlcyA9IGZhbHNlOwkNCi0Jc3RhdGljIHsNCi0JCXRyeSB7DQotCQkJU3lzdGVtLmxvYWRMaWJyYXJ5KCJ1cGRhdGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWhhc05hdGl2ZXMgPSB0cnVlOw0KLQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGxvYWQgbmF0aXZlIGxpYnJhcnkgJ3VwZGF0ZScuIik7IC8vJE5PTi1OTFMtMSQNCi0JCQloYXNOYXRpdmVzID0gZmFsc2U7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBEZXRlcm1pbmVzIGF2YWlsYWJsZSBmcmVlIHNwYWNlIG9uIGEgdm9sdW1lLg0KLQkgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2YgZnJlZSBzcGFjZSBhdmFpbGFibGUgdG8gdGhpcw0KLQkgKiB1c2VyIG9uIHRoZSB2b2x1bWUgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHBhdGguIFRoZQ0KLQkgKiBtZXRob2QgdGFrZXMgaW50byBhY2NvdW50IGFueSBzcGFjZSBxdW90YXMgb3Igb3RoZXINCi0JICogbmF0aXZlIG1lY2hhbmlzbXMgdGhhdCBtYXkgcmVzdHJpY3Qgc3BhY2UgdXNhZ2UNCi0JICogb24gYSBnaXZlbiB2b2x1bWUuDQotCSAqIEBwYXJhbSBwYXRoIGZpbGUgcGF0aC4gTWF5IGNvbnRhaW4gcGF0aCBlbGVtZW50cyBiZXlvbmQNCi0JICogdGhlIHZvbHVtZSAicm9vdCINCi0JICogQHJldHVybiB0aGUgYW1vdW50IG9mIGZyZWUgc3BhY2UgYXZhaWxhYmxlIChpbiB1bml0cw0KLQkgKiBvZiBLYnl0ZSksIG9yIGFuIGluZGljYXRpb24gdGhlIHNpemUgaXMgbm90IGtub3duIA0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNTSVpFX1VOS05PV04NCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRGcmVlU3BhY2UoRmlsZSBwYXRoKSB7DQotCQlpZiAoaGFzTmF0aXZlcykgew0KLQkJCXRyeSB7DQotCQkJCWxvbmcgYnl0ZXMgPSBuYXRpdmVHZXRGcmVlU3BhY2UocGF0aCk7DQotCQkJCXJldHVybiAoYnl0ZXMhPTApP2J5dGVzLzEwMjQ6MDsNCi0JCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIFNJWkVfVU5LTk9XTjsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogTGlzdHMgdGhlIGZpbGUgc3lzdGVtIHZvbHVtZS4NCi0JICogQHJldHVybiBhcnJheSBvZiB2b2x1bWUgcmVwcmVzZW50aW5nIG1vdW50DQotCSAqIHBvaW50cywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBmb3VuZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqIDxwPg0KLQkgKiA8Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0JICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0JICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0JICogPC9wPg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJVm9sdW1lW10gZ2V0Vm9sdW1lcygpIHsNCi0JCVN0cmluZ1tdIG1vdW50UG9pbnRzID0gbGlzdE1vdW50UG9pbnRzKCk7DQotCQlWb2x1bWVbXSB2b2wgPSBuZXcgVm9sdW1lWzBdOw0KLQkJaWYgKG1vdW50UG9pbnRzIT1udWxsKXsNCi0JCQl2b2wgPSBuZXcgVm9sdW1lW21vdW50UG9pbnRzLmxlbmd0aF07DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtb3VudFBvaW50cy5sZW5ndGg7IGkrKykgew0KLQkJCQlGaWxlIHJvb3QgPSBuZXcgRmlsZShtb3VudFBvaW50c1tpXSk7DQotCQkJCVN0cmluZyBsYWJlbCA9IGdldExhYmVsKHJvb3QpOw0KLQkJCQlpbnQgdHlwZSA9IGdldFR5cGUocm9vdCk7DQotCQkJCWxvbmcgc2l6ZSA9IGdldEZyZWVTcGFjZShyb290KTsNCi0JCQkJdm9sW2ldID0gbmV3IFZvbHVtZShyb290LGxhYmVsLHR5cGUsc2l6ZSk7DQotCQkJCXZvbFtpXS5tYXJrUmVhZE9ubHkoKTsNCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGZpbmQgbW91bnQgcG9pbnRzIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkvLyBmYWxsYmFjaw0KLQkJCUZpbGUgW10gcm9vdHMgPSBGaWxlLmxpc3RSb290cygpOw0KLQkJCWlmIChyb290cy5sZW5ndGggPT0gMSkgew0KLQkJCQkvLyBqdXN0IG9uZSByb290IC0gc2tpcCBpdA0KLQkJCQlGaWxlIHJvb3QgPSByb290c1swXTsNCi0JCQkJcm9vdHMgPSByb290Lmxpc3RGaWxlcygpOw0KLQkJCX0NCi0JCQl2b2wgPSBuZXcgVm9sdW1lW3Jvb3RzLmxlbmd0aF07CQkJDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgew0KLQkJCQl2b2xbaV0gPSBuZXcgVm9sdW1lKHJvb3RzW2ldLG51bGwsTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9VTktOT1dOLExvY2FsU3lzdGVtSW5mby5TSVpFX1VOS05PV04pOw0KLQkJCQl2b2xbaV0ubWFya1JlYWRPbmx5KCk7DQotCQkJfQkJCQ0KLQkJfQ0KLQkJcmV0dXJuIHZvbDsNCi0JfQ0KLQ0KLQkNCi0JLyoqDQotCSAqIEFkZCBsb2NhbCBzeXN0ZW0gY2hhbmdlIGxpc3RlbmVyLg0KLQkgKiBBbGxvd3MgYSBsaXN0ZW5lciB0byBiZSBhZGRlZCBmb3IgbW9uaXRvcmluZyBjaGFuZ2VzDQotCSAqIGluIHRoZSBsb2NhbCBzeXN0ZW0gaW5mb3JtYXRpb24uIFRoZSBsaXN0ZW5lciBpcyBub3RpZmllZA0KLQkgKiBlYWNoIHRpbWUgdGhlcmUgYXJlIHJlbGV2YW50IHZvbHVtZSBjaGFuZ2VzDQotCSAqIGRldGVjdGVkLiBUaGlzIHNwZWNpZmljYWxseSBpbmNsdWRlcyBjaGFuZ2VzIHRvIHRoZQ0KLQkgKiBsaXN0IG9mIHZvbHVtZXMgYXMgYSByZXN1bHQgb2YgcmVtb3ZhYmxlIGRyaXZlLyBtZWRpYQ0KLQkgKiBvcGVyYXRpb25zIChlZy4gQ0QgaW5zZXJ0aW9uLCByZW1vdmFsKSwgYW5kIGNoYW5nZXMgdG8gdm9sdW1lIA0KLQkgKiBtb3VudCBzdHJ1Y3R1cmUuDQotCSAqIEBwYXJhbSBsaXN0ZW5lciBjaGFuZ2UgbGlzdGVuZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKiA8cD4NCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0JICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotCSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotCSAqIDwvcD4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRJbmZvTGlzdGVuZXIoSUxvY2FsU3lzdGVtSW5mb0xpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpDQotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZW1vdmUgbG9jYWwgc3lzdGVtIGNoYW5nZSBsaXN0ZW5lcg0KLQkgKiBAcGFyYW0gbGlzdGVuZXIgY2hhbmdlIGxpc3RlbmVyDQotCSAqIEBzaW5jZSAyLjANCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlSW5mb0xpc3RlbmVyKElMb2NhbFN5c3RlbUluZm9MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQotCX0NCi0JCQ0KLQkvKioNCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBjaGFuZ2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gdm9sdW1lIHRoZSB2b2x1bWUgcmVwcmVzZW50aW5nIHRoZQ0KLQkgKiBjaGFuZ2UgZmlsZSBzeXN0ZW0gc3RydWN0dXJlLiBBbnkgY3VycmVudCBwYXRocyBiZXlvbmQNCi0JICogdGhlIHNwZWNpZmllZCAicm9vdCIgZmlsZSBvZiB0aGUgdm9sdW1lIGFyZSBhc3N1bWVkIHRvIGJlIGludmFsaWRhdGVkLg0KLQkgKiBAcGFyYW0gY2hhbmdlVHlwZSB0eXBlIG9mIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cmVkLg0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfQURERUQNCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1JFTU9WRUQNCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX0NIQU5HRUQNCi0JICogPHA+DQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotCSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLQkgKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLQkgKiA8L3A+DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlyZVN5c3RlbUluZm9DaGFuZ2VkKElWb2x1bWUgdm9sdW1lLCBpbnQgY2hhbmdlVHlwZSkgew0KLQkJZm9yIChpbnQgaT0wOyBpPCBsaXN0ZW5lcnMuc2l6ZSgpOyBpKyspIHsNCi0JCQkoKElMb2NhbFN5c3RlbUluZm9MaXN0ZW5lcilsaXN0ZW5lcnMuZ2V0KGkpKS5zeXN0ZW1JbmZvQ2hhbmdlZCh2b2x1bWUsY2hhbmdlVHlwZSk7DQotCQl9DQotCX0NCi0JCQ0KLQkvKg0KLQkgKiBEZXRlcm1pbmVzIHZvbHVtZSBsYWJlbC4NCi0JICogUmV0dXJucyB0aGUgbGFiZWwgb2YgdGhlIHZvbHVtZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQNCi0JICogcGF0aC4NCi0JICogQHBhcmFtIHBhdGggZmlsZSBwYXRoLiBNYXkgY29udGFpbiBwYXRoIGVsZW1lbnRzIGJleW9uZA0KLQkgKiB0aGUgdm9sdW1lICJyb290Ig0KLQkgKiBAcmV0dXJuIHZvbHVtZSBsYWJlbCAoYXMgc3RyaW5nKSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYNCi0JICogdGhlIGxhYmVsIGNhbm5vdCBiZSBkZXRlcm1pbmVkLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGFiZWwoRmlsZSBwYXRoKSB7DQotCQlpZiAoaGFzTmF0aXZlcykgew0KLQkJCXRyeSB7DQotCQkJCXJldHVybiBuYXRpdmVHZXRMYWJlbChwYXRoKTsNCi0JCQl9IGNhdGNoIChVbnNhdGlzZmllZExpbmtFcnJvciBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCS8qDQotCSAqIERldGVybWluZXMgdm9sdW1lIHR5cGUuDQotCSAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHZvbHVtZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQNCi0JICogcGF0aC4NCi0JICogQHBhcmFtIHBhdGggZmlsZSBwYXRoLiBNYXkgY29udGFpbiBwYXRoIGVsZW1lbnRzIGJleW9uZA0KLQkgKiB0aGUgdm9sdW1lICJyb290Ig0KLQkgKiBAcmV0dXJuIHZvbHVtZSB0eXBlDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9VTktOT1dODQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9JTlZBTElEX1BBVEgNCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1JFTU9WQUJMRQ0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfRklYRUQNCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX1JFTU9URQ0KLQkgKiBAc2VlIExvY2FsU3lzdGVtSW5mbyNWT0xVTUVfQ0RST00NCi0JICogQHNlZSBMb2NhbFN5c3RlbUluZm8jVk9MVU1FX0ZMT1BQWV8zDQotCSAqIEBzZWUgTG9jYWxTeXN0ZW1JbmZvI1ZPTFVNRV9GTE9QUFlfNQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VHlwZShGaWxlIHBhdGgpIHsNCi0JCWlmIChoYXNOYXRpdmVzKSB7DQotCQkJdHJ5IHsNCi0JCQkJcmV0dXJuIG5hdGl2ZUdldFR5cGUocGF0aCk7DQotCQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgew0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBWT0xVTUVfVU5LTk9XTjsNCi0JfQ0KLQkNCi0JLyoNCi0JICogTGlzdHMgdGhlIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50cy4NCi0JICogQHJldHVybiBhcnJheSBvZiBhYnNvbHV0ZSBmaWxlIHBhdGhzIHJlcHJlc2VudGluZyBtb3VudA0KLQkgKiBwb2ludHMsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgZm91bmQNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbGlzdE1vdW50UG9pbnRzKCkgew0KLQkJaWYgKGhhc05hdGl2ZXMpIHsNCi0JCQl0cnkgew0KLQkJCQlTdHJpbmdbXSBtb3VudFBvaW50cyA9IG5hdGl2ZUxpc3RNb3VudFBvaW50cygpOw0KLQkJCQlyZXR1cm4gbW91bnRQb2ludHM7DQotCQkJfSBjYXRjaCAoVW5zYXRpc2ZpZWRMaW5rRXJyb3IgZSkgew0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQkNCi0JLyoNCi0JICogTmF0aXZlIGltcGxlbWVudGF0aW9ucy4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBsb25nIG5hdGl2ZUdldEZyZWVTcGFjZShGaWxlIHBhdGgpOw0KLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nIG5hdGl2ZUdldExhYmVsKEZpbGUgcGF0aCk7DQotCXByaXZhdGUgc3RhdGljIG5hdGl2ZSBpbnQgbmF0aXZlR2V0VHlwZShGaWxlIHBhdGgpOw0KLQlwcml2YXRlIHN0YXRpYyBuYXRpdmUgU3RyaW5nW10gbmF0aXZlTGlzdE1vdW50UG9pbnRzKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvbmZpZ3VyYXRpb24vcGFja2FnZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NmJlMDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29uZmlndXJhdGlvbi9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPg0KLTxodG1sPg0KLTxoZWFkPg0KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPg0KLSAgIDxtZXRhIG5hbWU9IkF1dGhvciIgY29udGVudD0iSUJNIj4NCi0gICA8bWV0YSBuYW1lPSJHRU5FUkFUT1IiIGNvbnRlbnQ9Ik1vemlsbGEvNC43MiBbZW5dIChXaW5kb3dzIE5UIDUuMDsgVSkgW05ldHNjYXBlXSI+DQotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyBsb2NhbCBpbnN0YWxsYXRpb24NCi1pbmZvcm1hdGlvbi4NCi08aDI+DQotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4NCi1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW50ZXJmYWNlcyBmb3IgYWNjZXNzaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlIGxvY2FsDQotc3lzdGVtIGluc3RhbGxhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gSW4gZ2VuZXJhbCwgdXNlcnMgZXh0ZW5kaW5nDQotdGhlIHVwZGF0ZSBzdXBwb3J0Jm5ic3A7IGJ5IHdyaXRpbmcgYWRkaXRpb25hbCBmZWF0dXJlIGFuZCBzaXRlIGltcGxlbWVudGF0aW9uDQotZG8gbm90IG5lZWQgdG8gbWFrZSB1c2Ugb2YgaW50ZXJmYWNlcyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZS4NCi08cD4NCi08Yj5Ob3RlOjwvYj4gVGhpcyBwYWNrYWdlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi1jaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi1mcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLShyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotPC9wPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9BcmNoaXZlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0FyY2hpdmVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3YzRiZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0FyY2hpdmVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgc2l0ZSBhcmNoaXZlLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JQXJjaGl2ZVJlZmVyZW5jZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQXJjaGl2ZVJlZmVyZW5jZU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlUmVmZXJlbmNlDQotCWV4dGVuZHMgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsDQotCWltcGxlbWVudHMgSUFyY2hpdmVSZWZlcmVuY2Ugew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIEFyY2hpdmVSZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEFyY2hpdmVSZWZlcmVuY2UoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlTdHJpbmcgcmVzdWx0ID0gIklBcmNoaXZlUmVmZXJlbmNlOiAiOyAvLyROT04tTkxTLTEkDQotCQlyZXN1bHQgPQ0KLQkJCXJlc3VsdA0KLQkJCQkrICgoZ2V0UGF0aCgpID09IG51bGwpDQotCQkJCQk/IGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkNCi0JCQkJCTogZ2V0UGF0aCgpICsgIiA6ICIgKyBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0Jhc2VGZWF0dXJlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9CYXNlRmVhdHVyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YmM4OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0Jhc2VGZWF0dXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBCYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmVhdHVyZSBmYWN0b3J5Lg0KLSAqIFRoZSBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjb25zdHJ1Y3RpbmcgdGhlIGNvcnJlY3QNCi0gKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0cyBmb3IgZWFjaCBwYXJ0aWN1bGFyDQotICogZmVhdHVyZSB0eXBlLiBUaGlzIGNsYXNzIGNyZWF0ZXMgbW9kZWwgb2JqZWN0cyB0aGF0IGNvcnJlc3BvbmQNCi0gKiB0byB0aGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBwcm92aWRlZCBpbiB0aGlzIHBhY2thZ2UuDQotICogVGhlIGFjdHVhbCBmZWF0dXJlIGNyZWF0aW9uIG1ldGhvZCBpcyBzdWJjbGFzcyByZXNwb25zaWJpbGl0eS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUZhY3RvcnkNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbEZhY3RvcnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VGZWF0dXJlRmFjdG9yeSBleHRlbmRzIEZlYXR1cmVNb2RlbEZhY3RvcnkgaW1wbGVtZW50cyBJRmVhdHVyZUZhY3Rvcnkgew0KLQ0KLQkvKioNCi0JICogDQotCSAqIEBkZXByZWNhdGVkIGltcGxlbWVudCBjcmVhdGVGZWF0dXJlKFVSTCwgSVNpdGUsIElQcm9ncmVzc01vbml0b3IpIGluc3RlYWQNCi0JICogQHNlZSBJRmVhdHVyZUZhY3RvcnkjY3JlYXRlRmVhdHVyZShVUkwsSVNpdGUpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBjcmVhdGVGZWF0dXJlKHVybCwgc2l0ZSwgbnVsbCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBmZWF0dXJlLiBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IA0KLQkgKiBzdWJjbGFzcw0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZUZhY3RvcnkjY3JlYXRlRmVhdHVyZShVUkwsSVNpdGUsSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGZlYXR1cmUgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIEZlYXR1cmUNCi0JICogQHJldHVybiBmZWF0dXJlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlTW9kZWwgY3JlYXRlRmVhdHVyZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBGZWF0dXJlKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UNCi0JICogQHJldHVybiBmZWF0dXJlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBjcmVhdGVJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGluc3RhbGwgaGFuZGxlciBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgSW5zdGFsbEhhbmRsZXJFbnRyeQ0KLQkgKiBAcmV0dXJuIGluc3RhbGwgaGFuZGxlciBlbnRyeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsIGNyZWF0ZUluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgSW5zdGFsbEhhbmRsZXJFbnRyeSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBpbXBvcnQgZGVwZW5kZW5jeSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgSW1wb3J0DQotCSAqIEByZXR1cm4gaW1wb3J0IGRlcGVuZGVuY3kgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEltcG9ydE1vZGVsIGNyZWF0ZUltcG9ydE1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBJbXBvcnQoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgcGx1Zy1pbiBlbnRyeSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgUGx1Z2luRW50cnkNCi0JICogQHJldHVybiBwbHVnLWluIGVudHJ5IG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBQbHVnaW5FbnRyeU1vZGVsIGNyZWF0ZVBsdWdpbkVudHJ5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IFBsdWdpbkVudHJ5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIG5vbi1wbHVnLWluIGVudHJ5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBOb25QbHVnaW5FbnRyeQ0KLQkgKiBAcmV0dXJuIG5vbi1wbHVnLWluIGVudHJ5IG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBOb25QbHVnaW5FbnRyeU1vZGVsIGNyZWF0ZU5vblBsdWdpbkVudHJ5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IE5vblBsdWdpbkVudHJ5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIGFubm90YXRlZCBVUkwgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIFVSTEVudHJ5DQotCSAqIEByZXR1cm4gYW5ub3RhdGVkIFVSTCBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMRW50cnlNb2RlbCBjcmVhdGVVUkxFbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBVUkxFbnRyeSgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQmFzZUluc3RhbGxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0Jhc2VJbnN0YWxsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQ5MjBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQmFzZUluc3RhbGxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYW4gaW5zdGFsbCBoYW5kbGVyLgotICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGFuIGluc3RhbGwgaGFuZGxlciB3aXRoCi0gKiBudWxsIGltcGxlbWVudGF0aW9uIG9mIGl0cyBtZXRob2RzLiBJdCBhbGxvd3Mgc3ViY2xhc3NlcyB0byBzZWxlY3RpdmVseQotICogaW1wbGVtZW50IG9ubHkgdGhlIG1ldGhvZHMgcmVxdWlyZWQgZm9yIHRoZWlyIGluc3RhbGxhdGlvbiB0YXNrcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBzaG91bGQgYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+IAotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgQmFzZUluc3RhbGxIYW5kbGVyIGltcGxlbWVudHMgSUluc3RhbGxIYW5kbGVyIHsKLQotCS8qKgotCSAqIFVwZGF0ZSBhY3Rpb24gdHlwZQotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI0hBTkRMRVJfQUNUSU9OX0lOU1RBTEwKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNIQU5ETEVSX0FDVElPTl9DT05GSUdVUkUKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNIQU5ETEVSX0FDVElPTl9VTkNPTkZJR1VSRQotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI0hBTkRMRVJfQUNUSU9OX1VOSU5TVEFMTAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgdGFyZ2V0IG9mIHRoZSBhY3Rpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIElGZWF0dXJlIGZlYXR1cmU7Ci0KLQkvKioKLQkgKiBNb2RlbCBlbnRyeSB0aGF0IGRlZmluZXMgdGhpcyBoYW5kbGVyCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBJSW5zdGFsbEhhbmRsZXJFbnRyeSBlbnRyeTsKLQotCS8qKiAKLQkgKiBPcHRpb25hbCBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIEluc3RhbGxNb25pdG9yIG1vbml0b3I7Ci0KLQkvKioKLQkgKiBQbHVnLWluIGVudHJpZXMgZG93bmxvYWRlZAotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI0hBTkRMRVJfQUNUSU9OX0lOU1RBTEwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIElQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXM7Ci0KLQkvKioKLQkgKiBOb24tcGx1Zy1pbiBlbnRyaWVzIGRvd25sb2FkZWQKLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNIQU5ETEVSX0FDVElPTl9JTlNUQUxMCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXByb3RlY3RlZCBJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5FbnRyaWVzOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGhhbmRsZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGluc3RhbGwgaGFuZGxlci4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNpbml0aWFsaXplKGludCwgSUZlYXR1cmUsIElJbnN0YWxsSGFuZGxlckVudHJ5LCBJbnN0YWxsTW9uaXRvcikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgKLQkJaW50IHR5cGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlJbnN0YWxsSGFuZGxlckVudHJ5IGVudHJ5LAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHRoaXMuaW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJCXRoaXMuZW50cnkgPSBlbnRyeTsKLQkJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JCQl0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGluc3RhbGwgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luc3RhbGxJbml0aWF0ZWQKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbEluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgZmlsZXMgY29ycmVzcG9uZGluZyB0byBwbHVnLWluIGVudHJpZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWQsCi0JICogYnV0IGJlZm9yZSB0aGV5IGFyZSBhY3R1bGx5IHVucGFja2VkIGFuZCBpbnN0YWxsZWQuCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjcGx1Z2luc0Rvd25sb2FkZWQoSVBsdWdpbkVudHJ5W10pCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHBsdWdpbnNEb3dubG9hZGVkKElQbHVnaW5FbnRyeVtdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQl0aGlzLnBsdWdpbkVudHJpZXMgPSBwbHVnaW5zOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIG5vbi1wbHVnLWluIGVudHJpZXMgaGF2ZSBiZWVuIAotCSAqIGRvd25sb2FkZWQuCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoSU5vblBsdWdpbkVudHJ5W10sIElWZXJpZmljYXRpb25MaXN0ZW5lcikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoCi0JCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkRhdGEsCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCXRoaXMubm9uUGx1Z2luRW50cmllcyA9IG5vblBsdWdpbkRhdGE7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBmZWF0dXJlIGZpbGVzIGFuZCBhbnkgZG93bmxvYWRlZCBwbHVnLWlucyBoYXZlCi0JICogYmVlbiBpbnN0YWxsZWQuIAotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lcikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGluc3RhbGwgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luc3RhbGxDb21wbGV0ZWQoYm9vbGVhbikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb25maWd1cmUgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUluaXRpYXRlZCgpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGZlYXR1cmUgaGFzIGJlZW4gY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUNvbmZpZ3VyZSgpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ29uZmlndXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdW5jb25maWd1cmUgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlSW5pdGlhdGVkKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBmZWF0dXJlIGhhcyBiZWVuIHVuY29uZmlndXJlZC4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuY29uZmlndXJlKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgdW5jb25maWd1cmUgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4pCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHVuaW5zdGFsbCBhY3Rpb24uCi0JICogCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5pbnN0YWxsSW5pdGlhdGVkKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgZmVhdHVyZSBoYXMgYmVlbiB1bmluc3RhbGxlZC4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZVVuaW5zdGFsbCgpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5pbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSB1bmluc3RhbGwgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuaW5zdGFsbENvbXBsZXRlZChib29sZWFuKQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9CYXNlU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQmFzZVNpdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDZjYTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9CYXNlU2l0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0gDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEJhc2UgaW1wbGVtZW50YXRpb24gb2YgYSBzaXRlIGZhY3RvcnkuDQotICogVGhlIGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNvbnN0cnVjdGluZyB0aGUgY29ycmVjdA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3RzIGZvciBlYWNoIHBhcnRpY3VsYXINCi0gKiBzaXRlIHR5cGUuIFRoaXMgY2xhc3MgY3JlYXRlcyBtb2RlbCBvYmplY3RzIHRoYXQgY29ycmVzcG9uZA0KLSAqIHRvIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIHByb3ZpZGVkIGluIHRoaXMgcGFja2FnZS4NCi0gKiBUaGUgYWN0dWFsIHNpdGUgY3JlYXRpb24gbWV0aG9kIGlzIHN1YmNsYXNzIHJlc3BvbnNpYmlsaXR5Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmFjdG9yeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsRmFjdG9yeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVNpdGVGYWN0b3J5IGV4dGVuZHMgU2l0ZU1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElTaXRlRmFjdG9yeSB7DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGUgc2l0ZS4gSW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgbXVzdCBiZSBwcm92aWRlZCBieSANCi0JICogc3ViY2xhc3MNCi0JICogDQotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYWJzdHJhY3QgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogSGVscGVyIG1ldGhvZCB0byBhY2Nlc3MgcmVzb3VjZSBidW5kbGUgZm9yIHNpdGUuIFRoZSBkZWZhdWx0IA0KLQkgKiBpbXBsZW1lbnRhdGlvbiBhdHRlbXB0cyB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZWx5IGxvY2FsaXplZCANCi0JICogc2l0ZS5wcm9wZXJ0aWVzIGZpbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gdXJsIGJhc2UgVVJMIHVzZWQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgYnVuZGxlLg0KLQkgKiBAcmV0dXJuIHJlc291cmNlIGJ1bmRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShVUkwgdXJsKSB7DQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuYXNEaXJlY3RvcnlVUkwodXJsKTsNCi0JCQlDbGFzc0xvYWRlciBsID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IHVybCB9LCBudWxsKTsNCi0JCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoU2l0ZS5TSVRFX0ZJTEUsIExvY2FsZS5nZXREZWZhdWx0KCksIGwpOw0KLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKFBvbGljeS5iaW5kKCJCYXNlU2l0ZUZhY3RvcnkuQ2Fubm90UmV0cml2ZVBhcmVudERpcmVjdG9yeSIsIHVybC50b0V4dGVybmFsRm9ybSgpKSk7ICAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gYnVuZGxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBzaXRlIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBTaXRlDQotCSAqIEByZXR1cm4gc2l0ZSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU2l0ZU1vZGVsIGNyZWF0ZVNpdGVNYXBNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgU2l0ZSgpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgRmVhdHVyZVJlZmVyZW5jZQ0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIEFyY2hpdmVSZWZlcmVuY2UNCi0JICogQHJldHVybiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgQXJjaGl2ZVJlZmVyZW5jZSgpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbm5vdGF0ZWQgVVJMIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBVUkxFbnRyeQ0KLQkgKiBAcmV0dXJuIGFubm90YXRlZCBVUkwgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgY3JlYXRlVVJMRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgVVJMRW50cnkoKTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgY2F0ZWdvcnkgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIENhdGVnb3J5DQotCSAqIEByZXR1cm4gY2F0ZWdvcnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENhdGVnb3J5TW9kZWwgY3JlYXRlU2l0ZUNhdGVnb3J5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IENhdGVnb3J5KCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIE9wZW4gYSBzdHJlYW0gb24gYSBVUkwuDQotCSAqIG1hbmFnZXMgYSB0aW1lIG91dCBpZiB0aGUgY29ubmVjdGlvbiBpcyBsb2NrZWQgb3IgZmFpbHMNCi0JICogDQotCSAqIEBwYXJhbSByZXNvbHZlZFVSTA0KLQkgKiBAcmV0dXJuIElucHV0U3RyZWFtDQotCSAqLw0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gb3BlblN0cmVhbShVUkwgcmVzb2x2ZWRVUkwpICB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCk7DQotCQlyZXR1cm4gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0NhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0NhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmY2MxMmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9DYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgZmVhdHVyZSBjYXRlZ29yeSBkZWZpbml0aW9uLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JQ2F0ZWdvcnkNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWwNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIENhdGVnb3J5IGV4dGVuZHMgQ2F0ZWdvcnlNb2RlbCBpbXBsZW1lbnRzIElDYXRlZ29yeSB7DQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQ2F0ZWdvcnkoKSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgQ2F0ZWdvcnkoU3RyaW5nIG5hbWUsIFN0cmluZyBsYWJlbCkgew0KLQkJc2V0TmFtZShuYW1lKTsNCi0JCXNldExhYmVsKGxhYmVsKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGRlc2NyaXB0aW9uDQotCSAqIEBzZWUgSUNhdGVnb3J5I2dldERlc2NyaXB0aW9uKCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7DQotCQlyZXR1cm4gKElVUkxFbnRyeSkgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvQ29udGVudFJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9Db250ZW50UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YTM5ZmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9Db250ZW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMRW5jb2RlcjsNCi0NCi0vKioNCi0gKiBDb250ZW50IHJlZmVyZW5jZSBpbXBsZW1lbnRzIGEgZ2VuZXJhbCBhY2Nlc3Mgd3JhcHBlciANCi0gKiB0byBmZWF0dXJlIGFuZCBzaXRlIGNvbnRlbnQuIFRoZSByZWZlcmVuY2Ugc3BlY2lmaWVzDQotICogYSAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllciBmb3IgdGhlIGNvbnRlbnQsIGFuZCB0aGUgYWN0dWFsDQotICogcmVmZXJlbmNlIGFzIGEgZmlsZSwgb3IgYSBVUkwuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2UNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckVudHJ5Q29udGVudFJlZmVyZW5jZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29udGVudFJlZmVyZW5jZSB7DQotDQotCS8qKg0KLQkgKiBVbmtub3duIHNpemUgaW5kaWNhdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVU5LTk9XTl9TSVpFID0gLTE7DQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IGV4ZWN1dGFibGUgcGVybWlzc2lvbiB3aGVuIGluc3RhbGxpbmcgYSBjb250ZW50IHJlZmVyZW5jZQ0KLQkgKiBXaWxsIGFkZCBleGVjdXRhYmxlIGJpdCBpZiBuZWNlc3NhcnkNCi0JICogDQotCSAqIEBzaW5jZSAyLjAuMQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9FWEVDVVRBQkxFX1BFUk1JU1NJT04gPSAtMTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfVVJMX1BST1RPQ09MID0gImZpbGUiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgU3RyaW5nIGlkOw0KLQlwcml2YXRlIFVSTCB1cmw7IC8vIHJlZmVyZW5jZSBpcyBlaXRoZXIgVVJMIHJlZmVyZW5jZSAqT1IqDQotCXByaXZhdGUgRmlsZSBmaWxlOyAvLyAgICBsb2NhbCBmaWxlIHJlZmVyZW5jZQ0KLQlwcml2YXRlIFJlc3BvbnNlIHJlc3BvbnNlOw0KLQlwcml2YXRlIGludCBwZXJtaXNzaW9uOyANCi0JcHJpdmF0ZSBsb25nIGxlbmd0aDsNCi0JDQotCS8vIDx0cnVlPiBpZiBhIGNvcHkgb2YgYSBDb250ZW50cmVmZXJlbmVjIGluIGEgdGVtcCBsb2NhbCBkaXJlY3RvcnkNCi0JcHJpdmF0ZSBib29sZWFuIHRlbXBMb2NhbCA9IGZhbHNlOw0KLQkNCi0JcHJpdmF0ZSBsb25nIGxhc3RNb2RpZmllZDsNCi0NCi0JLyoNCi0JICogZG8gbm90IGFsbG93IGRlZmF1bHQgY29udHJ1Y3Rpb24NCi0JICovDQotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZSgpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGNvbnRlbnQgcmVmZXJlbmNlIGZyb20gVVJMLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSB1cmwgYWN0dWFsIHJlZmVyZW5jZWQgVVJMDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlKFN0cmluZyBpZCwgVVJMIHVybCkgew0KLQkJdGhpcy5pZCA9IChpZCA9PSBudWxsID8gIiIgOiBpZCk7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMudXJsID0gdXJsOyAvLyBjYW4gYmUgbnVsbA0KLQkJdGhpcy5maWxlID0gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGNvbnRlbnQgcmVmZXJlbmNlIGZyb20gZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBpZCAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllcg0KLQkgKiBAcGFyYW0gZmlsZSBhY3R1YWwgcmVmZXJlbmNlZCBmaWxlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlKFN0cmluZyBpZCwgRmlsZSBmaWxlKSB7DQotCQl0aGlzLmlkID0gKGlkID09IG51bGwgPyAiIiA6IGlkKTsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5maWxlID0gZmlsZTsgLy8gY2FuIGJlIG51bGwNCi0JCXRoaXMudXJsID0gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQSBmYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgYSBjb250ZW50IHJlZmVyZW5jZSBvZg0KLQkgKiB0aGUgc2FtZSB0eXBlLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSBmaWxlIGFjdHVhbCByZWZlcmVuY2VkIGZpbGUNCi0JICogQHJldHVybiBjb250ZW50IHJlZmVyZW5jZSBvZiB0aGUgc2FtZSB0eXBlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGNyZWF0ZUNvbnRlbnRSZWZlcmVuY2UoU3RyaW5nIGlkLCBGaWxlIGZpbGUpIHsNCi0JCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZShpZCwgZmlsZSx0cnVlKTsNCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UoU3RyaW5nIGlkLCBGaWxlIGZpbGUsIGJvb2xlYW4gYikgew0KLQkJdGhpcyhpZCxmaWxlKTsNCi0JCXNldFRlbXBMb2NhbChiKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmVzIHRoZSAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllciBmb3IgdGhlIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhlIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gaW5wdXQgc3RyZWFtDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gdW5hYmxlIHRvIGNyZWF0ZSBzdHJlYW0NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmIChmaWxlICE9IG51bGwpDQotCQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7DQotCQllbHNlIGlmICh1cmwgIT0gbnVsbCkgew0KLQkJCWlmIChyZXNwb25zZSA9PSBudWxsKSB7DQotCQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQkJCXJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQocmVzb2x2ZWRVUkwpOw0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tDb25uZWN0aW9uUmVzdWx0KHJlc3BvbnNlLHJlc29sdmVkVVJMKTsNCi0JCQl9DQotCQkJSW5wdXRTdHJlYW0gaXM9cmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlsZW5ndGg9cmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpOw0KLQkJCXJldHVybiBpczsNCi0JCX0gZWxzZQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiQ29udGVudFJlZmVyZW5jZS5VbmFibGVUb0NyZWF0ZUlucHV0U3RyZWFtIiwgdGhpcy50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiBpbnB1dCBzdHJlYW0gZm9yIHRoZSByZWZlcmVuY2UuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGlucHV0IHN0cmVhbQ0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIHVuYWJsZSB0byBjcmVhdGUgc3RyZWFtDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCUlucHV0U3RyZWFtIGdldFBhcnRpYWxJbnB1dFN0cmVhbShsb25nIG9mZnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmICh1cmwgIT0gbnVsbCAmJiAiaHR0cCIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsNCi0JCQlyZXNwb25zZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KHJlc29sdmVkVVJMKTsNCi0JCQlpZihyZXNwb25zZSBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkNCi0JCQkJKChIdHRwUmVzcG9uc2UpcmVzcG9uc2UpLnNldE9mZnNldChvZmZzZXQpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UscmVzb2x2ZWRVUkwpOw0KLQkJCUlucHV0U3RyZWFtIGlzID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlsZW5ndGg9b2Zmc2V0ICsgcmVzcG9uc2UuZ2V0Q29udGVudExlbmd0aCgpOw0KLQkJCXJldHVybiBpczsNCi0JCX0gZWxzZQ0KLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiQ29udGVudFJlZmVyZW5jZS5VbmFibGVUb0NyZWF0ZUlucHV0U3RyZWFtIiwgdGhpcy50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlZmVyZW5jZWQgaW5wdXQsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHJldHVybiBpbnB1dCBzaXplLCBvciBAc2VlICNVTktOT1dOX1NJWkUgaWYgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5wdXRTaXplKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmIChsZW5ndGg+MCkNCi0JCQlyZXR1cm4gbGVuZ3RoOw0KLQkJaWYgKGZpbGUgIT0gbnVsbCkNCi0JCQlyZXR1cm4gZmlsZS5sZW5ndGgoKTsNCi0JCWVsc2UgaWYgKHVybCAhPSBudWxsKSB7DQotCQkJaWYgKHJlc3BvbnNlID09IG51bGwpIHsNCi0JCQkJVVJMIHJlc29sdmVkVVJMID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCXJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsKTsNCi0JCQkJCXJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQocmVzb2x2ZWRVUkwpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQlyZXR1cm4gQ29udGVudFJlZmVyZW5jZS5VTktOT1dOX1NJWkU7DQotCQkJCX0NCi0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrQ29ubmVjdGlvblJlc3VsdChyZXNwb25zZSxyZXNvbHZlZFVSTCk7CQkJDQotCQkJfQ0KLQkJCWxvbmcgc2l6ZSA9IHJlc3BvbnNlLmdldENvbnRlbnRMZW5ndGgoKTsNCi0JCQlyZXR1cm4gc2l6ZSA9PSAtMSA/IENvbnRlbnRSZWZlcmVuY2UuVU5LTk9XTl9TSVpFIDogc2l6ZTsNCi0JCX0gZWxzZQ0KLQkJCXJldHVybiBDb250ZW50UmVmZXJlbmNlLlVOS05PV05fU0laRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlZmVyZW5jZSBpcyBhIGxvY2FsIGZpbGUgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVmZXJlbmNlIGlzIGxvY2FsLCANCi0JICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsUmVmZXJlbmNlKCkgew0KLQkJLyppZiAoZmlsZSAhPSBudWxsKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJZWxzZSBpZiAodXJsICE9IG51bGwpDQotCQkJcmV0dXJuIEZJTEVfVVJMX1BST1RPQ09MLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSk7DQotCQllbHNlDQotCQkJcmV0dXJuIGZhbHNlOyovDQotCQkvLyBvbmx5IHRlbXAgZmlsZXMgYXJlIGNvbnNpZGVyZWQgbG9jYWwNCi0JCXJldHVybiB0ZW1wTG9jYWw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVmZXJlbmNlIGFzIGEgZmlsZS4gTm90ZSwgdGhhdCB0aGlzIG1ldGhvZA0KLQkgKiA8Yj5kb2VzIG5vdDwvYj4gY2F1c2UgdGhlIGZpbGUgdG8gYmUgZG93bmxvYWRlZCBpZiBpdA0KLQkgKiBpcyBub3QgYWxyZWFkeSBsb2NhbC4NCi0JICogDQotCSAqIEByZXR1cm4gcmVmZXJlbmNlIGFzIGZpbGUNCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiByZWZlcmVuY2UgY2Fubm90IGJlIHJldHVybmVkIGFzIGZpbGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZpbGUgYXNGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCWlmIChmaWxlICE9IG51bGwpDQotCQkJcmV0dXJuIGZpbGU7DQotDQotCQlpZiAodXJsICE9IG51bGwgJiYgRklMRV9VUkxfUFJPVE9DT0wuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgew0KLQkJCUZpbGUgcmVzdWx0ID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7DQotCQkJaWYgKHJlc3VsdC5leGlzdHMoKSkNCi0JCQkJcmV0dXJuIHJlc3VsdDsNCi0JCQllbHNlIA0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oUG9saWN5LmJpbmQoIkNvbnRlbnRSZWZlcmVuY2UuRmlsZURvZXNOb3RFeGlzdCIsIHRoaXMudG9TdHJpbmcoKSkpOyAvLyROT04tTkxTLTEkIAkJCQ0KLQkJfQ0KLQ0KLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJDb250ZW50UmVmZXJlbmNlLlVuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNGaWxlIiwgdGhpcy50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQgDQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVmZXJlbmNlIGFzIGEgVVJMLg0KLQkgKiANCi0JICogQHJldHVybiByZWZlcmVuY2UgYXMgVVJMDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gcmVmZXJlbmNlIGNhbm5vdCBiZSByZXR1cm5lZCBhcyBVUkwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBhc1VSTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAodXJsICE9IG51bGwpDQotCQkJcmV0dXJuIHVybDsNCi0NCi0JCWlmIChmaWxlICE9IG51bGwpDQotCQkJcmV0dXJuIGZpbGUudG9VUkwoKTsNCi0NCi0JCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiQ29udGVudFJlZmVyZW5jZS5VbmFibGVUb1JldHVyblJlZmVyZW5jZUFzVVJMIiwgdGhpcy50b1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlpZiAoZmlsZSAhPSBudWxsKQ0KLQkJCXJldHVybiBmaWxlLmdldEFic29sdXRlUGF0aCgpOw0KLQkJZWxzZQ0KLQkJCXJldHVybiB1cmwudG9FeHRlcm5hbEZvcm0oKTsNCi0JfQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGVybWlzc2lvbiBmb3IgdGhpcyBmaWxlLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgY29udGVudCByZWZlcmVuY2UgcGVybWlzc2lvbg0KLQkgKiBAc2VlICNERUZBVUxUX0VYRUNVVEFCTEVfUEVSTUlTU0lPTg0KLQkgKiBAc2luY2UgMi4wLjENCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGVybWlzc2lvbigpIHsNCi0JCXJldHVybiBwZXJtaXNzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBwZXJtaXNzaW9uIG9mIHRoaXMgY29udGVudCByZWZlcmVuY2UuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGVybWlzc2lvbiBUaGUgcGVybWlzc2lvbiB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBlcm1pc3Npb24oaW50IHBlcm1pc3Npb24pIHsNCi0JCXRoaXMucGVybWlzc2lvbiA9IHBlcm1pc3Npb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgaWYgYSBjb250ZW50IHJlZmVyZW5jZSBpcyBjb25zaWRlcmVkIGxvY2FsIA0KLQkgKiANCi0JICogQHBhcmFtIHRlbXBMb2NhbCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmlsZSBpcyBjb25zaWRlcmVkIGxvY2FsDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wTG9jYWwoYm9vbGVhbiB0ZW1wTG9jYWwpIHsNCi0JCXRoaXMudGVtcExvY2FsID0gdGVtcExvY2FsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdGltZXN0YW1wIHRoZSBjb250ZW50IHdhcyBsYXN0IG1vZGlmaWVkLg0KLQkgKiBAcGFyYW0gdGltZXN0YW1wDQotCSAqIEBzaW5jZSAzLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChsb25nIHRpbWVzdGFtcCkgew0KLQkJdGhpcy5sYXN0TW9kaWZpZWQgPSB0aW1lc3RhbXA7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgY29udGVudCB3YXMgbGFzdCBtb2RpZmllZA0KLQkgKiBAcmV0dXJuDQotCSAqIEBzaW5jZSAzLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsNCi0JCWlmIChsYXN0TW9kaWZpZWQgPT0gMCkgew0KLQkJCWlmIChmaWxlICE9IG51bGwpIA0KLQkJCQlsYXN0TW9kaWZpZWQgPSBmaWxlLmxhc3RNb2RpZmllZCgpOw0KLQkJCWVsc2UgaWYgKHVybCAhPSBudWxsKSB7DQotCQkJCWlmIChyZXNwb25zZSA9PSBudWxsKSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQkJCQkJcmVzcG9uc2UgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCk7DQotCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCQkJCS8vIHJldHVybiAwDQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkJLy8gcmV0dXJuIDANCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlsYXN0TW9kaWZpZWQgPSByZXNwb25zZS5nZXRMYXN0TW9kaWZpZWQoKTsNCi0JCQl9IA0KLQkJfQ0KLQkJcmV0dXJuIGxhc3RNb2RpZmllZDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0ZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDExNGEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmVhdHVyZS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+IA0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZSBleHRlbmRzIEZlYXR1cmVNb2RlbCBpbXBsZW1lbnRzIElGZWF0dXJlIHsNCi0NCi0JLyoqDQotCSAqIFNpbXBsZSBmaWxlIG5hbWUgb2YgdGhlIGRlZmF1bHQgZmVhdHVyZSBtYW5pZmVzdCBmaWxlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfRklMRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogRmlsZSBleHRlbnNpb24gb2YgdGhlIGRlZmF1bHQgZmVhdHVyZSBtYW5pZmVzdCBmaWxlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfWE1MID0gRkVBVFVSRV9GSUxFICsgIi54bWwiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgSVNpdGUgc2l0ZTsgLy8gZmVhdHVyZSBzaXRlDQotCXByaXZhdGUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZmVhdHVyZUNvbnRlbnRQcm92aWRlcjsgLy8gY29udGVudCBwcm92aWRlcg0KLQlwcml2YXRlIExpc3QgLypvZiBJRmVhdHVyZVJlZmVyZW5jZSovDQotCWluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXM7DQotDQotCS8vUEVSRjogbmV3IGluc3RhbmNlIHZhcmlhYmxlDQotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uSWQ7DQotDQotCXByaXZhdGUgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gYWJvcnRlZEV4Y2VwdGlvbiA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBGZWF0dXJlIGRlZmF1bHQgY29uc3RydWN0b3INCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlKCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBDb21wYXJlcyB0d28gZmVhdHVyZXMgZm9yIGVxdWFsaXR5DQotCSAqIA0KLQkgKiBAcGFyYW0gb2JqZWN0IGZlYXR1cmUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gZmVhdHVyZXMgYXJlIGVxdWFsLCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSUZlYXR1cmUpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCUlGZWF0dXJlIGYgPSAoSUZlYXR1cmUpIG9iamVjdDsNCi0JCXJldHVybiBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBpZGVudGlmaWVyLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHsNCi0JCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkNCi0JCQlyZXR1cm4gdmVyc2lvbklkOw0KLQ0KLQkJU3RyaW5nIGlkID0gZ2V0RmVhdHVyZUlkZW50aWZpZXIoKTsNCi0JCVN0cmluZyB2ZXIgPSBnZXRGZWF0dXJlVmVyc2lvbigpOw0KLQkJaWYgKGlkICE9IG51bGwgJiYgdmVyICE9IG51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyKTsNCi0JCQkJcmV0dXJuIHZlcnNpb25JZDsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4oDQotCQkJCQkiVW5hYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uZWQgaWRlbnRpZmllcjoiICsgaWQgKyAiOiIgKyB2ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotCQl9DQotDQotCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBudWxsKTsNCi0JCXJldHVybiB2ZXJzaW9uSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgdGhpcyBmZWF0dXJlIGlzIGFzc29jaWF0ZWQgd2l0aC4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0U2l0ZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgew0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgVVJMLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRVUkwoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG51bGw7DQotCQl0cnkgew0KLQkJCWNvbnRlbnRQcm92aWRlciA9IGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiTm8gY29udGVudCBQcm92aWRlciIsIGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gKGNvbnRlbnRQcm92aWRlciAhPSBudWxsKSA/IGNvbnRlbnRQcm92aWRlci5nZXRVUkwoKSA6IG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gaW5mb3JtYXRpb24gZW50cnkgcmVmZXJlbmNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZQ0KLQkgKiBmZWF0dXJlIHVwZGF0ZSBzaXRlLiANCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0VXBkYXRlU2l0ZUVudHJ5KCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXRVcGRhdGVTaXRlRW50cnkoKSB7DQotCQlyZXR1cm4gKElVUkxFbnRyeSkgZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGVudHJpZXMgcmVmZXJlbmNpbmcgbG9jYXRpb25zIG9mIG90aGVyDQotCSAqIHVwZGF0ZSBzaXRlcy4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5W10gZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKSB7DQotCQlVUkxFbnRyeU1vZGVsW10gcmVzdWx0ID0gZ2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSVVSTEVudHJ5WzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSVVSTEVudHJ5W10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbmQgb3B0aW9uYWwgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBlbnRyeS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbEhhbmRsZXJFbnRyeSBnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkgew0KLQkJcmV0dXJuIChJSW5zdGFsbEhhbmRsZXJFbnRyeSkgZ2V0SW5zdGFsbEhhbmRsZXJNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGRlc2NyaXB0aW9uLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXREZXNjcmlwdGlvbigpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7DQotCQlyZXR1cm4gKElVUkxFbnRyeSkgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRDb3B5cmlnaHQoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldENvcHlyaWdodCgpIHsNCi0JCXJldHVybiAoSVVSTEVudHJ5KSBnZXRDb3B5cmlnaHRNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBsaWNlbnNlIGluZm9ybWF0aW9uIGZvciB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TGljZW5zZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0TGljZW5zZSgpIHsNCi0JCXJldHVybiAoSVVSTEVudHJ5KSBnZXRMaWNlbnNlTW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJuIG9wdGlvbmFsIGltYWdlIGZvciB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW1hZ2UoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEltYWdlKCkgew0KLQkJcmV0dXJuIGdldEltYWdlVVJMKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiBhIGxpc3Qgb2YgcGx1Zy1pbiBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0UmF3SW1wb3J0cygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJSW1wb3J0W10gZ2V0UmF3SW1wb3J0cygpIHsNCi0JCUltcG9ydE1vZGVsW10gcmVzdWx0ID0gZ2V0SW1wb3J0TW9kZWxzKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUltcG9ydFswXTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gKElJbXBvcnRbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBJbnN0YWxsIHRoZSBjb250ZW50cyBvZiB0aGlzIGZlYXR1cmUgaW50byB0aGUgc3BlY2lmaWVkIHRhcmdldCBmZWF0dXJlLg0KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmVhdHVyZSBpbnN0YWxsYXRpb24NCi0JICogcHJvdG9jb2wuIE90aGVyIGNvbmNyZXRlIGZlYXR1cmUgaW1wbGVtZW50YXRpb24gdGhhdCBvdmVycmlkZSB0aGlzDQotCSAqIG1ldGhvZCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIHByb3RvY29sLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNpbnN0YWxsKElGZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKA0KLQkJSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwNCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwNCi0JCUlQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpDQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJLy8gY2FsbCBvdGhlciBBUEkgd2l0aCBhbGwgb3B0aW9uYWwgZmVhdHVyZXMsIG9yIHNldHVwIHZhcmlhYmxlIG1lYW5pbmcgaW5zdGFsbCBhbGwNCi0JCXJldHVybiBpbnN0YWxsKHRhcmdldEZlYXR1cmUsIG51bGwsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBwcm9ncmVzcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluc3RhbGwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmVhdHVyZSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZlYXR1cmUuDQotCSAqIFRoaXMgbWV0aG9kIGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmZWF0dXJlIGluc3RhbGxhdGlvbg0KLQkgKiBwcm90b2NvbC4gT3RoZXIgY29uY3JldGUgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbiB0aGF0IG92ZXJyaWRlIHRoaXMNCi0JICogbWV0aG9kIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgcHJvdG9jb2wuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoDQotCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLA0KLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykNCi0JCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvL0RFQlVHDQotCQlkZWJ1ZygiSW5zdGFsbGluZy4uLjoiICsgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCUVycm9yUmVjb3ZlcnlMb2cgcmVjb3ZlcnlMb2cgPSBFcnJvclJlY292ZXJ5TG9nLmdldExvZygpOw0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gSW5zdGFsbE1vbml0b3IJCQ0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcjsNCi0JCWlmIChwcm9ncmVzcyA9PSBudWxsKQ0KLQkJCW1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7DQotCQllbHNlIGlmIChwcm9ncmVzcyBpbnN0YW5jZW9mIEluc3RhbGxNb25pdG9yKQ0KLQkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOw0KLQkJZWxzZQ0KLQkJCW1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IocHJvZ3Jlc3MpOw0KLQ0KLQkJLy8gU2V0dXAgb3B0aW9uYWwgaW5zdGFsbCBoYW5kbGVyDQotCQlJbnN0YWxsSGFuZGxlclByb3h5IGhhbmRsZXIgPQ0KLQkJCW5ldyBJbnN0YWxsSGFuZGxlclByb3h5KA0KLQkJCQlJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fSU5TVEFMTCwNCi0JCQkJdGhpcywNCi0JCQkJdGhpcy5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksDQotCQkJCW1vbml0b3IpOw0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7DQotCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOw0KLQkJYWJvcnRlZEV4Y2VwdGlvbiA9IG51bGw7DQotDQotCQkvLyBHZXQgc291cmNlIGZlYXR1cmUgcHJvdmlkZXIgYW5kIHZlcmlmaWVyLg0KLQkJLy8gSW5pdGlhbGl6ZSB0YXJnZXQgdmFyaWFibGVzLg0KLQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7DQotCQlJVmVyaWZpZXIgdmVyaWZpZXIgPSBwcm92aWRlci5nZXRWZXJpZmllcigpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVzdWx0ID0gbnVsbDsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGFscmVhZHlJbnN0YWxsZWRGZWF0dXJlID0gbnVsbDsNCi0JCUlGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyID0gbnVsbDsNCi0JCUlQbHVnaW5FbnRyeVtdIHRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJLy8gZGV0ZXJtaW5lIGxpc3Qgb2YgcGx1Z2lucyB0byBpbnN0YWxsDQotCQkJLy8gZmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHBsdWdpbiBlbnRyaWVzIGFscmVhZHkgY29udGFpbmVkDQotCQkJLy8gb24gdGhlIHRhcmdldCBzaXRlLCBhbmQgcGx1Z2luIGVudHJpZXMgcGFja2FnZWQgaW4gc291cmNlIGZlYXR1cmUNCi0JCQlJUGx1Z2luRW50cnlbXSBzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcyA9IGdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQlJU2l0ZSB0YXJnZXRTaXRlID0gdGFyZ2V0RmVhdHVyZS5nZXRTaXRlKCk7DQotCQkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkgew0KLQkJCQlkZWJ1ZygiVGhlIHNpdGUgdG8gaW5zdGFsbCBpbiBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMgPSBuZXcgSVBsdWdpbkVudHJ5WzBdOw0KLQkJCX0gZWxzZSB7DQotCQkJCXRhcmdldFNpdGVQbHVnaW5FbnRyaWVzID0gdGFyZ2V0U2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJfQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb0luc3RhbGwgPQ0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZigNCi0JCQkJCXNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzLA0KLQkJCQkJdGFyZ2V0U2l0ZVBsdWdpbkVudHJpZXMpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnNUb0luc3RhbGwgPSBnZXROb25QbHVnaW5FbnRyaWVzKCk7DQotDQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlpZiAob3B0aW9uYWxmZWF0dXJlcyAhPSBudWxsKSB7DQotCQkJCWNoaWxkcmVuID0NCi0JCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5vcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsKA0KLQkJCQkJCWNoaWxkcmVuLA0KLQkJCQkJCW9wdGlvbmFsZmVhdHVyZXMpOw0KLQkJCX0NCi0NCi0JCQkvLyBkZXRlcm1pbmUgbnVtYmVyIG9mIG1vbml0b3IgdGFza3MNCi0JCQkvLyAgIDIgdGFza3MgZm9yIHRoZSBmZWF0dXJlIGphciAoZG93bmxvYWQvdmVyaWZ5ICsgaW5zdGFsbCkNCi0JCQkvLyArIDIqbiB0YXNrcyBmb3IgcGx1Z2luIGVudHJpZXMgKGRvd25sb2FkL3ZlcmlmeSArIGluc3RhbGwgZm9yIGVhY2gpDQotCQkJLy8gKyAxKm0gdGFza3MgcGVyIG5vbi1wbHVnaW4gZGF0YSBlbnRyeSAoZG93bmxvYWQgZm9yIGVhY2gpDQotCQkJLy8gKyAxIHRhc2sgZm9yIGN1c3RvbSBub24tcGx1Z2luIGVudHJ5IGhhbmRsaW5nICgxIGZvciBhbGwgY29tYmluZWQpDQotCQkJLy8gKyA1KnggdGFza3MgZm9yIGNoaWxkcmVuIGZlYXR1cmVzICg1IHN1YnRhc2tzIHBlciBpbnN0YWxsKQ0KLQkJCWludCB0YXNrQ291bnQgPQ0KLQkJCQkyDQotCQkJCQkrIDIgKiBwbHVnaW5zVG9JbnN0YWxsLmxlbmd0aA0KLQkJCQkJKyBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aA0KLQkJCQkJKyAxDQotCQkJCQkrIDUgKiBjaGlsZHJlbi5sZW5ndGg7DQotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHRhc2tDb3VudCk7IC8vJE5PTi1OTFMtMSQNCi0JCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG51bGw7DQotDQotCQkJLy8gc3RhcnQgbG9nDQotCQkJcmVjb3ZlcnlMb2cub3BlbihFcnJvclJlY292ZXJ5TG9nLlNUQVJUX0lOU1RBTExfTE9HKTsNCi0NCi0JCQkvLyBTdGFydCB0aGUgaW5zdGFsbGF0aW9uIHRhc2tzCQkJDQotCQkJaGFuZGxlci5pbnN0YWxsSW5pdGlhdGVkKCk7DQotDQotCQkJLy8gRG93bmxvYWQgYW5kIHZlcmlmeSBmZWF0dXJlIGFyY2hpdmUocykNCi0JCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9DQotCQkJCXByb3ZpZGVyLmdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOw0KLQkJCXZlcmlmeVJlZmVyZW5jZXMoDQotCQkJCXZlcmlmaWVyLA0KLQkJCQlyZWZlcmVuY2VzLA0KLQkJCQltb25pdG9yLA0KLQkJCQl2ZXJpZmljYXRpb25MaXN0ZW5lciwNCi0JCQkJdHJ1ZSk7DQotCQkJbW9uaXRvcldvcmsobW9uaXRvciwgMSk7DQotCQkJDQotCQkJLy8gRG93bmxvYWQgYW5kIHZlcmlmeSBwbHVnaW4gYXJjaGl2ZXMNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVmZXJlbmNlcyA9IHByb3ZpZGVyLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoDQotCQkJCQkJcGx1Z2luc1RvSW5zdGFsbFtpXSwgbW9uaXRvcik7DQotCQkJCXZlcmlmeVJlZmVyZW5jZXModmVyaWZpZXIsIHJlZmVyZW5jZXMsIG1vbml0b3IsDQotCQkJCQkJCQl2ZXJpZmljYXRpb25MaXN0ZW5lciwgZmFsc2UpOw0KLQkJCQltb25pdG9yV29yayhtb25pdG9yLCAxKTsNCi0JCQl9DQotCQkJDQotCQkJaGFuZGxlci5wbHVnaW5zRG93bmxvYWRlZChwbHVnaW5zVG9JbnN0YWxsKTsNCi0NCi0JCQkvLyBEb3dubG9hZCBub24tcGx1Z2luIGFyY2hpdmVzLiBWZXJpZmljYXRpb24gaGFuZGxlZCBieSBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXINCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVmZXJlbmNlcyA9DQotCQkJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKA0KLQkJCQkJCW5vblBsdWdpbnNUb0luc3RhbGxbaV0sDQotCQkJCQkJbW9uaXRvcik7DQotCQkJCW1vbml0b3JXb3JrKG1vbml0b3IsIDEpOw0KLQkJCX0NCi0JCQloYW5kbGVyLm5vblBsdWdpbkRhdGFEb3dubG9hZGVkKA0KLQkJCQlub25QbHVnaW5zVG9JbnN0YWxsLA0KLQkJCQl2ZXJpZmljYXRpb25MaXN0ZW5lcik7DQotDQotCQkJLy8gQWxsIGFyY2hpdmVzIGFyZSBkb3dubG9hZGVkIGFuZCB2ZXJpZmllZC4gR2V0IHJlYWR5IHRvIGluc3RhbGwNCi0JCQljb25zdW1lciA9IHRhcmdldEZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpOw0KLQ0KLQkJCS8vIGluc3RhbGwgdGhlIGNoaWxkcmVuIGZlYXR1cmUNCi0JCQkvLyBjaGVjayBpZiB0aGV5IGFyZSBvcHRpb25hbCwgYW5kIGlmIHRoZXkgc2hvdWxkIGJlIGluc3RhbGxlZCBbMi4wLjFdDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOw0KLQkJCQl0cnkgew0KLQkJCQkJY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJCX0NCi0JCQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsKSB7DQotCQkJCQlzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA1KTsNCi0JCQkJCSgoU2l0ZSkgdGFyZ2V0U2l0ZSkuaW5zdGFsbCgvLyBuZWVkIHRvIGNhc3QNCi0JCQkJCWNoaWxkRmVhdHVyZSwNCi0JCQkJCQlvcHRpb25hbGZlYXR1cmVzLA0KLQkJCQkJCWNvbnN1bWVyLA0KLQkJCQkJCXZlcmlmaWVyLA0KLQkJCQkJCXZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJCQkJCXN1Yk1vbml0b3IpOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIEluc3RhbGwgcGx1Z2luIGZpbGVzDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7DQotCQkJCS8vIGlmIGFub3RoZXIgZmVhdHVyZSBoYXMgYWxyZWFkeSBpbnN0YWxsZWQgdGhpcyBwbHVnaW4sIHNraXAgaXQNCi0JCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmlzUGx1Z2luSnVzdEluc3RhbGxlZChwbHVnaW5zVG9JbnN0YWxsW2ldKSkgew0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlJQ29udGVudENvbnN1bWVyIHBsdWdpbkNvbnN1bWVyID0NCi0JCQkJCWNvbnN1bWVyLm9wZW4ocGx1Z2luc1RvSW5zdGFsbFtpXSk7DQotCQkJCS8vIFRPRE8gY29uc3VtZXIub3BlbiByZXR1cm5zIGVpdGhlcg0KLQkJCQkvLyBTaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lciBvciBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcg0KLQkJCQkvLyBhbmQgdGhleSBhcmUgZmVkIGVpdGhlcg0KLQkJCQkvLyBQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2Ugb3IgUGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcw0KLQkJCQkvLyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBvbmUgdGhhdCBpcyBnaXZlbiBQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2UNCi0JCQkJLy8gYnV0IGl0IHdvdWxkIGJyZWFrIGV4dGVybmFsIElDb250ZW50Q29uc3VtZXJzDQotDQotCQkJCWlmKHBsdWdpbnNUb0luc3RhbGxbaV0gaW5zdGFuY2VvZiBQbHVnaW5FbnRyeU1vZGVsICYmICEoKFBsdWdpbkVudHJ5TW9kZWwpcGx1Z2luc1RvSW5zdGFsbFtpXSkuaXNVbnBhY2soKSl7DQotCQkJCQkvLyBwbHVnaW4gY2FuIHJ1biBmcm9tIGEgamFyDQotCQkJCQlyZWZlcmVuY2VzID0gcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygNCi0JCQkJCQkJcGx1Z2luc1RvSW5zdGFsbFtpXSwgbW9uaXRvcik7DQotCQkJCX0gZWxzZXsNCi0JCQkJCS8vIHBsdWdpbiBtdXN0IGJlIHVucGFja2VkDQotCQkJCQlyZWZlcmVuY2VzID0NCi0JCQkJCQlwcm92aWRlci5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKA0KLQkJCQkJCQlwbHVnaW5zVG9JbnN0YWxsW2ldLA0KLQkJCQkJCQltb25pdG9yKTsNCi0JCQkJfQ0KLQ0KLQkJCQlTdHJpbmcgbXNnID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7DQotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgcGx1Z2luVmVySWQgPQ0KLQkJCQkJcGx1Z2luc1RvSW5zdGFsbFtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJCVN0cmluZyBwbHVnaW5JRCA9DQotCQkJCQkocGx1Z2luVmVySWQgPT0gbnVsbCkgPyAiIiA6IHBsdWdpblZlcklkLmdldElkZW50aWZpZXIoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQltc2cgPSBQb2xpY3kuYmluZCgiRmVhdHVyZS5UYXNrSW5zdGFsbFBsdWdpbkZpbGVzIiwgcGx1Z2luSUQpOyAvLyROT04tTkxTLTEkDQotDQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGorKykgew0KLQkJCQkJc2V0TW9uaXRvclRhc2tOYW1lKA0KLQkJCQkJCXN1Yk1vbml0b3IsDQotCQkJCQkJbXNnICsgcmVmZXJlbmNlc1tqXS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCQkJcGx1Z2luQ29uc3VtZXIuc3RvcmUocmVmZXJlbmNlc1tqXSwgc3ViTW9uaXRvcik7DQotCQkJCX0NCi0NCi0JCQkJSW5zdGFsbFJlZ2lzdHJ5LnJlZ2lzdGVyUGx1Z2luKHBsdWdpbnNUb0luc3RhbGxbaV0pOw0KLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpDQotCQkJCQlhYm9ydCgpOw0KLQkJCX0NCi0NCi0JCQkvLyBjaGVjayBpZiB3ZSBuZWVkIHRvIGluc3RhbGwgZmVhdHVyZSBmaWxlcyBbMTY3MThdCQ0KLQkJCS8vIHN0b3JlIHdpbGwgdGhyb3cgQ29yZUV4Y2VwdGlvbiBpZiBhbm90aGVyIGZlYXR1cmUgaXMgYWxyZWFkeQ0KLQkJCS8vIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBwbGFjZQ0KLQkJCWFscmVhZHlJbnN0YWxsZWRGZWF0dXJlID0gZmVhdHVyZUFscmVhZHlJbnN0YWxsZWQodGFyZ2V0U2l0ZSk7DQotCQkJLy8gMTg4NjcNCi0JCQlpZiAoYWxyZWFkeUluc3RhbGxlZEZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCQkvL0luc3RhbGwgZmVhdHVyZSBmaWxlcw0KLQkJCQlyZWZlcmVuY2VzID0gcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMobW9uaXRvcik7DQotDQotCQkJCVN0cmluZyBtc2cgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKTsNCi0JCQkJbXNnID0gUG9saWN5LmJpbmQoIkZlYXR1cmUuVGFza0luc3RhbGxGZWF0dXJlRmlsZXMiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCXNldE1vbml0b3JUYXNrTmFtZSgNCi0JCQkJCQlzdWJNb25pdG9yLA0KLQkJCQkJCW1zZyArICIgIiArIHJlZmVyZW5jZXNbaV0uZ2V0SWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJY29uc3VtZXIuc3RvcmUocmVmZXJlbmNlc1tpXSwgc3ViTW9uaXRvcik7DQotCQkJCX0NCi0JCQkJSW5zdGFsbFJlZ2lzdHJ5LnJlZ2lzdGVyRmVhdHVyZSh0aGlzKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQl9DQotDQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQ0KLQkJCQlhYm9ydCgpOw0KLQ0KLQkJCS8vIGNhbGwgaGFuZGxlciB0byBjb21wbGV0ZSBpbnN0YWxsYXRpb24gKGVnLiBoYW5kbGUgbm9uLXBsdWdpbiBlbnRyaWVzKQ0KLQkJCWhhbmRsZXIuY29tcGxldGVJbnN0YWxsKGNvbnN1bWVyKTsNCi0JCQltb25pdG9yV29yayhtb25pdG9yLCAxKTsNCi0NCi0JCQkvLyBpbmRpY2F0ZSBpbnN0YWxsIHN1Y2Nlc3MNCi0JCQlzdWNjZXNzID0gdHJ1ZTsNCi0NCi0JCX0gY2F0Y2ggKEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIGUpIHsNCi0JCQlhYm9ydGVkRXhjZXB0aW9uID0gZTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCW9yaWdpbmFsRXhjZXB0aW9uID0gZTsNCi0JCX0gZmluYWxseSB7DQotCQkJRXhjZXB0aW9uIG5ld0V4Y2VwdGlvbiA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJaWYgKGNvbnN1bWVyICE9IG51bGwpIHsNCi0JCQkJCWlmIChzdWNjZXNzKSB7DQotCQkJCQkJcmVzdWx0ID0gY29uc3VtZXIuY2xvc2UoKTsNCi0JCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQkJCQkJcmVzdWx0ID0gYWxyZWFkeUluc3RhbGxlZEZlYXR1cmU7IC8vIDE4ODY3DQotCQkJCQkJCWlmIChyZXN1bHQgIT0gbnVsbA0KLQkJCQkJCQkJJiYgb3B0aW9uYWxmZWF0dXJlcyAhPSBudWxsDQotCQkJCQkJCQkmJiBvcHRpb25hbGZlYXR1cmVzLmxlbmd0aCA+IDApIHsNCi0JCQkJCQkJCS8vIHJlaW5pdGlhbGl6ZSBhcyBuZXcgb3B0aW9uYWwgY2hpbGRyZW4gbWF5IGhhdmUgYmVlbiBpbnN0YWxsZWQNCi0JCQkJCQkJCXJlaW5pdGlhbGl6ZUZlYXR1cmUocmVzdWx0KTsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCQkvLyBjbG9zZSB0aGUgbG9nDQotCQkJCQkJcmVjb3ZlcnlMb2cuY2xvc2UoRXJyb3JSZWNvdmVyeUxvZy5FTkRfSU5TVEFMTF9MT0cpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQljb25zdW1lci5hYm9ydCgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWhhbmRsZXIuaW5zdGFsbENvbXBsZXRlZChzdWNjZXNzKTsNCi0JCQkJLy8gaWYgYWJvcnQgaXMgZG9uZSwgbm8gbmVlZCBmb3IgdGhlIGxvZyB0byBzdGF5DQotCQkJCXJlY292ZXJ5TG9nLmRlbGV0ZSgpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQluZXdFeGNlcHRpb24gPSBlOw0KLQkJCX0NCi0NCi0JCQkvLyBvcmlnaW5hbCBleGNlcHRpb24gd2lucyB1bmxlc3MgaXQgaXMgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24NCi0JCQkvLyBhbmQgYW4gZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWJvcnQNCi0JCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5lcnJvciIsIHRoaXMuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCW9yaWdpbmFsRXhjZXB0aW9uKTsNCi0JCQl9DQotDQotCQkJaWYgKG5ld0V4Y2VwdGlvbiAhPSBudWxsKQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5lcnJvciIsIHRoaXMuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCW5ld0V4Y2VwdGlvbik7DQotDQotCQkJaWYgKGFib3J0ZWRFeGNlcHRpb24gIT0gbnVsbCkgew0KLQkJCQl0aHJvdyBhYm9ydGVkRXhjZXB0aW9uOw0KLQkJCX0NCi0NCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBlbnRyaWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlI2dldFBsdWdpbkVudHJpZXMoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UmF3UGx1Z2luRW50cmllcygpIHsNCi0JCVBsdWdpbkVudHJ5TW9kZWxbXSByZXN1bHQgPSBnZXRQbHVnaW5FbnRyeU1vZGVscygpOw0KLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElQbHVnaW5FbnRyeVswXTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gKElQbHVnaW5FbnRyeVtdKSByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogTWV0aG9kIGZpbHRlci4NCi0JICogQHBhcmFtIHJlc3VsdA0KLQkgKiBAcmV0dXJuIElQbHVnaW5FbnRyeVtdDQotCSAqLw0KLQlwcml2YXRlIElQbHVnaW5FbnRyeVtdIGZpbHRlclBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeVtdIGFsbCkgew0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJaWYgKGFsbCAhPSBudWxsKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGwubGVuZ3RoOyBpKyspIHsNCi0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5pc1ZhbGlkRW52aXJvbm1lbnQoYWxsW2ldKSkNCi0JCQkJCWxpc3QuYWRkKGFsbFtpXSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJSVBsdWdpbkVudHJ5W10gcmVzdWx0ID0gbmV3IElQbHVnaW5FbnRyeVtsaXN0LnNpemUoKV07DQotCQlpZiAoIWxpc3QuaXNFbXB0eSgpKSB7DQotCQkJbGlzdC50b0FycmF5KHJlc3VsdCk7DQotCQl9DQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb3VudCBvZiByZWZlcmVuY2VkIHBsdWctaW4gZW50cmllcy4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0UGx1Z2luRW50cnlDb3VudCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsNCi0JCXJldHVybiBnZXRQbHVnaW5FbnRyaWVzKCkubGVuZ3RoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1wbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0Tm9uUGx1Z2luRW50cmllcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJTm9uUGx1Z2luRW50cnlbXSBnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkgew0KLQkJTm9uUGx1Z2luRW50cnlNb2RlbFtdIHJlc3VsdCA9IGdldE5vblBsdWdpbkVudHJ5TW9kZWxzKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSU5vblBsdWdpbkVudHJ5WzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSU5vblBsdWdpbkVudHJ5W10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY291bnQgb2YgcmVmZXJlbmNlZCBub24tcGx1Zy1pbiBlbnRyaWVzLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXROb25QbHVnaW5FbnRyeUNvdW50KCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGludCBnZXROb25QbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIGdldE5vblBsdWdpbkVudHJ5TW9kZWxzKCkubGVuZ3RoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcyBpbmNsdWRlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogDQotCSAqIEByZXR1cm4gYW4gZXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBnZXRSYXdJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChpbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwpDQotCQkJaW5pdGlhbGl6ZUluY2x1ZGVkUmVmZXJlbmNlcygpOw0KLQ0KLQkJaWYgKGluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMuc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbMF07DQotDQotCQlyZXR1cm4gKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSkgaW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcy50b0FycmF5KA0KLQkJCWFycmF5VHlwZUZvcihpbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKSk7DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRvd25sb2FkIHNpemUgb2YgdGhlIGZlYXR1cmUsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXREb3dubG9hZFNpemUoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoKSB7DQotCQl0cnkgew0KLQkJCVNldCBhbGxQbHVnaW5FbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsNCi0JCQlTZXQgYWxsTm9uUGx1Z2luRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7DQotDQotCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2lucyA9IGdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQlhbGxQbHVnaW5FbnRyaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KHBsdWdpbnMpKTsNCi0JCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5zID0gZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJCWFsbE5vblBsdWdpbkVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qobm9uUGx1Z2lucykpOw0KLQ0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCQlwbHVnaW5zID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJCWFsbFBsdWdpbkVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocGx1Z2lucykpOw0KLQkJCQlub25QbHVnaW5zID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKS5nZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQkJCWFsbE5vblBsdWdpbkVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3Qobm9uUGx1Z2lucykpOw0KLQkJCX0NCi0NCi0JCQlJUGx1Z2luRW50cnlbXSB0b3RhbFBsdWdpbnMgPQ0KLQkJCQluZXcgSVBsdWdpbkVudHJ5W2FsbFBsdWdpbkVudHJpZXMuc2l6ZSgpXTsNCi0JCQlJTm9uUGx1Z2luRW50cnlbXSB0b3RhbE5vblBsdWdpbnMgPQ0KLQkJCQluZXcgSU5vblBsdWdpbkVudHJ5W2FsbE5vblBsdWdpbkVudHJpZXMuc2l6ZSgpXTsNCi0JCQlpZiAoYWxsUGx1Z2luRW50cmllcy5zaXplKCkgIT0gMCkgew0KLQkJCQlhbGxQbHVnaW5FbnRyaWVzLnRvQXJyYXkodG90YWxQbHVnaW5zKTsNCi0JCQl9DQotCQkJaWYgKGFsbE5vblBsdWdpbkVudHJpZXMuc2l6ZSgpICE9IDApIHsNCi0JCQkJYWxsTm9uUGx1Z2luRW50cmllcy50b0FycmF5KHRvdGFsTm9uUGx1Z2lucyk7DQotCQkJfQ0KLQ0KLQkJCXJldHVybiBnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RG93bmxvYWRTaXplRm9yKA0KLQkJCQl0b3RhbFBsdWdpbnMsDQotCQkJCXRvdGFsTm9uUGx1Z2lucyk7DQotDQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgaW5zdGFsbCBzaXplIG9mIHRoZSBmZWF0dXJlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5zdGFsbFNpemUoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpIHsNCi0JCXRyeSB7DQotCQkJU2V0IGFsbFBsdWdpbkVudHJpZXMgPSBuZXcgSGFzaFNldCgpOw0KLQkJCVNldCBhbGxOb25QbHVnaW5FbnRyaWVzID0gbmV3IEhhc2hTZXQoKTsNCi0NCi0JCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zID0gZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCWFsbFBsdWdpbkVudHJpZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocGx1Z2lucykpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbnMgPSBnZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQkJYWxsTm9uUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChub25QbHVnaW5zKSk7DQotDQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCXBsdWdpbnMgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQkJYWxsUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7DQotCQkJCW5vblBsdWdpbnMgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQkJYWxsTm9uUGx1Z2luRW50cmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChub25QbHVnaW5zKSk7DQotCQkJfQ0KLQ0KLQkJCUlQbHVnaW5FbnRyeVtdIHRvdGFsUGx1Z2lucyA9DQotCQkJCW5ldyBJUGx1Z2luRW50cnlbYWxsUGx1Z2luRW50cmllcy5zaXplKCldOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIHRvdGFsTm9uUGx1Z2lucyA9DQotCQkJCW5ldyBJTm9uUGx1Z2luRW50cnlbYWxsTm9uUGx1Z2luRW50cmllcy5zaXplKCldOw0KLQkJCWlmIChhbGxQbHVnaW5FbnRyaWVzLnNpemUoKSAhPSAwKSB7DQotCQkJCWFsbFBsdWdpbkVudHJpZXMudG9BcnJheSh0b3RhbFBsdWdpbnMpOw0KLQkJCX0NCi0JCQlpZiAoYWxsTm9uUGx1Z2luRW50cmllcy5zaXplKCkgIT0gMCkgew0KLQkJCQlhbGxOb25QbHVnaW5FbnRyaWVzLnRvQXJyYXkodG90YWxOb25QbHVnaW5zKTsNCi0JCQl9DQotDQotCQkJcmV0dXJuIGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRJbnN0YWxsU2l6ZUZvcigNCi0JCQkJdG90YWxQbHVnaW5zLA0KLQkJCQl0b3RhbE5vblBsdWdpbnMpOw0KLQ0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCXJldHVybiBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoaXMgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBnZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChmZWF0dXJlQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJUG9saWN5LmJpbmQoDQotCQkJCQkiRmVhdHVyZS5Ob0NvbnRlbnRQcm92aWRlciIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCWdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSwNCi0JCQkJbnVsbCk7CQ0KLQkJfQ0KLQkJcmV0dXJuIHRoaXMuZmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCBjb25zdW1lciBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNnZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHNpdGUgZm9yIHRoaXMgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmUjc2V0U2l0ZShJU2l0ZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAodGhpcy5zaXRlICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgZmVhdHVyZVVSTFN0cmluZyA9DQotCQkJCShnZXRVUkwoKSAhPSBudWxsKSA/IGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgOiAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgiRmVhdHVyZS5TaXRlQWxyZWFkeVNldCIsIGZlYXR1cmVVUkxTdHJpbmcpLCAvLyROT04tTkxTLTEkDQotCQkJCW51bGwpOw0KLQkJfQ0KLQkJdGhpcy5zaXRlID0gc2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZSNzZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKElGZWF0dXJlQ29udGVudFByb3ZpZGVyKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKElGZWF0dXJlQ29udGVudFByb3ZpZGVyIGZlYXR1cmVDb250ZW50UHJvdmlkZXIpIHsNCi0JCXRoaXMuZmVhdHVyZUNvbnRlbnRQcm92aWRlciA9IGZlYXR1cmVDb250ZW50UHJvdmlkZXI7DQotCQlmZWF0dXJlQ29udGVudFByb3ZpZGVyLnNldEZlYXR1cmUodGhpcyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZmV0YXVyZQ0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGFzIHN0cmluZw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nIFVSTFN0cmluZyA9DQotCQkJKGdldFVSTCgpID09IG51bGwpDQotCQkJCT8gUG9saWN5LmJpbmQoIkZlYXR1cmUuTm9VUkwiKSAvLyROT04tTkxTLTEkDQotCQkJCTogZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0NCi0JCVN0cmluZyB2ZXJTdHJpbmcgPQ0KLQkJCVBvbGljeS5iaW5kKA0KLQkJCQkiRmVhdHVyZS5GZWF0dXJlVmVyc2lvblRvU3RyaW5nIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQlVUkxTdHJpbmcsDQotCQkJCWdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCVN0cmluZyBsYWJlbCA9IGdldExhYmVsKCkgPT0gbnVsbCA/ICIiIDogZ2V0TGFiZWwoKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHZlclN0cmluZyArICIgWyIgKyBsYWJlbCArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JLyoNCi0JICogSW5zdGFsbGF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCwgYWJvcnQgYW5kIHJldmVydA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJGZWF0dXJlLkluc3RhbGxhdGlvbkNhbmNlbGxlZCIpOyAvLyROT04tTkxTLTEkDQotCQl0aHJvdyBuZXcgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24obXNnLCBudWxsKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBJbml0aWFsaXplcyBpbmNsdWRlcyBmZWF0dXJlIHJlZmVyZW5jZXMNCi0JICogSWYgdGhlIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlIGlzIGZvdW5kIG9uIHRoZSBzaXRlLCBhZGQgaXQgdG8gdGhlIExpc3QNCi0JICogT3RoZXJ3aXNlIGF0dGVtcHQgdG8gaW5zdGFuY2lhdGUgaXQgdXNpbmcgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIGZlYXR1cmUgYW5kDQotCSAqIHVzaW5nIHRoZSBkZWZhdWx0IGxvY2F0aW9uIG9uIHRoZSBzaXRlLg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJbmNsdWRlZFJlZmVyZW5jZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIG5lc3RlZEZlYXR1cmVzID0gZ2V0RmVhdHVyZUluY2x1ZGVkKCk7DQotCQlpZiAobmVzdGVkRmVhdHVyZXMubGVuZ3RoID09IDApDQotCQkJcmV0dXJuOw0KLQ0KLQkJSVNpdGUgc2l0ZSA9IGdldFNpdGUoKTsNCi0JCWlmIChzaXRlID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaW5jbHVkZSA9IG5lc3RlZEZlYXR1cmVzW2ldOw0KLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmID0NCi0JCQkJZ2V0UGVyZmVjdEluY2x1ZGVGZWF0dXJlKHNpdGUsIGluY2x1ZGUpOw0KLQkJCWluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMuYWRkKG5ld1JlZik7DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgZ2V0UGVyZmVjdEluY2x1ZGVGZWF0dXJlKA0KLQkJSVNpdGUgc2l0ZSwNCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaW5jbHVkZSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIFsyMDM2N10gbm8gc2l0ZSwgY2Fubm90IGluaXRpYWxpemUgbmVzdGVkIHJlZmVyZW5jZXMNCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50aWZpZXIgPSBpbmNsdWRlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0NCi0JCS8vIHRvbyBsb25nIHRvIGNvbXB1dGUgaWYgbm90IGEgZmlsZSBzeXN0ZW0NCi0JCS8vIG90aGVyIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHBhcnNlIGZlYXR1cmUueG1sDQotCQkvLyB3aGVuIHBhcnNpbmcgZmlsZSBzeXN0ZW0gdG8gY3JlYXRlIGFyY2hpdmUgZmVhdHVyZXMvRmVhdHVyZUlkX1Zlci5qYXINCi0JCWlmICgiZmlsZSIuZXF1YWxzKHNpdGUuZ2V0VVJMKCkuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCS8vIGNoZWNrIGlmIGRlY2xhcmVkIG9uIHRoZSBTaXRlDQotCQkJaWYgKHJlZnMgIT0gbnVsbCkgew0KLQkJCQlmb3IgKGludCByZWYgPSAwOyByZWYgPCByZWZzLmxlbmd0aDsgcmVmKyspIHsNCi0JCQkJCWlmIChyZWZzW3JlZl0gIT0gbnVsbCkgew0KLQkJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaWQgPQ0KLQkJCQkJCQlyZWZzW3JlZl0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQkJCQkJCWlmIChpZGVudGlmaWVyLmVxdWFscyhpZCkpIHsNCi0JCQkJCQkJLy8gZm91bmQgYSBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgdGhhdCBtYXRjaGVzIG91ciBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlDQotCQkJCQkJCUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYgPQ0KLQkJCQkJCQkJbmV3IEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZShyZWZzW3JlZl0pOw0KLQkJCQkJCQluZXdSZWYuaXNPcHRpb25hbChpbmNsdWRlLmlzT3B0aW9uYWwoKSk7DQotCQkJCQkJCWlmIChpbmNsdWRlIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsKQ0KLQkJCQkJCQkJbmV3UmVmLnNldExhYmVsKA0KLQkJCQkJCQkJCSgoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBpbmNsdWRlKQ0KLQkJCQkJCQkJCQkuZ2V0TGFiZWwoKSk7DQotCQkJCQkJCW5ld1JlZi5zZXRTZWFyY2hMb2NhdGlvbigNCi0JCQkJCQkJCWluY2x1ZGUuZ2V0U2VhcmNoTG9jYXRpb24oKSk7DQotCQkJCQkJCXJldHVybiBuZXdSZWY7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gaW5zdGFuY2lhdGUgYnkgbWFwcGluZyBpdCBiYXNlZCBvbiB0aGUgc2l0ZS54bWwNCi0JCS8vIGluIGZ1dHVyZSB3ZSBtYXkgYXNrIGZvciBhIGZhY3RvcnkgdG8gY3JlYXRlIHRoZSBmZWF0dXJlIHJlZg0KLQkJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZiA9IG5ldyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoaW5jbHVkZSk7DQotCQluZXdSZWYuc2V0U2l0ZShnZXRTaXRlKCkpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcGFyZW50UmVmID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UodGhpcyk7DQotCQlpZiAocGFyZW50UmVmIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZSkgew0KLQkJCW5ld1JlZi5zZXRUeXBlKCgoRmVhdHVyZVJlZmVyZW5jZSkgcGFyZW50UmVmKS5nZXRUeXBlKCkpOw0KLQkJfQ0KLQkJU3RyaW5nIGZlYXR1cmVJRCA9DQotCQkJU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCArIGlkZW50aWZpZXIudG9TdHJpbmcoKSArICIuamFyIjsgLy8kTk9OLU5MUy0xJA0KLQkJVVJMIGZlYXR1cmVVUkwgPQ0KLQkJCWdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0QXJjaGl2ZVJlZmVyZW5jZShmZWF0dXJlSUQpOw0KLQkJbmV3UmVmLnNldFVSTChmZWF0dXJlVVJMKTsNCi0JCW5ld1JlZi5zZXRGZWF0dXJlSWRlbnRpZmllcihpZGVudGlmaWVyLmdldElkZW50aWZpZXIoKSk7DQotCQluZXdSZWYuc2V0RmVhdHVyZVZlcnNpb24oaWRlbnRpZmllci5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7DQotCQl0cnkgew0KLQkJCW5ld1JlZi5yZXNvbHZlKGdldFNpdGUoKS5nZXRVUkwoKSwgbnVsbCk7DQotCQkJLy8gbm8gbmVlZCB0byBnZXQgdGhlIGJ1bmRsZQ0KLQkJCXJldHVybiBuZXdSZWY7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgNCi0JCQkJCSJGZWF0dXJlLlVuYWJsZVRvSW5pdGlhbGl6ZUZlYXR1cmVSZWZlcmVuY2UiLCAvLyROT04tTkxTLTEkDQotCQkJCQlpZGVudGlmaWVyLnRvU3RyaW5nKCkpLA0KLQkJCQllKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBkZWJ1ZyhTdHJpbmcgdHJhY2UpIHsNCi0JCS8vREVCVUcNCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19JTlNUQUxMKSB7DQotCQkJVXBkYXRlQ29yZS5kZWJ1Zyh0cmFjZSk7DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgc2V0TW9uaXRvclRhc2tOYW1lKA0KLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLA0KLQkJU3RyaW5nIHRhc2tOYW1lKSB7DQotCQlpZiAobW9uaXRvciAhPSBudWxsKQ0KLQkJCW1vbml0b3Iuc2V0VGFza05hbWUodGFza05hbWUpOw0KLQl9DQotDQotCS8qDQotCSAqDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgbW9uaXRvcldvcmsoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGljaykNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQltb25pdG9yLndvcmtlZCh0aWNrKTsNCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJYWJvcnQoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVmZXJlbmNlcygNCi0JCUlWZXJpZmllciB2ZXJpZmllciwNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzLA0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvciwNCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwNCi0JCWJvb2xlYW4gaXNGZWF0dXJlKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ciA9IG51bGw7DQotCQlpZiAodmVyaWZpZXIgIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGorKykgew0KLQkJCQl2ciA9IHZlcmlmaWVyLnZlcmlmeSh0aGlzLCByZWZlcmVuY2VzW2pdLCBpc0ZlYXR1cmUsIG1vbml0b3IpOw0KLQkJCQlpZiAodnIgIT0gbnVsbCkgew0KLQkJCQkJaWYgKHZlcmlmaWNhdGlvbkxpc3RlbmVyID09IG51bGwpDQotCQkJCQkJcmV0dXJuOw0KLQ0KLQkJCQkJaW50IHJlc3VsdCA9IHZlcmlmaWNhdGlvbkxpc3RlbmVyLnByb21wdCh2cik7DQotDQotCQkJCQlpZiAocmVzdWx0ID09IElWZXJpZmljYXRpb25MaXN0ZW5lci5DSE9JQ0VfQUJPUlQpIHsNCi0JCQkJCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIkphclZlcmlmaWNhdGlvblNlcnZpY2UuQ2FuY2VsSW5zdGFsbCIpOyAvLyROT04tTkxTLTEkDQotCQkJCQkJRXhjZXB0aW9uIGUgPSB2ci5nZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKTsNCi0JCQkJCQl0aHJvdyBuZXcgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24obXNnLCBlKTsNCi0JCQkJCX0NCi0JCQkJCWlmIChyZXN1bHQgPT0gSVZlcmlmaWNhdGlvbkxpc3RlbmVyLkNIT0lDRV9FUlJPUikgew0KLQkJCQkJCXRocm93IFV0aWxpdGllcw0KLQkJCQkJCQkubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJCQkJCSJKYXJWZXJpZmljYXRpb25TZXJ2aWNlLlVuc3VjZXNzZnVsVmVyaWZpY2F0aW9uIiksCS8vJE5PTi1OTFMtMSQNCi0JCQkJCQl2ci5nZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogcmV0dXJucyByZWZlcmVuY2UgaWYgdGhlIHNhbWUgZmVhdHVyZSBpcyBpbnN0YWxsZWQgb24gdGhlIHNpdGUNCi0JICogWzE4ODY3XQ0KLQkgKi8NCi0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlQWxyZWFkeUluc3RhbGxlZChJU2l0ZSB0YXJnZXRTaXRlKSB7DQotDQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gdGFyZ2V0U2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgY3VycmVudFJlZmVyZW5jZSA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsNCi0JCQljdXJyZW50UmVmZXJlbmNlID0gcmVmZXJlbmNlc1tpXTsNCi0JCQkvLyBkbyBub3QgY29tcGFyZSBVUkwNCi0JCQl0cnkgew0KLQkJCQlpZiAodGhpcy5lcXVhbHMoY3VycmVudFJlZmVyZW5jZS5nZXRGZWF0dXJlKG51bGwpKSkNCi0JCQkJCXJldHVybiBjdXJyZW50UmVmZXJlbmNlOyAvLyAxODg2Nw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJVXBkYXRlQ29yZS53YXJuKA0KLQkJCSJWYWxpZGF0ZUFscmVhZHlJbnN0YWxsZWQ6RmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQNCi0JCQkJKyB0aGlzDQotCQkJCSsgIiBub3QgZm91bmQgb24gc2l0ZToiIC8vJE5PTi1OTFMtMSQNCi0JCQkJKyB0aGlzLmdldFVSTCgpKTsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIHJlIGluaXRpYWxpemUgY2hpbGRyZW4gb2YgdGhlIGZlYXR1cmUsIGludmFsaWRhdGUgdGhlIGNhY2hlDQotCSAqIEBwYXJhbSByZXN1bHQgRmVhdHVyZVJlZmVyZW5jZSB0byByZWluaXRpYWxpemUuDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcmVpbml0aWFsaXplRmVhdHVyZShJRmVhdHVyZVJlZmVyZW5jZSByZWZlcmVuY2VUb1JlaW5pdGlhbGl6ZSkgew0KLQ0KLQkJaWYgKHJlZmVyZW5jZVRvUmVpbml0aWFsaXplID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pDQotCQkJVXBkYXRlQ29yZS5kZWJ1ZygNCi0JCQkJIlJlIGluaXRpYWxpemUgZmVhdHVyZSByZWZlcmVuY2U6IiArIHJlZmVyZW5jZVRvUmVpbml0aWFsaXplKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7DQotCQl0cnkgew0KLQkJCWZlYXR1cmUgPSByZWZlcmVuY2VUb1JlaW5pdGlhbGl6ZS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCWlmIChmZWF0dXJlICE9IG51bGwgJiYgZmVhdHVyZSBpbnN0YW5jZW9mIEZlYXR1cmUpIHsNCi0JCQkJKChGZWF0dXJlKSBmZWF0dXJlKS5pbml0aWFsaXplSW5jbHVkZWRSZWZlcmVuY2VzKCk7DQotCQkJfQ0KLQkJCS8vIGJ1ZyAyNDk4MSAtIHJlY3Vyc2l2ZWx5IGdvIGludG8gaGllcmFyY2h5DQotCQkJLy8gb25seSBpZiBzaXRlIGlmIGZpbGUgDQotCQkJSVNpdGUgc2l0ZSA9IHJlZmVyZW5jZVRvUmVpbml0aWFsaXplLmdldFNpdGUoKTsNCi0JCQlpZiAoc2l0ZSA9PSBudWxsKQ0KLQkJCQlyZXR1cm47DQotCQkJVVJMIHVybCA9IHNpdGUuZ2V0VVJMKCk7DQotCQkJaWYgKHVybCA9PSBudWxsKQ0KLQkJCQlyZXR1cm47DQotCQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9DQotCQkJCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQkJcmVpbml0aWFsaXplRmVhdHVyZShpbmNsdWRlZFtpXSk7DQotCQkJCX0NCi0JCQl9DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGZpbHRlckZlYXR1cmVzKGdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKSk7DQotCX0NCi0NCi0JLyoNCi0JICogTWV0aG9kIGZpbHRlckZlYXR1cmVzLg0KLQkgKiBBbHNvIGltcGxlbWVudGVkIGluIFNpdGUNCi0JICogDQotCSAqIEBwYXJhbSBsaXN0DQotCSAqIEByZXR1cm4gTGlzdA0KLQkgKi8NCi0JcHJpdmF0ZSBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZmlsdGVyRmVhdHVyZXMoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGFsbEluY2x1ZGVkKSB7DQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlpZiAoYWxsSW5jbHVkZWQgIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsSW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpbmNsdWRlZCA9IGFsbEluY2x1ZGVkW2ldOw0KLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChpbmNsdWRlZCkpDQotCQkJCQlsaXN0LmFkZChpbmNsdWRlZCk7DQotCQkJCWVsc2Ugew0KLQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKSB7DQotCQkJCQkJVXBkYXRlQ29yZS53YXJuKA0KLQkJCQkJCQkiRmlsdGVyZWQgb3V0IGZlYXR1cmUgcmVmZXJlbmNlOiIgKyBpbmNsdWRlZCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPQ0KLQkJCW5ldyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW2xpc3Quc2l6ZSgpXTsNCi0JCWlmICghbGlzdC5pc0VtcHR5KCkpIHsNCi0JCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsNCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0UmF3Tm9uUGx1Z2luRW50cmllcygpDQotCSAqLw0KLQlwdWJsaWMgSU5vblBsdWdpbkVudHJ5W10gZ2V0Tm9uUGx1Z2luRW50cmllcygpIHsNCi0JCXJldHVybiBmaWx0ZXJOb25QbHVnaW5FbnRyeShnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgZmlsdGVyUGx1Z2luRW50cnkuDQotCSAqIEBwYXJhbSBhbGwNCi0JICogQHJldHVybiBJTm9uUGx1Z2luRW50cnlbXQ0KLQkgKi8NCi0JcHJpdmF0ZSBJTm9uUGx1Z2luRW50cnlbXSBmaWx0ZXJOb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnlbXSBhbGwpIHsNCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmIChhbGwgIT0gbnVsbCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7DQotCQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuaXNWYWxpZEVudmlyb25tZW50KGFsbFtpXSkpDQotCQkJCQlsaXN0LmFkZChhbGxbaV0pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCUlOb25QbHVnaW5FbnRyeVtdIHJlc3VsdCA9IG5ldyBJTm9uUGx1Z2luRW50cnlbbGlzdC5zaXplKCldOw0KLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgew0KLQkJCWxpc3QudG9BcnJheShyZXN1bHQpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdQbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIGZpbHRlclBsdWdpbkVudHJ5KGdldFJhd1BsdWdpbkVudHJpZXMoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0SW1wb3J0cygpDQotCSAqLw0KLQlwdWJsaWMgSUltcG9ydFtdIGdldEltcG9ydHMoKSB7DQotCQlyZXR1cm4gZmlsdGVySW1wb3J0cyhnZXRSYXdJbXBvcnRzKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgZmlsdGVySW1wb3J0cy4NCi0JICogQHBhcmFtIGFsbA0KLQkgKiBAcmV0dXJuIElJbXBvcnRbXQ0KLQkgKi8NCi0JcHJpdmF0ZSBJSW1wb3J0W10gZmlsdGVySW1wb3J0cyhJSW1wb3J0W10gYWxsKSB7DQotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlpZiAoYWxsICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykgew0KLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChhbGxbaV0pKQ0KLQkJCQkJbGlzdC5hZGQoYWxsW2ldKTsNCi0JCQl9DQotCQl9DQotDQotCQlJSW1wb3J0W10gcmVzdWx0ID0gbmV3IElJbXBvcnRbbGlzdC5zaXplKCldOw0KLQkJaWYgKCFsaXN0LmlzRW1wdHkoKSkgew0KLQkJCWxpc3QudG9BcnJheShyZXN1bHQpOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0ZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE4NmE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBCYXNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyLiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2V0Ci0gKiBvZiBoZWxwZXIgbWV0aG9kcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBmZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXJzLiBJbgotICogcGFydGljdWxhciwgbWV0aG9kcyBkZWFsaW5nIHdpdGggZG93bmxvYWRpbmcgYW5kIGNhY2hpbmcgb2YgZmVhdHVyZSBmaWxlcy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlQ29udGVudFByb3ZpZGVyCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFNXSVRDSF9DT1BZX0xPQ0FMID0gdHJ1ZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRmlsZUZpbHRlciB7Ci0KLQkJcHJpdmF0ZSBJUGF0aCBmaWx0ZXJQYXRoID0gbnVsbDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0b3IgZm9yIEZpbGVGaWx0ZXIuCi0JCSAqLwotCQlwdWJsaWMgRmlsZUZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5maWx0ZXJQYXRoID0gbmV3IFBhdGgoZmlsdGVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiByZXR1cm5zIHRydWUgaWYgdGhlIG5hbWUgbWF0Y2hlcyB0aGUgcnVsZQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBuYW1lKSB7Ci0KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBubyAnKicgcGF0dGVybiBtYXRjaGluZwotCQkJLy8gbXVzdCBiZSBlcXVhbHMKLQkJCUlQYXRoIG5hbWVQYXRoID0gbmV3IFBhdGgobmFtZSk7Ci0JCQlpZiAoZmlsdGVyUGF0aC5sYXN0U2VnbWVudCgpLmluZGV4T2YoJyonKSA9PSAtMSkgewotCQkJCXJldHVybiBmaWx0ZXJQYXRoLmVxdWFscyhuYW1lUGF0aCk7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIHNhbWUgZmlsZSBleHRlbnNpb24gaWYgZXh0ZW5zaW9uIGV4aXN0cyAoYS50eHQvKi50eHQpCi0JCQkvLyBvciBzYW1lIGZpbGUgbmFtZSAoYS50eHQsYS4qKQotCQkJU3RyaW5nIGV4dGVuc2lvbiA9IGZpbHRlclBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJaWYgKCFleHRlbnNpb24uZXF1YWxzKCIqIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UobmFtZVBhdGguZ2V0RmlsZUV4dGVuc2lvbigpKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQlJUGF0aCBub0V4dGVuc2lvbiA9IGZpbHRlclBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCQkJCVN0cmluZyBmaWxlTmFtZSA9IG5vRXh0ZW5zaW9uLmxhc3RTZWdtZW50KCk7Ci0JCQkJaWYgKCFmaWxlTmFtZS5lcXVhbHMoIioiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmICghbmFtZVBhdGgubGFzdFNlZ21lbnQoKS5zdGFydHNXaXRoKGZpbGVOYW1lKSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIHNhbWUgcGF0aAotCQkJSVBhdGggcDEgPSBuYW1lUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQlJUGF0aCBwMiA9IGZpbHRlclBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQkJcmV0dXJuIHAxLmVxdWFscyhwMik7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgVVJMIGJhc2U7Ci0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOwotCXByaXZhdGUgRmlsZSB0bXBEaXI7IC8vIGxvY2FsIHdvcmsgYXJlYSBmb3IgZWFjaCBwcm92aWRlcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9FWFRFTlNJT04gPSAiLmphciI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zLnByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYRUNVVEFCTEVTID0gInBlcm1pc3Npb25zLmV4ZWN1dGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBsb2NrCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgT2JqZWN0IGxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvLyBoYXNodGFibGUgb2YgbG9ja3MKLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgbG9ja3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkvKioKLQkgKiBGZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXIgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gYmFzZQotCSAqICAgICAgICAgICAgZmVhdHVyZSBVUkwuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIFVSTCBpcyBzcGVjaWZpYyB0bwotCSAqICAgICAgICAgICAgZWFjaCBjb250ZW50IHByb3ZpZGVyLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUNvbnRlbnRQcm92aWRlcihVUkwgYmFzZSkgewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCQl0aGlzLmZlYXR1cmUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdXJsLgotCSAqIAotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0VVJMKCkKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIGJhc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZW50IHByb3ZpZGVyLgotCSAqIAotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZSgpCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlYXR1cmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGVudCBwcm92aWRlci4KLQkgKiAKLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI3NldEZlYXR1cmUoSUZlYXR1cmUpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSBhcyBhIGxvY2FsIGZpbGUgc3lzdGVtIHJlZmVyZW5jZS4gSWYKLQkgKiByZXF1aXJlZCwgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIHNwZWNpZmllZCBjb250ZW50IHJlZmVyZW5jZSBpcwotCSAqIGZpcnN0IGRvd25sb2FkZWQgdG8gdGhlIGxvY2FsIHN5c3RlbQotCSAqIAotCSAqIEBwYXJhbSByZWYKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgcmVmZXJlbmNlCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiAgICAgICAgICAgIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgYXNMb2NhbFJlZmVyZW5jZSgKLQkJQ29udGVudFJlZmVyZW5jZSByZWYsCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYWxyZWFkeSBhIGxvY2FsIHJlZmVyZW5jZQotCQlpZiAocmVmLmlzTG9jYWxSZWZlcmVuY2UoKSkKLQkJCXJldHVybiByZWY7Ci0KLQkJLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGxvY2FsIGZpbGUgZm9yIHRoaXMgcmVmZXJlbmNlCi0JCVN0cmluZyBrZXkgPSByZWYudG9TdHJpbmcoKTsKLQotCQkvLyBuZWVkIHRvIHN5bmNoIGFzIGFub3RoZXIgdGhyZWFkIG15IGhhdmUgY3JlYXRlZCB0aGUgZmlsZSBidXQKLQkJLy8gaXMgc3RpbGwgY29weWluZyBpbnRvIGl0Ci0JCUZpbGUgbG9jYWxGaWxlID0gbnVsbDsKLQkJRmlsZUZyYWdtZW50IGxvY2FsRmlsZUZyYWdtZW50ID0gbnVsbDsKLQkJT2JqZWN0IGtleUxvY2sgPSBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGxvY2spIHsKLQkJCWlmIChsb2Nrcy5nZXQoa2V5KSA9PSBudWxsKQotCQkJCWxvY2tzLnB1dChrZXksIGtleSk7Ci0JCQlrZXlMb2NrID0gbG9ja3MuZ2V0KGtleSk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgKGtleUxvY2spIHsKLQkJCWxvY2FsRmlsZSA9IFV0aWxpdGllcy5sb29rdXBMb2NhbEZpbGUoa2V5KTsKLQkJCWlmIChsb2NhbEZpbGUgIT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIGlmIHRoZSBjYWNoZWQgZmlsZSBpcyBzdGlsbCB2YWxpZCAobm8gbmV3ZXIgdmVyc2lvbiBvbgotCQkJCS8vIHNlcnZlcikKLQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzCi0JCQkJCS5pc1NhbWVUaW1lc3RhbXAocmVmLmFzVVJMKCksIGxvY2FsRmlsZS5sYXN0TW9kaWZpZWQoKSkpCi0JCQkJCXJldHVybiByZWYuY3JlYXRlQ29udGVudFJlZmVyZW5jZSgKLQkJCQkJCXJlZi5nZXRJZGVudGlmaWVyKCksCi0JCQkJCQlsb2NhbEZpbGUpOwotCQkJfQotCi0JCQlpZiAobG9jYWxGaWxlID09IG51bGwpIHsKLQkJCQlsb2NhbEZpbGVGcmFnbWVudCA9Ci0JCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5sb29rdXBMb2NhbEZpbGVGcmFnbWVudChrZXkpOwotCQkJfQotCQkJLy8gCi0JCQkvLyBkb3dubG9hZCB0aGUgcmVmZXJlbmNlZCBmaWxlIGludG8gbG9jYWwgdGVtcG9yYXJ5IGFyZWEKLQkJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCU91dHB1dFN0cmVhbSBvcyA9IG51bGw7Ci0JCQlsb25nIGJ5dGVzQ29waWVkID0gMDsKLQkJCWxvbmcgaW5wdXRMZW5ndGggPSAwOwotCQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJbW9uaXRvci5zYXZlU3RhdGUoKTsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKAotCQkJCQlQb2xpY3kuYmluZCgiRmVhdHVyZUNvbnRlbnRQcm92aWRlci5Eb3dubG9hZGluZyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vbml0b3Iuc3ViVGFzayhyZWYuZ2V0SWRlbnRpZmllcigpICsgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1vbml0b3Iuc2V0VG90YWxDb3VudChyZWYuZ2V0SW5wdXRTaXplKCkpOwotCQkJCW1vbml0b3Iuc2hvd0NvcHlEZXRhaWxzKHRydWUpOwotCQkJfQotCi0JCQl0cnkgewotCQkJCWlmIChsb2NhbEZpbGVGcmFnbWVudCAhPSBudWxsCi0JCQkJCSYmICJodHRwIi5lcXVhbHMocmVmLmFzVVJMKCkuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlsb2NhbEZpbGUgPSBsb2NhbEZpbGVGcmFnbWVudC5nZXRGaWxlKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvLyBnZXQgcGFydGlhbCBpbnB1dCBzdHJlYW0KLQkJCQkJCWlzID0KLQkJCQkJCQlyZWYuZ2V0UGFydGlhbElucHV0U3RyZWFtKAotCQkJCQkJCQlsb2NhbEZpbGVGcmFnbWVudC5nZXRTaXplKCkpOwotCQkJCQkJaW5wdXRMZW5ndGggPSByZWYuZ2V0SW5wdXRTaXplKCktbG9jYWxGaWxlRnJhZ21lbnQuZ2V0U2l6ZSgpOyAKLQkJCQkJCS8vIGdldCBvdXRwdXQgc3RyZWFtIHRvIGFwcGVuZCB0byBmaWxlIGZyYWdtZW50Ci0JCQkJCQlvcyA9Ci0JCQkJCQkJbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKAotCQkJCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUsIHRydWUpKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJfQotCQkJCQkJaXMgPSBudWxsOwotCQkJCQkJb3MgPSBudWxsOwotCQkJCQkJbG9jYWxGaWxlRnJhZ21lbnQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpcyA9PSBudWxsKSB7Ci0JCQkJCS8vIG11c3QgZG93bmxvYWQgZnJvbSBzY3JhdGNoCi0JCQkJCWxvY2FsRmlsZSA9Ci0JCQkJCQlVdGlsaXRpZXMuY3JlYXRlTG9jYWxGaWxlKGdldFdvcmtpbmdEaXJlY3RvcnkoKSwgbnVsbCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpcyA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQkJaW5wdXRMZW5ndGggPSByZWYuZ2V0SW5wdXRTaXplKCk7IAotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJIkZlYXR1cmVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgcmVmIH0pLAotCQkJCQkJCWUpOwotCQkJCQl9Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCW9zID0KLQkJCQkJCQluZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCi0JCQkJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSkpOwotCQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCQkJUG9saWN5LmJpbmQoCi0JCQkJCQkJCSJGZWF0dXJlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvQ3JlYXRlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQluZXcgT2JqZWN0W10geyBsb2NhbEZpbGUgfSksCi0JCQkJCQkJZSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlEYXRlIHN0YXJ0ID0gbmV3IERhdGUoKTsKLQkJCQlpZiAobG9jYWxGaWxlRnJhZ21lbnQgIT0gbnVsbCkgewotCQkJCQlieXRlc0NvcGllZCA9IGxvY2FsRmlsZUZyYWdtZW50LmdldFNpemUoKTsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJbW9uaXRvci5pbmNyZW1lbnRDb3VudChieXRlc0NvcGllZCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBUcmFuc2ZlciBhcyBtYW55IGJ5dGVzIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0IHN0cmVhbQotCQkJCWxvbmcgb2Zmc2V0ID0gVXBkYXRlTWFuYWdlclV0aWxzLmNvcHkoaXMsIG9zLCBtb25pdG9yLCBpbnB1dExlbmd0aCk7Ci0JCQkJaWYgKG9mZnNldCAhPSAtMSkgewotCQkJCQlieXRlc0NvcGllZCArPSBvZmZzZXQ7Ci0JCQkJCWlmIChieXRlc0NvcGllZCA+IDApIHsKLQkJCQkJCS8vIHByZXNlcnZlIHBhcnRpYWxseSBkb3dubG9hZGVkIGZpbGUKLQkJCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5tYXBMb2NhbEZpbGVGcmFnbWVudCgKLQkJCQkJCQkJa2V5LAotCQkJCQkJCQluZXcgRmlsZUZyYWdtZW50KGxvY2FsRmlsZSwgYnl0ZXNDb3BpZWQpKTsKLQkJCQkJfQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiRmVhdHVyZS5JbnN0YWxsYXRpb25DYW5jZWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGhyb3cgbmV3IEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKG1zZywgbnVsbCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKAotCQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCQkiRmVhdHVyZUNvbnRlbnRQcm92aWRlci5FeGNlcHRpb25Eb3dubG9hZGluZyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbmV3IE9iamVjdFtdIHsgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKX0pLAotCQkJCQkJCW5ldyBJT0V4Y2VwdGlvbigpKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy51bk1hcExvY2FsRmlsZUZyYWdtZW50KGtleSk7Ci0JCQkJfQotCi0JCQkJRGF0ZSBzdG9wID0gbmV3IERhdGUoKTsKLQkJCQlsb25nIHRpbWVJbnNlY29uZHMgPSAoc3RvcC5nZXRUaW1lKCkgLSBzdGFydC5nZXRUaW1lKCkpIC8gMTAwMDsKLQkJCQkvLyB0aW1lIGluIG1pbGxpc2Vjb25kcyAvMTAwMCA9IHRpbWUgaW4gc2Vjb25kcwotCQkJCUludGVybmFsU2l0ZU1hbmFnZXIuZG93bmxvYWRlZCgKLQkJCQkJcmVmLmdldElucHV0U2l6ZSgpLAotCQkJCQkodGltZUluc2Vjb25kcyksCi0JCQkJCXJlZi5hc1VSTCgpKTsKLQotCQkJCXN1Y2Nlc3MgPSB0cnVlOwotCi0JCQkJLy8gZmlsZSBpcyBkb3dubG9hZGVkIHN1Y2Nlc2Z1bGx5LCBtYXAgaXQKLQkJCQlVdGlsaXRpZXMubWFwTG9jYWxGaWxlKGtleSwgbG9jYWxGaWxlKTsKLQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJIkZlYXR1cmVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9DcmVhdGUiLCAvLyROT04tTkxTLTEkCi0JCQkJCQluZXcgT2JqZWN0W10geyBsb2NhbEZpbGUgfSksCi0JCQkJCWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQkvL0RvIG5vdCBjbG9zZSBJUyBpZiB1c2VyIGNhbmNlbCwKLQkJCQkvL2Nsb3NpbmcgSVMgd2lsbCByZWFkIHRoZSBlbnRpcmUgU3RyZWFtIHVudGlsIHRoZSBlbmQKLQkJCQlpZiAoc3VjY2VzcyAmJiBpcyAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlvcy5jbG9zZSgpOyAvLyBzaG91bGQgZmx1c2ggYnVmZmVyIHN0cmVhbQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQotCQkJCWlmIChzdWNjZXNzIHx8IGJ5dGVzQ29waWVkID4gMCkgewotCQkJCQkvLyBzZXQgdGhlIHRpbWVzdGFtcCBvbiB0aGUgdGVtcCBmaWxlIHRvIG1hdGNoIHRoZSByZW1vdGUKLQkJCQkJLy8gdGltZXN0YW1wCi0JCQkJCWxvY2FsRmlsZS5zZXRMYXN0TW9kaWZpZWQocmVmLmdldExhc3RNb2RpZmllZCgpKTsKLQkJCQl9Ci0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5yZXN0b3JlU3RhdGUoKTsKLQkJCX0KLQkJCWxvY2tzLnJlbW92ZShrZXkpOwotCQl9IC8vIGVuZCBsb2NrCi0JCUNvbnRlbnRSZWZlcmVuY2UgcmVmZXJlbmNlID0KLQkJCXJlZi5jcmVhdGVDb250ZW50UmVmZXJlbmNlKHJlZi5nZXRJZGVudGlmaWVyKCksIGxvY2FsRmlsZSk7Ci0JCXJldHVybiByZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSBhcyBhIGxvY2FsIGZpbGUuIElmIHJlcXVpcmVkLCB0aGUgZmlsZQotCSAqIHJlcHJlc2VudGVkIGJ5IHRoZSBzcGVjaWZpZWQgY29udGVudCByZWZlcmVuY2UgaXMgZmlyc3QgZG93bmxvYWRlZCB0bwotCSAqIHRoZSBsb2NhbCBzeXN0ZW0KLQkgKiAKLQkgKiBAcGFyYW0gcmVmCi0JICogICAgICAgICAgICBjb250ZW50IHJlZmVyZW5jZQotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogICAgICAgICAgICBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBGaWxlIGFzTG9jYWxGaWxlKENvbnRlbnRSZWZlcmVuY2UgcmVmLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlGaWxlIGZpbGUgPSByZWYuYXNGaWxlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwgJiYgIVNXSVRDSF9DT1BZX0xPQ0FMKQotCQkJcmV0dXJuIGZpbGU7Ci0JCUNvbnRlbnRSZWZlcmVuY2UgbG9jYWxSZWYgPSBhc0xvY2FsUmVmZXJlbmNlKHJlZiwgbW9uaXRvcik7Ci0JCWZpbGUgPSBsb2NhbFJlZi5hc0ZpbGUoKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3b3JraW5nIGRpcmVjdG9yeSBmb3IgdGhpcyBjb250ZW50IHByb3ZpZGVyCi0JICogCi0JICogQHJldHVybiB3b3JraW5nIGRpcmVjdG9yeQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHJvdGVjdGVkIEZpbGUgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0bXBEaXIgPT0gbnVsbCkKLQkJCXRtcERpciA9IFV0aWxpdGllcy5jcmVhdGVXb3JraW5nRGlyZWN0b3J5KCk7Ci0JCXJldHVybiB0bXBEaXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgYXJjaGl2ZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBlbnRyaWVzICh0aGUgInBhY2thZ2luZyIgdmlldykuCi0JICogCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXREb3dubG9hZFNpemVGb3IoSVBsdWdpbkVudHJ5W10sCi0JICogICAgICBJTm9uUGx1Z2luRW50cnlbXSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemVGb3IoCi0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMsCi0JCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXMpIHsKLQkJbG9uZyByZXN1bHQgPSAwOwotCi0JCS8vIGlmIGJvdGggYXJlIG51bGwgb3IgZW1wdHksIHJldHVybiBVTktOT1dOIHNpemUKLQkJaWYgKChwbHVnaW5FbnRyaWVzID09IG51bGwgfHwgcGx1Z2luRW50cmllcy5sZW5ndGggPT0gMCkKLQkJCSYmIChub25QbHVnaW5FbnRyaWVzID09IG51bGwgfHwgbm9uUGx1Z2luRW50cmllcy5sZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7Ci0JCX0KLQotCQkvLyBsb29wIG9uIHBsdWdpbiBlbnRyaWVzCi0JCWxvbmcgc2l6ZSA9IDA7Ci0JCWlmIChwbHVnaW5FbnRyaWVzICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzaXplID0gKChQbHVnaW5FbnRyeU1vZGVsKSBwbHVnaW5FbnRyaWVzW2ldKS5nZXREb3dubG9hZFNpemUoKTsKLQkJCQlpZiAoc2l6ZSA9PSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpIHsKLQkJCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKLQkJCQl9Ci0JCQkJcmVzdWx0ICs9IHNpemU7Ci0JCQl9Ci0KLQkJLy8gbG9vcCBvbiBub24gcGx1Z2luIGVudHJpZXMKLQkJaWYgKG5vblBsdWdpbkVudHJpZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uUGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCXNpemUgPQotCQkJCQkoKE5vblBsdWdpbkVudHJ5TW9kZWwpIG5vblBsdWdpbkVudHJpZXNbaV0pCi0JCQkJCQkuZ2V0RG93bmxvYWRTaXplKCk7Ci0JCQkJaWYgKHNpemUgPT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKSB7Ci0JCQkJCXJldHVybiBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7Ci0JCQkJfQotCQkJCXJlc3VsdCArPSBzaXplOwotCQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgZmlsZXMgcmVxdWlyZWQgZm9yIHRoZSBzcGVjaWZpZWQgcGx1Zy1pbgotCSAqIGFuZCBub24tcGx1Zy1pbiBlbnRyaWVzICh0aGUgImxvZ2ljYWwiIHZpZXcpLgotCSAqIAotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0SW5zdGFsbFNpemVGb3IoSVBsdWdpbkVudHJ5W10sCi0JICogICAgICBJTm9uUGx1Z2luRW50cnlbXSkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcigKLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcywKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRW50cmllcykgewotCQlsb25nIHJlc3VsdCA9IDA7Ci0KLQkJLy8gaWYgYm90aCBhcmUgbnVsbCBvciBlbXB0eSwgcmV0dXJuIFVOS05PV04gc2l6ZQotCQlpZiAoKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vblBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBub25QbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsKLQkJfQotCi0JCS8vIGxvb3Agb24gcGx1Z2luIGVudHJpZXMKLQkJbG9uZyBzaXplID0gMDsKLQkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCXNpemUgPSAoKFBsdWdpbkVudHJ5TW9kZWwpIHBsdWdpbkVudHJpZXNbaV0pLmdldEluc3RhbGxTaXplKCk7Ci0JCQkJaWYgKHNpemUgPT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKSB7Ci0JCQkJCXJldHVybiBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7Ci0JCQkJfQotCQkJCXJlc3VsdCArPSBzaXplOwotCQkJfQotCi0JCS8vIGxvb3Agb24gbm9uIHBsdWdpbiBlbnRyaWVzCi0JCWlmIChub25QbHVnaW5FbnRyaWVzICE9IG51bGwpCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzaXplID0KLQkJCQkJKChOb25QbHVnaW5FbnRyeU1vZGVsKSBub25QbHVnaW5FbnRyaWVzW2ldKQotCQkJCQkJLmdldEluc3RhbGxTaXplKCk7Ci0JCQkJaWYgKHNpemUgPT0gQ29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKSB7Ci0JCQkJCXJldHVybiBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7Ci0JCQkJfQotCQkJCXJlc3VsdCArPSBzaXplOwotCQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGF0aCBpZGVudGlmaWVyIGZvciBhIHBsdWdpbiBlbnRyeS4gPGNvZGU+cGx1Z2lucy8mbHQ7cGx1Z2luSWQ+XyZsdDtwbHVnaW5WZXJzaW9uPi5qYXI8L2NvZGU+Ci0JICogCi0JICogQHJldHVybiB0aGUgcGF0aCBpZGVudGlmaWVyCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXRoSUQoSVBsdWdpbkVudHJ5IGVudHJ5KSB7Ci0JCXJldHVybiBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgKLQkJCSsgZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkKLQkJCSsgSkFSX0VYVEVOU0lPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIGlkZW50aWZlciBmb3IgYSBub24gcGx1Z2luIGVudHJ5LiA8Y29kZT5mZWF0dXJlcy8mbHQ7ZmVhdHVyZUlkPl8mbHQ7ZmVhdHVyZVZlcnNpb24+LyZsdDtkYXRhSWQ+PC9jb2RlPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhdGggaWRlbnRpZmllcgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aElEKElOb25QbHVnaW5FbnRyeSBlbnRyeSkgewotCQlTdHJpbmcgbm9uUGx1Z2luQmFzZUlEID0KLQkJCVNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgKLQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkKLQkJCQkrICIvIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbm9uUGx1Z2luQmFzZUlEICsgZW50cnkuZ2V0SWRlbnRpZmllcigpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHBlcm1pc3Npb24gb2YgYWxsIHRoZSBDb250ZW50UmVmZXJlbmNlcyBDaGVjayBmb3IgdGhlCi0JICogLnBlcm1pc3Npb25zIGNvbnRlbnRSZWZlcmVuY2UgYW5kIHVzZSBpdCB0byBzZXQgdGhlIHBlcm1pc3Npb25zIG9mIG90aGVyCi0JICogQ29udGVudFJlZmVyZW5jZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGVybWlzc2lvbnMoQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMpIHsKLQotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsIHx8IHJlZmVyZW5jZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTWFwIHBlcm1pc3Npb25zID0gZ2V0UGVybWlzc2lvbnMocmVmZXJlbmNlcyk7Ci0JCWlmIChwZXJtaXNzaW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UgPSByZWZlcmVuY2VzW2ldOwotCQkJU3RyaW5nIGlkID0gY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCk7Ci0JCQlPYmplY3QgdmFsdWUgPSBudWxsOwotCQkJaWYgKCh2YWx1ZSA9IG1hdGNoZXNPbmVSdWxlKGlkLCBwZXJtaXNzaW9ucykpICE9IG51bGwpIHsKLQkJCQlJbnRlZ2VyIHBlcm1pc3Npb24gPSAoSW50ZWdlcikgdmFsdWU7Ci0JCQkJY29udGVudFJlZmVyZW5jZS5zZXRQZXJtaXNzaW9uKHBlcm1pc3Npb24uaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgbWF0Y2hpbmcgcnVsZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogZm91bmQuIEEgcnVsZSBpcyBtYXRjaGVkIGlmIHRoZSBpZCBpcyBlcXVhbHMgdG8gYSBrZXksIG9yIGlmIHRoZSBpZCBpcwotCSAqIHJlc29sdmVkIGJ5IGEga2V5LiBpZiB0aGUgaWQgaXMgPGNvZGU+L3BhdGgvZmlsZS50eHQ8L2NvZGU+IGl0IGlzCi0JICogcmVzb2x2ZWQgYnkgPGNvZGU+L3BhdGgvKjwvY29kZT4gb3IgPGNvZGU+L3BhdGgvKi50eHQ8L2NvZGU+Ci0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgaWRlbnRpZmllcgotCSAqIEBwYXJhbSBwZXJtaXNzaW9ucwotCSAqICAgICAgICAgICAgbGlzdCBvZiBydWxlcwotCSAqIEByZXR1cm4gT2JqZWN0IHRoZSB2YWx1ZSBvZiB0aGUgbWF0Y2luZyBydWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgbWF0Y2hlc09uZVJ1bGUoU3RyaW5nIGlkLCBNYXAgcGVybWlzc2lvbnMpIHsKLQotCQlTZXQga2V5U2V0ID0gcGVybWlzc2lvbnMua2V5U2V0KCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlGaWxlRmlsdGVyIHJ1bGUgPSAoRmlsZUZpbHRlcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAocnVsZS5hY2NlcHQoaWQpKSB7Ci0JCQkJcmV0dXJuIHBlcm1pc3Npb25zLmdldChydWxlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogcmV0dXJucyB0aGUgcGVybWlzc2lvbiBNQVAKLQkgKi8KLQlwcml2YXRlIE1hcCBnZXRQZXJtaXNzaW9ucyhDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcykgewotCi0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotCQkvLyBzZWFyY2ggZm9yIC5wZXJtaXNzaW9ucwotCQlib29sZWFuIG5vdGZvdW5kID0gdHJ1ZTsKLQkJQ29udGVudFJlZmVyZW5jZSBwZXJtaXNzaW9uUmVmZXJlbmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aCAmJiBub3Rmb3VuZDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UgPSByZWZlcmVuY2VzW2ldOwotCQkJaWYgKERPVF9QRVJNSVNTSU9OUy5lcXVhbHMoY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJbm90Zm91bmQgPSBmYWxzZTsKLQkJCQlwZXJtaXNzaW9uUmVmZXJlbmNlID0gY29udGVudFJlZmVyZW5jZTsKLQkJCX0KLQkJfQotCQlpZiAobm90Zm91bmQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCVByb3BlcnRpZXMgcHJvcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlwcm9wLmxvYWQocGVybWlzc2lvblJlZmVyZW5jZS5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJU3RyaW5nIGV4ZWN1dGFibGVzID0gcHJvcC5nZXRQcm9wZXJ0eShFWEVDVVRBQkxFUyk7Ci0JCWlmIChleGVjdXRhYmxlcyA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihleGVjdXRhYmxlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlJbnRlZ2VyIGRlZmF1bHRFeGVjdXRhYmxlUGVybWlzc2lvbiA9Ci0JCQluZXcgSW50ZWdlcihDb250ZW50UmVmZXJlbmNlLkRFRkFVTFRfRVhFQ1VUQUJMRV9QRVJNSVNTSU9OKTsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCXJlc3VsdC5wdXQoZmlsdGVyLCBkZWZhdWx0RXhlY3V0YWJsZVBlcm1pc3Npb24pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0ZlYXR1cmVSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmEyYWM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvRmVhdHVyZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmVhdHVyZSByZWZlcmVuY2UuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2UKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZVJlZmVyZW5jZU1vZGVsCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUmVmZXJlbmNlIGV4dGVuZHMgRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGltcGxlbWVudHMgSUZlYXR1cmVSZWZlcmVuY2UsIElQbGF0Zm9ybUVudmlyb25tZW50IHsKLQotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uSWQ7Ci0KLQkvL1BFUkY6IG5ldyBpbnN0YW5jZSB2YXJpYWJsZQotCXByaXZhdGUgSUZlYXR1cmUgZXhhY3RGZWF0dXJlOwotCi0JLyoqCi0JICogRmVhdHVyZSByZWZlcmVuY2UgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEZlYXR1cmVSZWZlcmVuY2UuCi0JICogQHBhcmFtIHJlZiB0aGUgcmVmZXJlbmNlIHRvIGNvcHkKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJc3VwZXIoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgcmVmKTsKLQkJdHJ5IHsKLQkJCXNldFVSTChyZWYuZ2V0VVJMKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEZlYXR1cmVSZWZlcmVuY2UuCi0JICogQHBhcmFtIHJlZiB0aGUgcmVmZXJlbmNlIHRvIGNvcHkKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVJlZmVyZW5jZShGZWF0dXJlUmVmZXJlbmNlTW9kZWwgcmVmKSB7Ci0JCXN1cGVyKHJlZik7Ci0JCXRyeSB7Ci0JCQlzZXRVUkwocmVmLmdldFVSTCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHRoaXMgcmVmZXJlbmNlIHBvaW50cyB0byAKLQkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIG9uIHRoZSBTaXRlCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEZlYXVyZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHRoaXMgcmVmZXJlbmNlIHBvaW50cyB0byAKLQkgKiAgQHJldHVybiB0aGUgZmVhdHVyZSBvbiB0aGUgU2l0ZQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChleGFjdEZlYXR1cmUgIT0gbnVsbCkKLQkJCXJldHVybiBleGFjdEZlYXR1cmU7Ci0JCWV4YWN0RmVhdHVyZSA9IGdldEZlYXR1cmUodGhpcyxtb25pdG9yKTsKLQkJcmV0dXJuIGV4YWN0RmVhdHVyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHRoZSByZWZlcmVuY2UgcG9pbnRzIHRvIAotCSAqIEBwYXJhbSByZWYgdGhlIGZlYXR1cmUgcmVmZXJlbmNlCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBvbiB0aGUgU2l0ZQotCSAqLwotCXByb3RlY3RlZCBJRmVhdHVyZSBnZXRGZWF0dXJlKElGZWF0dXJlUmVmZXJlbmNlIHJlZixJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsKLQkJVVJMIHJlZlVSTCA9IHJlZi5nZXRVUkwoKTsKLQkJZmVhdHVyZSA9IGNyZWF0ZUZlYXR1cmUocmVmVVJMLG1vbml0b3IpOwotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNvbmNyZXRlIGZlYXR1cmUgY29ycmVzcG9uZGluZyB0byB0aGlzIHJlZmVyZW5jZQotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLQkJSVNpdGUgc2l0ZSA9IGdldFNpdGUoKTsKLQkJLy8gaWYgdGhlIHNpdGUgZXhpc3RzLCB1c2UgdGhlIHNpdGUgZmFjdG9yeQotCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2l0ZS5jcmVhdGVGZWF0dXJlKHR5cGUsIHVybCwgbW9uaXRvcik7Ci0JCX0KLQkJCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yeSh0eXBlKTsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlRmVhdHVyZSh1cmwsIHNpdGUsIG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVwZGF0ZSBzaXRlIGZvciB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlCi0JICogCi0JICogQHNlZSBJRmVhdHVyZVJlZmVyZW5jZSNnZXRTaXRlKCkKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gKElTaXRlKSBnZXRTaXRlTW9kZWwoKTsKLQl9Ci0KLQkvKiogCi0JICogU2V0cyB0aGUgZmVhdHVyZSByZWZlcmVuY2UgVVJMLgotCSAqIFRoaXMgaXMgdHlwaWNhbGx5IHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSBjcmVhdGlvbgotCSAqIG9wZXJhdGlvbi4gT25jZSBzZXQsIHRoZSB1cmwgc2hvdWxkIG5vdCBiZSByZXNldC4KLQkgKiAKLQkgKiBAc2VlIElGZWF0dXJlUmVmZXJlbmNlI3NldFVSTChVUkwpCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUkwoVVJMIHVybCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCXNldFVSTFN0cmluZyh1cmwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl0cnkgewotCQkJCXJlc29sdmUodXJsLCBudWxsKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkZlYXR1cmVSZWZlcmVuY2UuVW5hYmxlVG9SZXNvbHZlVVJMIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsJLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlcyBhIHNpdGUgd2l0aCB0aGUgZmVhdHVyZSByZWZlcmVuY2UuCi0JICogVGhpcyBpcyB0eXBpY2FsbHkgcGVyZm9ybWVkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUgcmVmZXJlbmNlIGNyZWF0aW9uCi0JICogb3BlcmF0aW9uLiBPbmNlIHNldCwgdGhlIHNpdGUgc2hvdWxkIG5vdCBiZSByZXNldC4KLQkgKiAKLQkgKiBAc2VlIElGZWF0dXJlUmVmZXJlbmNlI3NldFNpdGUoSVNpdGUpCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHsKLQkJc2V0U2l0ZU1vZGVsKChTaXRlTW9kZWwpIHNpdGUpOwotCX0KLQotCS8qKgotCSogUmV0dXJucyB0aGUgZmVhdHVyZSBpZGVudGlmaWVyLgotCSogCi0JKiBAc2VlIElGZWF0dXJlUmVmZXJlbmNlI2dldFZlcnNpb25lZElkZW50aWZpZXIoKQotCSogQHNpbmNlIDIuMAotCSovCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHsKLQotCQlpZiAodmVyc2lvbklkICE9IG51bGwpCi0JCQlyZXR1cm4gdmVyc2lvbklkOwotCi0JCVN0cmluZyBpZCA9IGdldEZlYXR1cmVJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyB2ZXIgPSBnZXRGZWF0dXJlVmVyc2lvbigpOwotCQlpZiAoaWQgIT0gbnVsbCAmJiB2ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl2ZXJzaW9uSWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwgdmVyKTsKLQkJCQlyZXR1cm4gdmVyc2lvbklkOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgdmVyc2lvbmVkIGlkZW50aWZpZXI6IiArIGlkICsgIjoiICsgdmVyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQkvLyB3ZSBuZWVkIHRoZSBleGFjdCBtYXRjaCBvciB3ZSBtYXkgaGF2ZSBhbiBpbmZpbml0ZSBsb29wCi0JCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIG51bGwpOwotCQl0cnkgewotCQkJdmVyc2lvbklkID0gZ2V0RmVhdHVyZShudWxsKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB2ZXJzaW9uSWQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChzdXBlci5nZXRMYWJlbCgpICE9IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIuZ2V0TGFiZWwoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGZWF0dXJlKG51bGwpLmdldExhYmVsKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJaWYgKHN1cGVyLmdldE9TKCkgPT0gbnVsbCAmJiBnZXRVUkwoKSE9bnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldEZlYXR1cmUobnVsbCkuZ2V0T1MoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0T1MoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgb3B0aW9uYWwgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlpZiAoc3VwZXIuZ2V0V1MoKSA9PSBudWxsICYmIGdldFVSTCgpIT1udWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5nZXRXUygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCXJldHVybiBzdXBlci5nZXRXUygpOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCkgewotCQlpZiAoc3VwZXIuZ2V0T1NBcmNoKCkgPT0gbnVsbCAmJiBnZXRVUkwoKSE9bnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldEZlYXR1cmUobnVsbCkuZ2V0T1NBcmNoKCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJcmV0dXJuIHN1cGVyLmdldE9TQXJjaCgpOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgewotCQlpZiAoc3VwZXIuZ2V0TkwoKSA9PSBudWxsICYmIGdldFVSTCgpIT1udWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5nZXROTCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCXJldHVybiBzdXBlci5nZXROTCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmZWF0dXJlIGlzIHBhdGNoaW5nIGFub3RoZXIgZmVhdHVyZSwKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsKLQkJaWYgKHN1cGVyLmdldFBhdGNoKCkgPT0gbnVsbCkKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGdldEZlYXR1cmUobnVsbCkuaXNQYXRjaCgpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQlyZXR1cm4gInRydWUiLmVxdWFsc0lnbm9yZUNhc2Uoc3VwZXIuZ2V0UGF0Y2goKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUFyY2hpdmVSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUFyY2hpdmVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3NzdjNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lBcmNoaXZlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFNpdGUgYXJjaGl2ZSBpbnRlcmZhY2UuCi0gKiBTaXRlIGFyY2hpdmUgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhIHBhY2thZ2VkIGFyY2hpdmUgKGZpbGUpIGxvY2F0ZWQKLSAqIG9uIGFuIHVwZGF0ZSBzaXRlLiBJdCBhbGxvd3MgYSAic3ltYm9saWMiIHBhdGggdXNlZCB0byBpZGVudGlmeQotICogYSBwbHVnLWluIG9yIG5vbi1wbHVnLWluIGZlYXR1cmUgZW50cnkgdG8gYmUgZXhwbGljaXRseSBtYXBwZWQKLSAqIHRvIGEgc3BlY2lmaWMgVVJMLiAKLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIAotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgCi0gKiBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5BcmNoaXZlUmVmZXJlbmNlCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUFyY2hpdmVSZWZlcmVuY2UgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCS8qKiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhcmNoaXZlICJzeW1ib2xpYyIgcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOwotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIHNpdGUgYXJjaGl2ZSBVUkwgCi0JICogCi0JICogQHJldHVybiB0aGUgYXJjaGl2ZSBVUkwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUNhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZjQ2NDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlIGNhdGVnb3J5IGRlZmluaXRpb24uDQotICogQSBzaXRlIGNhbiBvcmdhbml6ZSBpdHMgZmVhdHVyZXMgaW50byBjYXRlZ29yaWVzLiBDYXRlZ29yaWVzDQotICogY2FuIGJlIGZ1cnRoZXIgb3JnYW5pemVkIGludG8gaGllcmFyY2hpZXMuIEVhY2ggY2F0ZWdvcnkgbmFtZQ0KLSAqIGlzIGEgY29tcG9zZWQgb2YgdGhlIG5hbWUgb2YgaXRzIHBhcmVudCBhbmQgYSBzaW1wbGUgaWRlbnRpZmllcg0KLSAqIHNlcGFyYXRlZCBieSBhIHNsYXNoICgiLyIpLiBGb3IgZXhhbXBsZSA8Y29kZT50b29scy91dGlsaXRpZXMvcHJpbnQ8L2NvZGU+DQotICogZGVmaW5lcyBhIGNhdGVnb3J5IHRoYXQgaXMgYSBjaGlsZCBvZiA8Y29kZT50b29scy91dGlsaXRpZXM8L2NvZGU+IGFuZA0KLSAqIGdyYW5kY2hpbGQgb2YgPGNvZGU+dG9vbHM8L2NvZGU+Lg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNhdGVnb3J5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGVnb3J5ICBleHRlbmRzIElBZGFwdGFibGV7DQotDQotCS8qKiANCi0JICogUmV0cmlldmUgdGhlIG5hbWUgb2YgdGhlIGNhdGVnb3J5LiBUaGUgbmFtZSBjYW4gYmUgYSBzaW1wbGUNCi0JICogdG9rZW4gKHJvb3QgY2F0ZWdvcnkpIG9yIGEgbnVtYmVyIG9mIHNsYXNoLXNlcGFyYXRlZCAoIi8iKSANCi0JICogdG9rZW5zLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgY2F0ZWdvcnkgbmFtZQ0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBjYXRlZ29yeQ0KLQkgKiANCi0JICogQHJldHVybiBkaXNwbGF5YWJsZSBjYXRlZ29yeSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsNCi0NCi0JLyoqIA0KLQkgKiBSZXRyaWV2ZSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZGVzY3JpcHRpb24NCi0JICogDQotCSAqIEByZXR1cm4gY2F0ZWdvcnkgZGVzY3JpcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldERlc2NyaXB0aW9uKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNWJmNGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogR2VuZXJpYyBjb250ZW50IGNvbnN1bWVyLg0KLSAqIEEgZ2VuZXJpYyBjb250ZW50IGNvbnN1bWVyIGlzIHVzZWQgdG8gc3RvcmUgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gZmlsZXMNCi0gKiBmb3IgYSBmZWF0dXJlLg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIA0KLSAqIHdpbGwgb25seSB1c2UgdGhlIGNvbnRlbnQgY29uc3VtZXIgcHJvdmlkZWQgYnkgdGhlIGZlYXR1cmUgdHlwZShzKQ0KLSAqIGltcGxlbWVudGVkIGJ5IHRoZSBwbGF0Zm9ybS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50Q29uc3VtZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJQ29udGVudENvbnN1bWVyIHsNCi0NCi0JLyoqDQotCSAqIFN0b3JlcyBhIGZpbGUuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI29wZW4oSVBsdWdpbkVudHJ5KQ0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI29wZW4oSU5vblBsdWdpbkVudHJ5KQ0KLQkgKiBAcGFyYW0gY29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UgdG8gdGhlIGZpbGUgdG8gc3RvcmUNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgdGhlIHN0b3JlIG9wZXJhdGlvbnMgZm9yIHRoaXMNCi0JICogY29uc3VtZXINCi0JICogDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxN2NiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogRmVhdHVyZSBkZWZpbmVzIHRoZSBwYWNrYWdpbmcgImNvbnRhaW5lciIgZm9yIGEgZ3JvdXAgb2YgcmVsYXRlZCBwbHVnLWlucywNCi0gKiBwbHVnLWluIGZyYWdtZW50cywgYW5kIG9wdGlvbmFsbHkgbm9uLXBsdWctaW4gZmlsZXMuIA0KLSAqIDxwPg0KLSAqIEZlYXR1cmVzIGFyZSB0cmVhdGVkIHB1cmVseSBhcyBhbiBpbnN0YWxsYXRpb24gYW5kIHBhY2thZ2luZyBjb25zdHJ1Y3QuIA0KLSAqIFRoZXkgZG8gbm90IHBsYXkgYSByb2xlIGR1cmluZyBFY2xpcHNlIHBsdWctaW4gZXhlY3V0aW9uLg0KLSAqIFRoZXkgYXJlIHNpbXBseSBhbiBpbmNsdXNpdmUgIm1hbmlmZXN0IiBvZiB0aGUgcGx1Zy1pbnMsIGZyYWdtZW50cyANCi0gKiBhbmQgb3RoZXIgZmlsZXMgdGhhdCBtYWtlIHVwIHRoYXQgZmVhdHVyZS4gSWYgZmVhdHVyZXMgYXJlIGxvZ2ljYWxseSBtYWRlIA0KLSAqIHVwIG9mIHBsdWctaW5zIGZyb20gInN1Yi1mZWF0dXJlcyIsIHRoZSB0b3AtbGV2ZWwgZmVhdHVyZSAibWFuaWZlc3QiDQotICogbXVzdCBiZSBmdWxseSByZXNvbHZlZCBhdCBwYWNrYWdpbmcgdGltZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIA0KLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIA0KLSAqIGludGVyZmFjZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlIGV4dGVuZHMgSUFkYXB0YWJsZSwgSVBsYXRmb3JtRW52aXJvbm1lbnQgew0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgJ2hhcHB5JyBmZWF0dXJlDQotCSAqIEEgZmVhdHVyZSBpcyBjb25zaWRlcmVkIHRvIGJlICdoYXBweScgaW4gdGhlIGNvbnRleHQgb2YgYSBsb2NhbCBzaXRlDQotCSAqIGlmIGFsbCB0aGUgcGx1Zy1pbnMgcmVmZXJlbmNlZCBieSB0aGUgZmVhdHVyZSBhcmUgaW5zdGFsbGVkIG9uIHRoZSBzaXRlIGFuZCBubyBvdGhlcg0KLQkgKiB2ZXJzaW9uIG9mIGFueSBvZiB0aGUgcGx1Zy1pbnMgYXJlIGluc3RhbGxlZCBvbiBhbnkgb3RoZXIgc2l0ZSBvZiB0aGUgbG9jYWwgc2l0ZS4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlI2dldEJyb2tlblN0YXR1cyhJRmVhdHVyZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0hBUFBZID0gMDsNCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyBhICdoYXBweScgZmVhdHVyZQ0KLQkgKiBBIGZlYXR1cmUgaXMgY29uc2lkZXJlZCB0byBiZSAnYW1iaWd1b3VzJyBpbiB0aGUgY29udGV4dCBvZiBhIGxvY2FsIHNpdGUNCi0JICogaWYgYWxsIHRoZSBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoZSBmZWF0dXJlIGFyZSBpbnN0YWxsZWQgb24gdGhlIHNpdGUgYW5kIG90aGVyDQotCSAqIHZlcnNpb24gb2YgYW55IG9mIHRoZSBwbHVnLWlucyBhcmUgaW5zdGFsbGVkIG9uIGFueSBvdGhlciBzaXRlIG9mIHRoZSBsb2NhbCBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGUjZ2V0QnJva2VuU3RhdHVzKElGZWF0dXJlKQ0KLQkgKi8JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19BTUJJR1VPVVMgPSAxOw0KLQkNCi0JLyoqDQotCSAqIEluZGljYXRlcyBhbiAndW5oYXBweScgZmVhdHVyZQ0KLQkgKiBBIGZlYXR1cmUgaXMgY29uc2lkZXJlZCB0byBiZSAndW5oYXBweScgaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBzaXRlLA0KLQkgKiBpZiBzb21lIG9mIHRoZSBwbHVnLWlucyByZWZlcmVuY2VkIGJ5IHRoZSBmZWF0dXJlIGFyZSBub3QgaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZS4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlI2dldEJyb2tlblN0YXR1cyhJRmVhdHVyZSkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19VTkhBUFBZID0gMjsNCi0JDQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIGEgZGlzYWJsZSBmZWF0dXJlDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZSNnZXRCcm9rZW5TdGF0dXMoSUZlYXR1cmUpDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19ESVNBQkxFRCA9IC0xOw0KLQkJDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgdGhlIG9uZS1jbGljayB1cGRhdGUgd2lsbCBzZWFyY2ggdGhlIA0KLQkgKiBsb2NhdGlvbiBvZiB0aGUgbmVzdGluZyByb290IGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wLjENCi0JICovCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRUFSQ0hfTE9DQVRJT05fREVGQVVMVCA9IDA7CQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHRoZSBvbmUtY2xpY2sgdXBkYXRlIHdpbGwgc2VhcmNoIHRoZSANCi0JICogbG9jYXRpb24gZGVmaW5lZCBieSB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEBzaW5jZSAyLjAuMQ0KLQkgKi8JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFQVJDSF9MT0NBVElPTl9GRUFUVVJFID0gMTsJDQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgdGhlIG9uZS1jbGljayB1cGRhdGUgd2lsbCBzZWFyY2ggYm90aCB0aGUgDQotCSAqIGxvY2F0aW9uIG9mIHRoZSBuZXN0aW5nIHJvb3QgZmVhdHVyZSBhbmQgdGhlIA0KLQkgKiBsb2NhdGlvbiBkZWZpbmVkIGJ5IHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHNpbmNlIDIuMC4xDQotCSAqLwkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIX0xPQ0FUSU9OX0JPVEggPSAyOwkNCi0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIHRoaXMgZmVhdHVyZSBpcyBhc3NvY2lhdGVkIHdpdGguDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBzaXRlIGZvciB0aGlzIGZlYXR1cmUNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBvZiB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIFVSTC4NCi0JICogVGhpcyBpcyB0aGUgVVJMIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBmZWF0dXJlLiBUaGUgaW50ZXJwcmV0YXRpb24NCi0JICogb2YgdGhlIFVSTCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmNyZXRlIGZlYXR1cmUgaW1wbGVtZW50YXRpb24uICAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgVVJMDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBlbnRyeSByZWZlcmVuY2luZyB0aGUgbG9jYXRpb24gb2YgdGhlDQotCSAqIGZlYXR1cmUgdXBkYXRlIHNpdGUuIFRoZSB1cGRhdGUgc2l0ZSBjYW4gYmUgYWNjZXNzZWQgdG8gb2J0YWluDQotCSAqIGZlYXR1cmUgdXBkYXRlcyBmb3IgdGhpcyBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiB1cGRhdGUgc2l0ZSBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldFVwZGF0ZVNpdGVFbnRyeSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIGluZm9ybWF0aW9uIGVudHJpZXMgcmVmZXJlbmNpbmcgbG9jYXRpb25zIG9mIG90aGVyDQotCSAqIHVwZGF0ZSBzaXRlcy4gVGhpcyBtZWNoYW5pc20gY2FuIGJlIHVzZWQgYnkgZmVhdHVyZXMgdG8gZGlzdHJpYnV0ZQ0KLQkgKiBsb2NhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBnZW5lcmFsIHVwZGF0ZSBzaXRlcyB0byBjbGllbnRzLg0KLQkgKiANCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBzaXRlIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeVtdIGdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgZGlzcGxheWFibGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBwcm92aWRlciBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuZCBvcHRpb25hbCBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGVudHJ5Lg0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YWxsIGhhbmRsZXIgZW50cnksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmDQotCSAqIG5vbmUgd2FzIHNwZWNpZmllZA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUluc3RhbGxIYW5kbGVyRW50cnkgZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSByZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldERlc2NyaXB0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBjb3B5cmlnaHQgaW5mb3JtYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXRDb3B5cmlnaHQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGxpY2Vuc2UgaW5mb3JtYXRpb24gZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGxpY2Vuc2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXRMaWNlbnNlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gb3B0aW9uYWwgaW1hZ2UgZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgVVJMIHBvaW50aW5nIHRvIHRoZSBpbWFnZSwgLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0SW1hZ2UoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybiBhIGxpc3Qgb2YgcGx1Zy1pbiBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgZmVhdHVyZS4gQSBwbHVnLWluDQotCSAqIGRlcGVuZGVuY3kgaXMgYSByZWZlcmVuY2UgdG8gYSBwbHVnLWluIHJlcXVpcmVkIGZvciBmZWF0dXJlIGV4ZWN1dGlvbg0KLQkgKiB0aGF0IGlzIG5vdCBwYWNrYWdlZCBhcyBwYXJ0IG9mIHRoZSBmZWF0dXJlLg0KLQkgKiBmaWx0ZXJlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgd2luZG93aW5nIHN5c3RlbSBhbmQgYXJjaGl0ZWN0dXJlIHN5c3RlbQ0KLQkgKiBzZXQgaW4gPGNvZGU+U2l0ZW1hbmFnZXI8L2NvZGU+DQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJlcXVpcmVkIHBsdWctaW4gZGVwZW5kZW5jaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJSW1wb3J0W10gZ2V0SW1wb3J0cygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwbHVnLWluIGRlcGVuZGVuY2llcyBmb3IgdGhpcyBmZWF0dXJlLiBBIHBsdWctaW4NCi0JICogZGVwZW5kZW5jeSBpcyBhIHJlZmVyZW5jZSB0byBhIHBsdWctaW4gcmVxdWlyZWQgZm9yIGZlYXR1cmUgZXhlY3V0aW9uDQotCSAqIHRoYXQgaXMgbm90IHBhY2thZ2VkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUuDQotIAkgKiBObyBmaWx0ZXJpbmcgb2NjdXJzDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJlcXVpcmVkIHBsdWctaW4gZGVwZW5kZW5jaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIElJbXBvcnRbXSBnZXRSYXdJbXBvcnRzKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJuIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcmltYXJ5IHBsdWdpbiBhc3NvY2lhdGVkIHRvIHRoaXMgZmVhdHVyZQ0KLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBub3QgYSBwcmltYXJ5IGZlYXR1cmUuDQotCSAqIElmIHRoZSBwcmltYXJ5IHBsdWdpbiBpZCBpcyBub3Qgc3BlY2lmaWVkIGFuZCB0aGUgZmVhdHVyZSBpcyBhIHByaW1hcnkNCi0JICogZmVhdHVyZSwgcmV0dXJucyB0aGUgZmVhdHVyZSBpZGVudGlmaWVyLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgaWRlbnRpZmllciBvZiB0aGUgYXNzb2NpYXRlZCBwcmltYXJ5IHBsdWdpbiBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4xIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5UGx1Z2luSUQoKTsNCi0NCi0NCi0JLyoqDQotCSAqIEluc3RhbGwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmVhdHVyZSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZlYXR1cmUuDQotCSAqIEFsbCBvcHRpb25hbCBmZWF0dXJlcyB3aWxsIGJlIGluc3RhbGxlZA0KLQkgKiANCi0JICogQHBhcmFtIHRhcmdldEZlYXR1cmUNCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBpbnN0YWxsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgNCi0JCUlGZWF0dXJlIHRhcmdldEZlYXR1cmUsDQotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsDQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIEluc3RhbGwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmVhdHVyZSBpbnRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZlYXR1cmUuDQotCSAqIE9ubHkgdGhlIGxpc3RlZCBvcHRpb25hbCBmZWF0dXJlcyB3aWxsIGJlIGluc3RhbGxlZC4NCi0JICogDQotCSAqIEBwYXJhbSB0YXJnZXRGZWF0dXJlDQotCSAqIEBwYXJhbSBvcHRpb25hbEZlYXR1cmVzIHRoZSBvcHRpb25hbCBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQNCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyDQotCSAqIEBwYXJhbSBtb25pdG9yDQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBpbnN0YWxsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wLjENCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKA0KLQkJSUZlYXR1cmUgdGFyZ2V0RmVhdHVyZSwNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcywNCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwNCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbixDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMgaW5jbHVkZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIGZpbHRlcmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB3aW5kb3dpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUgc3lzdGVtDQotCSAqIHNldCBpbiA8Y29kZT5TaXRlbWFuYWdlcjwvY29kZT4NCi0JICogDQotCSAqIEByZXR1cm4gYW4gZXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlcyBpbmNsdWRlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogTm8gZmlsdGVyaW5nIG9jY3Vycw0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBlbnRyaWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIGZpbHRlcmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB3aW5kb3dpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUgc3lzdGVtDQotCSAqIHNldCBpbiA8Y29kZT5TaXRlbWFuYWdlcjwvY29kZT4NCi0JICogDQotCSAqIEByZXR1cm4gYW4gZXJyYXkgb2YgcGx1Zy1pbiBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBlbnRyaWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIE5vIGZpbHRlcmluZyBvY2N1cnMNCi0JICogDQotCSAqIEByZXR1cm4gYW4gZXJyYXkgb2YgcGx1Zy1pbiBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFJhd1BsdWdpbkVudHJpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvdW50IG9mIHJlZmVyZW5jZWQgcGx1Zy1pbiBlbnRyaWVzLg0KLQkgKiANCi0JICogQHJldHVybiBwbHVnLWluIGVudHJ5IGNvdW50DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBub24tcGx1Zy1pbiBlbnRyaWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlDQotCSAqIGZpbHRlcmVkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtLCB3aW5kb3dpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUgc3lzdGVtDQotCSAqIHNldCBpbiA8Y29kZT5TaXRlbWFuYWdlcjwvY29kZT4NCi0JICogDQotCSAqIEByZXR1cm4gYW4gZXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJTm9uUGx1Z2luRW50cnlbXSBnZXROb25QbHVnaW5FbnRyaWVzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1wbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogTm8gZmlsdGVyaW5nIG9jY3Vycw0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBub24tcGx1Zy1pbiBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldFJhd05vblBsdWdpbkVudHJpZXMoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvdW50IG9mIHJlZmVyZW5jZWQgbm9uLXBsdWctaW4gZW50cmllcy4NCi0JICogDQotCSAqIEByZXR1cm4gbm9uLXBsdWctaW4gZW50cnkgY291bnQNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGludCBnZXROb25QbHVnaW5FbnRyeUNvdW50KCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkb3dubG9hZCBzaXplIG9mIHRoZSBmZWF0dXJlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEByZXR1cm4gZG93bmxvYWQgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsI1VOS05PV05fU0laRQ0KLQkgKiBAcmV0dXJuIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpOw0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZlYXR1cmUgY2FuIGJlIHVzZWQgYXMgYSBwcmltYXJ5IGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSBwcmltYXJ5IGZlYXR1cmUsIA0KLQkgKiBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnkoKTsNCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmVhdHVyZSBtdXN0IGJlIHByb2Nlc3NlZCBhbG9uZSBkdXJpbmcgaW5zdGFsbGF0aW9uDQotCSAqIGFuZCBjb25maWd1cmF0aW9uLiBGZWF0dXJlcyB0aGF0IGFyZSBub3QgZXhjbHVzaXZlIGNhbiBiZSBpbnN0YWxsZWQgaW4gYQ0KLQkgKiBiYXRjaC4NCi0JICogDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmVhdHVyZSByZXF1aXJlcyBleGNsdXNpdmUgcHJvY2Vzc2luZywNCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdXNpdmUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiBhbiBhcHBsaWNhdGlvbiB0byBiZSB1c2VkIHdoZW4NCi0JICogc3RhcnRpbmcgdXAgdGhlIHBsYXRmb3JtIHdpdGggdGhpcyBmZWF0dXJlIGFzIHRoZSBwcmltYXJ5IGZlYXR1cmUuDQotCSAqIFRoZSBhcHBsaWNhdGlvbiBpZGVudGlmaWVyIG11c3QgcmVwcmVzZW50IGEgdmFsaWQgYXBwbGljYXRpb24gcmVnaXN0ZXJlZA0KLQkgKiBpbiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9uczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Lg0KLQkgKiANCi0JICogQHJldHVybiBhcHBsaWNhdGlvbiBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiBhIGNvbG9jYXRpb24gYWZmaW5pdHkgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBZmZpbml0eUZlYXR1cmUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoaXMgZmVhdHVyZS4gQSBjb250ZW50IHByb3ZpZGVyDQotCSAqIGlzIGFuIGFic3RyYWN0aW9uIG9mIGVhY2ggZmVhdHVyZSBpbnRlcm5hbCBwYWNrYWdpbmcgc3RydWN0dXJlLg0KLQkgKiBJdCBhbGxvd3MgdGhlIGZlYXR1cmUgY29udGVudCB0byBiZSBhY2Nlc3NlZCBpbiBhIHN0YW5kYXJkIHdheQ0KLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBpbnRlcm5hbCBwYWNrYWdpbmcuIEFsbCBjb25jcmV0ZSBmZWF0dXJlcw0KLQkgKiBuZWVkIHRvIGJlIGFibGUgdG8gcmV0dXJuIGEgY29udGVudCBwcm92aWRlci4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgY29uc3VtZXIgZm9yIHRoaXMgZmVhdHVyZS4gQSBjb250ZW50IGNvbnN1bWVyDQotCSAqIGlzIGFuIGFic3RyYWN0aW9uIG9mIGVhY2ggZmVhdHVyZSBpbnRlcm5hbCBwYWNrYWdpbmcgbWVjaGFuaXNtLg0KLQkgKiBJdCBhbGxvd3MgY29udGVudCB0byBiZSBzdG9yZWQgaW50byBhIGZlYXR1cmUgaW4gYSBzdGFuZGFyZCB3YXkNCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgcGFja2FnaW5nIG1lY2hhbmlzbSB1c2VkLiBPbmx5IGNvbmNyZXRlIGZlYXR1cmVzDQotCSAqIHRoYXQgc3VwcG9ydCBzdG9yaW5nIG5lZWQgdG8gaW1wbGVtZW50IGEgY29udGVudCBjb25zdW1lci4gVGhlIHBsYXRmb3JtDQotCSAqIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGZlYXR1cmUgdHlwZSBzdXBwb3J0aW5nIGNvbnRlbnQgY29uc3VtZXIuDQotCSAqIFRoaXMgaXMgdGhlIGZlYXR1cmUgdHlwZSByZXByZXNlbnRpbmcgYSBsb2NhbGx5LWluc3RhbGxlZA0KLQkgKiBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIGNvbnRlbnQgY29uc3VtZXINCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBleGNlcHRpb24gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBzaXRlIGZvciB0aGlzIGZlYXR1cmUuIFRoaXMgaXMgdHlwaWNhbGx5IHBlcmZvcm1lZCBhcyBwYXJ0DQotCSAqIG9mIHRoZSBmZWF0dXJlIGNyZWF0aW9uIG9wZXJhdGlvbi4gT25jZSBzZXQsIHRoZSBzaXRlDQotCSAqIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2l0ZSB0aGUgc2l0ZQ0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gc2l0ZSBmb3IgdGhpcyBmZWF0dXJlIGlzIGFscmVhZHkgc2V0DQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhpcyBmZWF0dXJlLiBUaGlzIGlzIHR5cGljYWxseQ0KLQkgKiBwZXJmb3JtZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZSBjcmVhdGlvbiBvcGVyYXRpb24uIE9uY2Ugc2V0LCB0aGUgDQotCSAqIHByb3ZpZGVyIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZUNvbnRlbnRQcm92aWRlciBjb250ZW50IHByb3ZpZGVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZmVhdHVyZUNvbnRlbnRQcm92aWRlcik7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmVhdHVyZSBpcyBwYXRjaGluZyBhbm90aGVyIGZlYXR1cmUsDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHJldHVybiBib29sZWFuDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKTsNCi0NCi0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZUNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWUzN2Y3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmVDb250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogRmVhdHVyZSBjb250ZW50IGNvbnN1bWVyLg0KLSAqIEEgZmVhdHVyZSBjb250ZW50IGNvbnN1bWVyIGlzIGFuIGFic3RyYWN0aW9uIG9mIGVhY2ggZmVhdHVyZSBpbnRlcm5hbA0KLSAqIHBhY2thZ2luZyBtZWNoYW5pc20uIEl0IGFsbG93cyBjb250ZW50IHRvIGJlIHN0b3JlZCBpbnRvIGEgZmVhdHVyZSBpbg0KLSAqIGEgc3RhbmRhcmQgd2F5IHJlZ2FyZGxlc3Mgb2YgdGhlIHBhY2thZ2luZyBtZWNoYW5pc20gdXNlZC4gT25seSBjb25jcmV0ZQ0KLSAqIGZlYXR1cmVzIHRoYXQgc3VwcG9ydCBzdG9yaW5nIG5lZWQgdG8gaW1wbGVtZW50IGEgY29udGVudCBjb25zdW1lci4gDQotICogVGhlIHBsYXRmb3JtIGltcGxlbWVudHMgYXQgbGVhc3Qgb25lIGZlYXR1cmUgdHlwZSBzdXBwb3J0aW5nIGNvbnRlbnQNCi0gKiBjb25zdW1lci4gVGhpcyBpcyB0aGUgZmVhdHVyZSB0eXBlIHJlcHJlc2VudGluZyBhIGxvY2FsbHktaW5zdGFsbGVkDQotICogZmVhdHVyZS4NCi0gKiA8cD4NCi0gKiBBIGZlYXR1cmUgY29udGVudCBjb25zdW1lciBkZWxlZ2F0ZXMgdGhlIHN0b3JhZ2Ugb2YgcGx1Zy1pbiBhbmQgDQotICogbm9uLXBsdWctaW4gZmlsZXMgdG8gYSBnZW5lcmljIGNvbnRlbnQgY29uc3VtZXIuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIA0KLSAqIHdpbGwgb25seSB1c2UgdGhlIGZlYXR1cmUgY29udGVudCBjb25zdW1lciBwcm92aWRlZCBieSB0aGUgZmVhdHVyZSB0eXBlKHMpDQotICogaW1wbGVtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JQ29udGVudENvbnN1bWVyDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgew0KLQ0KLQkNCi0JLyoqDQotCSAqIFN0b3JlIGEgZmVhdHVyZSBmaWxlLg0KLQkgKiBOb3RlIHRoYXQgb25seSB0aGUgZmVhdHVyZSBkZWZpbml0aW9uIGZpbGVzIHNob3VsZCBiZSBzdG9yZWQgdXNpbmcNCi0JICogdGhpcyBtZXRob2QuIFBsdWctaW4gZmlsZXMgYW5kIG5vbi1wbHVnLWluIGRhdGEgZmlsZXMgc2hvdWxkIGJlDQotCSAqIHN0b3JlZCB1c2luZyB0aGUgY29udGVudCBjb25zdW1lcnMgY29ycmVzcG9uZGluZyB0byB0aGVpciByZXNwZWN0aXZlDQotCSAqIGVudHJpZXMuDQotCSAqIA0KLQkgKiBAc2VlICNvcGVuKElQbHVnaW5FbnRyeSkNCi0JICogQHNlZSAjb3BlbihJTm9uUGx1Z2luRW50cnkpCSANCi0JICogQHBhcmFtIGNvbnRlbnRSZWZlcmVuY2UgY29udGVudCByZWZlcmVuY2UgdG8gZmVhdHVyZSBmaWxlDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBPcGVucyBhIGdlbmVyaWMgY29udGVudCBjb25zdW1lciBmb3IgdGhlIHNwZWNpZmllZCBwbHVnLWluIGVudHJ5Lg0KLQkgKiBQbHVnLWluIGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBlbnRyeSBzaG91bGQgYmUgc3RvcmVkDQotCSAqIHVzaW5nIHRoaXMgY29udGVudCBjb25zdW1lci4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyeSBwbHVnLWluIGVudHJ5DQotCSAqIEByZXR1cm4gZ2VuZXJpYyBjb250ZW50IGNvbnN1bWVyIGZvciB0aGUgZW50cnkNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBPcGVucyBhIGdlbmVyaWMgY29udGVudCBjb25zdW1lciBmb3IgdGhlIHNwZWNpZmllZCBub24tcGx1Zy1pbiBlbnRyeS4NCi0JICogTm9uLXBsdWctaW4gZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIGVudHJ5IHNob3VsZCBiZSBzdG9yZWQNCi0JICogdXNpbmcgdGhpcyBjb250ZW50IGNvbnN1bWVyLg0KLQkgKiANCi0JICogQHBhcmFtIG5vblBsdWdpbkVudHJ5IG5vbi1wbHVnLWluIGVudHJ5DQotCSAqIEByZXR1cm4gZ2VuZXJpYyBjb250ZW50IGNvbnN1bWVyIGZvciB0aGUgZW50cnkNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogQ2xvc2VzIHRoaXMgY29udGVudCBjb25zdW1lci4gVGhpcyBpbmRpY2F0ZXMgYSBzdWNjZXNzZnVsIGNvbXBsZXRpb24NCi0JICogb2YgdGhlIHN0b3JlIG9wZXJhdGlvbnMuIFRoZSBjb250ZW50IGNvbnN1bWVyIGNvbW1pdHMgYW55IGNoYW5nZXMNCi0JICogbWFkZSBieSB0aGlzIGNvbnN1bWVyLg0KLQkgKiANCi0JICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIG5ld2x5IHBvcHVsYXRlZCBmZWF0dXJlDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGNsb3NlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBDbG9zZXMgdGhpcyBjb250ZW50IGNvbnN1bWVyLCBpbmRpY2F0aW5nIHRoZSBzdG9yZSBvcGVyYXRpb25zIHNob3VsZA0KLQkgKiBiZSBhYm9ydGVkLiBUaGUgY29udGVudCBjb25zdW1lciBhdHRlbXB0cyB0byBiYWNrIG91dCBhbnkgY2hhbmdlcw0KLQkgKiBtYWRlIGJ5IHRoaXMgY29udGVudCBjb25zdW1lci4NCi0JICogDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgZm9yIHRoaXMgY29udGVudCBjb25zdW1lci4NCi0JICogSW4gZ2VuZXJhbCwgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFzIHBhcnQgb2YNCi0JICogZmVhdHVyZSBjcmVhdGlvbi4gT25jZSBzZXQsIHRoZSBmZWF0dXJlIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIGZvciB0aGlzIGNvbnRlbnQgY29uc3VtZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgZm9yIHRoaXMgY29udGVudCBjb25zdW1lci4NCi0JICoNCi0JICogQHJldHVybiB0aGUgZmVhdHVyZSBmb3IgdGhpcyBjb250ZW50IGNvbnN1bWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCk7DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBwYXJlbnQgZm9yIHRoaXMgY29udGVudCBjb25zdW1lci4NCi0JICogSW4gZ2VuZXJhbCwgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFzIHBhcnQgb2YNCi0JICogZmVhdHVyZSBjcmVhdGlvbi4gT25jZSBzZXQsIHRoZSBmZWF0dXJlIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBmZWF0dXJlIGNvbnRlbnQgY29uc3VtZXIuDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50KTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgY29udGVudCBjb25zdW1lciB0aGF0IG9wZW5lZA0KLQkgKiB0aGlzIGZlYXR1cmUgY29udGVudCBjb25zdW1lciwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogaWYgdGhpcyBmZWF0dXJlIGNvbnRlbnQgY29uc3VtZXIgaXMgYSByb290IGZlYXR1cmUNCi0JICogY29udGVudCBjb25zdW1lci4NCi0JICoNCi0JICogQHJldHVybiB0aGUgcGFyZW50IGZlYXR1cmUgY29udGVudCBjb25zdW1lciwgb3IgbnVsbC4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldFBhcmVudCgpOw0KLQ0KLQkvKioNCi0JICogTGluayB0aGUgY29udGVudCBjb25zdW1lciBvZiB0aGUgZmVhdHVyZSBhcyBhIGNoaWxkDQotCSAqIGNvbnRlbnQgY29uc3VtZXINCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBjaGlsZCBmZWF0dXJlLg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgY29udGVudCBjb25zdW1lcnMgdGhhdA0KLQkgKiB0aGlzIGZlYXR1cmUgY29udGVudCBjb25zdW1lciBvcGVuZWQNCi0JICoNCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlIGNvbnRlbnQgY29uc3VtZXIsIG9yIGVuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSBnZXRDaGlsZHJlbigpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ODBiMGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXIuDQotICogQSBmZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXIgaXMgYW4gYWJzdHJhY3Rpb24gb2YgZWFjaCBmZWF0dXJlIGludGVybmFsIA0KLSAqIHBhY2thZ2luZyBzdHJ1Y3R1cmUuIEl0IGFsbG93cyB0aGUgZmVhdHVyZSBjb250ZW50IHRvIGJlIGFjY2Vzc2VkIGluDQotICogYSBzdGFuZGFyZCB3YXkgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJuYWwgcGFja2FnaW5nLiBBbGwgY29uY3JldGUgZmVhdHVyZQ0KLSAqIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIGltcGxlbWVudCBhIGZlYXR1cmUgY29udGVudCBwcm92aWRlci4NCi0gKiA8cD4NCi0gKiBUaGVyZSBhcmUgdHdvIHdheXMgb2YgbG9va2luZyBhdCBhIGZlYXR1cmUgY29udGVudDoNCi0gKiA8b2w+DQotICogPGxpPnRoZSAibG9naWNhbCIgdmlldywgd2hpY2ggaXMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWN0dWFsIGZpbGVzIHRoYXQNCi0gKiBtYWtlIHVwIHRoZSBmZWF0dXJlLiBUaGVzZSBpbmNsdWRlIGFueSBmaWxlcyB0aGF0IGRlc2NyaWJlIHRoZSBmZWF0dXJlDQotICogaXRzZWxmLCBmaWxlcyB0aGF0IGFyZSB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHJlZmVyZW5jZWQgcGx1Zy1pbnMsDQotICogYW5kIGZpbGVzIHRoYXQgYXJlIHRoZSBub24tcGx1Zy1pbiBkYXRhIGZpbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmVhdHVyZQ0KLSAqIDxsaT50aGUgInBhY2thZ2VkIiB2aWV3LCB3aGljaCBpcyBhIHNldCBvZiByZWxhdGVkIGFyY2hpdmUgZmlsZXMgdGhhdA0KLSAqIGNvbnRhaW4gdGhlICJsb2dpY2FsIiBmaWxlcy4NCi0gKiA8L29sPg0KLSAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBhIGZlYXR1cmUgY29udGVudCBwcm92aWRlciB0byBtYW5hZ2UgdGhlDQotICogbWFwcGluZyBiZXR3ZWVuIHRoZSAicGFja2FnZWQiIGFuZCAibG9naWNhbCIgdmlld3MuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHVybC4gDQotCSAqIFRoZSBleGFjdCBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIFVSTCBpcyBzcGVjaWZpYyB0byBlYWNoIGNvbnRlbnQNCi0JICogcHJvdmlkZXIuIFR5cGljYWxseSwgdGhlIFVSTCBpcyBhIHJlZmVyZW5jZSB0byBhIGZpbGUgdGhhdCBjYW4gYmUgDQotCSAqIHVzZWQgZGlyZWN0bHksIG9yIGluZGlyZWN0bHksIHRvIGRldGVybWluZSB0aGUgY29udGVudCBvZiB0aGUgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSB1cmwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBjb250ZW50IHJlZmVyZW5jZSB0byB0aGUgZmVhdHVyZSBtYW5pZmVzdC4gVGhlIGZlYXR1cmUgbWFuaWZlc3QNCi0JICogaXMgYW4geG1sIGZpbGUsIHdob3NlIGZvcm1hdCBpcyBzcGVjaWZpZWQgYnkgdGhlIHBsYXRmb3JtLiBUeXBpY2FsbHkNCi0JICogYSBmZWF0dXJlIHdpbGwgY29udGFpbiB0aGUgbWFuaWZlc3QgYXMgb25lIG9mIHRoZSBwYWNrYWdlZCBmaWxlcy4NCi0JICogRm9yIGZlYXR1cmVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIG1hbmlmZXN0LCBvciBjb250YWluIGEgbWFuaWZlc3QNCi0JICogdGhhdCBkb2VzIG5vdCBmb2xsb3cgdGhlIHNwZWNpZmllZCBmb3JtYXQsIHRoaXMgbWV0aG9kIHJldHVybnMNCi0JICogYSByZWZlcmVuY2UgdG8gYSBjb21wdXRlZCBtYW5pZmVzdCBpbiB0aGUgYXBwcm9wcmlhdGUgcGxhdGZvcm0NCi0JICogZm9ybWF0Lg0KLQkgKiANCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEByZXR1cm4gZmVhdHVyZSBtYW5pZmVzdCByZWZlcmVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYW5pZmVzdCBjYW5ub3QgYmUgZm91bmQuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbnRlbnQgcmVmZXJlbmNlcyBvZiBhbGwgdGhlICJwYWNrYWdlZCINCi0JICogYXJjaGl2ZXMgdGhhdCBtYWtlIHVwIHRoaXMgZmVhdHVyZS4gDQotCSAqIDxwPg0KLQkgKiBUaGUgbnVtYmVyIG9mIHJldHVybmVkIHJlZmVyZW5jZXMgaXMgZGVwZW5kZW50IG9uIGVhY2ggZmVhdHVyZSANCi0JICogY29udGVudCBwcm92aWRlciAoaS5lIGlzIGRlcGVuZGVudCBvbiB0aGUgcGFja2FnaW5nIG1lY2hhbmlzbSB1c2VkDQotCSAqIGJ5IHRoZSBwYXJ0aWN1bGFyIGZlYXR1cmUgdHlwZSkuDQotCSAqIDwvcD4NCi0JICogDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlZmVyZW5jZXMNCi0JICogYXJlIGZvdW5kDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbnRlbnQgcmVmZXJlbmNlcyBvZiB0aGUgInBhY2thZ2VkIg0KLQkgKiBhcmNoaXZlcyB0aGF0IGNvbnRhaW4gdGhlIGZlYXR1cmUgZGVzY3JpcHRpdmUgaW5mb3JtYXRpb24uDQotCSAqIDxwPg0KLQkgKiBJbiBnZW5lcmFsLCB0aGUgZmVhdHVyZSBkZXNjcmlwdGl2ZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgcGFja2FnZWQNCi0JICogc2VwYXJhdGVseSBmcm9tIHRoZSAiYnVsayIgb2YgdGhlIGFjdHVhbCBmZWF0dXJlIGNvbnRlbnQuDQotCSAqIFRoZSBmZWF0dXJlIGVudHJ5IGFyY2hpdmUocykgbXVzdCBiZSBkb3dubG9hZGVkIGZyb20gYW4gdXBkYXRlDQotCSAqIHNpdGUgaW4gb3JkZXIgdG8gcHJlc2VudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmVhdHVyZSB0byB0aGUNCi0JICogY2xpZW50LiBDb25zZXF1ZW50bHksIGtlZXBpbmcgdGhlIG51bWJlciBhbmQgc2l6ZSBvZiB0aGUgZmVhdHVyZQ0KLQkgKiBlbnRyeSBhcmNoaXZlKHMpIHRvIGEgbWluaW11bSB3aWxsIHNwZWVkIHVwIHRoZSByZXNwb25zaXZlbmVzcyBvZiB0aGUNCi0JICogdXNlciBpbnRlcmZhY2UuDQotCSAqIDwvcD4NCi0JICogPHA+DQotCSAqIFRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVmZXJlbmNlcyBpcyBkZXBlbmRlbnQgb24gZWFjaCBmZWF0dXJlDQotCSAqIGNvbnRlbnQgcHJvdmlkZXIgKGkuZSBpcyBkZXBlbmRlbnQgb24gdGhlIHBhY2thZ2luZyBtZWNoYW5pc20gdXNlZA0KLQkgKiBieSB0aGUgcGFydGljdWxhciBmZWF0dXJlIHR5cGUpLg0KLQkgKiA8L3A+DQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yKQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyByZWZlcmVuY2VzDQotCSAqIGFyZSBmb3VuZA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBjb250ZW50IHJlZmVyZW5jZXMgb2YgdGhlICJwYWNrYWdlZCINCi0JICogYXJjaGl2ZXMgdGhhdCBjb250YWluIHRoZSBmaWxlcyBmb3IgdGhlIHNwZWNpZmllZCBwbHVnLWluIGVudHJ5Lg0KLQkgKiA8cD4NCi0JICogVGhlIG51bWJlciBvZiByZXR1cm5lZCByZWZlcmVuY2VzIGlzIGRlcGVuZGVudCBvbiBlYWNoIGZlYXR1cmUNCi0JICogY29udGVudCBwcm92aWRlciAoaS5lIGlzIGRlcGVuZGVudCBvbiB0aGUgcGFja2FnaW5nIG1lY2hhbmlzbSB1c2VkDQotCSAqIGJ5IHRoZSBwYXJ0aWN1bGFyIGZlYXR1cmUgdHlwZSkuDQotCSAqIDwvcD4NCi0JICogDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhJUGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yKQ0KLQkgKiBAcGFyYW0gcGx1Z2luRW50cnkgcGx1Zy1pbiBlbnRyeQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyByZWZlcmVuY2VzDQotCSAqIGFyZSBmb3VuZA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygNCi0JCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY29udGVudCByZWZlcmVuY2VzIG9mIHRoZSAicGFja2FnZWQiDQotCSAqIGFyY2hpdmVzIHRoYXQgY29udGFpbiB0aGUgZmlsZXMgZm9yIHRoZSBzcGVjaWZpZWQgbm9uLXBsdWctaW4gZW50cnkuDQotCSAqIDxwPg0KLQkgKiBUaGUgbnVtYmVyIG9mIHJldHVybmVkIHJlZmVyZW5jZXMgaXMgZGVwZW5kZW50IG9uIGVhY2ggZmVhdHVyZQ0KLQkgKiBjb250ZW50IHByb3ZpZGVyIChpLmUgaXMgZGVwZW5kZW50IG9uIHRoZSBwYWNrYWdpbmcgbWVjaGFuaXNtIHVzZWQNCi0JICogYnkgdGhlIHBhcnRpY3VsYXIgZmVhdHVyZSB0eXBlKS4NCi0JICogPC9wPg0KLQkgKiA8cD4NCi0JICogTm90ZSwgdGhhdCB0aGUgcGxhdGZvcm0gZG9lcyBub3QgaW50ZXJwcmV0IG5vbi1wbHVnLWluIGVudHJpZXMgaW4gYW55IA0KLQkgKiB3YXksIG90aGVyIHRoYXQgcGVyZm9ybWluZyBhbnkgcmVxdWlyZWQgZG93bmxvYWRzLiBOb24tcGx1Zy1pbiBlbnRyaWVzDQotCSAqIGFyZSBoYW5kbGVkIGJ5IGN1c3RvbSBpbnN0YWxsIGhhbmRsZXJzIHRoYXQgbXVzdCBiZSBzcGVjaWZpZWQgZm9yDQotCSAqIHRoZSBmZWF0dXJlLiBDb25zZXF1ZW50bHksIHRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IG1ha2UgYSBkaXN0aW5jdGlvbg0KLQkgKiBiZXR3ZWVuIHRoZSAibG9naWNhbCIgYW5kICJwYWNrYWdlZCIgdmlld3MgZm9yIG5vbi1wbHVnLWluIGVudHJpZXMuDQotCSAqIFRoZSAicGFja2FnZWQiIHZpZXcgKHJldHVybmluZyByZWZlcmVuY2VzIHRvIHRoZSBub24tcGx1Zy1pbiBhcmNoaXZlcykNCi0JICogaXMgdGhlIG9ubHkgb25lIHN1cHBvcnRlZC4gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjdXN0b20gaW5zdGFsbA0KLQkgKiBoYW5kbGVyIHRvIHVuZGVyc3RhbmQgdGhlICJsb2dpY2FsIiB2aWV3IG9mIG5vbi1wbHVnLWluIGFyY2hpdmVzLg0KLQkgKiA8L3A+DQotCSAqIA0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHJldHVybiBhbiBhcnJheSBvZiByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiBubyByZWZlcmVuY2VzDQotCSAqIGFyZSBmb3VuZA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygNCi0JCUlOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSwNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY29udGVudCByZWZlcmVuY2VzIHRvIHRoZSBmZWF0dXJlIGRlZmluaXRpb24gZmlsZXMNCi0JICogKGkuZSB0aGUgImxvZ2ljYWwiIHZpZXcgb2YgdGhlIGZpbGVzIGRlZmluaW5nIHRoZSBmZWF0dXJlKS4gVGhlc2UNCi0JICogYXJlIHRoZSBmaWxlcyByZXF1aXJlZCB0byBwcmVzZW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmZWF0dXJlIHRvIHRoZQ0KLQkgKiBjbGllbnQsIGFuZCBpbiBnZW5lcmFsLCBzaG91bGQgbm90IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBwbHVnLWluIGFuZCANCi0JICogbm9uLXBsdWctaW4gZmlsZXMuDQotCSAqIA0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yKQ0KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yLCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBDb250ZW50UmVmZXJlbmNlIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlZmVyZW5jZXMgYXJlIGZvdW5kDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB3aGVuIGFuIGVycm9yIG9jY3Vycw0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbnRlbnQgcmVmZXJlbmNlcyB0byB0aGUgZmlsZXMgaW1wbGVtZW50aW5nDQotCSAqIHRoZSBzcGVjaWZpZWQgcGx1Zy1pbi4gKGkuZSB0aGUgImxvZ2ljYWwiIHZpZXcgb2YgdGhlIHBsdWctaW4pLg0KLQkgKiANCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IpDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIENvbnRlbnRSZWZlcmVuY2Ugb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVmZXJlbmNlcyBhcmUgZm91bmQNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoDQotCQlJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBhcmNoaXZlcyByZXF1aXJlZCBmb3IgdGhlDQotCSAqIHNwZWNpZmllZCBwbHVnLWluIGFuZCBub24tcGx1Zy1pbiBlbnRyaWVzICh0aGUgInBhY2thZ2luZyIgdmlldykuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGx1Z2luRW50cmllcyBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMNCi0JICogQHBhcmFtIG5vblBsdWdpbkVudHJpZXMgYW4gYXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcw0KLQkgKiBAcmV0dXJuIHRvdGFsIGRvd25sb2FkIHNpemUsIG9yIGFuIGluZGljYXRpb24gdGhhdCBzaXplIGNvdWxkIG5vdCBiZQ0KLQkgKiBkZXRlcm1pbmVkDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZUZvcigNCi0JCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMsDQotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5FbnRyaWVzKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGZpbGVzIHJlcXVpcmVkIGZvciB0aGUNCi0JICogc3BlY2lmaWVkIHBsdWctaW4gYW5kIG5vbi1wbHVnLWluIGVudHJpZXMgKHRoZSAibG9naWNhbCIgdmlldykuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGx1Z2luRW50cmllcyBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMNCi0JICogQHBhcmFtIG5vblBsdWdpbkVudHJpZXMgYW4gYXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcw0KLQkgKiBAcmV0dXJuIHRvdGFsIGRvd25sb2FkIHNpemUsIG9yIGFuIGluZGljYXRpb24gdGhhdCBzaXplIGNvdWxkIG5vdCBiZQ0KLQkgKiBkZXRlcm1pbmVkDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplRm9yKA0KLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcywNCi0JCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXMpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdmVyaWZpZXIgZm9yIHRoaXMgZmVhdHVyZS4NCi0JICogSWYgcHJvdmlkZWQsIHRoZSB2ZXJpZmllciBpcyBjYWxsZWQgYXQgdmFyaW91cyBwb2ludCBkdXJpbmcNCi0JICogaW5zdGFsbGF0aW9uIHByb2Nlc3NpbmcgdG8gdmVyaWZ5IGRvd25sb2FkZWQgYXJjaGl2ZXMuIFRoZQ0KLQkgKiB0eXBlIG9mIHZlcmlmaWNhdGlvbiBwcm92aWRlZCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQNCi0JICogcHJvdmlkZXIgaW1wbGVtZW50YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIHZlcmlmaWVyDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgZm9yIHRoaXMgY29udGVudCBwcm92aWRlcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpOw0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZW50IHByb3ZpZGVyLg0KLQkgKiBJbiBnZW5lcmFsLCB0aGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgcGFydCBvZg0KLQkgKiBmZWF0dXJlIGNyZWF0aW9uLiBPbmNlIHNldCwgdGhlIGZlYXR1cmUgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgZm9yIHRoaXMgY29udGVudCBwcm92aWRlcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQwMmVjZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lGZWF0dXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLQ0KLS8qKg0KLSAqIEZlYXR1cmUgZmFjdG9yeSBpbnRlcmZhY2UuDQotICogQSBmZWF0dXJlIGZhY3RvcnkgaXMgdXNlZCB0byBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiBjb25jcmV0ZQ0KLSAqIGZlYXR1cmVzLiANCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlRmVhdHVyZUZhY3RvcnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZUZhY3Rvcnkgew0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIGZlYXR1cmUgZGVmaW5lZCBieSB0aGUgc3VwcGxpZWQgVVJMLiBUaGUgZmVhdHVyZQ0KLQkgKiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBzaXRlLg0KLQkgKiA8cD4NCi0JICogVGhlIGFjdHVhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVVJMIGlzIGZlYXR1cmUtdHlwZSBzcGVjaWZpYy4NCi0JICogSW4gbW9zdCBjYXNlcyB0aGUgVVJMIHdpbGwgcG9pbnQgdG8gc29tZSBmZWF0dXJlLXNwZWNpZmljDQotCSAqIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gY29uc3RydWN0DQotCSAqIHRoZSBmZWF0dXJlIG9iamVjdC4NCi0JICogPC9wPg0KLQkgKiBAcGFyYW0gdXJsIFVSTCBpbnRlcnByZXRlZCBieSB0aGUgZmVhdHVyZQ0KLQkgKiBAcGFyYW0gc2l0ZSBzaXRlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmVhdHVyZQ0KLQkgKiBAcmV0dXJuIGNvbmNyZXRlIGZlYXR1cmUgb2JqZWN0DQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAZGVwcmVjYXRlZCB1c2UgY3JlYXRlRmVhdHVyZShVUkwsIElTaXRlLCBJUHJvZ3Jlc3NNb25pdG9yKSBpbnN0ZWFkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgZmVhdHVyZSBkZWZpbmVkIGJ5IHRoZSBzdXBwbGllZCBVUkwuIFRoZSBmZWF0dXJlDQotCSAqIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHNpdGUuDQotCSAqIDxwPg0KLQkgKiBUaGUgYWN0dWFsIGludGVycHJldGF0aW9uIG9mIHRoZSBVUkwgaXMgZmVhdHVyZS10eXBlIHNwZWNpZmljLg0KLQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBVUkwgd2lsbCBwb2ludCB0byBzb21lIGZlYXR1cmUtc3BlY2lmaWMNCi0JICogZmlsZSB0aGF0IGNhbiBiZSB1c2VkIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBjb25zdHJ1Y3QNCi0JICogdGhlIGZlYXR1cmUgb2JqZWN0Lg0KLQkgKiA8L3A+DQotCSAqIEBwYXJhbSB1cmwgVVJMIGludGVycHJldGVkIGJ5IHRoZSBmZWF0dXJlDQotCSAqIEBwYXJhbSBzaXRlIHNpdGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWF0dXJlDQotCSAqIEByZXR1cm4gY29uY3JldGUgZmVhdHVyZSBvYmplY3QNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjEgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwkNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JRmVhdHVyZVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdlMThiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUZlYXR1cmVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogRmVhdHVyZSByZWZlcmVuY2UuDQotICogQSByZWZlcmVuY2UgdG8gYSBmZWF0dXJlLg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVSZWZlcmVuY2UNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJRmVhdHVyZVJlZmVyZW5jZSBleHRlbmRzIElBZGFwdGFibGUsSVBsYXRmb3JtRW52aXJvbm1lbnQgew0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIFVSTC4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBVUkwgDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdXBkYXRlIHNpdGUgZm9yIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUNCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBzaXRlDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUNCi0JICoNCi0JICogQHJldHVybiB0aGUgbGFiZWwNCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCk7DQotDQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUuDQotCSAqIFRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgdGhlIGZ1bGwgZmVhdHVyZSBvYmplY3QuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUNCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvcikgaW5zdGVhZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZS4NCi0JICogVGhpcyBpcyBhIGZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyB0aGUgZnVsbCBmZWF0dXJlIG9iamVjdC4NCi0JICogDQotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yDQotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZWQgZmVhdHVyZQ0KLQkgKiBAc2luY2UgMi4xIA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSBVUkwuDQotCSAqIFRoaXMgaXMgdHlwaWNhbGx5IHBlcmZvcm1lZCBhcyBwYXJ0IG9mIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSBjcmVhdGlvbg0KLQkgKiBvcGVyYXRpb24uIE9uY2Ugc2V0LCB0aGUgdXJsIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gdXJsIHJlZmVyZW5jZSBVUkwNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIEFzc29jaWF0ZXMgYSBzaXRlIHdpdGggdGhlIGZlYXR1cmUgcmVmZXJlbmNlLg0KLQkgKiBUaGlzIGlzIHR5cGljYWxseSBwZXJmb3JtZWQgYXMgcGFydCBvZiB0aGUgZmVhdHVyZSByZWZlcmVuY2UgY3JlYXRpb24NCi0JICogb3BlcmF0aW9uLiBPbmNlIHNldCwgdGhlIHNpdGUgc2hvdWxkIG5vdCBiZSByZXNldC4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlIHNpdGUgZm9yIHRoZSBmZWF0dXJlIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKTsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmVhdHVyZSBpcyBwYXRjaGluZyBhbm90aGVyIGZlYXR1cmUsDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHJldHVybiBib29sZWFuDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKTsNCi0JDQotCQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbXBvcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUltcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzhmNjQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUltcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLQ0KLS8qKg0KLSAqIFBsdWctaW4gZGVwZW5kZW5jeSBlbnRyeS4NCi0gKiBEZXNjcmliZXMgYSBmZXR1cmUgZGVwZW5kZW5jeSBvbiBhIHBhcnRpY3VsYXIgcGx1Zy1pbi4gVGhlIGRlcGVuZGVuY3kgDQotICogY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyBwbHVnLWluIHZlcnNpb24gYW5kIGEgbWF0Y2hpbmcgcnVsZSBmb3IgDQotICogc2F0aXNmeWluZyB0aGUgZGVwZW5kZW5jeS4NCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbXBvcnQNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJSW1wb3J0IGV4dGVuZHMgSUFkYXB0YWJsZSwgSVVwZGF0ZUNvbnN0YW50cywgSVBsYXRmb3JtRW52aXJvbm1lbnQgew0KLQ0KLQkvKioNCi0JICogVGhlIGltcG9ydCByZWxhdGVzIHRvIGEgcGx1Z2luDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0lORF9QTFVHSU4gPSAwOw0KLQkNCi0JLyoqDQotCSAqIFRoZSBpbXBvcnQgcmVsYXRlcyB0byBhIGZlYXR1cmUNCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLSU5EX0ZFQVRVUkUgPSAxOw0KLQ0KLQkvKiogDQotCSAqIFJldHVybnMgYW4gaWRlbnRpZmllciBvZiB0aGUgZGVwZW5kZW50IHBsdWctaW4uDQotCSAqIA0KLQkgKiBAcmV0dXJuIHBsdWctaW4gaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgcnVsZSBmb3IgdGhlIGRlcGVuZGVuY3kuDQotCSAqIA0KLQkgKiBAcmV0dXJuIG1hdGNoaW5nIHJ1bGUNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UnVsZSgpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1hdGNoaW5nIHJ1bGUgZm9yIHRoZSBkZXBlbmRlbmN5IGlkZW50aWZpZXIuDQotCSAqIA0KLQkgKiBAcmV0dXJuIG1hdGNoaW5nIGlkIHJ1bGUNCi0JICogQHNpbmNlIDIuMSANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0SWRSdWxlKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVwZW5kZW5jeSBraW5kDQotCSAqIA0KLQkgKiBAc2VlICNLSU5EX1BMVUdJTg0KLQkgKiBAc2VlICNLSU5EX0ZFQVRVUkUNCi0JICogQHJldHVybiBLSU5EX1BMVUdJTiBpZiB0aGUgZGVwZW5kZW5jeSByZWxhdGVzIHRvIGEgcGx1Z2luLCANCi0JICogS0lORF9GRUFUVVJFIGlmIHRoZSBkZXBlbmRlbmN5IHJlbGF0ZXMgdG8gYSBmZWF0dXJlLg0KLQkgKi8NCi0JcHVibGljIGludCBnZXRLaW5kKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGF0Y2ggbW9kZS4gSWYgdGhlIGltcG9ydCBpcyBpbiBwYXRjaCBtb2RlLA0KLQkgKiB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIGlzIGNvbnNpZGVyZWQgYSBwYXRjaCB0YXJnZXQsDQotCSAqIGFuZCB0aGUgZmVhdHVyZSB0aGF0IG93bnMgdGhlIGltcG9ydCBpcyBwYXRjaCBjYXJyaWVyLg0KLQkgKiBQYXRjaCBjYXJyaWVyIGFuZCBwYXRjaGVkIGZlYXR1cmUgYXJlIGxpbmtlZCBpbiBhDQotCSAqIGRpc3RpbmN0IHdheTogaWYgYSBwYXRjaGVkIGZlYXR1cmUgaXMgZGlzYWJsZWQsDQotCSAqIGFsbCB0aGUgcGF0Y2hlcyBhcmUgZGlzYWJsZWQgd2l0aCBpdC4NCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IHJlcHJlc2VudHMgYSBwYXRjaA0KLQkgKiByZWZlcmVuY2UsIGZhbHNlIG90aGVyd2lzZS4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMmJlOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLQotCi0KLS8qKgotICogSW5jbHVkZWQgRmVhdHVyZSByZWZlcmVuY2UuCi0gKiBBIHJlZmVyZW5jZSB0byBhIGluY2x1ZGVkIGZlYXR1cmUuCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCAKLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIAotICogaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZVJlZmVyZW5jZQotICogQHNpbmNlIDIuMC4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBleHRlbmRzIElGZWF0dXJlUmVmZXJlbmNlLCBJQWRhcHRhYmxlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiBUaGlzIGlzIGEgZmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIHRoZSBmdWxsIGZlYXR1cmUgb2JqZWN0LgotCSAqIGVxdWl2YWxlbnQgdG8gZ2V0RmVhdHVyZShmYWxzZSxudWxsKTsKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiBUaGlzIGlzIGEgZmFjdG9yeSBtZXRob2QgdGhhdCBjcmVhdGVzIHRoZSBmdWxsIGZlYXR1cmUgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwZXJmZWN0TWF0Y2ggPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHBlcmZlY3QgbWF0Y2ggZmVhdHVyZSBmZWF0dXJlIHNob3VsZCBiZSByZXR1cm5lZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgYmVzdCBtYXRjaCBmZWF0dXJlIHNob3VsZCBiZSByZXR1cm5lZC4KLQkgKiBAcGFyYW0gY29uZmlndXJlZFNpdGUgdGhlIGNvbmZpZ3VyZWQgc2l0ZSB0byBzZWFyY2ggZm9yIHRoZSBGZWF0dXJlLiBJZiAKLQkgKiB0aGUgY29uZmlndXJlZCBzaXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSBzZWFyY2ggd2lsbCBiZSBkb25lIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyZWQgc2l0ZS4KLQkgKiBAcmV0dXJuIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUKLQkgKiBpbnN0ZWFkCi0JICogQHNpbmNlIDIuMC4yCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLQkgKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLQkgKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotCSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZShib29sZWFuIHBlcmZlY3RNYXRjaCxJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlLgotCSAqIFRoaXMgaXMgYSBmYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgdGhlIGZ1bGwgZmVhdHVyZSBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIHBlcmZlY3RNYXRjaCA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcGVyZmVjdCBtYXRjaCBmZWF0dXJlIGZlYXR1cmUgc2hvdWxkIGJlIHJldHVybmVkCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBiZXN0IG1hdGNoIGZlYXR1cmUgc2hvdWxkIGJlIHJldHVybmVkLgotCSAqIEBwYXJhbSBjb25maWd1cmVkU2l0ZSB0aGUgY29uZmlndXJlZCBzaXRlIHRvIHNlYXJjaCBmb3IgdGhlIEZlYXR1cmUuIElmIAotCSAqIHRoZSBjb25maWd1cmVkIHNpdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHNlYXJjaCB3aWxsIGJlIGRvbmUgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJlZCBzaXRlLgotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlCi0JICogQHNpbmNlIDIuMQotCSAqIDxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLQkgKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0JICogc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQKLQkgKiBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0Ci0JICogdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJCi0JICogZXZvbHZlcy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKGJvb2xlYW4gcGVyZmVjdE1hdGNoLElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCi0JLyoqCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZmVhdHVyZSBpcyBvcHRpb25hbCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAc2luY2UgMi4wLjEKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBydWxlIGZvciB0aGlzIGluY2x1ZGVkIGZlYXR1cmUuCi0JICogVGhlIHJ1bGUgd2lsbCBkZXRlcm1pbmUgdGhlIGFiaWxpdHkgb2YgdGhlIGluY2x1ZGVkIGZlYXR1cmUgdG8gbW92ZSB2ZXJzaW9uIAotCSAqIHdpdGhvdXQgY2F1c2luZyB0aGUgb3ZlcmFsbCBmZWF0dXJlIHRvIGFwcGVhciBicm9rZW4uCi0JICogCi0JICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+UlVMRV9QRVJGRUNUPC9jb2RlPgotCSAqIAotCSAqIEBzZWUgSVVwZGF0ZUNvbnN0YW50cyNSVUxFX1BFUkZFQ1QKLQkgKiBAc2VlIElVcGRhdGVDb25zdGFudHMjUlVMRV9FUVVJVkFMRU5UCi0JICogQHNlZSBJVXBkYXRlQ29uc3RhbnRzI1JVTEVfQ09NUEFUSUJMRQotCSAqIEBzZWUgSVVwZGF0ZUNvbnN0YW50cyNSVUxFX0dSRUFURVJfT1JfRVFVQUwKLQkgKiBAcmV0dXJuIGludCByZXByZXNlbnRhdGlvbiBvZiBmZWF0dXJlIG1hdGNoaW5nIHJ1bGUuCi0JICogQHNpbmNlIDIuMC4yCi0JICogQGRlcHJlY2F0ZWQgc2luY2UgMy4wIGluY2x1ZGVkIGZlYXR1cmUgdmVyc2lvbiBpcyBleGFjdGx5IHNwZWNpZmllZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF0Y2goKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZWFyY2ggbG9jYXRpb24gZm9yIHRoaXMgaW5jbHVkZWQgZmVhdHVyZS4KLQkgKiBUaGUgbG9jYXRpb24gd2lsbCBiZSB1c2VkIHRvIHNlYXJjaCB1cGRhdGVzIGZvciB0aGlzIGZlYXR1cmUuCi0JICogCi0JICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+U0VBUkNIX1JPT1Q8L2NvZGU+Ci0JICogCi0JICogQHNlZSBJVXBkYXRlQ29uc3RhbnRzI1NFQVJDSF9ST09UCi0JICogQHNlZSBJVXBkYXRlQ29uc3RhbnRzI1NFQVJDSF9TRUxGCi0JICogQHJldHVybiBpbnQgcmVwcmVzZW50YXRpb24gb2YgZmVhdHVyZSBzZWFyY2hpbmcgcnVsZS4KLQkgKiBAc2luY2UgMi4wLjIKLQkgKi8KLQotCXB1YmxpYyBpbnQgZ2V0U2VhcmNoTG9jYXRpb24oKTsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5zdGFsbEhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUluc3RhbGxIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YmM3NzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5zdGFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogQ3VzdG9tIGluc3RhbGwgaGFuZGxlci4KLSAqIEN1c3RvbSBpbnN0YWxsIGhhbmRsZXJzIGNhbiBvcHRpb25hbGx5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGZlYXR1cmUuCi0gKiBUaGUgYWN0dWFsIGluc3RhbGwgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgcGh5c2ljYWxseSBkZWxpdmVyZWQKLSAqIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUgcGFja2FnZSwgb3IgY2FuIGFscmVhZHkgYmUgaW5zdGFsbGVkIG9uIHRoZSBjbGllbnQKLSAqIG1hY2hpbmUgYW5kIHJlZ2lzdGVyZWQgdmlhIHRoZSA8Y29kZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5pbnN0YWxsSGFuZGxlcnM8L2NvZGU+Ci0gKiBleHRlbnNpb24gcG9pbnQuIFRoZSBpbnN0YWxsIGhhbmRsZXIgbWV0aG9kcyBhcmUgY2FsbGVkIGF0IHByZWRldGVybWluZWQKLSAqIHBvaW50IGR1cmluZyB1cGRhdGUgYWN0aW9ucy4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIAotICogZGlyZWN0bHkgc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUluc3RhbGxIYW5kbGVyCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxIYW5kbGVyIHsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgaGFuZGxlciBpcyBiZWluZyBpbml0aWFsaXplZCBmb3IgZmVhdHVyZSBpbnN0YWxsLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIQU5ETEVSX0FDVElPTl9JTlNUQUxMID0gMTsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgaGFuZGxlciBpcyBiZWluZyBpbml0aWFsaXplZCBmb3IgZmVhdHVyZSBjb25maWd1cmUuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRSA9IDI7Ci0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGhhbmRsZXIgaXMgYmVpbmcgaW5pdGlhbGl6ZWQgZm9yIGZlYXR1cmUgdW5jb25maWd1cmUuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRVJfQUNUSU9OX1VOQ09ORklHVVJFID0gMzsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgaGFuZGxlciBpcyBiZWluZyBpbml0aWFsaXplZCBmb3IgZmVhdHVyZSB1bmluc3RhbGwuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhBTkRMRVJfQUNUSU9OX1VOSU5TVEFMTCA9IDQ7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBpbnN0YWxsIGhhbmRsZXIuCi0JICogSW5zdGFsbCBoYW5kbGVycyBhcmUgYWx3YXlzIGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqIFRoZSBhcmUgaW5pdGlhbGl6ZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNvbnN0cnVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSB1cGRhdGUgYWN0aW9uIHR5cGUKLQkgKiBAcGFyYW0gZmVhdHVyZSB0aGUgdGFyZ2V0IG9mIHRoZSBhY3Rpb24KLQkgKiBAcGFyYW0gZW50cnkgbW9kZWwgZW50cnkgdGhhdCBkZWZpbmVzIHRoaXMgaGFuZGxlcgotCSAqIEBwYXJhbSBtb25pdG9yIG9wdGlvbmFsIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKAotCQlpbnQgdHlwZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUluc3RhbGxIYW5kbGVyRW50cnkgZW50cnksCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5zdGFsbCBhY3Rpb24uIEF0IHRoaXMgcG9pbnQsIG5vIGluc3RhbGwKLQkgKiBwcm9jZXNzaW5nIGhhcyB0YWtlbiBwbGFjZS4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9JTlNUQUxMCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgZmlsZXMgY29ycmVzcG9uZGluZyB0byBwbHVnLWluIGVudHJpZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWQsCi0JICogYnV0IGJlZm9yZSB0aGV5IGFyZSBhY3R1bGx5IHVucGFja2VkIGFuZCBpbnN0YWxsZWQuCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCSAqIEBwYXJhbSBwbHVnaW5zIGRvd25sb2FkZWQgcGx1Zy1pbiBlbnRyaWVzLiBOb3RlIHRoaXMgbWF5IGJlIGEgc3Vic2V0Ci0JICogb2YgdGhlIHBsdWctaW5zIGFjdHVhbGx5IHJlZmVyZW5jZXMgYnkgdGhlIGZlYXR1cmUuCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBwbHVnaW5zRG93bmxvYWRlZChJUGx1Z2luRW50cnlbXSBwbHVnaW5zKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIG5vbi1wbHVnLWluIGVudHJpZXMgaGF2ZSBiZWVuIAotCSAqIGRvd25sb2FkZWQuIFRoZSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGNhbiBwZXJmb3JtIGFueSBjdXN0b20KLQkgKiB2ZXJpZmljYXRpb24gb2YgdGhlIG5vbi1wbHVnLWluIGVudHJpZXMgKHRoZXNlIGFyZSBub3QgaW50ZXJwcmV0ZWQKLQkgKiBpbiBhbnkgd2F5IGJ5IHRoZSBwbGF0Zm9ybSAoYmV5b25kIGRvd25sb2FkaW5nKSkuCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCSAqIEBwYXJhbSBub25QbHVnaW5EYXRhIGRvd25sb2FkZWQgbm9uLXBsdWctaW4gZW50cmllcy4KLQkgKiBAcGFyYW0gbGlzdGVuZXIgdmVyaWZpY2F0aW9uIGxpc3RlbmVyLCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBub25QbHVnaW5EYXRhRG93bmxvYWRlZCgKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRGF0YSwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgZmVhdHVyZSBmaWxlcyBhbmQgYW55IGRvd25sb2FkZWQgcGx1Zy1pbnMgaGF2ZQotCSAqIGJlZW4gaW5zdGFsbGVkLiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgcG9pbnQgd2hlcmUgdGhlIGN1c3RvbQotCSAqIGluc3RhbGwgaGFuZGxlciBjYW4gaW5zdGFsbCBhbnkgbm9uLXBsdWctaW4gZW50cmllcyAodGhlc2UgYXJlIG5vdCAKLQkgKiBpbnRlcnByZXRlZCBpbiBhbnkgd2F5IGJ5IHRoZSBwbGF0Zm9ybSAoYmV5b25kIGRvd25sb2FkaW5nKSkuCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCSAqIEBwYXJhbSBjb25zdW1lciBjb250ZW50IGNvbnN1bWVyIGZvciB0aGUgZmVhdHVyZS4gVGhlIGluc3RhbGwgaGFuZGxlcgotCSAqIGNhbiBjaG9vc2UgdG8gdXNlIHRoaXMgY29uc3VtZXIgdG8gaW5zdGFsbCB0aGUgbm9uLXBsdWctaW4gZGF0YSwKLQkgKiBvciBjYW4gaGFuZGxlIHRoZSBkYXRhIGluIGFueSBvdGhlciB3YXkuIElmIHVzaW5nIHRoZSBjb25zdW1lciwKLQkgKiB0aGUgaW5zdGFsbCBoYW5kbGVyIHNob3VsZCBvbmx5IGNhbGwgCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIGFuZCBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI29wZW4oSU5vblBsdWdpbkVudHJ5KQotCSAqIG1ldGhvZHMgb2YgdGhlIGNvbnN1bWVyLiAKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlSW5zdGFsbChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBjb25zdW1lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdGFsbCBhY3Rpb24uCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fSU5TVEFMTAotCSAqIEBwYXJhbSBzdWNjZXNzIGluZGljYXRlcyBhY3Rpb24gc3VjY2Vzcy4gCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjb25maWd1cmUgYWN0aW9uCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fQ09ORklHVVJFCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgZmVhdHVyZSBoYXMgYmVlbiBjb25maWd1cmVkLiBUaGUgaW5zdGFsbCBoYW5kbGVyCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IGNvbXBsZXRpb24gdGFza3MuIE5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkCi0JICogdG8gdGhlIG1ldGhvZC4gSWYgbmVlZGVkLCB0aGUgaW5zdGFsbCBoYW5kbGVyIGNhbiB1c2UgYXJndW1lbnRzCi0JICogcGFzc2VkIG9uIHRoZSBpbml0aWFsaXphdGlvbiBjYWxsLgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB0ZXJtaW5hdGVzIHRoZSBhY3Rpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVDb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIHRoZSBjb25maWd1cmUgYWN0aW9uLgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRQotCSAqIEBwYXJhbSBzdWNjZXNzIGluZGljYXRlcyBhY3Rpb24gc3VjY2Vzcy4gCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHVuY29uZmlndXJlIGFjdGlvbgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX1VOQ09ORklHVVJFCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIHRoZSBmZWF0dXJlIGhhcyBiZWVuIHVuY29uZmlndXJlZC4gVGhlIGluc3RhbGwgaGFuZGxlcgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBjb21wbGV0aW9uIHRhc2tzLiBObyBhcmd1bWVudHMgYXJlIHBhc3NlZAotCSAqIHRvIHRoZSBtZXRob2QuIElmIG5lZWRlZCwgdGhlIGluc3RhbGwgaGFuZGxlciBjYW4gdXNlIGFyZ3VtZW50cwotCSAqIHBhc3NlZCBvbiB0aGUgaW5pdGlhbGl6YXRpb24gY2FsbC4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9VTkNPTkZJR1VSRQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB0ZXJtaW5hdGVzIHRoZSBhY3Rpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVVbmNvbmZpZ3VyZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHVuY29uZmlndXJlIGFjdGlvbi4KLQkgKiAKLQkgKiBAc2VlICNIQU5ETEVSX0FDVElPTl9VTkNPTkZJR1VSRQotCSAqIEBwYXJhbSBzdWNjZXNzIGluZGljYXRlcyBhY3Rpb24gc3VjY2Vzcy4gCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgdW5pbnN0YWxsIGFjdGlvbgotCSAqIAotCSAqIEBzZWUgI0hBTkRMRVJfQUNUSU9OX1VOSU5TVEFMTAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiB0ZXJtaW5hdGVzIHRoZSBhY3Rpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDYWxsZWQgYWZ0ZXIgdGhlIGZlYXR1cmUgaGFzIGJlZW4gdW5pbnN0YWxsZWQuIFRoZSBpbnN0YWxsIGhhbmRsZXIKLQkgKiBzaG91bGQgcGVyZm9ybSBhbnkgY29tcGxldGlvbiB0YXNrcy4gTm8gYXJndW1lbnRzIGFyZSBwYXNzZWQKLQkgKiB0byB0aGUgbWV0aG9kLiBJZiBuZWVkZWQsIHRoZSBpbnN0YWxsIGhhbmRsZXIgY2FuIHVzZSBhcmd1bWVudHMKLQkgKiBwYXNzZWQgb24gdGhlIGluaXRpYWxpemF0aW9uIGNhbGwuIE5vdGUsIHRoYXQgYXQgdGhpcyBwb2ludAotCSAqIHRoZSBmZWF0dXJlIGZpbGVzIGFuZCBhbnkgdW5yZWZlcmVuY2VkIHBsdWctaW5zIGhhdmUgYmVlbgotCSAqIHJlbW92ZWQuCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uIHRlcm1pbmF0ZXMgdGhlIGFjdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuaW5zdGFsbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdGhlIHVuaW5zdGFsbCBhY3Rpb24uCi0JICogCi0JICogQHNlZSAjSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMCi0JICogQHBhcmFtIHN1Y2Nlc3MgaW5kaWNhdGVzIGFjdGlvbiBzdWNjZXNzLiAKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gdGVybWluYXRlcyB0aGUgYWN0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5zdGFsbEhhbmRsZXJFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JSW5zdGFsbEhhbmRsZXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzkyMzFjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSUluc3RhbGxIYW5kbGVyRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogSW5zdGFsbCBoYW5kbGVyIGVudHJ5LgotICogQXNzb2NpYXRlcyBhbiBvcHRpb25hbCBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIHdpdGggdGhlIGZlYXR1cmUuCi0gKiBJbnN0YWxsIGhhbmRsZXJzIG11c3QgaW1wbGVtZW50IHRoZSBJSW5zdGFsbEhhbmRsZXIgaW50ZXJmYWNlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAqIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxIYW5kbGVyRW50cnkKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxIYW5kbGVyRW50cnkgZXh0ZW5kcyBJQWRhcHRhYmxlIHsKLQotCS8qKgotCSAqIFJldHVybnMgb3B0aW9uYWwgVVJMIHVzZWQgZm9yIGJyb3dzZXItdHJpZ2dlcmVkIGluc3RhbGxhdGlvbiBoYW5kbGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHVybAotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgb3B0aW9uYWwgbmFtZSBvZiBhIGxpYnJhcnkgY29udGFpbmluZyB0aGUgaW5zdGFsbAotCSAqIGhhbmRsZXIgY2xhc3Nlcy4gSWYgc3BlY2lmaWVkLCB0aGUgcmVmZXJlbmNlZCBsaWJyYXJ5Ci0JICogbXVzdCBiZSBjb250YWluZWQgaW4gdGhlIGZlYXR1cmUgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGluc3RhbGwgaGFuZGxlciBsaWJyYXJ5IG5hbWUKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBpbnN0YWxsIGhhbmRsZXIgbmFtZS4KLQkgKiBJdCBpcyBpbnRlcnByZXRlZCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBsaWJyYXJ5Ci0JICogc3BlY2lmaWNhdGlvbi4gSWYgbGlicmFyeSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZQotCSAqIGlzIGludGVwcmV0ZWQgYXMgYW4gaWRlbnRpZmllciBvZiBhICJnbG9iYWwiIGluc3RhbGwKLQkgKiBoYW5kbGVyIHJlZ2lzdGVyZWQgaW4gdGhlIDxjb2RlPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxIYW5kbGVyczwvY29kZT4gCi0JICogZXh0ZW5zaW9uIHBvaW50LiBJZiBsaWJyYXJ5IGlzIHNwZWNpZmllZCwgdGhlIG5hbWUgaXMgaW50ZXJwcmV0ZWQKLQkgKiBhcyBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGEgY2xhc3MgY29udGFpbmVkIGluIHRoZQotCSAqIGxpYnJhcnkuIEluIGJvdGggY2FzZXMsIHRoZSByZXN1bHRpbmcgY2xhc3MgbXVzdAotCSAqIGltcGxlbWVudCBJSW5zdGFsbEhhbmRsZXIuIFRoZSBjbGFzcyBpcyBkeW5hbWljYWxseSBsb2FkZWQgYW5kCi0JICogY2FsbGVkIGF0IHNwZWNpZmljIHBvaW50cyBkdXJpbmcgZmVhdHVyZSBwcm9jZXNzaW5nLgotCSAqIFRoZSBoYW5kbGVyIGhhcyB2aXNpYmlsaXR5IHRvIHRoZSBBUEkgY2xhc3NlcyBmcm9tIHRoZSB1cGRhdGUgcGx1Zy1pbiwKLQkgKiBhbmQgcGx1Zy1pbnMgcmVxdWlyZWQgYnkgdGhlIHVwZGF0ZSBwbHVnaW4uIAotCSAqIAotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyCi0JICogQHJldHVybiBoYW5kbGVyIG5hbWUKLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JTm9uUGx1Z2luRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSU5vblBsdWdpbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZjA1ZjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JTm9uUGx1Z2luRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi0NCi0vKioNCi0gKiBOb24tcGx1Zy1pbiBlbnRyeSBkZWZpbmVzIGFuIGFyYml0cmFyeSBub24tcGx1Zy1pbiBkYXRhIGZpbGUgcGFja2FnZWQNCi0gKiBhcyBwYXJ0IG9mIGEgZmVhdHVyZS4gTm9uLXBsdWctaW4gZW50cmllcyBhcmUgbm90IGludGVycHJldGVkIGJ5IHRoZQ0KLSAqIHBsYXRmb3JtIChvdGhlciB0aGFuIGJlaW5nIGRvd25sb2FkZWQgYXMgcGFydCBvZiBhbiBpbnN0YWxsIGFjdGlvbikuDQotICogVGhleSByZXF1aXJlIGEgY3VzdG9tIGluc3RhbGwgaGFuZGxlciB0byBiZSBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUNCi0gKiBmZWF0dXJlLiBOb3RlLCB0aGF0IGRlZmluaW5nIGEgbm9uLXBsdWctaW4gZW50cnkgZG9lcyBub3QgbmVjZXNzYXJpbHkNCi0gKiBpbmRpY2F0ZSB0aGUgbm9uLXBsdWctaW4gZmlsZSBpcyBwYWNrYWdlZCB0b2dldGhlciB3aXRoIGFueSBvdGhlcg0KLSAqIGZlYXR1cmUgZmlsZXMuIFRoZSBhY3R1YWwgcGFja2FnaW5nIGRldGFpbHMgYXJlIGRldGVybWluZWQgYnkgdGhlDQotICogZmVhdHVyZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgZmVhdHVyZS4NCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Ob25QbHVnaW5FbnRyeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcg0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElOb25QbHVnaW5FbnRyeSBleHRlbmRzIElQbGF0Zm9ybUVudmlyb25tZW50LCBJQWRhcHRhYmxlIHsNCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgZGF0YSBlbnRyeS4gDQotCSAqIA0KLQkgKiBAcmV0dXJuIGRhdGEgZW50cnkgaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkb3dubG9hZCBzaXplIG9mIHRoZSBlbnRyeSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsI1VOS05PV05fU0laRQ0KLQkgKiBAcmV0dXJuIGRvd25sb2FkIHNpemUgb2YgdGhlIGZlYXR1cmUgaW4gS2lsb0J5dGVzLCBvciBhbiBpbmRpY2F0aW9uIA0KLQkgKiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsIHNpemUgb2YgdGhlIGZlYXR1cmUsIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbCNVTktOT1dOX1NJWkUNCi0JICogQHJldHVybiBpbnN0YWxsIHNpemUgb2YgdGhlIGZlYXR1cmUgaW4gS2lsb0J5dGVzLCBvciBhbiBpbmRpY2F0aW9uIA0KLQkgKiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemUoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JUGxhdGZvcm1FbnZpcm9ubWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JUGxhdGZvcm1FbnZpcm9ubWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjE3YWJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVBsYXRmb3JtRW52aXJvbm1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogUGx1Zy1pbiBlbnRyeSBkZWZpbmVzIGEgcGFja2FnaW5nIHJlZmVyZW5jZSBmcm9tIGEgZmVhdHVyZSB0byBhIHBsdWctaW4uCi0gKiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVmZXJlbmNlZCBwbHVnLWluIGlzIHRvIGJlIGNvbnNpZGVyZWQgYXMKLSAqIHBhcnQgb2YgdGhlIGZlYXR1cmUuIE5vdGUsIHRoYXQgdGhpcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBpbmRpY2F0ZQotICogdGhhdCB0aGUgcGx1Zy1pbiBmaWxlcyBhcmUgcGFja2FnZWQgdG9nZXRoZXIgd2l0aCBhbnkgb3RoZXIKLSAqIGZlYXR1cmUgZmlsZXMuIFRoZSBhY3R1YWwgcGFja2FnaW5nIGRldGFpbHMgYXJlIGRldGVybWluZWQgYnkgdGhlCi0gKiBmZWF0dXJlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIHRoZSBmZWF0dXJlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAqIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlBsdWdpbkVudHJ5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGxhdGZvcm1FbnZpcm9ubWVudCBleHRlbmRzIElBZGFwdGFibGUgewotCi0KLQkvKioKLQkgKiBSZXR1cm5zIG9wdGlvbmFsIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4KLQkgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9zIGRlc2lnbmF0b3JzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLgotCSAqIEluZGljYXRlcyB0aGlzIGVudHJ5IHNob3VsZCBvbmx5IGJlIGluc3RhbGxlZCBvbiBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqIG9zIHN5c3RlbXMuIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIDxjb2RlPio8L2NvZGU+LCB0aGUKLQkgKiBlbnRyeSBjYW4gYmUgaW5zdGFsbGVkIG9uIGFsbCBzeXN0ZW1zIChwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbikuIElmIHRoZQotCi0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFzIGEgaGludCBieSB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1cGRhdGUKLQkgKiBzdXBwb3J0LgotCSAqCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKTsKLQotCS8qKgotCSAqIFJldHVybnMgb3B0aW9uYWwgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLiAKLQkgKiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFyY2ggZGVzaWduYXRvcnMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uCi0JICogSW5kaWNhdGVzIHRoaXMgZW50cnkgc2hvdWxkIG9ubHkgYmUgaW5zdGFsbGVkIG9uIG9uZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogc3lzdGVtcy4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgPGNvZGU+KjwvY29kZT4sIHRoZQotCSAqIGVudHJ5IGNhbiBiZSBpbnN0YWxsZWQgb24gYWxsIHN5c3RlbXMgKHBvcnRhYmxlIGltcGxlbWVudGF0aW9uKS4KLQkgKiAKLQkgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgYXMgYSBoaW50IGJ5IHRoZSBpbnN0YWxsYXRpb24gYW5kIHVwZGF0ZQotCSAqIHN1cHBvcnQuCi0JICogCi0JICogQHJldHVybiBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXUygpOwotCi0JLyoqCi0JICogUmV0dXJucyBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uIAotCSAqIEEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaCBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KLQkgKiBJbmRpY2F0ZXMgdGhpcyBlbnRyeSBzaG91bGQgb25seSBiZSBpbnN0YWxsZWQgb24gb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBzeXN0ZW1zLiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCBvciBpcyA8Y29kZT4qPC9jb2RlPiwgdGhlCi0JICogZW50cnkgY2FuIGJlIGluc3RhbGxlZCBvbiBhbGwgc3lzdGVtcyAocG9ydGFibGUgaW1wbGVtZW50YXRpb24pLgotCSAqIAotCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBhcyBhIGhpbnQgYnkgdGhlIGluc3RhbGxhdGlvbiBhbmQgdXBkYXRlCi0JICogc3VwcG9ydC4KLQkgKiAKLQkgKiBAcmV0dXJuIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBvcHRpb25hbCBsb2NhbGUgc3BlY2lmaWNhdGlvbi4gCi0JICogQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhbGUgZGVzaWduYXRvcnMgZGVmaW5lZCBieSBKYXZhLgotCSAqIEluZGljYXRlcyB0aGlzIGVudHJ5IHNob3VsZCBvbmx5IGJlIGluc3RhbGxlZCBvbiBhIHN5c3RlbSBydW5uaW5nCi0JICogd2l0aCBhIGNvbXBhdGlibGUgbG9jYWxlICh1c2luZyBKYXZhIGxvY2FsZS1tYXRjaGluZyBydWxlcykuCi0JICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgPGNvZGU+KjwvY29kZT4sIHRoZSBlbnRyeSBjYW4KLQkgKiBiZSBpbnN0YWxsZWQgb24gYWxsIHN5c3RlbXMgKGxhbmd1YWdlLW5ldXRyYWwgaW1wbGVtZW50YXRpb24pLgotCSAqIAotCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBhcyBhIGhpbnQgYnkgdGhlIGluc3RhbGxhdGlvbiBhbmQgdXBkYXRlCi0JICogIHN1cHBvcnQuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROTCgpOwotCi0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVBsdWdpbkVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lQbHVnaW5FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjk1YTlkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVBsdWdpbkVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogUGx1Zy1pbiBlbnRyeSBkZWZpbmVzIGEgcGFja2FnaW5nIHJlZmVyZW5jZSBmcm9tIGEgZmVhdHVyZSB0byBhIHBsdWctaW4uDQotICogSXQgaW5kaWNhdGVzIHRoYXQgdGhlIHJlZmVyZW5jZWQgcGx1Zy1pbiBpcyB0byBiZSBjb25zaWRlcmVkIGFzDQotICogcGFydCBvZiB0aGUgZmVhdHVyZS4gTm90ZSwgdGhhdCB0aGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGluZGljYXRlDQotICogdGhhdCB0aGUgcGx1Zy1pbiBmaWxlcyBhcmUgcGFja2FnZWQgdG9nZXRoZXIgd2l0aCBhbnkgb3RoZXINCi0gKiBmZWF0dXJlIGZpbGVzLiBUaGUgYWN0dWFsIHBhY2thZ2luZyBkZXRhaWxzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZQ0KLSAqIGZlYXR1cmUgY29udGVudCBwcm92aWRlciBmb3IgdGhlIGZlYXR1cmUuDQotICogPHA+DQotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzIGNsaWVudHMgc2hvdWxkIA0KLSAqIGRpcmVjdGx5IGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIA0KLSAqIGludGVyZmFjZS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuUGx1Z2luRW50cnkNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXINCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGludGVyZmFjZSBJUGx1Z2luRW50cnkgZXh0ZW5kcyBJUGxhdGZvcm1FbnZpcm9ubWVudCxJQWRhcHRhYmxlIHsNCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgcGx1Z2luIGVudHJ5DQotCSAqIA0KLQkgKiBAcmV0dXJuIHBsdWdpbiBlbnRyeSBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGluZGljYXRpb24gd2hldGh5ZXIgdGhpcyBlbnRyeSByZXByZXNlbnRzIGEgZnJhZ21lbnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBlbnRyeSByZXByZXNlbnRzIGEgcGx1Zy1pbiBmcmFnbWVudCwgDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgZW50cnkgcmVwcmVzZW50cyBhIHBsdWctaW4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGRvd25sb2FkIHNpemUgb2YgdGhlIGVudHJ5LCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuQ29udGVudEVudHJ5TW9kZWwjVU5LTk9XTl9TSVpFDQotCSAqIEByZXR1cm4gZG93bmxvYWQgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemUoKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsI1VOS05PV05fU0laRQ0KLQkgKiBAcmV0dXJuIGluc3RhbGwgc2l6ZSBvZiB0aGUgZmVhdHVyZSBpbiBLaWxvQnl0ZXMsIG9yIGFuIGluZGljYXRpb24gDQotCSAqIHRoZSBzaXplIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpOw0KLQ0KLQkvKiogDQotCSAqIFNldHMgdGhlIGlkZW50aWZpZXIgb2YgdGhpcyBwbHVnaW4gZW50cnkuIA0KLQkgKiBUaGlzIGlzIHR5cGljYWxseSBwZXJmb3JtZWQgYXMgcGFydCBvZiB0aGUgcGx1Zy1pbiBlbnRyeSBjcmVhdGlvbg0KLQkgKiBvcGVyYXRpb24uIE9uY2Ugc2V0LCB0aGUgaWRlbnRpZmllciBzaG91bGQgbm90IGJlIHJlc2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIGlkZW50aWZpZXIgcGx1Z2luIGVudHJ5IGlkZW50aWZpZXINCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudGlmaWVyKTsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGM3ZGIxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogU2l0ZSByZXByZXNlbnRzIGEgbG9jYXRpb24gY29udGFpbmluZyBzb21lIG51bWJlciBvZiBmZWF0dXJlcyAocGFja2FnZWQNCi0gKiBvciBpbnN0YWxsZWQpLiBTaXRlcyBhcmUgdHJlYXRlZCBwdXJlbHkgYXMgYW4gaW5zdGFsbGF0aW9uIGFuZCBwYWNrYWdpbmcNCi0gKiBjb25zdHJ1Y3QuIFRoZXkgZG8gbm90IHBsYXkgYSByb2xlIGR1cmluZyBFY2xpcHNlIHBsdWctaW4gZXhlY3V0aW9uLiANCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGUgZXh0ZW5kcyBJQWRhcHRhYmxlIHsNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgdHlwZSBmb3IgYW4gaW5zdGFsbGVkIGZlYXR1cmUuIERpZmZlcmVudCBjb25jcmV0ZSBmZWF0dXJlDQotCSAqIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgcmVnaXN0ZXJlZCB0b2dldGhlciB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdHlwZQ0KLQkgKiB1c2luZyB0aGUgPGNvZGU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzPC9jb2RlPiANCi0JICogZXh0ZW5zaW9uIHBvaW50Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9UWVBFID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmluc3RhbGxlZCI7IC8vJE5PTi1OTFMtMSQJCQ0KLQ0KLQkvKioNCi0JICogRGVmYXVsdCB0eXBlIGZvciBhIHBhY2thZ2VkIGZlYXR1cmUuIERpZmZlcmVudCBjb25jcmV0ZSBmZWF0dXJlDQotCSAqIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgcmVnaXN0ZXJlZCB0b2dldGhlciB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdHlwZQ0KLQkgKiB1c2luZyB0aGUgPGNvZGU+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzPC9jb2RlPiANCi0JICogZXh0ZW5zaW9uIHBvaW50Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiOyAvLyROT04tTkxTLTEkCQkNCi0NCi0JLyoqDQotCSAqIElmIHdlIGFyZSB1bmFibGUgdG8gYWNjZXNzIGEgc2l0ZSwgdGhlIHJldHVybmVkIENvcmVFeGNlcHRpb24gd2lsbCBjb250YWluDQotCSAqIHRoaXMgcmV0dXJuIGNvZGUuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wLjENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJVEVfQUNDRVNTX0VYQ0VQVElPTiA9IDQyOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l0ZSBVUkwNCi0JICogDQotCSAqIEByZXR1cm4gc2l0ZSBVUkwNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIHNpdGUgdHlwZS4gRGlmZmVyZW50IGNvbmNyZXRlIHNpdGUgaW1wbGVtZW50YXRpb25zIGNhbiBiZQ0KLQkgKiByZWdpc3RlcmVkIHRvZ2V0aGVyIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB0eXBlIHVzaW5nIHRoZQ0KLQkgKiA8Y29kZT5vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4NCi0JICogDQotCSAqIEByZXR1cm4gc2l0ZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l0ZSBkZXNjcmlwdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gc2l0ZSBkZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldERlc2NyaXB0aW9uKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3JpZXMgZGVmaW5lZCBieSB0aGUgc2l0ZS4NCi0JICogDQotCSAqIEByZXR1cm4gYXJyYXkgb2Ygc2l0ZSBjYXRlZ29yaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBuYW1lZCBzaXRlIGNhdGVnb3J5Lg0KLQkgKiANCi0JICogQHBhcmFtIG5hbWUgY2F0ZWdvcnkgbmFtZQ0KLQkgKiBAcmV0dXJuIG5hbWVkIGNhdGVnb3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZml0IGRvZXMgbm90IGV4aXN0DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoU3RyaW5nIG5hbWUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHRvIGZlYXR1cmVzIG9uIHRoaXMgc2l0ZS4NCi0JICogDQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiByZWZlcmVuY2VzIHRvIGZlYXR1cmVzIG9uIHRoaXMgc2l0ZS4NCi0JICogTm8gZmlsdGVyaW5nIG9jY3Vycy4NCi0JICogDQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheS4uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCBmZWF0dXJlIGlmIA0KLQkgKiBpdCBpcyBpbnN0YWxsZWQgb24gdGhpcyBzaXRlLg0KLQkgKiBmaWx0ZXJlZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgd2luZG93aW5nIHN5c3RlbSBhbmQgYXJjaGl0ZWN0dXJlDQotCSAqIHN5c3RlbSBzZXQgaW4gPGNvZGU+U2l0ZW1hbmFnZXI8L2NvZGU+DQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlDQotCSAqIEByZXR1cm4gZmVhdHVyZSByZWZlcmVuY2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgZmVhdHVyZQ0KLQkgKiBjYW5ub3QgYmUgbG9jYXRlZCBvbiB0aGlzIHNpdGUuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSBmZWF0dXJlKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gYXJjaGl2ZXMgbG9jYXRlZA0KLQkgKiBvbiB0aGlzIHNpdGUNCi0JICogDQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgYXJjaGl2ZSByZWZlcmVuY2VzLCBvciBhbiBlbXB0eSBhcnJheSBpZiB0aGVyZSBhcmUNCi0JICogbm8gYXJjaGl2ZXMga25vd24gdG8gdGhpcyBzaXRlLiBOb3RlLCB0aGF0IGFuIGVtcHR5IGFycmF5IGRvZXMgbm90DQotCSAqIG5lY2Vzc2FyaWx5IGluZGljYXRlIHRoZXJlIGFyZSBubyBhcmNoaXZlcyBhY2Nlc3NpYmxlIG9uIHRoaXMgc2l0ZS4NCi0JICogSXQgc2ltcGx5IGluZGljYXRlcyB0aGUgc2l0ZSBoYXMgbm8gcHJpb3Iga25vd2xlZGdlIG9mIHN1Y2ggYXJjaGl2ZXMuDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUFyY2hpdmVSZWZlcmVuY2VbXSBnZXRBcmNoaXZlcygpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhpcyBzaXRlLiBBIGNvbnRlbnQgcHJvdmlkZXINCi0JICogaXMgYW4gYWJzdHJhY3Rpb24gb2YgZWFjaCBzaXRlIG9yZ2FuaXphdGlvbi4gSXQgYWxsb3dzIHRoZSANCi0JICogY29udGVudCBvZiB0aGUgc2l0ZSB0byBiZSBhY2Nlc3NlZCBpbiBhIHN0YW5kYXJkIHdheQ0KLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBvcmdhbml6YXRpb24uIEFsbCBjb25jcmV0ZSBzaXRlcw0KLQkgKiBuZWVkIHRvIGJlIGFibGUgdG8gcmV0dXJuIGEgY29udGVudCBwcm92aWRlci4NCi0JICogDQotCSAqIEByZXR1cm4gc2l0ZSBjb250ZW50IHByb3ZpZGVyDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB0eXBlIGZvciBhIHBhY2thZ2VkIGZlYXR1cmUgc3VwcG9ydGVkIGJ5IHRoaXMgc2l0ZQ0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIHR5cGUsIGFzIHJlZ2lzdGVyZWQgaW4gdGhlDQotCSAqIDxjb2RlPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmVUeXBlczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byBwbHVnLWlucyBpbnN0YWxsZWQNCi0JICogb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHJldHVybiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMsb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGx1Zy1pbnMgaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZQ0KLQkgKiANCi0JICogQHJldHVybiBudW1iZXIgb2YgaW5zdGFsbGVkIHBsdWctaW5zDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpOw0KLQ0KLQkvKioNCi0JICogQWRkcyBhIG5ldyBwbHVnLWluIGVudHJ5IHRvIHRoaXMgc2l0ZS4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyeSBwbHVnLWluIGVudHJ5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSk7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byBwbHVnLWlucyB0aGF0IGFyZQ0KLQkgKiBpbnN0YWxsZWQgb24gdGhpcyBzaXRlIGFuZCBhcmUgcmVmZXJlbmNlZCBvbmx5IGJ5IHRoZSBzcGVjaWZpZWQNCi0JICogZmVhdHVyZS4gVGhlc2UgYXJlIHBsdWctaW5zIHRoYXQgYXJlIG5vdCBzaGFyZWQgd2l0aCBhbnkgb3RoZXINCi0JICogZmVhdHVyZS4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUNCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwbHVnLWluIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGRvd25sb2FkZWQgaW4gb3JkZXINCi0JICogdG8gaW5zdGFsbCB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLCBpZiBpdCBjYW4gYmUgZGV0ZXJtaW5lZC4NCi0JICogVGhpcyBtZXRob2QgdGFrZXMgaW50byBhY2NvdW50IGFueSBwbHVnLWlucyB0aGF0IGFyZSBhbHJlYWR5DQotCSAqIGF2YWlsYWJsZSBvbiB0aGlzIHNpdGUuDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNvbnRlbnRFbnRyeU1vZGVsI1VOS05PV05fU0laRQ0KLQkgKiBAcGFyYW0gZmVhdHVyZSBjYW5kaWRhdGUgZmVhdHVyZQ0KLQkgKiBAcmV0dXJuIGRvd25sb2FkIHNpemUgb2YgdGhlIGZlYXR1cmUgaW4gS2lsb0J5dGVzLCBvciBhbiBpbmRpY2F0aW9uIA0KLQkgKiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpOw0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIGluc3RhbGxlZA0KLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlIG9uIHRoaXMgc2l0ZSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIFRoaXMgbWV0aG9kIHRha2VzIGludG8gYWNjb3VudCBhbnkgcGx1Zy1pbnMgdGhhdCBhcmUgYWxyZWFkeQ0KLQkgKiBpbnN0YWxsZWQgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Db250ZW50RW50cnlNb2RlbCNVTktOT1dOX1NJWkUNCi0JICogQHBhcmFtIGZlYXR1cmUgY2FuZGlkYXRlIGZlYXR1cmUNCi0JICogQHJldHVybiBpbnN0YWxsIHNpemUgb2YgdGhlIGZlYXR1cmUgaW4gS2lsb0J5dGVzLCBvciBhbiBpbmRpY2F0aW9uIA0KLQkgKiB0aGUgc2l6ZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemVGb3IoSUZlYXR1cmUgZmVhdHVyZSk7DQotDQotCS8qKg0KLQkgKiBJbnN0YWxscyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHBhcmFtIGZlYXR1cmUgZmVhdHVyZSB0byBpbnN0YWxsDQotCSAqIEBwYXJhbSB2ZXJpZmljYXRpb25MaXN0ZW5lciBpbnN0YWxsIHZlcmlmaWNhdGlvbiBsaXN0ZW5lcg0KLQkgKiBAcGFyYW0gbW9uaXRvciBpbnN0YWxsIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgaW5zdGFsbA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBJbnN0YWxscyB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLg0KLQkgKiBPbmx5IG9wdGlvbmFsIGZlYXR1cmVzIHBhc3NlZCBhcyBwYXJhbWV0ZXIgd2lsbCBiZSBpbnN0YWxsZWQuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIHRvIGluc3RhbGwNCi0JICogQHBhcmFtIG9wdGlvbmFsZmVhdHVyZXMgbGlzdCBvZiBvcHRpb25hbCBmZWF0dXJlcyB0byBiZSBpbnN0YWxsZWQNCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyIGluc3RhbGwgdmVyaWZpY2F0aW9uIGxpc3RlbmVyDQotCSAqIEBwYXJhbSBtb25pdG9yIGluc3RhbGwgbW9uaXRvciwgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBleGNlcHRpb24gSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gd2hlbiB0aGUgdXNlciBjYW5jZWxzIHRoZSBpbnN0YWxsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOw0KLQ0KLQkvKioNCi0JICogUmVtb3ZlcyAodW5pbnN0YWxscykgdGhlIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gdGhpcyBzaXRlLiBUaGlzIG1ldGhvZA0KLQkgKiB0YWtlcyBpbnRvIGFjY291bnQgcGx1Zy1pbiBlbnRyaWVzIHJlZmVyZW5jZWQgYnkgdGhlIHNwZWNpZmllZCBmZXRhdXJlDQotCSAqIHRoYXQgY29udGludWUgdG8gYmUgcmVxdWlyZWQgYnkgb3RoZXIgZmVhdHVyZXMgaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZS4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlIGZlYXR1cmUgdG8gcmVtb3ZlDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3INCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHNpdGUgY29udGVudCBwcm92aWRlci4gVGhpcyBpcyB0eXBpY2FsbHkgcGVyZm9ybWVkDQotCSAqIGFzIHBhcnQgb2YgdGhlIHNpdGUgY3JlYXRpb24gb3BlcmF0aW9uLiBPbmNlIHNldCwgdGhlIA0KLQkgKiBwcm92aWRlciBzaG91bGQgbm90IGJlIHJlc2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZSBjb250ZW50IHByb3ZpZGVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcik7DQotDQotCS8qKiANCi0JICogUmV0dXJucyB0aGUgPGNvZGU+SUNvbmZpZ3VyZWRTaXRlPC9jb2RlPiBmb3IgdGhpcyBzaXRlIGluIHRoZSBjdXJyZW50IA0KLQkgKiBjb25maWd1cmF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgZm91bmQuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wLjINCi0JICovDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7DQotDQotCS8qKg0KLQkqIENyZWF0ZXMgYSBuZXcgZmVhdHVyZSBvYmplY3QuIFRoZSBmZWF0dXJlIG11c3QgZXhpc3Qgb24gdGhpcyBzaXRlDQotCSogb3IgYSBjb3JlIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIA0KLQkqIG1heSBlbGVjdCB0byBjYWNoZSBpbnN0YW5jZXMsIGluIHdoaWNoIGNhc2Ugc3Vic2VxdWVudCBjYWxscyANCi0JKiB0byBjcmVhdGUgYSBmZWF0dXJlIHdpdGggdGhlIHNhbWUgVVJMIHdpbGwNCi0JKiByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UuDQotCSogcGFyYW0gdHlwZSB0aGUgZmVhdHVyZSB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgZmFjdG9yeS4gSWYNCi0JKiA8Y29kZT5udWxsPC9jb2RlPiBpcyBwYXNzZWQsIGRlZmF1bHQgZmVhdHVyZSB0eXBlIHdpbGwgYmUgdXNlZC4NCi0JKiBwYXJhbSB1cmwgVVJMIG9mIHRoZSBmZWF0dXJlIGFyY2hpdmUgYXMgbGlzdGVkIGluIHRoZSBzaXRlLg0KLQkqIHJldHVybiBuZXdseSBjcmVhdGVkIGZlYXR1cmUgb2JqZWN0LCBvciBhIGNhY2hlZCB2YWx1ZSBpZg0KLQkqIGNhY2hpbmcgaXMgaW1wbGVtZW50ZWQgYnkgdGhpcyBzaXRlLg0KLQkqIEBkZXByZWNhdGVkIHVzZSBjcmVhdGVGZWF0dXJlKFN0cmluZyxVUkwsSVByb2dyZXNzTW9uaXRvcikgaW5zdGVhZA0KLQkqIEBzaW5jZSAyLjAuMg0KLQkqLw0KLQlJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyB0eXBlLCBVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0JLyoqDQotCSogQ3JlYXRlcyBhIG5ldyBmZWF0dXJlIG9iamVjdC4gVGhlIGZlYXR1cmUgbXVzdCBleGlzdCBvbiB0aGlzIHNpdGUNCi0JKiBvciBhIGNvcmUgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgDQotCSogbWF5IGVsZWN0IHRvIGNhY2hlIGluc3RhbmNlcywgaW4gd2hpY2ggY2FzZSBzdWJzZXF1ZW50IGNhbGxzIA0KLQkqIHRvIGNyZWF0ZSBhIGZlYXR1cmUgd2l0aCB0aGUgc2FtZSBVUkwgd2lsbA0KLQkqIHJldHVybiB0aGUgc2FtZSBpbnN0YW5jZS4NCi0JKiBwYXJhbSB0eXBlIHRoZSBmZWF0dXJlIHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBmYWN0b3J5LiBJZg0KLQkqIDxjb2RlPm51bGw8L2NvZGU+IGlzIHBhc3NlZCwgZGVmYXVsdCBmZWF0dXJlIHR5cGUgd2lsbCBiZSB1c2VkLg0KLQkqIHBhcmFtIHVybCBVUkwgb2YgdGhlIGZlYXR1cmUgYXJjaGl2ZSBhcyBsaXN0ZWQgaW4gdGhlIHNpdGUuDQotCSogcmV0dXJuIG5ld2x5IGNyZWF0ZWQgZmVhdHVyZSBvYmplY3QsIG9yIGEgY2FjaGVkIHZhbHVlIGlmDQotCSogY2FjaGluZyBpcyBpbXBsZW1lbnRlZCBieSB0aGlzIHNpdGUuDQotCSogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3INCi0JKiBAc2luY2UgMi4xDQotCSovDQotCUlGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nIHR5cGUsIFVSTCB1cmwsSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjllOGU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLSANCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotDQotLyoqDQotICogU2l0ZSBjb250ZW50IHByb3ZpZGVyLg0KLSAqIEEgc2l0ZSBjb250ZW50IHByb3ZpZGVyIGlzIGFuIGFic3RyYWN0aW9uIG9mIGVhY2ggc2l0ZSBpbnRlcm5hbCANCi0gKiBvcmdhbml6YXRpb24uIEl0IGFsbG93cyB0aGUgc2l0ZSBjb250ZW50IHRvIGJlIGFjY2Vzc2VkIGluDQotICogYSBzdGFuZGFyZCB3YXkgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJuYWwgb3JnYW5pemF0aW9uLiBBbGwgY29uY3JldGUgc2l0ZQ0KLSAqIGltcGxlbWVudGF0aW9ucyBuZWVkIHRvIGltcGxlbWVudCBhIHNpdGUgY29udGVudCBwcm92aWRlci4NCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlQ29udGVudFByb3ZpZGVyDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLSANCi1wdWJsaWMgaW50ZXJmYWNlIElTaXRlQ29udGVudFByb3ZpZGVyIHsNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhpcyBzaXRlDQotCSAqIA0KLQkgKiBAcmV0dXJuIHNpdGUgVVJMDQotCSAqIEBzaW5jZSAyLjANCi0JICovCQ0KLQlwdWJsaWMgVVJMIGdldFVSTCgpOw0KLQkJCQ0KLQkNCi0JLyoqDQotCSAqIFJldHVybnMgYSBVUkwgZm9yIHRoZSBpZGVudGlmaWVkIGFyY2hpdmUgDQotCSAqIA0KLQkgKiBAcGFyYW0gaWQgYXJjaGl2ZSBpZGVudGlmaWVyDQotCSAqIEByZXR1cm4gYXJjaGl2ZSBVUkwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24gDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSAgdGhyb3dzIENvcmVFeGNlcHRpb247DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIGZvciB0aGlzIHByb3ZpZGVyDQotCSAqIA0KLQkgKiBAcmV0dXJuIHByb3ZpZGVyIHNpdGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElTaXRlIGdldFNpdGUoKTsJDQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBmb3IgdGhpcyBwcm92aWRlci4NCi0JICogSW4gZ2VuZXJhbCwgdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFzIHBhcnQgb2YNCi0JICogc2l0ZSBjcmVhdGlvbi4gT25jZSBzZXQsIHRoZSBzaXRlIHNob3VsZCBub3QgYmUgcmVzZXQuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2l0ZSBwcm92aWRlciBzaXRlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGUoSVNpdGUgc2l0ZSk7DQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQyNTJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVNpdGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogU2l0ZSBmYWN0b3J5IGludGVyZmFjZS4NCi0gKiBBIHNpdGUgZmFjdG9yeSBpcyB1c2VkIHRvIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIGNvbmNyZXRlDQotICogc2l0ZXMuIA0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4gSG93ZXZlciwgaW4gbW9zdCBjYXNlcyBjbGllbnRzIHNob3VsZCANCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyANCi0gKiBpbnRlcmZhY2UuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElTaXRlRmFjdG9yeSB7DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgc2l0ZSBkZWZpbmVkIGJ5IHRoZSBzdXBwbGllZCBVUkwuIA0KLQkgKiA8cD4NCi0JICogVGhlIGFjdHVhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgVVJMIGlzIHNpdGUtdHlwZSBzcGVjaWZpYy4NCi0JICogSW4gbW9zdCBjYXNlcyB0aGUgVVJMIHdpbGwgcG9pbnQgdG8gc29tZSBzaXRlLXNwZWNpZmljDQotCSAqIGZpbGUgdGhhdCBjYW4gYmUgdXNlZCAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gY29uc3RydWN0DQotCSAqIHRoZSBzaXRlIG9iamVjdC4NCi0JICogPC9wPg0KLQkgKiBAcGFyYW0gdXJsIFVSTCBpbnRlcnByZXRlZCBieSB0aGUgc2l0ZQ0KLQkgKiBAcmV0dXJuIHNpdGUgb2JqZWN0DQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB0aGUgcmVmZXJlbmNlZCBzaXRlIHR5cGUgaXMNCi0JICogbm90IGEgc3VwcG9ydGVkIHR5cGUgZm9yIHRoaXMgZmFjdG9yeSANCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmFjdG9yeUV4dGVuc2lvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUZhY3RvcnlFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmNWZkOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmFjdG9yeUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gdGhlIHN0YW5kYXJkIElTaXRlRmFjdG9yeSBpbnRlcmZhY2UuCi0gKiBJZiBhIGZhY3RvcnkgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSBhbmQgaXMgaGFuZGxpbmcKLSAqIFVSTCBjb25uZWN0aW9ucywgYSBwcm9ncmVzcyBtb25pdG9yIGNhbiBiZSBwYXNzZWQgdG8gCi0gKiBhbGxvdyBjYW5jZWxpbmcgb2YgZnJvemVuIGNvbm5lY3Rpb25zLiAKLSAqIDwvcD4KLSAqIDxwPklucHV0IHN0cmVhbSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBjb25uZWN0aW9uIG9uCi0gKiBhIHNlcGFyYXRlIHRocmVhZC4gV2hlbiBjb25uZWN0aW9uIGlzIGNhbmNlbGVkLCAKLSAqIHRoZSB0aHJlYWQgaXMgc3RpbGwgYWN0aXZlLiBJdCBpcyBhbGxvd2VkIHRvIHRlcm1pbmF0ZQotICogd2hlbiB0aGUgY29ubmVjdGlvbiB0aW1lcyBvdXQgb24gaXRzIG93bi4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeQotICogQHNpbmNlIDIuMQotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVGYWN0b3J5RXh0ZW5zaW9uIHsKLQkvKioKLQkgKiBSZXR1cm5zIGEgc2l0ZSBkZWZpbmVkIGJ5IHRoZSBzdXBwbGllZCBVUkwuIAotCSAqIDxwPgotCSAqIFRoZSBhY3R1YWwgaW50ZXJwcmV0YXRpb24gb2YgdGhlIFVSTCBpcyBzaXRlLXR5cGUgc3BlY2lmaWMuCi0JICogSW4gbW9zdCBjYXNlcyB0aGUgVVJMIHdpbGwgcG9pbnQgdG8gc29tZSBzaXRlLXNwZWNpZmljCi0JICogZmlsZSB0aGF0IGNhbiBiZSB1c2VkIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBjb25zdHJ1Y3QKLQkgKiB0aGUgc2l0ZSBvYmplY3QuCi0JICogPC9wPgotCSAqIEBwYXJhbSB1cmwgVVJMIGludGVycHJldGVkIGJ5IHRoZSBzaXRlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yIHRoYXQgY2FuIGJlIGNhbmNlbGVkCi0JICogQHJldHVybiBzaXRlIG9iamVjdAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBleGNlcHRpb24gSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIHRoZSByZWZlcmVuY2VkIHNpdGUgdHlwZSBpcwotCSAqIG5vdCBhIHN1cHBvcnRlZCB0eXBlIGZvciB0aGlzIGZhY3RvcnkgCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JU2l0ZUZlYXR1cmVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0OWVkZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lTaXRlRmVhdHVyZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFNpdGUgRmVhdHVyZSByZWZlcmVuY2UuCi0gKiBBIHJlZmVyZW5jZSB0byBhIGZlYXR1cmUgb24gYSBwYXJ0aWN1bGFyIHVwZGF0ZSBzaXRlLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgCi0gKiBkaXJlY3RseSBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyAKLSAqIGludGVyZmFjZS4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVGZWF0dXJlUmVmZXJlbmNlCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGV4dGVuZHMgSUZlYXR1cmVSZWZlcmVuY2UsIElBZGFwdGFibGUgewotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBjYXRlZ29yaWVzIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgYmVsb25nIHRvLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2F0ZWdvcmllcywgb3IgYW4gZW1wdHkgYXJyYXkKLQkgKiBAc2luY2UgMi4xIAotCSAqLwotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCk7Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2F0ZWdvcnkgdG8gdGhlIHJlZmVyZW5jZWQgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgbmV3IGNhdGVnb3J5Ci0JICogQHNpbmNlIDIuMSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShJQ2F0ZWdvcnkgY2F0ZWdvcnkpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lVUkxFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVVJMRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxMzQ1Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lVUkxFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLQ0KLS8qKg0KLSAqIFVSTCBlbnRyeSBpcyBhbiBhbm5vdGF0ZWQgVVJMIG9iamVjdC4gSXQgYWxsb3dzIGRlc2NyaXB0aXZlIHRleHQgdG8gYmUNCi0gKiBhc3NvY2lhdGVkIHdpdGggYSBVUkwuIFdoZW4gdXNlZCBhcyBkZXNjcmlwdGlvbiBvYmplY3QsIHRoZSBhbm5vdGF0aW9uDQotICogdHlwaWNhbGx5IGNvcnJlc3BvbmRzIHRvIHNob3J0IGRlc2NyaXB0aXZlIHRleHQsIHdpdGggdGhlIFVSTCByZWZlcmVuY2UNCi0gKiBwb2ludGluZyB0byBmdWxsIGJyb3dzYWJsZSBkZXNjcmlwdGlvbi4NCi0gKiA8cD4NCi0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEhvd2V2ZXIsIGluIG1vc3QgY2FzZXMgY2xpZW50cyBzaG91bGQgDQotICogZGlyZWN0bHkgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgDQotICogaW50ZXJmYWNlLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VUkxFbnRyeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElVUkxFbnRyeSBleHRlbmRzIElBZGFwdGFibGUgew0KLQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfU0lURSA9IDA7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdFQl9TSVRFID0gMTsJDQotDQotCS8qKiANCi0JICogUmV0dXJucyB0aGUgVVJMIGFubm90YXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQ0KLQkgKiANCi0JICogQHJldHVybiB1cmwgYW5ub3RhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKTsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGFjdHVhbCBVUkwuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybC4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgVVJMRW50cnkNCi0JICogDQotCSAqIEBzZWUgI1VQREFURV9TSVRFDQotCSAqIEBzZWUgI1dFQl9TSVRFDQotCSAqIEByZXR1cm4gdHlwZQ0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRUeXBlKCk7CQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lVcGRhdGVDb25zdGFudHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVVwZGF0ZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA2YmEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVVwZGF0ZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotIAotLyoqCi0gKiBNYW5hZ2VzIGEgbGlzdCBvZiBzdGF0aWMgY29uc3RhbnRzLgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDIuMC4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZUNvbnN0YW50cyB7Ci0JCi0JCS8qKgotCSAqIE5vIG1hdGNoaW5nIHJ1bGUgc3BlY2lmaWVkIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX05PTkUgPSAwOwotCi0JLyoqCi0JICogRGVwZW5kZW5jeSBjYW4gYmUgc2F0aXNmaWVkIG9ubHkgd2l0aCBwbHVnLWluIHZlcnNpb24gbWF0Y2hpbmcgCi0JICogZXhhY3RseSB0aGUgc3BlY2lmaWVkIHZlcnNpb24uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfUEVSRkVDVCA9IDE7Ci0KLQkvKioKLQkgKiBEZXBlbmRlbmN5IGNhbiBiZSBzYXRpc2ZpZWQgb25seSB3aXRoIHBsdWctaW4gdmVyc2lvbiB0aGF0IGlzIAotCSAqIGVxdWl2YWxlbnQgdG8gdGhlIHNwZWNpZmllZCB2ZXJzaW9uIChzYW1lIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uCi0JICogaWRlbnRpZmllciwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHNlcnZpY2UgaWRlbnRpZmllcikuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfRVFVSVZBTEVOVCA9IDI7Ci0KLQkvKioKLQkgKiBEZXBlbmRlbmN5IGNhbiBiZSBzYXRpc2ZpZWQgb25seSB3aXRoIHBsdWctaW4gdmVyc2lvbiB0aGF0IGlzIAotCSAqIGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHZlcnNpb24gKGVpdGhlciBpcyBlcXVpdmFsZW50LAotCSAqIG9yIGdyZWF0ZXIgbWlub3IgaWRlbnRpZmllciAoYnV0IHNhbWUgbWFqb3IgaWRlbnRpZmllcikpLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0NPTVBBVElCTEUgPSAzOwotCi0JLyoqCi0JICogRGVwZW5kZW5jeSBjYW4gYmUgc2F0aXNmaWVkIG9ubHkgd2l0aCBwbHVnLWluIHZlcnNpb24gdGhhdCBpcyAKLQkgKiBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9HUkVBVEVSX09SX0VRVUFMID0gNDsKLQkKLQkvKioKLQkgKiBEZXBlbmRlbmN5IGNhbiBiZSBzYXRpc2ZpZWQgb25seSBpZiB0aGUgcmVxdWlyZWQgaWRlbnRpZmllcgotCSAqIGlzIGEgcHJlZml4IG9mIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4KLQkgKiBAc2luY2UgMi4xCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9QUkVGSVggPSAxOwotCi0JLyoqCi0JICogVGhlIHNlYXJjaCBsb2NhdGlvbiBmb3IgdXBkYXRlcyBpcyBkZWZpbmVkIGJ5IHRoZSByb290IGZlYXR1cmUuCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIX1JPT1QgPSAxPDwxOwotCQotCS8qKgotCSAqIFRoZSBzZWFyY2ggbG9jYXRpb24gZm9yIHVwZGF0ZXMgaXMgZGVmaW5lZCBieSB0aGlzIGZlYXR1cmUuCi0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VBUkNIX1NFTEYgPSAxPDwyOwotCQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lWZXJpZmljYXRpb25MaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVmVyaWZpY2F0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5MTg2ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lWZXJpZmljYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLSAKLS8qKgotICogVmVyaWZpY2F0aW9uIGxpc3RlbmVyLiBUaGlzIGludGVyZmFjZSBhYnN0cmFjdCB0aGUgdXNlciBpbnRlcmFjdGlvbgotICogdGhhdCBtYXkgYmUgcmVxdWlyZWQgYXMgYSByZXN1bHQgb2YgZmVhdHVyZSBpbnN0YWxsYXRpb24uIEluIHBhcnRpY3VsYXIsCi0gKiBhcyBmZWF0dXJlIGFyY2hpdmVzIGFyZSBkb3dubG9hZGVkIGFuZCB2ZXJpZmllZCwgdGhlIHVzZXIgbWF5IG5lZWQgdG8gCi0gKiBpbmRpY2F0ZSB3aGV0aGVyIHRvIGFjY2VwdCBhbnkgb25lIG9mIHRoZSBhcmNoaXZlcywgb3IgYWJvcnQgdGhlIAotICogaW5zdGFsbGF0aW9uLgotICogPHA+Ci0gKiBDbGllbnRzIG1heSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpY2F0aW9uUmVzdWx0Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklWZXJpZmllcgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZSB0aGUgYWN0aW9uIHRoYXQgcmVzdWx0ZWQgaW4gdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIGJlIGFib3J0ZWQuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9BQk9SVCA9IDA7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGUgdGhlcmUgd2FzIGFuIGVycm9yIGluIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QuCi0JICogVGhlIGFjdGlvbiB0aGF0IHJlc3VsdGVkIGluIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBiZSBhYm9ydGVkLgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSE9JQ0VfRVJST1IgPSAxOwotCQotCS8qKgotCSAqIEluZGljYXRlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGUgdmVyaWZpY2F0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCwKLQkgKiBidXQgdGhlIGluZm9ybWF0aW9uIHN1cHBsaWVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbiByZXN1bHQKLQkgKiBzaG91bGQgYmUgdHJ1c3RlZCBvbmx5IGZvciB0aGlzIHJlcXVlc3QuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRV9JTlNUQUxMX1RSVVNUX09OQ0UgPSAyOwotCQotCS8qKgotCSAqIEluZGljYXRlIHRoYXQgdGhlIHRhcmdldCBvZiB0aGUgdmVyaWZpY2F0aW9uIHNob3VsZCBiZSBhY2NlcHRlZCwKLQkgKiBhbmQgdGhlIGluZm9ybWF0aW9uIHN1cHBsaWVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbiByZXN1bHQKLQkgKiBzaG91bGQgYmUgdHJ1c3RlZCBmb3IgdGhpcyByZXF1ZXN0LCBhbmQgc3Vic2VxdWVudCByZXF1ZXN0cy4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTID0gMzsKLQkKLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGNvbnRpbnVlIHdpdGggdGhlIGN1cnJlbnQgYWN0aW9uCi0JICogYmFzZWQgb24gdGhlIGluZGljYXRlZCB2ZXJpZmljYXRpb24gcmVzdWx0cy4gVHlwaWNhbGx5LAotCSAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB3aWxsIHByb21wdCB0aGUgdXNlcgotCSAqIGZvciB0aGUgYXBwcm9wcmlhdGUgYW5zd2VyLiBIb3dldmVyLCBvdGhlciByZXNwb3NlIAotCSAqIGltcGxlbWVudGF0aW9ucyBjYW4gYmUgcHJvdmlkZWQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdCB2ZXJpZmljYXRpb24gcmVzdWx0IAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IHByb21wdChJVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0lWZXJpZmljYXRpb25SZXN1bHQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODMyODllLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLS8qKgotICogVmVyaWZpY2F0aW9uIHJlc3VsdC4gQW4gb2JqZWN0IGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSByZXByZXNlbnRzCi0gKiBhIHRva2VuIHBhc3NlZCBiZXR3ZWVuIHRoZSB1cGRhdGUgZnJhbWV3b3JrIGFuZCB0aGUgdmVyaWZpZXIgYW5kIHZlcmlmaWNhdGlvbgotICogbGlzdGVuZXIuIFRoZSB2ZXJpZmllciB1c2VzIHRoZSB0b2tlbiB0byBjYXB0dXJlIHRoZSByZXN1bHQgb2YgdGhlIGZpbGUKLSAqIHZlcmlmaWNhdGlvbi4gSXQgaXMgdGhlbiBwYXNzZWQgdG8gdGhlIHZlcmlmaWNhdGlvbiBsaXN0ZW5lcgotICogdG8gb3B0aW9uYWxseSBwcmVzZW50IHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIgKGluIGFuIAotICogaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgd2F5KS4gVGhlIHZlcmlmaWNhdGlvbiBsaXN0ZW5lciBpbiB0dXJuCi0gKiB1c2VzIHRoaXMgdG9rZW4gdG8gY2FwdHVyZSB0aGUgZGVzaXJlZCByZXNwb25zZS4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmVyaWZpY2F0aW9uUmVzdWx0IHsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgZmlsZSB0eXBlIGlzIHJlY29nbml6ZWQgYnV0IHRoZSBmaWxlIGlzIG5vdCBzaWduZWQKLQkgKiAKLQkgKiBAc2VlICNUWVBFX0VOVFJZX1VOUkVDT0dOSVpFRAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVFJZX05PVF9TSUdORUQgPSAxOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBmaWxlIGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlIGl0IHdhcyBzaWduZWQKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FTlRSWV9DT1JSVVBURUQgPSAyOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoZSBmaWxlIGlzIHNpZ25lZCBieSBhIGtub3duIHNpZ25lcgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVFJZX1NJR05FRF9SRUNPR05JWkVEID0gMzsKLQotCS8qKgotCSAqIEluZGljYXRlcyB0aGUgZmlsZSBpcyBzaWduZWQgYnV0IHRoZSBzaWduZXIgaXMgbm90IGtub3duCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCA9IDU7Ci0KLQkvKioKLQkgKiBFcnJvciBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV05fRVJST1IgPSA2OwotCi0JLyoqCi0JICogVmVyaWZpY2F0aW9uIHdhcyBjYW5jZWxsZWQKLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkVSSUZJQ0FUSU9OX0NBTkNFTExFRCA9IDc7Ci0KLQkvKioKLQkgKiBDb3VsZCBub3QgcGVyZm9ybSB2ZXJpZmljYXRpb24gZHVlIHRvIHVucmVjb2duaXplZCBmaWxlCi0JICogCi0JICogQHNlZSAjVFlQRV9FTlRSWV9OT1RfU0lHTkVECi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRU5UUllfVU5SRUNPR05JWkVEID0gODsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgcmVmZXJlbmNlIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgdmVyaWZpY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gY29udGVudCByZWZlcmVuY2UKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0Q29udGVudFJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSB0aGUgcmVmZXJlbmNlZCBmaWxlIGlzIHBhcnQgb2YuCi0JICogCi0JICogQHJldHVybiBmZWF0dXJlCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2ZXJpZmljYXRpb24gY29kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHZlcmlmaWNhdGlvbiBjb2RlLCBhcyBkZWZpbmVkIGluIHRoaXMgaW50ZXJmYWNlLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZlcmlmaWNhdGlvbkNvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW55IGV4Y2VwdGlvbiBjYXVnaHQgZHVyaW5nIHZlcmlmaWNhdGlvbgotCSAqIAotCSAqIEByZXR1cm4gZXhjZXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEV4Y2VwdGlvbiBnZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgZGlzcGxheSB0ZXh0IGRlc2NyaWJpbmcgdGhlIHJlc3VsdCBvZiB0aGUgdmVyaWZpY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gcmVzdWx0IHRleHQsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGV4dCBkZXNjcmliaW5nIHRoZSBzaWduZXIKLQkgKiAKLQkgKiBAcmV0dXJuIHNpZ25lciBpbmZvcm1hdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2lnbmVySW5mbygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0ZXh0IGRlc2NyaWJpbmcgdGhlIGF1dGhvcml0eSB0aGF0IHZlcmlmaWVkLyBjZXJ0aWZpZWQgCi0JICogdGhlIHNpZ25lcgotCSAqIAotCSAqIEByZXR1cm4gdmVyaWZpZXIgaW5mb3JtYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcmlmaWVySW5mbygpOwotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlZmVyZW5jZWQgZmlsZSBpcyBwYXJ0IG9mIHRoZSBvdmVyYWxsIGZlYXR1cmUKLQkgKiBkZWZpbml0aW9uLCBvciBvbmUgb2YgaXRzIGNvbXBvbmVudCBwbHVnLWluIG9yIG5vbi1wbHVnLWluIGVudHJpZXMuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiByZWZlcmVuY2UgaXMgYSBmZWF0dXJlIGZpbGUsIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiByZWZlcmVuY2UgaXMgYSBwbHVnLWluIG9yIG5vbi1wbHVnLWluIGZpbGUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCk7Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNpZ25lciBhbmQgdmVyaWZpZXIgaW5mbyBoYXZlIGFscmVhZHkgYmVlbiBhY2NlcHRlZCBieSB0aGUgdXNlcgotCSAqIGR1cmluZyBhIHByZXZpb3VzIHZlcmlmaWNhdGlvbiBvZiBvbmUgb2YgdGhlIGZpbGUgb2YgdGhlIGZlYXR1cmUuCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVzdWx0IGhhcyBhbHJlYWR5IGJlZW4gYWNjZXB0ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIHRoZSByZXN1bHQgaGFzIG5vdCB5ZXQgYmVlbiBhY2NlcHRlZCBieSB0aGUgdXNlcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbHJlYWR5U2VlbigpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVmVyaWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSVZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxODE4NWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JVmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBWZXJpZmllci4gVGhpcyBpbnRlcmZhY2UgYWJzdHJhY3RzIHRoZSBhcmNoaXZlIHZlcmlmaWNhdGlvbiBzdGVwCi0gKiBwZXJmb3JtZWQgYnkgc3BlY2lmaWMgZmVhdHVyZSBpbXBsZW1lbnRhdGlvbnMuIFRoZSBhY3R1YWwgZGV0YWlscwotICogb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWNhdGlvblJlc3VsdAotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRWZXJpZmllcigpCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVZlcmlmaWVyIHsKLQotCS8qKgotCSAqIFBlcmZvcm0gdmVyaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIGNvbnRhaW5pbmcgdGhpcyBhcmNoaXZlCi0JICogQHBhcmFtIHJlZmVyZW5jZSBhY3R1YWwgYXJjaGl2ZSByZWZlcmVuY2UKLQkgKiBAcGFyYW0gaXNGZWF0dXJlVmVyaWZpY2F0aW9uIDxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyB0aGUgc3BlY2lmaWVkCi0JICogcmVmZXJlbmNlIHNob3VsZCBiZSBjb25zaWRlcmVkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUgZGVzY3JpcHRpb24KLQkgKiBpbmZvcm1hdGlvbiAoaWUuIHZlcmlmeWluZyB0aGUgb3ZlcmFsbCBmZWF0dXJlKSwgCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGluZGljYXRlcyB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSBpcyBhIHBsdWctaW4KLQkgKiBvciBhIG5vbi1wbHVnLWluIGFyY2hpdmUgZmlsZSAoaWUuIHZlcmlmeWluZyBhIGNvbXBvbmVudCBvZiB0aGUKLQkgKiBmZWF0dXJlKQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEByZXR1cm4gdmVyaWZpY2F0aW9uIHJlc3VsdAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZnkoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUNvbnRlbnRSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQlib29sZWFuIGlzRmVhdHVyZVZlcmlmaWNhdGlvbiwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb247Ci0JCQotCS8qKgotCSAqIFNldHMgdGhlIHBhcmVudCB2ZXJpZmllci4KLQkgKiAKLQkgKiBUaGUgcGFyZW50IHZlcmlmaWVyIGNhbiBvbmx5IGJlIHNldCBvbmNlIGJ5IHRoZSBwYXJlbnQgZmVhdHVyZS4KLQkgKiBJdCBtYXkgdXNlZCBmb3IgZGlmZmVyZW50IHZlcmlmaWNhdGlvbiBzdHJhdGVnaWVzLiAKLQkgKiAoZm9yIGluc3RhbmNlLCB5b3UgbWF5IGRlY2lkZSB0aGF0IGJvdGggdGhlIHBhcmVudCBhbmQgY3VycmVudCB2ZXJpZmllcgotCSAqIG11c3Qgc3VjZXNzZnVsbHkgdmVyaWZ5IHRoZSBjb250ZW50IHJlZmVyZW5jZSwgb3IgdGhhdCBvbmx5IG9uZSBvZiB0aGVtIG11c3QgdmVyaWZ5KQotCSAqIEBwYXJhbSBwYXJlbnRWZXJpZmllciB0aGUgcGFyZW50IHZlcmlmaWVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJVmVyaWZpZXIgcGFyZW50VmVyaWZpZXIpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCB2ZXJpZmllcgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCB2ZXJpZmllcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSVZlcmlmaWVyIGdldFBhcmVudCgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbXBvcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW1wb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZmEzNTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgcGx1Zy1pbiBkZXBlbmRlbmN5Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW1wb3J0DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbXBvcnRNb2RlbA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW1wb3J0IGV4dGVuZHMgSW1wb3J0TW9kZWwgaW1wbGVtZW50cyBJSW1wb3J0IHsNCi0NCi0JLy9QRVJGOiBuZXcgaW5zdGFuY2UgdmFyaWFibGUNCi0JcHJpdmF0ZSBWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25JZDsNCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gaWRlbnRpZmllciBvZiB0aGUgZGVwZW5kZW50IHBsdWctaW4uDQotCSAqIEBzZWUgSUltcG9ydCNnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkNCi0JICovDQotCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7DQotCQlpZiAodmVyc2lvbklkICE9IG51bGwpDQotCQkJcmV0dXJuIHZlcnNpb25JZDsNCi0NCi0JCVN0cmluZyBpZCA9IGdldElkZW50aWZpZXIoKTsNCi0JCVN0cmluZyB2ZXIgPSBnZXRWZXJzaW9uKCk7DQotCQlpZiAoaWQgIT0gbnVsbCAmJiB2ZXIgIT0gbnVsbCkgew0KLQkJCXRyeSB7DQotCQkJCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXIpOw0KLQkJCQlyZXR1cm4gdmVyc2lvbklkOw0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uZWQgaWRlbnRpZmllcjoiICsgaWQgKyAiOiIgKyB2ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQl9DQotCQl9DQotDQotCQkNCi0JCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCIiLG51bGwpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gdmVyc2lvbklkOwkJDQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG1hdGNoaW5nIHJ1bGUgZm9yIHRoZSBkZXBlbmRlbmN5Lg0KLQkgKiBAc2VlIElJbXBvcnQjZ2V0UnVsZSgpDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFJ1bGUoKSB7DQotCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLmdldE1hdGNoaW5nUnVsZShnZXRNYXRjaGluZ1J1bGVOYW1lKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgcnVsZSBmb3IgdGhlIGRlcGVuZGVuY3kgaWRlbnRpZmllci4NCi0JICogQHNlZSBJSW1wb3J0I2dldElkUnVsZSgpDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldElkUnVsZSgpIHsNCi0JCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0TWF0Y2hpbmdJZFJ1bGUoZ2V0TWF0Y2hpbmdJZFJ1bGVOYW1lKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUltcG9ydCNnZXRLaW5kKCkNCi0JICovDQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbmN5IGtpbmQNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW1wb3J0I2dldEtpbmQoKQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRLaW5kKCkgew0KLQkJcmV0dXJuIGlzRmVhdHVyZUltcG9ydCgpP0tJTkRfRkVBVFVSRTpLSU5EX1BMVUdJTjsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1NzFhZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIG9wdGlvbnMgb2YgYSBuZXN0ZWQgZmVhdHVyZS4KLSAqIEZlYXR1cmUgd2lsbCBpbmNsdWRlIG90aGVyIGZlYXR1cmVzLiBUaGlzIGNsYXNzIHdpbGwgcmVwcmVzZW50IHRoZSBvcHRpb25zIG9mIHRoZSBpbmNsdXNpb24uCi0gKiA8cD4KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlOyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXIKLSAqIEBzaW5jZSAyLjAuMQotICovCi1wdWJsaWMgY2xhc3MgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlCi0JZXh0ZW5kcyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbAotCWltcGxlbWVudHMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZQotCSAqIAotCSAqIEBzaW5jZSAyLjEKLQkgKi8KLQlwdWJsaWMgSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZlYXR1cmUgb3B0aW9ucyAKLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZWRGZWF0dXJlUmVmIHJlZmVyZW5jZSB0byBjbG9uZQotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBpbmNsdWRlZEZlYXR1cmVSZWYpIHsKLQkJc3VwZXIoKEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBpbmNsdWRlZEZlYXR1cmVSZWYpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSkgewotCQlzdXBlcihmZWF0dXJlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKgotCSAqIE1ldGhvZCBpc0Rpc2FibGVkLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0Rpc2FibGVkKCkgewotCQlJQ29uZmlndXJlZFNpdGUgY1NpdGUgPSBnZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCWlmIChjU2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWQgPSBjU2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5lcXVhbHMoY29uZmlndXJlZFtpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCQkvLwkJLy8gRklYTUU6IHRoZSBhYm92ZSBjb2RlIHdhcyBjb21tZW50ZWQgb3V0IGFuZCByZXR1cm5lZCBmYWxzZS4gCi0JCS8vCQkvLyBTaG91bGQgdGhpcyBiZSBjb21tZW50ZWQgb3V0IGFnYWluPwotCQkvLwkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogTWV0aG9kIGlzSW5zdGFsbGVkLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1VuaW5zdGFsbGVkKCkgewotCQlpZiAoIWlzRGlzYWJsZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpbnN0YWxsZWQgPSBnZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YWxsZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0aGlzLmVxdWFscyhpbnN0YWxsZWRbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBpZiB3ZSByZWFjaGVkIHRoaXMgcG9pbnQsIHRoZSBjb25maWd1cmVkIHNpdGUgZXhpc3RzIGFuZCBpdCBkb2VzIG5vdAotCQkvLyBjb250YWluIHRoaXMgZmVhdHVyZSByZWZlcmVuY2UsIHNvIGNsZWFybHkgdGhlIGZlYXR1cmUgaXMgdW5pbnN0YWxsZWQKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlI2dldEZlYXR1cmUoYm9vbGVhbiwKLQkgKiBJQ29uZmlndXJlZFNpdGUpCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgKLQkJYm9vbGVhbiBwZXJmZWN0TWF0Y2gsCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UjZ2V0RmVhdHVyZShib29sZWFuLAotCSAqIElDb25maWd1cmVkU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoCi0JCWJvb2xlYW4gcGVyZmVjdE1hdGNoLAotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUsCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIGdldEZlYXR1cmUobW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZSNnZXRGZWF0dXJlKCkKLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0RmVhdHVyZShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKTsKLQl9Ci0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZVJlZmVyZW5jZSNnZXRGZWF0dXJlCi0JICogKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpc1VuaW5zdGFsbGVkKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuT0ssIFBvbGljeS5iaW5kKCJJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UuZmVhdHVyZVVuaW5zdGFsbGVkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQlnZXRGZWF0dXJlSWRlbnRpZmllcigpKSwgbnVsbCkpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RmVhdHVyZShtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0luc3RhbGxIYW5kbGVyRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5zdGFsbEhhbmRsZXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzRjMzk2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5zdGFsbEhhbmRsZXJFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYW4gaW5zdGFsbCBoYW5kbGVyIGVudHJ5LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklJbnN0YWxsSGFuZGxlckVudHJ5Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkluc3RhbGxIYW5kbGVyRW50cnlNb2RlbAotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JSW5zdGFsbEhhbmRsZXIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxIYW5kbGVyRW50cnkKLQlleHRlbmRzIEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbAotCWltcGxlbWVudHMgSUluc3RhbGxIYW5kbGVyRW50cnkgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEluc3RhbGxIYW5kbGVyRW50cnkuCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbnN0YWxsSGFuZGxlckVudHJ5KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5zdGFsbE1vbml0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSW5zdGFsbE1vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFlOGM5MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0luc3RhbGxNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBJbnN0YWxsIHByb2dyZXNzIG1vbml0b3INCi0gKiBEZWxlZ2F0aW5nIHdyYXBwZXIgZm9yIElQcm9ncmVzc01vbml0b3IgdXNlZCBmb3IgaW5zdGFsbGF0aW9uIGhhbmRsaW5nLg0KLSAqIA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEluc3RhbGxNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7DQotDQotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7DQotCXByb3RlY3RlZCBTdGFjayB0YXNrczsNCi0NCi0JcHJvdGVjdGVkIFN0cmluZyB0YXNrU3RyaW5nOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1YlRhc2tTdHJpbmc7DQotCXByb3RlY3RlZCBib29sZWFuIHNob3dEZXRhaWxzOw0KLQlwcm90ZWN0ZWQgbG9uZyB0b3RhbENvcHlDb3VudDsNCi0JcHJvdGVjdGVkCWxvbmcgY3VycmVudENvdW50ID0gMDsNCi0NCi0JcHJvdGVjdGVkIGNsYXNzIE1vbml0b3JTdGF0ZSB7DQotDQotCQlwcml2YXRlIFN0cmluZyB0YXNrU3RyaW5nOw0KLQkJcHJpdmF0ZSBTdHJpbmcgc3ViVGFza1N0cmluZzsNCi0JCXByaXZhdGUgYm9vbGVhbiBzaG93RGV0YWlsczsNCi0JCXByaXZhdGUgbG9uZyB0b3RhbENvcHlDb3VudDsNCi0NCi0JCXByaXZhdGUgTW9uaXRvclN0YXRlKA0KLQkJCVN0cmluZyB0YXNrU3RyaW5nLA0KLQkJCVN0cmluZyBzdWJUYXNrU3RyaW5nLA0KLQkJCWJvb2xlYW4gc2hvd0RldGFpbHMsDQotCQkJbG9uZyB0b3RhbENvcHlDb3VudCkgew0KLQkJCXRoaXMudGFza1N0cmluZyA9IHRhc2tTdHJpbmc7DQotCQkJdGhpcy5zdWJUYXNrU3RyaW5nID0gc3ViVGFza1N0cmluZzsNCi0JCQl0aGlzLnNob3dEZXRhaWxzID0gc2hvd0RldGFpbHM7DQotCQkJdGhpcy50b3RhbENvcHlDb3VudCA9IHRvdGFsQ29weUNvdW50Ow0KLQkJfQ0KLQ0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0VGFza1N0cmluZygpIHsNCi0JCQlyZXR1cm4gdGhpcy50YXNrU3RyaW5nOw0KLQkJfQ0KLQ0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0U3ViVGFza1N0cmluZygpIHsNCi0JCQlyZXR1cm4gdGhpcy5zdWJUYXNrU3RyaW5nOw0KLQkJfQ0KLQ0KLQkJcHJpdmF0ZSBib29sZWFuIGdldFNob3dEZXRhaWxzKCkgew0KLQkJCXJldHVybiB0aGlzLnNob3dEZXRhaWxzOw0KLQkJfQ0KLQ0KLQkJcHJpdmF0ZSBsb25nIGdldFRvdGFsQ29weUNvdW50KCkgew0KLQkJCXJldHVybiB0aGlzLnRvdGFsQ29weUNvdW50Ow0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgSW5zdGFsbE1vbml0b3IoKSB7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluc3RhbGwgbW9uaXRvciBjb25zdHJ1Y3Rvcg0KLQkgKiANCi0JICogQHBhcmFtIG1vbml0b3IgYmFzZSBpbnN0YWxsIG1vbml0b3INCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEluc3RhbGxNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsNCi0JCXRoaXMudGFza3MgPSBuZXcgU3RhY2soKTsNCi0JCXRoaXMudGFza1N0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkDQotCQl0aGlzLnN1YlRhc2tTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJdGhpcy5zaG93RGV0YWlscyA9IGZhbHNlOw0KLQkJdGhpcy50b3RhbENvcHlDb3VudCA9IDA7DQotCX0NCi0NCi0JLyoqDQotCSAqIEJlZ2luIG5ldyBtb25pdG9yIHRhc2suDQotCSAqIA0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjYmVnaW5UYXNrKFN0cmluZywgaW50KQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsNCi0JCXRhc2tTdHJpbmcgPSBuYW1lOw0KLQkJbW9uaXRvci5iZWdpblRhc2sobmFtZSwgdG90YWxXb3JrKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGUgY29tcGxldGlvbiBvZiBtb25pdG9yIGFjdGl2aXR5Lg0KLQkgKiANCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2RvbmUoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkb25lKCkgew0KLQkJbW9uaXRvci5kb25lKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlIG1vbml0b3IgcHJvZ3Jlc3MuDQotCSAqIA0KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaW50ZXJuYWxXb3JrZWQoZG91YmxlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbnRlcm5hbFdvcmtlZChkb3VibGUgd29yaykgew0KLQkJbW9uaXRvci5pbnRlcm5hbFdvcmtlZCh3b3JrKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ2hlY2sgaXMgdXNlIGluZGljYXRlZCB0aGF0IHRoZSBvcGVyYXRpb24gYmUgY2FuY2VsbGVkLg0KLQkgKiANCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgew0KLQkJcmV0dXJuIG1vbml0b3IuaXNDYW5jZWxlZCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXQgdGhlIGNhbmNlbGxhdGlvbiBzdGF0ZS4NCi0JICogDQotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzZXRDYW5jZWxlZChib29sZWFuKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIHZhbHVlKSB7DQotCQltb25pdG9yLnNldENhbmNlbGVkKHZhbHVlKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0IHRhc2sgbmFtZS4NCi0JICogDQotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzZXRUYXNrTmFtZShTdHJpbmcpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRhc2tOYW1lKFN0cmluZyBuYW1lKSB7DQotCQl0aGlzLnRhc2tTdHJpbmcgPSBuYW1lOw0KLQkJdGhpcy5zdWJUYXNrU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMuc2hvd0RldGFpbHMgPSBmYWxzZTsNCi0JCXRoaXMudG90YWxDb3B5Q291bnQgPSAwOw0KLQkJbW9uaXRvci5zdWJUYXNrKCIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJbW9uaXRvci5zZXRUYXNrTmFtZShuYW1lKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0IHN1YnRhc2sgbmFtZS4NCi0JICogDQotCSAqIEBzZWUgSVByb2dyZXNzTW9uaXRvciNzdWJUYXNrKFN0cmluZykNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgew0KLQkJdGhpcy5zdWJUYXNrU3RyaW5nID0gbmFtZTsNCi0JCXRoaXMuc2hvd0RldGFpbHMgPSBmYWxzZTsNCi0JCXRoaXMudG90YWxDb3B5Q291bnQgPSAwOw0KLQkJbW9uaXRvci5zdWJUYXNrKG5hbWUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZSBtb25pdG9yIHByb2dyZXNzLg0KLQkgKiANCi0JICogQHNlZSBJUHJvZ3Jlc3NNb25pdG9yI3dvcmtlZChpbnQpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgew0KLQkJbW9uaXRvci53b3JrZWQod29yayk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNhdmUgdGhlIGN1cnJlbnQgbW9uaXRvciBzdGF0ZS4NCi0JICogVGhlIHN0YXRlcyBhcmUgc2F2ZWQgb24gYSBwdXNoLWRvd24gc3RhY2suIFByaW9yIHN0YXRlcw0KLQkgKiBjYW4gYmUgcmVzdG9yZWQgYnkgY2FsbGluZyByZXN0b3JTdGF0ZSgpDQotCSAqIA0KLQkgKiBAc2VlICNyZXN0b3JlU3RhdGUoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoKSB7DQotCQl0YXNrcy5wdXNoKA0KLQkJCW5ldyBNb25pdG9yU3RhdGUodGFza1N0cmluZywgc3ViVGFza1N0cmluZywgc2hvd0RldGFpbHMsIHRvdGFsQ29weUNvdW50KSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlc3RvcmUgdGhlIG1vbml0b3Igc3RhdGUuDQotCSAqIA0KLQkgKiBAc2VlICNzYXZlU3RhdGUoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoKSB7DQotCQlpZiAodGFza3Muc2l6ZSgpID4gMCkgew0KLQkJCU1vbml0b3JTdGF0ZSBzdGF0ZSA9IChNb25pdG9yU3RhdGUpIHRhc2tzLnBvcCgpOw0KLQkJCXNldFRhc2tOYW1lKHN0YXRlLmdldFRhc2tTdHJpbmcoKSk7DQotCQkJc3ViVGFzayhzdGF0ZS5nZXRTdWJUYXNrU3RyaW5nKCkpOw0KLQkJCXRoaXMuc2hvd0RldGFpbHMgPSBzdGF0ZS5nZXRTaG93RGV0YWlscygpOw0KLQkJCXRoaXMudG90YWxDb3B5Q291bnQgPSBzdGF0ZS5nZXRUb3RhbENvcHlDb3VudCgpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZSB3aGV0aGVyIHRoZSBtb25pdG9yIHN1YnRhc2sgbWVzc2FnZSBzaG91bGQgaW5jbHVkZQ0KLQkgKiBjb3B5IHByb2dyZXNzIGNvdW50cy4NCi0JICogDQotCSAqIEBzZWUgI3NldENvcHlDb3VudChsb25nKQ0KLQkgKiBAc2VlICNzZXRUb3RhbENvdW50KGxvbmcpDQotCSAqIEBwYXJhbSBzZXR0aW5nIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgdGhlIGNvcHkgY291bnQsDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2hvd0NvcHlEZXRhaWxzKGJvb2xlYW4gc2V0dGluZykgew0KLQkJdGhpcy5zaG93RGV0YWlscyA9IHNldHRpbmc7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB0byBjb3B5Lg0KLQkgKiANCi0JICogQHNlZSAjc2hvd0NvcHlEZXRhaWxzKGJvb2xlYW4pDQotCSAqIEBzZWUgI3NldENvcHlDb3VudChsb25nKQ0KLQkgKiBAcGFyYW0gY291bnQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRvdGFsQ291bnQobG9uZyBjb3VudCkgew0KLQkJdGhpcy50b3RhbENvcHlDb3VudCA9IGNvdW50Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBjb3BpZWQuDQotCSAqIA0KLQkgKiBAc2VlICNzaG93Q29weURldGFpbHMoYm9vbGVhbikNCi0JICogQHNlZSAjc2V0VG90YWxDb3VudChsb25nKQ0KLQkgKiBAcGFyYW0gY291bnQgbnVtYmVyIG9mIGJ5dGVzIGFscmVhZHkgY29waWVkLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRDb3B5Q291bnQobG9uZyBjb3VudCkgew0KLQkJaWYgKHNob3dEZXRhaWxzICYmIGNvdW50ID4gMCkgew0KLQkJCWN1cnJlbnRDb3VudCA9IGNvdW50Ow0KLQkJCWxvbmcgY291bnRLID0gY291bnQgLyAxMDI0Ow0KLQkJCWxvbmcgdG90YWxLID0gdG90YWxDb3B5Q291bnQgLyAxMDI0Ow0KLQkJCVN0cmluZyBtc2cgPQ0KLQkJCQkodG90YWxLIDw9IDApDQotCQkJCQk/IFBvbGljeS5iaW5kKCJJbnN0YWxsTW9uaXRvci5Eb3dubG9hZFNpemUiLCBMb25nLnRvU3RyaW5nKGNvdW50SykpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCTogUG9saWN5LmJpbmQoDQotCQkJCQkJIkluc3RhbGxNb25pdG9yLkRvd25sb2FkU2l6ZUxvbmciLCAvLyROT04tTkxTLTEkDQotCQkJCQkJTG9uZy50b1N0cmluZyhjb3VudEspLA0KLQkJCQkJCUxvbmcudG9TdHJpbmcodG90YWxLKSk7DQotCQkJbW9uaXRvci5zdWJUYXNrKHN1YlRhc2tTdHJpbmcgKyBtc2cpOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKioNCi0JICogSW5jcmVtZW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZC4NCi0JICogDQotCSAqIEBzZWUgI3Nob3dDb3B5RGV0YWlscyhib29sZWFuKQ0KLQkgKiBAc2VlICNzZXRUb3RhbENvdW50KGxvbmcpDQotCSAqIEBwYXJhbSBpbmNyZW1lbnQgbnVtYmVyIG9mIG5ldyBieXRlcyAgY29waWVkLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpbmNyZW1lbnRDb3VudChsb25nIGluY3JlbWVudCkgew0KLQkJc2V0Q29weUNvdW50KGN1cnJlbnRDb3VudCArIGluY3JlbWVudCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9KYXJDb250ZW50UmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0phckNvbnRlbnRSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwODY1Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0phckNvbnRlbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi1pbXBvcnQgamF2YS51dGlsLmphci4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIExvY2FsIC5qYXIgZmlsZSBjb250ZW50IHJlZmVyZW5jZS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyRW50cnlDb250ZW50UmVmZXJlbmNlDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBKYXJDb250ZW50UmVmZXJlbmNlIGV4dGVuZHMgQ29udGVudFJlZmVyZW5jZSB7DQotDQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCByZWZlcmVuY2VMaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQlwcml2YXRlIEphckZpbGUgamFyRmlsZTsNCi0NCi0JLyoqDQotCSAqIENvbnRlbnQgc2VsZWN0b3IgdXNlZCBpbiAuamFyIG9wZXJhdGlvbnMuDQotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gY2F1c2VzIGFsbCBmaWxlIGVudHJpZXMgdG8gYmUgc2VsZWN0ZWQgd2l0aA0KLQkgKiBnZW5lcmF0ZWQgaWRlbnRpZmllcnMgYmVpbmcgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIC5qYXIgZW50cnkgbmFtZS4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFNlbGVjdG9yIHsNCi0NCi0JCS8qKg0KLQkJICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIC5qYXIgZW50cnkgc2hvdWxkIGJlIHNlbGVjdGVkLg0KLQkJICogRGVmYXVsdCBiZWhhdmlvciBpcyB0byBzZWxlY3QgYWxsIG5vbi1kaXJlY3RvcnkgZW50cmllcy4NCi0JCSAqIA0KLQkJICogQHBhcmFtIGVudHJ5IC5qYXIgZW50cnkNCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZW50cnkgaXMgdG8gYmUgc2VsZWN0ZWQsIA0KLQkJICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkJICogQHNpbmNlIDIuMA0KLQkJICovDQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKEphckVudHJ5IGVudHJ5KSB7DQotCQkJcmV0dXJuIGVudHJ5ID09IG51bGwgPyBmYWxzZSA6ICFlbnRyeS5pc0RpcmVjdG9yeSgpOw0KLQkJfQ0KLQ0KLQkJLyoqDQotCQkgKiBEZWZpbmVzIHRoZSAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllciBmb3IgdGhlIA0KLQkJICogZW50cnkuIERlZmF1bHQgaWRlbnRpZmllciBpcyB0aGUgc2FtZSBhcyB0aGUgamFyIGVudHJ5IG5hbWUuDQotCQkgKiANCi0JCSAqIEBwYXJhbSBlbnRyeSAuamFyIGVudHJ5DQotCQkgKiBAcmV0dXJuICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCQkgKiBAc2luY2UgMi4wDQotCQkgKi8NCi0JCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBlbnRyeSkgew0KLQkJCXJldHVybiBlbnRyeSA9PSBudWxsID8gbnVsbCA6IGVudHJ5LmdldE5hbWUoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGphciBjb250ZW50IHJlZmVyZW5jZSBmcm9tIFVSTC4NCi0JICogDQotCSAqIEBwYXJhbSBpZCAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllcg0KLQkgKiBAcGFyYW0gdXJsIGFjdHVhbCByZWZlcmVuY2VkIFVSTA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSmFyQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIFVSTCB1cmwpIHsNCi0JCXN1cGVyKGlkLCB1cmwpOw0KLQkJdGhpcy5qYXJGaWxlID0gbnVsbDsNCi0JCXJlZmVyZW5jZUxpc3QuYWRkKHRoaXMpOyAvLyBrZWVwIHRyYWNrIG9mIGFyY2hpdmVzDQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBqYXIgY29udGVudCByZWZlcmVuY2UgZnJvbSBmaWxlLg0KLQkgKiANCi0JICogQHBhcmFtIGlkICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIEBwYXJhbSBmaWxlIGFjdHVhbCByZWZlcmVuY2VkIGZpbGUNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEphckNvbnRlbnRSZWZlcmVuY2UoU3RyaW5nIGlkLCBGaWxlIGZpbGUpIHsNCi0JCXN1cGVyKGlkLCBmaWxlKTsNCi0JCXRoaXMuamFyRmlsZSA9IG51bGw7DQotCQlyZWZlcmVuY2VMaXN0LmFkZCh0aGlzKTsgLy8ga2VlcCB0cmFjayBvZiBhcmNoaXZlcw0KLQl9DQotDQotCS8qKg0KLQkgKiBBIGZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhIGphciBjb250ZW50IHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEBwYXJhbSBpZCAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllcg0KLQkgKiBAcGFyYW0gZmlsZSBhY3R1YWwgcmVmZXJlbmNlZCBmaWxlDQotCSAqIEByZXR1cm4gamFyIGNvbnRlbnQgcmVmZXJlbmNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGNyZWF0ZUNvbnRlbnRSZWZlcmVuY2UoU3RyaW5nIGlkLCBGaWxlIGZpbGUpIHsNCi0JCXJldHVybiBuZXcgSmFyQ29udGVudFJlZmVyZW5jZShpZCwgZmlsZSx0cnVlKTsNCi0JfQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgSmFyQ29udGVudFJlZmVyZW5jZS4NCi0JICogQHBhcmFtIGlkDQotCSAqIEBwYXJhbSBmaWxlDQotCSAqIEBwYXJhbSBiDQotCSAqLw0KLQlwdWJsaWMgSmFyQ29udGVudFJlZmVyZW5jZShTdHJpbmcgaWQsIEZpbGUgZmlsZSwgYm9vbGVhbiBiKSB7DQotCQl0aGlzKGlkLGZpbGUpOw0KLQkJc2V0VGVtcExvY2FsKGIpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlZmVyZW5jZSBhcyBhIGphciBmaWxlLiBOb3RlLCB0aGF0IHRoaXMgbWV0aG9kDQotCSAqIDxiPmRvZXMgbm90PC9iPiBjYXVzZSB0aGUgZmlsZSB0byBiZSBkb3dubG9hZGVkIGlmIGl0DQotCSAqIGlzIG5vdCBhbHJlYWR5IGxvY2FsLg0KLQkgKiANCi0JICogQHJldHVybiByZWZlcmVuY2UgYXMgamFyIGZpbGUNCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbiByZWZlcmVuY2UgY2Fubm90IGJlIHJldHVybmVkIGFzIGphciBmaWxlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBKYXJGaWxlIGFzSmFyRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAodGhpcy5qYXJGaWxlID09IG51bGwpIHsNCi0JCQlGaWxlIGZpbGUgPSBhc0ZpbGUoKTsNCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkNCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiYXNKYXJGaWxlIDoiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAoZmlsZSAhPSBudWxsICYmICFmaWxlLmV4aXN0cygpKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybigiSmFyRmlsZSBkb2VzIG5vdCBleGl0czoiICsgZmlsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlLmdldEFic29sdXRlUGF0aCgpKTsNCi0JCQl9DQotCQkJdGhpcy5qYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7DQotCQl9DQotCQlyZXR1cm4gamFyRmlsZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW5wYWNrcyB0aGUgcmVmZXJlbmNlZCBqYXIgYXJjaGl2ZSBpbnRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uDQotCSAqIFJldHVybnMgY29udGVudCByZWZlcmVuY2VzIHRvIHRoZSB1bnBhY2tlZCBmaWxlcy4NCi0JICogDQotCSAqIEBwYXJhbSBkaXIgbG9jYXRpb24gdG8gdW5wYWNrIHRoZSBqYXIgaW50bw0KLQkgKiBAcGFyYW0gc2VsZWN0b3Igc2VsZWN0b3IsIHVzZWQgdG8gc2VsZWN0IGVudHJpZXMgdG8gdW5wYWNrLCBhbmQgdG8gZGVmaW5lDQotCSAqICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVycyBmb3IgdGhlIGVudHJpZXMuDQotCSAqIEBwYXJhbSBtb25pdG9yIHByb2dyZXNzIG1vbml0b3IgDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIHVucGFjayhGaWxlIGRpciwgQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0NCi0JCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2VsZWN0b3INCi0JCWlmIChzZWxlY3RvciA9PSBudWxsKQ0KLQkJCXNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpOw0KLQ0KLQkJLy8gZ2V0IGFyY2hpdmUgY29udGVudA0KLQkJSmFyRmlsZSBqYXJBcmNoaXZlID0gdGhpcy5hc0phckZpbGUoKTsNCi0JCUxpc3QgY29udGVudCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJBcmNoaXZlLmVudHJpZXMoKTsNCi0NCi0JCS8vIHJ1biB0aHJvdWdoIHRoZSBlbnRyaWVzIGFuZCB1bmphcg0KLQkJU3RyaW5nIGVudHJ5SWQ7DQotCQlKYXJFbnRyeSBlbnRyeTsNCi0JCUlucHV0U3RyZWFtIGlzOw0KLQkJT3V0cHV0U3RyZWFtIG9zOw0KLQkJRmlsZSBsb2NhbEZpbGU7DQotCQl0cnkgew0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJbW9uaXRvci5zYXZlU3RhdGUoKTsNCi0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShQb2xpY3kuYmluZCgiSmFyQ29udGVudFJlZmVyZW5jZS5VbnBhY2tpbmciKSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJbW9uaXRvci5zdWJUYXNrKHRoaXMuZ2V0SWRlbnRpZmllcigpKTsNCi0JCQkJbW9uaXRvci5zaG93Q29weURldGFpbHMoZmFsc2UpOw0KLQkJCX0NCi0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQkJCQllbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOw0KLQkJCQlpZiAoZW50cnkgIT0gbnVsbCAmJiBzZWxlY3Rvci5pbmNsdWRlKGVudHJ5KSkgew0KLQkJCQkJaXMgPSBudWxsOw0KLQkJCQkJb3MgPSBudWxsOw0KLQkJCQkJZW50cnlJZCA9IHNlbGVjdG9yLmRlZmluZUlkZW50aWZpZXIoZW50cnkpOw0KLQkJCQkJbG9jYWxGaWxlID0gVXRpbGl0aWVzLmNyZWF0ZUxvY2FsRmlsZShkaXIsIGVudHJ5SWQpOyAvLyBjcmVhdGUgdGVtcCBmaWxlIA0KLQkJCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJaXMgPSBqYXJBcmNoaXZlLmdldElucHV0U3RyZWFtKGVudHJ5KTsNCi0JCQkJCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpOw0KLQkJCQkJCQlVdGlsaXRpZXMuY29weShpcywgb3MsIG1vbml0b3IpOw0KLQkJCQkJCX0gZmluYWxseSB7DQotCQkJCQkJCWlmIChpcyAhPSBudWxsKQ0KLQkJCQkJCQkJdHJ5IHsNCi0JCQkJCQkJCQlpcy5jbG9zZSgpOw0KLQkJCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCQkJfQ0KLQkJCQkJCQlpZiAob3MgIT0gbnVsbCkNCi0JCQkJCQkJCXRyeSB7DQotCQkJCQkJCQkJb3MuY2xvc2UoKTsNCi0JCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJY29udGVudC5hZGQobmV3IENvbnRlbnRSZWZlcmVuY2UoZW50cnlJZCwgbG9jYWxGaWxlKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpDQotCQkJCW1vbml0b3IucmVzdG9yZVN0YXRlKCk7DQotCQl9DQotCQlyZXR1cm4gKENvbnRlbnRSZWZlcmVuY2VbXSkgY29udGVudC50b0FycmF5KG5ldyBDb250ZW50UmVmZXJlbmNlWzBdKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVW5wYWNrcyB0aGUgbmFtZWQgamFyIGVudHJ5IGludG8gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4NCi0JICogUmV0dXJucyBjb250ZW50IHJlZmVyZW5jZSB0byB0aGUgdW5wYWNrZWQgZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBkaXIgbG9jYXRpb24gdG8gdW5wYWNrIHRoZSBqYXIgaW50bw0KLQkgKiBAcGFyYW0gZW50cnlOYW1lIG5hbWUgb2YgdGhlIGphciBlbnRyeQ0KLQkgKiBAcGFyYW0gc2VsZWN0b3Igc2VsZWN0b3IsIHVzZWQgdG8gZGVmaW5lICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIGZvciB0aGUgZW50cnkNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciANCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIHVucGFjayhGaWxlIGRpciwgU3RyaW5nIGVudHJ5TmFtZSwgQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0NCi0JCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2VsZWN0b3INCi0JCWlmIChzZWxlY3RvciA9PSBudWxsKQ0KLQkJCXNlbGVjdG9yID0gbmV3IENvbnRlbnRTZWxlY3RvcigpOw0KLQ0KLQkJLy8gdW5qYXIgdGhlIGVudHJ5DQotCQlKYXJGaWxlIGphckFyY2hpdmUgPSB0aGlzLmFzSmFyRmlsZSgpOw0KLQkJZW50cnlOYW1lID0gZW50cnlOYW1lLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJSmFyRW50cnkgZW50cnkgPSBqYXJBcmNoaXZlLmdldEphckVudHJ5KGVudHJ5TmFtZSk7DQotCQlTdHJpbmcgZW50cnlJZDsNCi0JCWlmIChlbnRyeSAhPSBudWxsKSB7DQotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOw0KLQkJCU91dHB1dFN0cmVhbSBvcyA9IG51bGw7DQotCQkJZW50cnlJZCA9IHNlbGVjdG9yLmRlZmluZUlkZW50aWZpZXIoZW50cnkpOw0KLQkJCUZpbGUgbG9jYWxGaWxlID0gVXRpbGl0aWVzLmNyZWF0ZUxvY2FsRmlsZShkaXIsIGVudHJ5SWQpOyAvLyBjcmVhdGUgdGVtcCBmaWxlDQotCQkJaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCXRyeSB7DQotCQkJCQlpcyA9IGphckFyY2hpdmUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOw0KLQkJCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpOw0KLQkJCQkJVXRpbGl0aWVzLmNvcHkoaXMsIG9zLCBtb25pdG9yKTsNCi0JCQkJfSBmaW5hbGx5IHsNCi0JCQkJCWlmIChpcyAhPSBudWxsKQ0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCWlzLmNsb3NlKCk7DQotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCX0NCi0JCQkJCWlmIChvcyAhPSBudWxsKQ0KLQkJCQkJCXRyeSB7DQotCQkJCQkJCW9zLmNsb3NlKCk7DQotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJCX0NCi0JCQkJfQ0KLQkJCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2UoZW50cnlJZCwgbG9jYWxGaWxlKTsNCi0JCQl9IGVsc2UNCi0JCQkJcmV0dXJuIG51bGw7IC8vIGVudHJ5IHdhcyBhIGRpcmVjdG9yeQ0KLQkJfSBlbHNlDQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbih0aGlzLmFzRmlsZSgpLmdldEFic29sdXRlUGF0aCgpICsgIiAiICsgZW50cnlOYW1lKTsJLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBQZWVrcyBpbnRvIHRoZSByZWZlcmVuY2VkIGphciBhcmNoaXZlLg0KLQkgKiBSZXR1cm5zIGNvbnRlbnQgcmVmZXJlbmNlcyB0byB0aGUgamFyIGVudHJpZXMgd2l0aGluIHRoZSBqYXIgZmlsZS4NCi0JICogDQotCSAqIEBwYXJhbSBzZWxlY3RvciBzZWxlY3RvciwgdXNlZCB0byBzZWxlY3QgZW50cmllcyB0byByZXR1cm4sIGFuZCB0byBkZWZpbmUNCi0JICogInN5bWJvbGljIiBwYXRoIGlkZW50aWZpZXJzIGZvciB0aGUgZW50cmllcy4NCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciANCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIHBlZWsoQ29udGVudFNlbGVjdG9yIHNlbGVjdG9yLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYSBzZWxlY3Rvcg0KLQkJaWYgKHNlbGVjdG9yID09IG51bGwpDQotCQkJc2VsZWN0b3IgPSBuZXcgQ29udGVudFNlbGVjdG9yKCk7DQotDQotCQkvLyBnZXQgYXJjaGl2ZSBjb250ZW50DQotCQlKYXJGaWxlIGphckFyY2hpdmUgPSB0aGlzLmFzSmFyRmlsZSgpOw0KLQkJTGlzdCBjb250ZW50ID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphckFyY2hpdmUuZW50cmllcygpOw0KLQ0KLQkJLy8gcnVuIHRocm91Z2ggdGhlIGVudHJpZXMgYW5kIGNyZWF0ZSBjb250ZW50IHJlZmVyZW5jZXMNCi0JCUphckVudHJ5IGVudHJ5Ow0KLQkJU3RyaW5nIGVudHJ5SWQ7DQotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQkJCWVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7DQotCQkJaWYgKHNlbGVjdG9yLmluY2x1ZGUoZW50cnkpKSB7DQotCQkJCWVudHJ5SWQgPSBzZWxlY3Rvci5kZWZpbmVJZGVudGlmaWVyKGVudHJ5KTsNCi0JCQkJY29udGVudC5hZGQobmV3IEphckVudHJ5Q29udGVudFJlZmVyZW5jZShlbnRyeUlkLCB0aGlzLCBlbnRyeSkpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiAoQ29udGVudFJlZmVyZW5jZVtdKSBjb250ZW50LnRvQXJyYXkobmV3IENvbnRlbnRSZWZlcmVuY2VbMF0pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQZWVrcyBpbnRvIHRoZSByZWZlcmVuY2VkIGphciBhcmNoaXZlIGxvb2tpbmcgZm9yIHRoZSBuYW1lZCBlbnRyeS4NCi0JICogUmV0dXJucyBjb250ZW50IHJlZmVyZW5jZSB0byB0aGUgamFyIGVudHJ5IHdpdGhpbiB0aGUgamFyIGZpbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gZW50cnlOYW1lIG5hbWUgb2YgdGhlIGphciBlbnRyeQ0KLQkgKiBAcGFyYW0gc2VsZWN0b3Igc2VsZWN0b3IsIHVzZWQgdG8gZGVmaW5lICJzeW1ib2xpYyIgcGF0aCBpZGVudGlmaWVyDQotCSAqIGZvciB0aGUgZW50cnkNCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvciANCi0JICogQHJldHVybiB0aGUgY29udGVudCByZWZlcmVuY2Ugb2ZyIDxjb2RlPm51bGw8L251bGw+IGlmIHRoZSBlbnRyeSBkb2Vzbid0IGV4aXN0DQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgcGVlayhTdHJpbmcgZW50cnlOYW1lLCBDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotDQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhIHNlbGVjdG9yDQotCQlpZiAoc2VsZWN0b3IgPT0gbnVsbCkNCi0JCQlzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKTsNCi0NCi0JCS8vIGFzc3VtZSB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhIGphciBhcmNoaXZlLg0KLQkJSmFyRmlsZSBqYXJBcmNoaXZlID0gdGhpcy5hc0phckZpbGUoKTsNCi0JCWVudHJ5TmFtZSA9IGVudHJ5TmFtZS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCUphckVudHJ5IGVudHJ5ID0gamFyQXJjaGl2ZS5nZXRKYXJFbnRyeShlbnRyeU5hbWUpOw0KLQkJaWYgKGVudHJ5ID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlTdHJpbmcgZW50cnlJZCA9IHNlbGVjdG9yLmRlZmluZUlkZW50aWZpZXIoZW50cnkpOw0KLQkJcmV0dXJuIG5ldyBKYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UoZW50cnlJZCwgdGhpcywgZW50cnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDbG9zZXMgdGhlIGphciBhcmNoaXZlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZWZlcmVuY2UuDQotCSAqIA0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGNsb3NlQXJjaGl2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlpZiAodGhpcy5qYXJGaWxlICE9IG51bGwpIHsNCi0JCQl0aGlzLmphckZpbGUuY2xvc2UoKTsNCi0JCQl0aGlzLmphckZpbGUgPSBudWxsOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBQZXJmb3JtIHNodXRkb3duIHByb2Nlc3NpbmcgZm9yIGphciBhcmNoaXZlIGhhbmRsaW5nLg0KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBwbGF0Zm9ybSBpcyBzaHV0dGluZyBkb3duLg0KLQkgKiBJdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGF0IGFueSBvdGhlciB0aW1lIHVuZGVyDQotCSAqIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBBIHNpZGUtZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyBtZXRob2QNCi0JICogaXMgdGhhdCBhbGwgamFycyByZWZlcmVuY2VkIGJ5IEphckNvbnRlbnRSZWZlcmVuY2VzIGFyZSBjbG9zZWQuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZUxpc3Quc2l6ZSgpOyBpKyspIHsNCi0JCQlKYXJDb250ZW50UmVmZXJlbmNlIHJlZiA9IChKYXJDb250ZW50UmVmZXJlbmNlKSByZWZlcmVuY2VMaXN0LmdldChpKTsNCi0JCQl0cnkgew0KLQkJCQlyZWYuY2xvc2VBcmNoaXZlKCk7IC8vIGVuc3VyZSB3ZSBhcmUgbm90IGxlYXZpbmcgb3BlbiBqYXJzDQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkvLyB3ZSB0cmllZCwgbm90aGluZyB3ZSBjYW4gZG8gLi4uDQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSmFyRW50cnlDb250ZW50UmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL0phckVudHJ5Q29udGVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmVlYWZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvSmFyRW50cnlDb250ZW50UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLmphci4qOw0KLQ0KLS8qKg0KLSAqIC5qYXIgZmlsZSBlbnRyeSBjb250ZW50IHJlZmVyZW5jZS4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSmFyRW50cnlDb250ZW50UmVmZXJlbmNlIGV4dGVuZHMgQ29udGVudFJlZmVyZW5jZSB7DQotDQotCXByaXZhdGUgSmFyQ29udGVudFJlZmVyZW5jZSBqYXJDb250ZW50UmVmZXJlbmNlOw0KLQlwcml2YXRlIEphckVudHJ5IGVudHJ5Ow0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGphciBlbnRyeSBjb250ZW50IHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEBwYXJhbSBpZCAic3ltYm9saWMiIHBhdGggaWRlbnRpZmllcg0KLQkgKiBAcGFyYW0gamFyQ29udGVudFJlZmVyZW5jZSBqYXIgZmlsZSBjb250ZW50IHJlZmVyZW5jZQ0KLQkgKiBAcGFyYW0gZW50cnkgamFyIGVudHJ5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBKYXJFbnRyeUNvbnRlbnRSZWZlcmVuY2UoDQotCQlTdHJpbmcgaWQsDQotCQlKYXJDb250ZW50UmVmZXJlbmNlIGphckNvbnRlbnRSZWZlcmVuY2UsDQotCQlKYXJFbnRyeSBlbnRyeSkgew0KLQkJc3VwZXIoaWQsIChGaWxlKSBudWxsKTsNCi0JCXRoaXMuamFyQ29udGVudFJlZmVyZW5jZSA9IGphckNvbnRlbnRSZWZlcmVuY2U7DQotCQl0aGlzLmVudHJ5ID0gZW50cnk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuIGlucHV0IHN0cmVhbSBmb3IgdGhlIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gaW5wdXQgc3RyZWFtDQotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24gdW5hYmxlIHRvIGNyZWF0ZSBzdHJlYW0NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXJldHVybiBqYXJDb250ZW50UmVmZXJlbmNlLmFzSmFyRmlsZSgpLmdldElucHV0U3RyZWFtKGVudHJ5KTsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSByZWZlcmVuY2VkIGVudHJ5Lg0KLQkgKiANCi0JICogQHJldHVybiBpbnB1dCBzaXplDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBsb25nIGdldElucHV0U2l6ZSgpIHsNCi0JCXJldHVybiBlbnRyeS5nZXRTaXplKCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVmZXJlbmNlIGlzIHRvIGEgYW4gZW50cnkgd2l0aGluIGEgbG9jYWwgamFyLg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcmVmZXJlbmNlIGlzIGxvY2FsLCANCi0JICogb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsUmVmZXJlbmNlKCkgew0KLQkJcmV0dXJuIGphckNvbnRlbnRSZWZlcmVuY2UuaXNMb2NhbFJlZmVyZW5jZSgpOw0KLQl9CQ0KLQkJDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IHJlZmVyZW5jZSBhcyBhIFVSTC4NCi0JICogDQotCSAqIEByZXR1cm4gcmVmZXJlbmNlIGFzIFVSTA0KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uIHJlZmVyZW5jZSBjYW5ub3QgYmUgcmV0dXJuZWQgYXMgVVJMDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgYXNVUkwoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGZpbGVOYW1lID0NCi0JCQlqYXJDb250ZW50UmVmZXJlbmNlLmFzRmlsZSgpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJcmV0dXJuIG5ldyBVUkwoImphcjpmaWxlOiIgKyBmaWxlTmFtZSArICIhLyIgKyBlbnRyeS5nZXROYW1lKCkpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQkJCQ0KLQkvKioNCi0JICogUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHJlZmVyZW5jZS4NCi0JICogDQotCSAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQlVUkwgdXJsOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBhc1VSTCgpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXVybCA9IG51bGw7DQotCQl9DQotCQlpZiAodXJsICE9IG51bGwpDQotCQkJcmV0dXJuIHVybC50b0V4dGVybmFsRm9ybSgpOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArICJAIiArIGhhc2hDb2RlKCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL05vblBsdWdpbkVudHJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL05vblBsdWdpbkVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWY1NzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9Ob25QbHVnaW5FbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Ygbm9uLXBsdWctaW4gZW50cnkuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuTm9uUGx1Z2luRW50cnlNb2RlbA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgTm9uUGx1Z2luRW50cnkNCi0JZXh0ZW5kcyBOb25QbHVnaW5FbnRyeU1vZGVsDQotCWltcGxlbWVudHMgSU5vblBsdWdpbkVudHJ5IHsNCi0NCi0JLyoqDQotCSAqIE5vbi1wbHVnLWluIGVudHJ5IGRlZmF1bHQgY29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBOb25QbHVnaW5FbnRyeSgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9QbHVnaW5FbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9QbHVnaW5FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjlmOWY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvUGx1Z2luRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHBsdWctaW4gZW50cnkuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklQbHVnaW5FbnRyeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuUGx1Z2luRW50cnlNb2RlbA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGx1Z2luRW50cnkgZXh0ZW5kcyBQbHVnaW5FbnRyeU1vZGVsIGltcGxlbWVudHMgSVBsdWdpbkVudHJ5IHsNCi0JDQotCS8vIFBFUkY6IG5ldyBpbnN0YW5jZSB2YXJpYWJsZQ0KLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXIgdmVyc2lvbklkOw0KLQ0KLQkvKioNCi0JICogUGx1Zy1pbiBlbnRyeSBkZWZhdWx0IGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgUGx1Z2luRW50cnkoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgcGx1Z2luIGVudHJ5DQotCSAqIA0KLQkgKiBAc2VlIElQbHVnaW5FbnRyeSNnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXIgZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpIHsNCi0JCWlmICh2ZXJzaW9uSWQgIT0gbnVsbCkNCi0JCQlyZXR1cm4gdmVyc2lvbklkOw0KLQ0KLQkJU3RyaW5nIGlkID0gZ2V0UGx1Z2luSWRlbnRpZmllcigpOw0KLQkJU3RyaW5nIHZlciA9IGdldFBsdWdpblZlcnNpb24oKTsNCi0JCWlmIChpZCAhPSBudWxsICYmIHZlciAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJdmVyc2lvbklkID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoaWQsIHZlcik7DQotCQkJCXJldHVybiB2ZXJzaW9uSWQ7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY3JlYXRlIHZlcnNpb25lZCBpZGVudGlmaWVyOiIgKyBpZCArICI6IiArIHZlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0JCX0NCi0NCi0JCXZlcnNpb25JZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCIiLG51bGwpOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gdmVyc2lvbklkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBpZGVudGlmaWVyIG9mIHRoaXMgcGx1Z2luIGVudHJ5LiANCi0JICogDQotCSAqIEBzZWUgSVBsdWdpbkVudHJ5I3NldFZlcnNpb25lZElkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllcikNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbmVkSWRlbnRpZmllcihWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50aWZpZXIpIHsNCi0JCXNldFBsdWdpbklkZW50aWZpZXIoaWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpOw0KLQkJc2V0UGx1Z2luVmVyc2lvbihpZGVudGlmaWVyLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsNCi0JfQkNCi0NCi0JLyoqDQotCSAqIENvbXBhcmVzIHR3byBwbHVnaW4gZW50cmllcyBmb3IgZXF1YWxpdHkNCi0JICogDQotCSAqIEBwYXJhbSBvYmplY3QgcGx1Z2luIGVudHJ5IG9iamVjdCB0byBjb21wYXJlIHdpdGgNCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHdvIGVudHJpZXMgYXJlIGVxdWFsLCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgew0KLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSVBsdWdpbkVudHJ5KSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlJUGx1Z2luRW50cnkgZSA9IChJUGx1Z2luRW50cnkpIG9iamVjdDsNCi0JCXJldHVybiBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzEzZGIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBzaXRlLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuDQotICogPC9wPiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaXRlIGV4dGVuZHMgU2l0ZU1vZGVsIGltcGxlbWVudHMgSVNpdGUgew0KLQ0KLQkvKioNCi0JICogRGVmYXVsdCBpbnN0YWxsYXRpb24gcGF0aCBmb3IgZmVhdHVyZXMNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IGluc3RhbGxhdGlvbiBwYXRoIGZvciBwbHVnLWlucyBhbmQgcGx1Zy1pbiBmcmFnbWVudHMNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUExVR0lOX1BBVEggPSAicGx1Z2lucy8iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IHBhdGggb24gYSBzaXRlIHdoZXJlIHBhY2thZ2VkIGZlYXR1cmVzIGFyZSBsb2NhdGVkDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0ZFQVRVUkVfUEFUSCA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IHNpdGUgbWFuaWZlc3QgZmlsZSBuYW1lDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX0ZJTEUgPSAic2l0ZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgc2l0ZSBtYW5pZmVzdCBleHRlbnNpb24NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfWE1MID0gU0lURV9GSUxFICsgIi54bWwiOyAvLyROT04tTkxTLTEkDQotDQotCXByaXZhdGUgSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcjsNCi0JDQotCXByaXZhdGUgTWFwIGZlYXR1cmVDYWNoZSA9IG5ldyBIYXNoTWFwKCk7IC8vIGtleT1VUkxLZXkgdmFsdWU9SUZlYXR1cmUNCi0JDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2l0ZQ0KLQkgKi8NCi0JcHVibGljIFNpdGUoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb21wYXJlcyB0d28gc2l0ZXMgZm9yIGVxdWFsaXR5DQotCSAqIA0KLQkgKiBAcGFyYW0gb2JqIHNpdGUgb2JqZWN0IHRvIGNvbXBhcmUgd2l0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gc2l0ZXMgYXJlIGVxdWFsLCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgew0KLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSVNpdGUpKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWlmIChnZXRVUkwoKSA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCUlTaXRlIG90aGVyU2l0ZSA9IChJU2l0ZSkgb2JqOw0KLQ0KLQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGdldFVSTCgpLCBvdGhlclNpdGUuZ2V0VVJMKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIFVSTA0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRVUkwoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsNCi0JCVVSTCB1cmwgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0VVJMKCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQl9DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIGRlc2NyaXB0aW9uLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXREZXNjcmlwdGlvbigpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7DQotCQlyZXR1cm4gKElVUkxFbnRyeSkgZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3JpZXMgZGVmaW5lZCBieSB0aGUgc2l0ZS4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0Q2F0ZWdvcmllcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJQ2F0ZWdvcnlbXSBnZXRDYXRlZ29yaWVzKCkgew0KLQkJQ2F0ZWdvcnlNb2RlbFtdIHJlc3VsdCA9IGdldENhdGVnb3J5TW9kZWxzKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUNhdGVnb3J5WzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSUNhdGVnb3J5W10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbmFtZWQgc2l0ZSBjYXRlZ29yeS4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0Q2F0ZWdvcnkoU3RyaW5nKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsNCi0JCUlDYXRlZ29yeSByZXN1bHQgPSBudWxsOw0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQkJaW50IGxlbmd0aCA9IGdldENhdGVnb3J5TW9kZWxzKCkubGVuZ3RoOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgew0KLQkJCWlmIChnZXRDYXRlZ29yeU1vZGVscygpW2ldLmdldE5hbWUoKS5lcXVhbHMoa2V5KSkgew0KLQkJCQlyZXN1bHQgPSAoSUNhdGVnb3J5KSBnZXRDYXRlZ29yeU1vZGVscygpW2ldOw0KLQkJCQlmb3VuZCA9IHRydWU7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vREVCVUc6DQotCQlpZiAoIWZvdW5kKSB7DQotCQkJU3RyaW5nIFVSTFN0cmluZyA9ICh0aGlzLmdldFVSTCgpICE9IG51bGwpID8gdGhpcy5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIDogIjxubyBzaXRlIHVybD4iOyAvLyROT04tTkxTLTEkDQotCQkJVXBkYXRlQ29yZS53YXJuKFBvbGljeS5iaW5kKCJTaXRlLkNhbm5vdEZpbmRDYXRlZ29yeSIsIGtleSwgVVJMU3RyaW5nKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCWlmIChnZXRDYXRlZ29yeU1vZGVscygpLmxlbmd0aCA8PSAwKQ0KLQkJCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIlNpdGUuTm9DYXRlZ29yaWVzIikpOwkvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gZmVhdHVyZXMgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRGZWF0dXJlUmVmZXJlbmNlcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpIHsNCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2dldEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpIHsNCi0JCS8vIG9ubHkgZmlsdGVyIGxvY2FsIHNpdGUNCi0JCWlmIChnZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSE9bnVsbCkNCi0JCQlyZXR1cm4gZmlsdGVyRmVhdHVyZXMoZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKSk7DQotCQllbHNlIA0KLQkJCXJldHVybiBnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJDQotCX0NCi0NCi0JLyoNCi0JICogTWV0aG9kIGZpbHRlckZlYXR1cmVzLg0KLQkgKiBBbHNvIGltcGxlbWVudGVkIGluIEZlYXR1cmUNCi0JICogIA0KLQkgKiBAcGFyYW0gbGlzdA0KLQkgKiBAcmV0dXJuIExpc3QNCi0JICovDQotCXByaXZhdGUgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmlsdGVyRmVhdHVyZXMoSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gYWxsSW5jbHVkZWQpIHsNCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmIChhbGxJbmNsdWRlZCE9bnVsbCl7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxJbmNsdWRlZC5sZW5ndGg7IGkrKykgew0KLQkJCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgaW5jbHVkZWQgPSBhbGxJbmNsdWRlZFtpXTsNCi0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5pc1ZhbGlkRW52aXJvbm1lbnQoaW5jbHVkZWQpKQ0KLQkJCQkJbGlzdC5hZGQoaW5jbHVkZWQpOw0KLQkJCQllbHNlew0KLQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKXsNCi0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIkZpbHRlcmVkIG91dCBmZWF0dXJlIHJlZmVyZW5jZToiK2luY2x1ZGVkKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW2xpc3Quc2l6ZSgpXTsNCi0JCWlmICghbGlzdC5pc0VtcHR5KCkpew0KLQkJCWxpc3QudG9BcnJheShyZXN1bHQpOw0KLQkJfQ0KLQkJDQotCQlyZXR1cm4gcmVzdWx0OwkNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGdldEZlYXR1cmVSZWZlcmVuY2UoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQ0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiU2l0ZTpnZXRGZWF0dXJlUmVmZXJlbmNlOiBUaGUgZmVhdHVyZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0NCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGN1cnJlbnRSZWZlcmVuY2UgPSBudWxsOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7DQotCQkJY3VycmVudFJlZmVyZW5jZSA9IHJlZmVyZW5jZXNbaV07DQotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGZlYXR1cmUuZ2V0VVJMKCksIGN1cnJlbnRSZWZlcmVuY2UuZ2V0VVJMKCkpKQ0KLQkJCQlyZXR1cm4gY3VycmVudFJlZmVyZW5jZTsNCi0JCX0NCi0NCi0JCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSAiICsgZmVhdHVyZSArICIgbm90IGZvdW5kIG9uIHNpdGUiICsgdGhpcy5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gYXJjaGl2ZXMgbG9jYXRlZA0KLQkgKiBvbiB0aGlzIHNpdGUNCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0QXJjaGl2ZXMoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSUFyY2hpdmVSZWZlcmVuY2VbXSBnZXRBcmNoaXZlcygpIHsNCi0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCWlmIChyZXN1bHQubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJQXJjaGl2ZVJlZmVyZW5jZVswXTsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gKElBcmNoaXZlUmVmZXJlbmNlW10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgY29udGVudCBwcm92aWRlciBmb3IgdGhpcyBzaXRlLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRTaXRlQ29udGVudFByb3ZpZGVyKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElTaXRlQ29udGVudFByb3ZpZGVyIGdldFNpdGVDb250ZW50UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoc2l0ZUNvbnRlbnRQcm92aWRlciA9PSBudWxsKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGUuTm9Db250ZW50UHJvdmlkZXIiKSwgbnVsbCk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBzaXRlQ29udGVudFByb3ZpZGVyOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHR5cGUgZm9yIGEgcGFja2FnZWQgZmVhdHVyZSBzdXBwb3J0ZWQgYnkgdGhpcyBzaXRlDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZWRGZWF0dXJlVHlwZSgpIHsNCi0JCXJldHVybiBERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gcGx1Zy1pbnMgaW5zdGFsbGVkDQotCSAqIG9uIHRoaXMgc2l0ZS4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0UGx1Z2luRW50cmllcygpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzKCkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwbHVnLWlucyBpbnN0YWxsZWQgb24gdGhpcyBzaXRlDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldFBsdWdpbkVudHJ5Q291bnQoKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFBsdWdpbkVudHJ5Q291bnQoKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8gcGx1Zy1pbnMgdGhhdCBhcmUNCi0JICogaW5zdGFsbGVkIG9uIHRoaXMgc2l0ZSBhbmQgYXJlIHJlZmVyZW5jZWQgb25seSBieSB0aGUgc3BlY2lmaWVkDQotCSAqIGZlYXR1cmUuIA0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShJRmVhdHVyZSkJICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9SZW1vdmUgPSBuZXcgSVBsdWdpbkVudHJ5WzBdOw0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkNCi0JCQlyZXR1cm4gcGx1Z2luc1RvUmVtb3ZlOw0KLQ0KLQkJLy8gZ2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIGZlYXR1cmUNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWlmIChlbnRyaWVzICE9IG51bGwpIHsNCi0JCQkvLyBnZXQgYWxsIHRoZSBvdGhlciBwbHVnaW5zIGZyb20gYWxsIHRoZSBvdGhlciBmZWF0dXJlcw0KLQkJCVNldCBhbGxQbHVnaW5JRCA9IG5ldyBIYXNoU2V0KCk7DQotCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCWlmIChmZWF0dXJlcyAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IGluZGV4RmVhdHVyZXMgPSAwOyBpbmRleEZlYXR1cmVzIDwgZmVhdHVyZXMubGVuZ3RoOyBpbmRleEZlYXR1cmVzKyspIHsNCi0JCQkJCUlGZWF0dXJlIGZlYXR1cmVUb0NvbXBhcmUgPSBudWxsOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlmZWF0dXJlVG9Db21wYXJlID0gZmVhdHVyZXNbaW5kZXhGZWF0dXJlc10uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQkJCX0NCi0JCQkJCWlmICghZmVhdHVyZS5lcXVhbHMoZmVhdHVyZVRvQ29tcGFyZSkpIHsNCi0JCQkJCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gZmVhdHVyZXNbaW5kZXhGZWF0dXJlc10uZ2V0RmVhdHVyZShudWxsKS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJCQkJaWYgKHBsdWdpbkVudHJpZXMgIT0gbnVsbCkgew0KLQkJCQkJCQlmb3IgKGludCBpbmRleEVudHJpZXMgPSAwOyBpbmRleEVudHJpZXMgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaW5kZXhFbnRyaWVzKyspIHsNCi0JCQkJCQkJCWFsbFBsdWdpbklELmFkZChwbHVnaW5FbnRyaWVzW2luZGV4RW50cmllc10uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsNCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBjcmVhdGUgdGhlIGRlbHRhIHdpdGggdGhlIHBsdWdpbnMgdGhhdCBtYXkgYmUgc3RpbGwgdXNlZCBieSBvdGhlciBjb25maWd1cmVkIG9yIHVuY29uZmlndXJlZCBmZWF0dXJlDQotCQkJTGlzdCBwbHVnaW5zID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJCWZvciAoaW50IGluZGV4UGx1Z2lucyA9IDA7IGluZGV4UGx1Z2lucyA8IGVudHJpZXMubGVuZ3RoOyBpbmRleFBsdWdpbnMrKykgew0KLQkJCQlpZiAoIWFsbFBsdWdpbklELmNvbnRhaW5zKGVudHJpZXNbaW5kZXhQbHVnaW5zXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7DQotCQkJCQlwbHVnaW5zLmFkZChlbnRyaWVzW2luZGV4UGx1Z2luc10pOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIG1vdmUgTGlzdCBpbnRvIEFycmF5DQotCQkJaWYgKCFwbHVnaW5zLmlzRW1wdHkoKSkgew0KLQkJCQlwbHVnaW5zVG9SZW1vdmUgPSBuZXcgSVBsdWdpbkVudHJ5W3BsdWdpbnMuc2l6ZSgpXTsNCi0JCQkJcGx1Z2lucy50b0FycmF5KHBsdWdpbnNUb1JlbW92ZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHBsdWdpbnNUb1JlbW92ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBhIG5ldyBwbHVnLWluIGVudHJ5IHRvIHRoaXMgc2l0ZS4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnN0YWxsIGFjdGlvbi4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjYWRkUGx1Z2luRW50cnkoSVBsdWdpbkVudHJ5KQ0KLQkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgZG93bmxvYWQgc2l6ZSBmb3IgdGhlIHNwZWNpZmllZCBmZWF0dXJlIG9uIHRoaXMgc2l0ZS4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnN0YWxsIGFjdGlvbi4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlKQ0KLQkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXREb3dubG9hZFNpemVGb3IoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBpbnN0YWxsIHNpemUgZm9yIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBvbiB0aGlzIHNpdGUuDQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBiZWNhdXNlIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW5zdGFsbCBhY3Rpb24uDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldEluc3RhbGxTaXplRm9yKElGZWF0dXJlKQ0KLQkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5zdGFsbCB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgYW5kIGFsbCBvcHRpb25hbCBmZWF0dXJlcyBvbiB0aGlzIHNpdGUuDQotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbg0KLQkgKiBiZWNhdXNlIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW5zdGFsbCBhY3Rpb24uDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICogQGV4Y2VwdGlvbiBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGluc3RhbGwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgbGlzdGVkIG9wdGlvbmFsIGZlYXR1cmVzIG9uIHRoaXMgc2l0ZS4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnN0YWxsIGFjdGlvbi4NCi0JICogDQotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgaW5zdGFsbA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5zdGFsbCB0aGUgc3BlY2lmaWVkIGZlYXR1cmUgb24gdGhpcyBzaXRlIHVzaW5nIHRoZSBjb250ZW50IGNvbnN1bWVyIGFzIA0KLQkgKiBhIGNvbnRleHQgdG8gaW5zdGFsbCB0aGUgZmVhdHVyZSBpbi4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBpbnN0YWxsIGFjdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBzb3VyY2VGZWF0dXJlIGZlYXR1cmUgdG8gaW5zdGFsbA0KLQkgKiBAcGFyYW0gcGFyZW50Q29udGVudENvbnN1bWVyIGNvbnRlbnQgY29uc3VtZXIgb2YgdGhlIHBhcmVudCBmZWF0dXJlDQotCSAqIEBwYXJhbSBwYXJlbnRWZXJpZmllciB2ZXJpZmllciBvZiB0aGUgcGFyZW50IGZlYXR1cmUNCi0JICogQHBhcmFtIHZlcmlmaWNhdGlvbkxpc3RlbmVyIGluc3RhbGwgdmVyaWZpY2F0aW9uIGxpc3RlbmVyDQotCSAqIEBwYXJhbSBwcm9ncmVzcyBpbnN0YWxsIG1vbml0b3IsIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgaW5zdGFsbA0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBzb3VyY2VGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIElGZWF0dXJlQ29udGVudENvbnN1bWVyIHBhcmVudENvbnRlbnRDb25zdW1lciwgSVZlcmlmaWVyIHBhcmVudFZlcmlmaWVyLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVtb3ZlICh1bmluc3RhbGwpIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBmcm9tIHRoaXMgc2l0ZS4NCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIGJlY2F1c2UgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZW1vdmUgYWN0aW9uLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpDQotCSAqIEBleGNlcHRpb24gamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBjb250ZW50IHByb3ZpZGVyLg0KLQkgKiANCi0JICogQHNlZSBJU2l0ZSNzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudFByb3ZpZGVyKElTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIpIHsNCi0JCXRoaXMuc2l0ZUNvbnRlbnRQcm92aWRlciA9IHNpdGVDb250ZW50UHJvdmlkZXI7DQotCX0NCi0JLyoqDQotCSAqIEBzZWUgSVNpdGUjZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkNCi0JICovDQotCXB1YmxpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkgew0KLQkJcmV0dXJuIChJQ29uZmlndXJlZFNpdGUpIGdldENvbmZpZ3VyZWRTaXRlTW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZSNjcmVhdGVGZWF0dXJlKFN0cmluZywgVVJMKQ0KLQkgKiBAZGVwcmVjYXRlZA0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoU3RyaW5nIHR5cGUsIFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBjcmVhdGVGZWF0dXJlKHR5cGUsdXJsLG51bGwpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2NyZWF0ZUZlYXR1cmUoU3RyaW5nLCBVUkwsDQotCSAqIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBGaXJzdCBjaGVjayB0aGUgY2FjaGUNCi0JCVVSTEtleSBrZXkgPSBuZXcgVVJMS2V5KHVybCk7DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlQ2FjaGUuZ2V0KGtleSk7DQotCQlpZiAoZmVhdHVyZSAhPSBudWxsKSByZXR1cm4gZmVhdHVyZTsNCi0NCi0JCS8vIENyZWF0ZSBhIG5ldyBvbmUNCi0JCWlmICh0eXBlID09IG51bGwgfHwgdHlwZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkvLyBhc2sgdGhlIFNpdGUgZm9yIHRoZSBkZWZhdWx0IHR5cGUNCi0JCQl0eXBlID0gZ2V0RGVmYXVsdFBhY2thZ2VkRmVhdHVyZVR5cGUoKTsNCi0JCX0NCi0NCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yeSh0eXBlKTsNCi0JCWZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUodXJsLCB0aGlzLCBtb25pdG9yKTsNCi0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsNCi0JCQkvLyBBZGQgdGhlIGZlYXR1cmUgdG8gdGhlIGNhY2hlDQotCQkJZmVhdHVyZUNhY2hlLnB1dChrZXksIGZlYXR1cmUpOw0KLQkJfQ0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRmVhdHVyZUZyb21DYWNoZShVUkwgZmVhdHVyZVVSTCkgew0KLQkJVVJMS2V5IGtleSA9IG5ldyBVUkxLZXkoZmVhdHVyZVVSTCk7DQotCQlmZWF0dXJlQ2FjaGUucmVtb3ZlKGtleSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9TaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2MWU4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLSANCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogQmFzZSBzaXRlIGNvbnRlbnQgcHJvdmlkZXINCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU2l0ZUNvbnRlbnRQcm92aWRlciB7DQotDQotCXByaXZhdGUgVVJMIGJhc2U7DQotCXByaXZhdGUgSVNpdGUgc2l0ZTsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBTaXRlQ29udGVudFByb3ZpZGVyDQotCSAqLw0KLQlwdWJsaWMgU2l0ZUNvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7DQotCQlzdXBlcigpOw0KLQkJdGhpcy5iYXNlID0gdXJsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBVUkwgb2YgdGhpcyBzaXRlDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlQ29udGVudFByb3ZpZGVyI2dldFVSTCgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJcmV0dXJuIGJhc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBVUkwgZm9yIHRoZSBpZGVudGlmaWVkIGFyY2hpdmUNCi0JICogDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcgYXJjaGl2ZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBuZXcgVVJMKGdldFVSTCgpLCBhcmNoaXZlSUQpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJCSJTaXRlQ29udGVudFByb3ZpZGVyLkVycm9yQ3JlYXRpbmdVUkxGb3JBcmNoaXZlSUQiLCAvLyROT04tTkxTLTEkDQotCQkJCQkJYXJjaGl2ZUlELA0KLQkJCQkJCWdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpLA0KLQkJCQkJZSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgZm9yIHRoaXMgcHJvdmlkZXINCi0JICogDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0U2l0ZSgpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgew0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHNpdGUgZm9yIHRoaXMgcHJvdmlkZXINCi0JICogDQotCSAqIEBwYXJhbSBzaXRlIHNpdGUgZm9yIHRoaXMgcHJvdmlkZXINCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKSB7DQotCQl0aGlzLnNpdGUgPSBzaXRlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUZlYXR1cmVSZWZlcmVuY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUZlYXR1cmVSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFkNTE3NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGVGZWF0dXJlUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgZmVhdHVyZSByZWZlcmVuY2UuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVSZWZlcmVuY2UKLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZVJlZmVyZW5jZU1vZGVsCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlRmVhdHVyZVJlZmVyZW5jZQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIAotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZXh0ZW5kcyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGltcGxlbWVudHMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHsKLQotCXByaXZhdGUgTGlzdCBjYXRlZ29yaWVzOwotCi0JLyoqCi0JICogRmVhdHVyZSByZWZlcmVuY2UgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBGZWF0dXJlUmVmZXJlbmNlLgotCSAqIEBwYXJhbSByZWYgdGhlIHJlZmVyZW5jZSB0byBjb3B5Ci0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlKElTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJc3VwZXIocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3JpZXMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSBiZWxvbmcgdG8uCi0JICogCi0JICogQHNlZSBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UjZ2V0Q2F0ZWdvcmllcygpCi0JICogQHNpbmNlIDIuMSAKLQkgKi8KLQlwdWJsaWMgSUNhdGVnb3J5W10gZ2V0Q2F0ZWdvcmllcygpIHsKLQotCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0JCQljYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJU3RyaW5nW10gY2F0ZWdvcmllc0FzU3RyaW5nID0gZ2V0Q2F0ZWdvcnlOYW1lcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzQXNTdHJpbmcubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ2F0ZWdvcnkgc2l0ZUNhdCA9IGdldFNpdGUoKS5nZXRDYXRlZ29yeShjYXRlZ29yaWVzQXNTdHJpbmdbaV0pOwotCQkJCWlmIChzaXRlQ2F0ICE9IG51bGwpCi0JCQkJCWNhdGVnb3JpZXMuYWRkKHNpdGVDYXQpOwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgc2l0ZVVSTCA9IGdldFNpdGUoKS5nZXRVUkwoKSAhPSBudWxsID8gZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgOiBudWxsOwotCQkJCQlVcGRhdGVDb3JlLndhcm4oIkNhdGVnb3J5ICIgKyBjYXRlZ29yaWVzQXNTdHJpbmdbaV0gKyAiIG5vdCBmb3VuZCBpbiBTaXRlOiIgKyBzaXRlVVJMKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUNhdGVnb3J5W10gcmVzdWx0ID0gbmV3IElDYXRlZ29yeVswXTsKLQotCQlpZiAoIShjYXRlZ29yaWVzID09IG51bGwgfHwgY2F0ZWdvcmllcy5pc0VtcHR5KCkpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgSUNhdGVnb3J5W2NhdGVnb3JpZXMuc2l6ZSgpXTsKLQkJCWNhdGVnb3JpZXMudG9BcnJheShyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGNhdGVnb3J5IHRvIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUuCi0JICogCi0JICogQHNlZSBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UjYWRkQ2F0ZWdvcnkoSUNhdGVnb3J5KQotCSAqIEBzaW5jZSAyLjEgCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnkoSUNhdGVnb3J5IGNhdGVnb3J5KSB7Ci0JCXRoaXMuYWRkQ2F0ZWdvcnlOYW1lKGNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjEzZGJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBTaXRlIEZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCAKLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIAotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVSZWZlcmVuY2UKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZXh0ZW5kcyBGZWF0dXJlUmVmZXJlbmNlIHsKLQotCXByaXZhdGUgTGlzdCAvKiBvZiBTdHJpbmcqLwotCWNhdGVnb3J5TmFtZXM7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCBvYmplY3QuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIEZlYXR1cmVSZWZlcmVuY2VNb2RlbC4KLQkgKiBAcGFyYW0gcmVmCi0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQlzdXBlcihyZWYpOwotCQlpZiAocmVmIGluc3RhbmNlb2YgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgewotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCByZWZNb2RlbCA9IChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSByZWY7Ci0JCQlzZXRDYXRlZ29yeU5hbWVzKHJlZk1vZGVsLmdldENhdGVnb3J5TmFtZXMoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGNhdGVnb3JpZXMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbmFtZXMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcnlOYW1lcygpIHsKLQkJaWYgKGNhdGVnb3J5TmFtZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCi0JCXJldHVybiAoU3RyaW5nW10pIGNhdGVnb3J5TmFtZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lcyBvZiBjYXRlZ29yaWVzIHRoaXMgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5TmFtZXMgYW4gYXJyYXkgb2YgY2F0ZWdvcnkgbmFtZXMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlOYW1lcyhTdHJpbmdbXSBjYXRlZ29yeU5hbWVzKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCWlmIChjYXRlZ29yeU5hbWVzID09IG51bGwpCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBudWxsOwotCQllbHNlCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoY2F0ZWdvcnlOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIG5hbWUgb2YgYSBjYXRlZ29yeSB0aGlzIGZlYXR1cmUgYmVsb25ncyB0by4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeU5hbWUgY2F0ZWdvcnkgbmFtZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeU5hbWUoU3RyaW5nIGNhdGVnb3J5TmFtZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodGhpcy5jYXRlZ29yeU5hbWVzID09IG51bGwpCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghdGhpcy5jYXRlZ29yeU5hbWVzLmNvbnRhaW5zKGNhdGVnb3J5TmFtZSkpCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMuYWRkKGNhdGVnb3J5TmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIG5hbWUgb2YgYSBjYXRlZ29yeXMgdGhpcyBmZWF0dXJlIGJlbG9uZ3MgdG8uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnlOYW1lIGNhdGVnb3J5IG5hbWUKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2F0ZWdvcnlOYW1lKFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHRoaXMuY2F0ZWdvcnlOYW1lcyAhPSBudWxsKQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzLnJlbW92ZShjYXRlZ29yeU5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZU1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvU2l0ZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiMzRmYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1NpdGVNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqICAgICBMYXVyZW50IEZvdXJyaWVyIChsYXVyZW50QGZvdXJyaWVyLm5vbS5mcikgLSBIVFRQIFByb3h5IGNvZGUgYW5kIE5ldEFjY2VzcyBQbHVnaW4gDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogU2l0ZSBNYW5hZ2VyLg0KLSAqIEEgaGVscGVyIGNsYXNzIHVzZWQgZm9yIGNyZWF0aW5nIHNpdGUgaW5zdGFuY2UuIA0KLSAqIFNpdGUgbWFuYWdlciBpcyBhIHNpbmdsZXRvbiBjbGFzcy4gSXQgY2Fubm90IGJlIGluc3RhbnRpYXRlZDsgDQotICogYWxsIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgc3RhdGljIG1ldGhvZHMuDQotICogDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGUNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGUNCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZU1hbmFnZXIgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3M7DQotCXByaXZhdGUgc3RhdGljIFN0cmluZyB3czsNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFyY2g7DQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBubDsNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0h0dHBQcm94eUVuYWJsZTsNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hUVFBfSE9TVCA9ICJodHRwLnByb3h5SG9zdCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSFRUUF9QT1JUID0gImh0dHAucHJveHlQb3J0IjsJIC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSFRUUF9QUk9YWSA9ICJodHRwLnByb3h5U2V0IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIFNpdGVNYW5hZ2VyKCkgew0KLQl9DQotDQotCS8qKiANCi0JICogUmV0dXJucyBhIHNpdGUgb2JqZWN0IGZvciB0aGUgc2l0ZSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50IFVSTC4NCi0JICogVHlwaWNhbGx5LCB0aGUgVVJMIHJlZmVyZW5jZXMgYSBzaXRlIG1hbmlmZXN0IGZpbGUgb24gYW4gdXBkYXRlIA0KLQkgKiBzaXRlLiBBbiB1cGRhdGUgc2l0ZSBhY3RzIGFzIGEgc291cmNlIG9mIGZlYXR1cmVzIGZvciBpbnN0YWxsYXRpb24NCi0JICogYWN0aW9ucy4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlVVJMIHNpdGUgVVJMDQotCSAqIEByZXR1cm4gc2l0ZSBvYmplY3QgZm9yIHRoZSB1cmwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRTaXRlKFVSTCxJUG9ncmVzc01vbml0b3IpIGluc3RlYWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVNpdGUgZ2V0U2l0ZShVUkwgc2l0ZVVSTCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIEludGVybmFsU2l0ZU1hbmFnZXIuZ2V0U2l0ZShzaXRlVVJMLCB0cnVlLG51bGwpOw0KLQl9DQotDQotCS8qKiANCi0JICogUmV0dXJucyBhIHNpdGUgb2JqZWN0IGZvciB0aGUgc2l0ZSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50IFVSTC4NCi0JICogVHlwaWNhbGx5LCB0aGUgVVJMIHJlZmVyZW5jZXMgYSBzaXRlIG1hbmlmZXN0IGZpbGUgb24gYW4gdXBkYXRlIA0KLQkgKiBzaXRlLiBBbiB1cGRhdGUgc2l0ZSBhY3RzIGFzIGEgc291cmNlIG9mIGZlYXR1cmVzIGZvciBpbnN0YWxsYXRpb24NCi0JICogYWN0aW9ucy4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlVVJMIHNpdGUgVVJMDQotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yDQotCSAqIEByZXR1cm4gc2l0ZSBvYmplY3QgZm9yIHRoZSB1cmwgb3IgPHNhbXA+bnVsbDwvc2FtcD4gaW4gY2FzZSBhIA0KLQkgKiB1c2VyIGNhbmNlbGVkIHRoZSBjb25uZWN0aW9uIGluIHRoZSBwcm9ncmVzcyBtb25pdG9yLg0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMSANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVNpdGUgZ2V0U2l0ZShVUkwgc2l0ZVVSTCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gSW50ZXJuYWxTaXRlTWFuYWdlci5nZXRTaXRlKHNpdGVVUkwsIHRydWUsIG1vbml0b3IpOw0KLQl9DQotDQotCS8qKiANCi0JICogUmV0dXJucyBhIHNpdGUgb2JqZWN0IGZvciB0aGUgc2l0ZSBzcGVjaWZpZWQgYnkgdGhlIGFyZ3VtZW50IFVSTC4NCi0JICogVHlwaWNhbGx5LCB0aGUgVVJMIHJlZmVyZW5jZXMgYSBzaXRlIG1hbmlmZXN0IGZpbGUgb24gYW4gdXBkYXRlIA0KLQkgKiBzaXRlLiBBbiB1cGRhdGUgc2l0ZSBhY3RzIGFzIGEgc291cmNlIG9mIGZlYXR1cmVzIGZvciBpbnN0YWxsYXRpb24NCi0JICogYWN0aW9ucy4NCi0JICogDQotCSAqIEBwYXJhbSBzaXRlVVJMIHNpdGUgVVJMDQotCSAqIEBwYXJhbSB1c2VzQ2FjaGUgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBjYWNoZSBzaG91bGQgYmUgcmVmcmVzaGVkLCBhbmQgdGhlIHNpdGUgZW50aXJlbHkgcmVwYXJzZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuDQotCSAqIEByZXR1cm4gc2l0ZSBvYmplY3QgZm9yIHRoZSB1cmwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRTaXRlKFVSTCxib29sZWFuLElQb2dyZXNzTW9uaXRvcikgaW5zdGVhZA0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJU2l0ZSBnZXRTaXRlKFVSTCBzaXRlVVJMLCBib29sZWFuIHVzZXNDYWNoZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIEludGVybmFsU2l0ZU1hbmFnZXIuZ2V0U2l0ZShzaXRlVVJMLCB1c2VzQ2FjaGUsbnVsbCk7DQotCX0NCi0NCi0JLyoqIA0KLQkgKiBSZXR1cm5zIGEgc2l0ZSBvYmplY3QgZm9yIHRoZSBzaXRlIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnQgVVJMLg0KLQkgKiBUeXBpY2FsbHksIHRoZSBVUkwgcmVmZXJlbmNlcyBhIHNpdGUgbWFuaWZlc3QgZmlsZSBvbiBhbiB1cGRhdGUgDQotCSAqIHNpdGUuIEFuIHVwZGF0ZSBzaXRlIGFjdHMgYXMgYSBzb3VyY2Ugb2YgZmVhdHVyZXMgZm9yIGluc3RhbGxhdGlvbg0KLQkgKiBhY3Rpb25zLg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGVVUkwgc2l0ZSBVUkwNCi0JICogQHBhcmFtIHVzZXNDYWNoZSA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIGNhY2hlIHNob3VsZCBiZSByZWZyZXNoZWQsIGFuZCB0aGUgc2l0ZSBlbnRpcmVseSByZXBhcnNlZCwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3INCi0JICogQHJldHVybiBzaXRlIG9iamVjdCBmb3IgdGhlIHVybCBvciA8c2FtcD5udWxsPC9zYW1wPiBpbiBjYXNlIGEgDQotCSAqIHVzZXIgY2FuY2VsZWQgdGhlIGNvbm5lY3Rpb24gaW4gdGhlIHByb2dyZXNzIG1vbml0b3IuDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElTaXRlIGdldFNpdGUoVVJMIHNpdGVVUkwsIGJvb2xlYW4gdXNlc0NhY2hlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBJbnRlcm5hbFNpdGVNYW5hZ2VyLmdldFNpdGUoc2l0ZVVSTCwgdXNlc0NhY2hlLCBtb25pdG9yKTsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgImxvY2FsIHNpdGUiLiBBIGxvY2FsIHNpdGUgaXMgYSBsb2dpY2FsIGNvbGxlY3Rpb24NCi0JICogb2YgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBwbHVzIG9uZSBvciBtb3JlIGZpbGUgc3lzdGVtIA0KLQkgKiBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMsIHJlcHJlc2VudGVkIGFzIGludGl2aWR1YWwgc2l0ZXMuIA0KLQkgKiBUaGVzZSBhcmUgcG90ZW50aWFsIHRhcmdldHMgZm9yIGluc3RhbGxhdGlvbiBhY3Rpb25zLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgbG9jYWwgc2l0ZQ0KLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gSW50ZXJuYWxTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVHJpZ2dlciBoYW5kbGluZyBvZiBuZXdseSBkaXNjb3ZlcmVkIGZlYXR1cmVzLiBUaGlzIG1ldGhvZA0KLQkgKiBjYW4gYmUgY2FsbGVkIGJ5IHRoZSBleGVjdXRpbmcgYXBwbGljYXRpb24gd2hlbmV2ZXIgaXQNCi0JICogaXMgaW52b2tlZCB3aXRoIHRoZSAtbmV3VXBkYXRlcyBjb21tYW5kIGxpbmUgYXJndW1lbnQuDQotCSAqIA0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJzLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqIEBkZXByZWNhdGVkIERvIG5vdCB1c2UgdGhpcyBtZXRob2QNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBoYW5kbGVOZXdDaGFuZ2VzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotCS8qKg0KLQkgKiBSZXR1cm5zIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4gQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBhcmNoDQotCSAqIGRlc2lnbmF0b3JzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLiANCi0JICogDQotCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBhcyBhIGhpbnQgYnkgdGhlIGluc3RhbGxhdGlvbiBhbmQgdXBkYXRlDQotCSAqIHN1cHBvcnQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRPU0FyY2goKSB7DQotCQlpZiAoYXJjaCA9PSBudWxsKQ0KLQkJCWFyY2ggPSBQbGF0Zm9ybS5nZXRPU0FyY2goKTsNCi0JCXJldHVybiBhcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4gQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBvcw0KLQkgKiBkZXNpZ25hdG9ycyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4NCi0JICogDQotCSAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBhcyBhIGhpbnQgYnkgdGhlIGluc3RhbGxhdGlvbiBhbmQgdXBkYXRlDQotCSAqIHN1cHBvcnQuDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T1MoKSB7DQotCQlpZiAob3MgPT0gbnVsbCkNCi0JCQlvcyA9IFBsYXRmb3JtLmdldE9TKCk7DQotCQlyZXR1cm4gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLiBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFyY2gNCi0JICogZGVzaWduYXRvcnMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uIA0KLQkgKiANCi0JICogVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGFzIGEgaGludCBieSB0aGUgaW5zdGFsbGF0aW9uIGFuZCB1cGRhdGUNCi0JICogc3VwcG9ydC4NCi0JICogQHJldHVybiBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdTKCkgew0KLQkJaWYgKHdzID09IG51bGwpDQotCQkJd3MgPSBQbGF0Zm9ybS5nZXRXUygpOw0KLQkJcmV0dXJuIHdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBhcmNoLg0KLQkgKiBAcGFyYW0gYXJjaCBUaGUgYXJjaCB0byBzZXQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPU0FyY2goU3RyaW5nIGFyY2gpIHsNCi0JCVNpdGVNYW5hZ2VyLmFyY2ggPSBhcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBvcy4NCi0JICogQHBhcmFtIG9zIFRoZSBvcyB0byBzZXQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPUyhTdHJpbmcgb3MpIHsNCi0JCVNpdGVNYW5hZ2VyLm9zID0gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHdzLg0KLQkgKiBAcGFyYW0gd3MgVGhlIHdzIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFdTKFN0cmluZyB3cykgew0KLQkJU2l0ZU1hbmFnZXIud3MgPSB3czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbmwuDQotCSAqIEBwYXJhbSBubCBUaGUgbmwgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7DQotCQlTaXRlTWFuYWdlci5ubCA9IG5sOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiBieXRlcyBwZXIgc2Vjb25kIHRyYW5zZmVyIHJhdGUgZm9yIHRoaXMgVVJMDQotCSAqIEBwYXJhbSBzaXRlIHRoZSBVUkwgb2YgdGhlIHNpdGUNCi0JICogQHJldHVybiBsb25nIGEgYnl0ZXMgcGVyIHNlY29uZCBlc3RpbWF0ZSByYXRlDQotCSAqIEBzaW5jZSAyLjENCi0gCSAqLwkNCi0JcHVibGljIHN0YXRpYyBsb25nIGdldEVzdGltYXRlZFRyYW5zZmVyUmF0ZShVUkwgc2l0ZSkgew0KLQkJaWYgKHNpdGUgPT0gbnVsbCkNCi0JCQlyZXR1cm4gMDsNCi0JCXJldHVybiBJbnRlcm5hbFNpdGVNYW5hZ2VyLmdldEVzdGltYXRlZFRyYW5zZmVyUmF0ZShzaXRlLmdldEhvc3QoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgY3VycmVudCBsb2NhbGUNCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjdXJyZW50IGxvY2FsZSBvciA8Y29kZT5udWxsPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROTCgpIHsNCi0JCWlmIChubCA9PSBudWxsKQ0KLQkJCW5sID0gUGxhdGZvcm0uZ2V0TkwoKTsNCi0JCXJldHVybiBubDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgSFRUUCBQcm94eSBTZXJ2ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQ0KLQkgKiBAcmV0dXJuIHRoZSBIVFRQIHByb3h5IFNlcnZlciANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEh0dHBQcm94eVNlcnZlcigpIHsNCi0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoUF9IVFRQX0hPU1QpOw0KLQl9DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBIVFRQIFByb3h5IFBvcnQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQ0KLQkgKiBAcmV0dXJuIHRoZSBIVFRQIHByb3h5IFBvcnQgDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRIdHRwUHJveHlQb3J0KCkgew0KLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShQX0hUVFBfUE9SVCk7DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIHVzZSB0aGUgDQotCSAqIGh0dHAgcHJveHkgc2VydmVyLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEByZXR1cm4gaXMgdGhlIGh0dHAgcHJveHkgc2VydmVyIGVuYWJsZQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSHR0cFByb3h5RW5hYmxlKCkgew0KLQkJcmV0dXJuIGlzSHR0cFByb3h5RW5hYmxlOw0KLQl9DQotCS8qKg0KLQkgKiBTZXRzIHRoZSBIVFRQIFByb3h5IGluZm9ybWF0aW9uDQotCSAqIFNldHMgdGhlIEhUVFAgcHJveHkgc2VydmVyIGZvciB0aGUgSFRUUCBwcm94eSBzZXJ2ZXIgDQotCSAqIFNldHMgdGhlIEhUVFAgcHJveHkgcG9ydCBmb3IgdGhlIEhUVFAgcHJveHkgc2VydmVyIA0KLQkgKiBJZiB0aGUgcHJveHkgbmFtZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgcHJveHkgcG9ydCBpcw0KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB0aGUgY29ubmVjdGlvbiB3aWxsIG5vdCB1c2UgSFRUUCBwcm94eSBzZXJ2ZXIuDQotCSAqIA0KLQkgKiBAcGFyYW0gZW5hYmxlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4gaHR0cA0KLQkgKiBwcm94eSBzZXJ2ZXIsIDxjb2RlPmZhbHNlIDwvY29kZT4gb3RoZXJ3aXNlLg0KLQkgKiBAcGFyYW0gaHR0cFByb3h5U2VydmVyIHRoZSBIVFRQIHByb3h5IHNlcnZlciBuYW1lIG9yIElQIGFkcmVzcw0KLQkgKiBAcGFyYW0gaHR0cFByb3h5UG9ydCB0aGUgSFRUUCBwcm94eSBwb3J0DQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SHR0cFByb3h5SW5mbyhib29sZWFuIGVuYWJsZSwgU3RyaW5nIGh0dHBQcm94eVNlcnZlciwgU3RyaW5nIGh0dHBQcm94eVBvcnQpIHsNCi0JCWlzSHR0cFByb3h5RW5hYmxlID0gZW5hYmxlOw0KLQ0KLQkJLy8gaWYgZW5hYmxlIGlzIGZhbHNlLCBvciB2YWx1ZXMgYXJlIG51bGwsDQotCQkvLyB3ZSBzaG91bGQgcmVtb3ZlIHRoZSBwcm9wZXJ0aWVzIGFuZCBzYXZlIHRoZSBmYWN0IHRoYXQgcHJveHkgaXMgZGlzYWJsZSANCi0JCWlmICghZW5hYmxlIHx8IGh0dHBQcm94eVNlcnZlciA9PSBudWxsIHx8IGh0dHBQcm94eVBvcnQgPT0gbnVsbCkgew0KLQkJCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucmVtb3ZlKFBfSFRUUF9IT1NUKTsNCi0JCQlTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnJlbW92ZShQX0hUVFBfUE9SVCk7DQotCQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoUF9IVFRQX1BST1hZKTsNCi0JCQkvL2lmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykNCi0JCQlVcGRhdGVDb3JlLndhcm4oIlJlbW92ZSBwcm94eSBzZXJ2ZXIgaW5mbyIpOyAvLyROT04tTkxTLTEkDQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFVwZGF0ZUNvcmUuSFRUUF9QUk9YWV9FTkFCTEUsIGlzSHR0cFByb3h5RW5hYmxlKCkpOw0KLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQkvL1N5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJwcm94eVNldCIsICJ0cnVlIik7DQotCQkvL1N5c3RlbS5nZXRQcm9wZXJ0aWVzKCkucHV0KCJwcm94eUhvc3QiLCBwcm94eUhvc3QpOw0KLQkJLy9TeXN0ZW0uZ2V0UHJvcGVydGllcygpLnB1dCgicHJveHlQb3J0IiwgcHJveHlQb3J0KTsNCi0JCQ0KLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5zZXRQcm9wZXJ0eShQX0hUVFBfUFJPWFksIGVuYWJsZT8idHJ1ZSI6ImZhbHNlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJU3lzdGVtLmdldFByb3BlcnRpZXMoKS5zZXRQcm9wZXJ0eShQX0hUVFBfSE9TVCwgaHR0cFByb3h5U2VydmVyKTsNCi0JCVN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuc2V0UHJvcGVydHkoUF9IVFRQX1BPUlQsIGh0dHBQcm94eVBvcnQpOw0KLQkJLy9pZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfV0FSTklOR1MpDQotCQlVcGRhdGVDb3JlLndhcm4oIkFkZGVkIHByb3h5IHNlcnZlciBpbmZvOiIgKyBodHRwUHJveHlTZXJ2ZXIgKyAiOiIgKyBodHRwUHJveHlQb3J0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVXBkYXRlQ29yZS5IVFRQX1BST1hZX0hPU1QsIGdldEh0dHBQcm94eVNlcnZlcigpKTsNCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShVcGRhdGVDb3JlLkhUVFBfUFJPWFlfUE9SVCwgZ2V0SHR0cFByb3h5UG9ydCgpKTsNCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShVcGRhdGVDb3JlLkhUVFBfUFJPWFlfRU5BQkxFLCBpc0h0dHBQcm94eUVuYWJsZSgpKTsNCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7DQotDQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9VUkxFbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9VUkxFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTZkZjc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVVJMRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIGFuIGFubm90YXRlZCBVUkwuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4NCi0gKiA8L3A+IA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeQ0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbA0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi1wdWJsaWMgY2xhc3MgVVJMRW50cnkgZXh0ZW5kcyBVUkxFbnRyeU1vZGVsIGltcGxlbWVudHMgSVVSTEVudHJ5IHsNCi0NCi0JLyoqDQotCSAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIGFubm90YXRlZCBVUkwNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkxFbnRyeSgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gYW5ub3RhdGVkIFVSTC4NCi0JICogDQotCSAqIEByZXR1cm4gYW5ub3RhdGVkIHVybCBhcyBTdHJpbmcNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCVN0cmluZyByZXN1bHQgPSAiSVVSTEVudHJ5OiAiOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgVVJMU3RyaW5nID0NCi0JCQkoZ2V0VVJMKCkgPT0gbnVsbCkgPyBQb2xpY3kuYmluZCgiRmVhdHVyZS5Ob1VSTCIpIDogZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsJLy8kTk9OLU5MUy0xJA0KLQkJcmVzdWx0ID0NCi0JCQlyZXN1bHQNCi0JCQkJKyAoKGdldEFubm90YXRpb24oKSA9PSBudWxsKSA/IFVSTFN0cmluZyA6IGdldEFubm90YXRpb24oKSArICIgOiAiICsgVVJMU3RyaW5nKTsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1V0aWxpdGllcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9VdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1MzUwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1V0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIGNvbGxlY3Rpb24gb2YgdXRpbGl0eSBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgCi0gKiB1c2VkIGZvciBpbnN0YWxsIHByb2Nlc3NpbmcKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBVdGlsaXRpZXMgewotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGVudHJ5TWFwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERhdGVGb3JtYXQgZGF0ZUZvcm1hdCA9IERhdGVGb3JtYXQuZ2V0RGF0ZVRpbWVJbnN0YW5jZShEYXRlRm9ybWF0LkRFRkFVTFQsIERhdGVGb3JtYXQuREVGQVVMVCwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0JcHJpdmF0ZSBzdGF0aWMgbG9uZyB0bXBzZWVkID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlyUm9vdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IHdvcmtpbmcgZGlyZWN0b3J5IChpbiB0ZW1wb3Jhcnkgc3BhY2UpLiBFbnN1cmVzCi0JICogdGhlIGRpcmVjdG9yeSBleGlzdHMuIEFueSBkaXJlY3RvcnkgbGV2ZWxzIHRoYXQgaGFkIHRvIGJlIGNyZWF0ZWQKLQkgKiBhcmUgbWFya2VkIGZvciBkZWxldGlvbiBvbiBleGl0LgotCSAqIAotCSAqIEByZXR1cm4gd29ya2luZyBkaXJlY3RvcnkKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbGUgY3JlYXRlV29ya2luZ0RpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKGRpclJvb3QgPT0gbnVsbCkgewotCQkJZGlyUm9vdCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gaW4gTGludXgsIHJldHVybnMgJy90bXAnLCB3ZSBtdXN0IGFkZCAnLycKLQkJCWlmICghZGlyUm9vdC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQkJZGlyUm9vdCArPSBGaWxlLnNlcGFyYXRvcjsKLQotCQkJLy8gb24gVW5peC9MaW51eCwgdGhlIHRlbXAgZGlyIGlzIHNoYXJlZCBieSBtYW55IHVzZXJzLCBzbyB3ZSBuZWVkIHRvIGVuc3VyZSAKLQkJCS8vIHRoYXQgdGhlIHRvcCB3b3JraW5nIGRpcmVjdG9yeSBpcyBkaWZmZXJlbnQgZm9yIGVhY2ggdXNlcgotCQkJaWYgKCFQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGhvbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuaG9tZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaG9tZSA9IEludGVnZXIudG9TdHJpbmcoaG9tZS5oYXNoQ29kZSgpKTsKLQkJCQlkaXJSb290ICs9IGhvbWUgKyBGaWxlLnNlcGFyYXRvcjsKLQkJCX0KLQkJCWRpclJvb3QgKz0gImVjbGlwc2UiICsgRmlsZS5zZXBhcmF0b3IgKyAiLnVwZGF0ZSIgKyBGaWxlLnNlcGFyYXRvciArIExvbmcudG9TdHJpbmcodG1wc2VlZCkgKyBGaWxlLnNlcGFyYXRvcjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlTdHJpbmcgdG1wTmFtZSA9IGRpclJvb3QgKyBMb25nLnRvU3RyaW5nKCsrdG1wc2VlZCkgKyBGaWxlLnNlcGFyYXRvcjsKLQotCQlGaWxlIHRtcERpciA9IG5ldyBGaWxlKHRtcE5hbWUpOwotCQl2ZXJpZnlQYXRoKHRtcERpciwgZmFsc2UpOwotCQlpZiAoIXRtcERpci5leGlzdHMoKSkKLQkJCXRocm93IG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24odG1wTmFtZSk7Ci0JCXJldHVybiB0bXBEaXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHdvcmtpbmcgZmlsZS4gVGhlIGZpbGUgaXMgbWFya2VkIGZvciBkZWxldGlvbiBvbiBleGl0LgotCSAqIAotCSAqIEBzZWUgI2xvb2t1cExvY2FsRmlsZShTdHJpbmcpCi0JICogQHBhcmFtIHRtcERpciBkaXJlY3RvcnkgbG9jYXRpb24gZm9yIG5ldyBmaWxlLiBBbnkgbWlzc2luZyBkaXJlY3RvcnkKLQkgKiBsZXZlbHMgYXJlIGNyZWF0ZWQgKGFuZCBtYXJrZWQgZm9yIGRlbGV0aW9uIG9uIGV4aXQpCi0JICogQHBhcmFtIG5hbWUgb3B0aW9uYWwgZmlsZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPi4gSWYgbmFtZSBpcyBub3QKLQkgKiBzcGVjaWZpZWQsIGEgdGVtcG9yYXJ5IG5hbWUgaXMgZ2VuZXJhdGVkLgotCSAqIEByZXR1cm4gY3JlYXRlZCB3b3JraW5nIGZpbGUKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbGUgY3JlYXRlTG9jYWxGaWxlKEZpbGUgdG1wRGlyLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gY3JlYXRlIHRoZSBsb2NhbCBmaWxlCi0JCUZpbGUgdGVtcDsKLQkJU3RyaW5nIGZpbGVQYXRoOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgZmlsZSB3aXRoIHNwZWNpZmllZCBuYW1lCi0JCQlmaWxlUGF0aCA9IG5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQlpZiAoZmlsZVBhdGguc3RhcnRzV2l0aChGaWxlLnNlcGFyYXRvcikpCi0JCQkJZmlsZVBhdGggPSBmaWxlUGF0aC5zdWJzdHJpbmcoMSk7Ci0JCQl0ZW1wID0gbmV3IEZpbGUodG1wRGlyLCBmaWxlUGF0aCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBjcmVhdGUgZmlsZSB3aXRoIHRlbXAgbmFtZQotCQkJdGVtcCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImVjbGlwc2UiLCBudWxsLCB0bXBEaXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGVtcC5kZWxldGVPbkV4aXQoKTsKLQkJdmVyaWZ5UGF0aCh0ZW1wLCB0cnVlKTsKLQotCQlyZXR1cm4gdGVtcDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBsb29rdXAga2V5LgotCSAqIEBwYXJhbSBrZXkgb3B0aW9uYWwgbG9va3VwIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIHRlbXAgdGhlIGxvY2FsIHdvcmtpbmcgZmlsZQotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgbWFwTG9jYWxGaWxlKFN0cmluZyBrZXksIEZpbGUgdGVtcCkgewotCQkvLyBjcmVhdGUgZmlsZSBhc3NvY2lhdGlvbiAKLQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQlpZiAoZW50cnlNYXAgPT0gbnVsbCkKLQkJCQllbnRyeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQllbnRyeU1hcC5wdXQoa2V5LCB0ZW1wKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBwcmV2aW91c2x5IGNhY2hlZCBsb2NhbCBmaWxlIChpbiB0ZW1wb3JhcnkgYXJlYSkgbWF0Y2hpbmcgdGhlCi0JICogc3BlY2lmaWVkIGtleS4gCi0JICogCi0JICogQHBhcmFtIGtleSBsb29rdXAga2V5Ci0JICogQHJldHVybiBjYWNoZWQgZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbGUgbG9va3VwTG9jYWxGaWxlKFN0cmluZyBrZXkpIHsKLQkJaWYgKGVudHJ5TWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChGaWxlKSBlbnRyeU1hcC5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBGbHVzaGVzIGFsbCB0aGUga2V5cyBmcm9tIHRoZSBsb2NhbCBmaWxlIG1hcC4KLQkgKiBSZWluaXRpYWxpemUgdGhlIGNhY2hlLgotICAgICAqCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgZmx1c2hMb2NhbEZpbGUoKSB7Ci0JCWVudHJ5TWFwID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlIGxvY2FsIGZpbGUgbWFwLiBUaGUgZmlsZSBpcwotCSAqIG5vdCBhY3R1YWxseSBkZWxldGVkIHVudGlsIFZNIHRlcm1pbmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBrZXkgbG9va3VwIGtleQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxvY2FsRmlsZShTdHJpbmcga2V5KSB7Ci0JCWlmIChlbnRyeU1hcCAhPSBudWxsKQotCQkJZW50cnlNYXAucmVtb3ZlKGtleSk7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0gdG8gdGhlIG91dHB1dCBzdHJlYW0uIE5laXRoZXIgc3RyZWFtCi0JICogaXMgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGlzIGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSBvcyBvdXRwdXQgc3RyZWFtCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEBleGNlcHRpb24gSU9FeGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGlzLCBPdXRwdXRTdHJlYW0gb3MsIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gewotCQlsb25nIG9mZnNldCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5KGlzLCBvcywgbW9uaXRvciwgMCk7Ci0JCWlmIChvZmZzZXQgIT0gLTEpIHsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiRmVhdHVyZS5JbnN0YWxsYXRpb25DYW5jZWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IG5ldyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbihtc2csIG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb3JlRXhjZXB0aW9uIGZyb20gc29tZSBvdGhlciBleGNlcHRpb24uCi0JICogVGhlIHR5cGUgb2YgdGhlIENvcmVFeGNlcHRpb24gaXMgPGNvZGU+SVN0YXR1cy5FUlJPUjwvY29kZT4KLQkgKiBJZiB0aGUgZXhjZXB0aW9uIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBpcyBhbHNvIGEgQ29yZUV4Y2VwdGlvbiwKLQkgKiB0aGUgbmV3IENvcmVFeGNlcHRpb24gd2lsbCBjb250YWluIGFsbCB0aGUgc3RhdHVzIG9mIHRoZSBwYXNzZWQKLQkgKiBDb3JlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNFUlJPUgotCSAqIEBwYXJhbSBzIGV4Y2VwdGlvbiBzdHJpbmcKLQkgKiBAcGFyYW0gY29kZSB0aGUgY29kZSByZXBvcnRlZAotCSAqIEBwYXJhbSBlIGFjdHVhbCBleGNlcHRpb24gYmVpbmcgcmVwb3J0ZWQKLQkgKiBAcmV0dXJuIGEgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvcmVFeGNlcHRpb24gbmV3Q29yZUV4Y2VwdGlvbihTdHJpbmcgcywgaW50IGNvZGUsIFRocm93YWJsZSBlKSB7Ci0JCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkJLy8gY2hlY2sgdGhlIGNhc2Ugb2YgYSBtdWx0aXN0YXR1cwotCQlJU3RhdHVzIHN0YXR1czsKLQkJaWYgKGUgaW5zdGFuY2VvZiBGZWF0dXJlRG93bmxvYWRFeGNlcHRpb24pCi0JCQlyZXR1cm4gKEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbillOwotCQllbHNlIGlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJaWYgKHMgPT0gbnVsbCkKLQkJCQlzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhpZCwgY29kZSwgcywgZSk7Ci0JCQlJU3RhdHVzIGNoaWxkcmVuU3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJCSgoTXVsdGlTdGF0dXMpIHN0YXR1cykuYWRkKGNoaWxkcmVuU3RhdHVzKTsKLQkJCSgoTXVsdGlTdGF0dXMpIHN0YXR1cykuYWRkQWxsKGNoaWxkcmVuU3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBjb21wbGV0ZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocyAhPSBudWxsKQotCQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChzKTsKLQkJCWlmIChlICE9IG51bGwpIHsKLQkJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIiBbIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbXNnID0gZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyE9bnVsbD9tc2c6ZS50b1N0cmluZygpKTsKLQkJCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgY29kZSwgY29tcGxldGVTdHJpbmcudG9TdHJpbmcoKSwgZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgQ29yZUV4Y2VwdGlvbiBmcm9tIHNvbWUgb3RoZXIgZXhjZXB0aW9uLgotCSAqIFRoZSB0eXBlIG9mIHRoZSBDb3JlRXhjZXB0aW9uIGlzIDxjb2RlPklTdGF0dXMuRVJST1I8L2NvZGU+Ci0JICogSWYgdGhlIGV4Y2VwdGlvbnBhc3NlZCBhcyBhIHBhcmFtZXRlciBpcyBhbHNvIGEgQ29yZUV4Y2VwdGlvbiwKLQkgKiB0aGUgbmV3IENvcmVFeGNlcHRpb24gd2lsbCBjb250YWluIGFsbCB0aGUgc3RhdHVzIG9mIHRoZSBwYXNzZWQKLQkgKiBDb3JlRXhjZXB0aW9uLgotCSAqIAotCSAqIEBzZWUgSVN0YXR1cyNFUlJPUgotCSAqIEBwYXJhbSBzIGV4Y2VwdGlvbiBzdHJpbmcKLQkgKiBAcGFyYW0gZSBhY3R1YWwgZXhjZXB0aW9uIGJlaW5nIHJlcG9ydGVkCi0JICogQHJldHVybiBhIENvcmVFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB7Ci0JCXJldHVybiBuZXdDb3JlRXhjZXB0aW9uKHMsIElTdGF0dXMuT0ssIGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBDb3JlRXhjZXB0aW9uIGZyb20gdHdvIG90aGVyIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcyBvdmVyYWxsIGV4Y2VwdGlvbiBzdHJpbmcKLQkgKiBAcGFyYW0gczEgc3RyaW5nIGZvciBmaXJzdCBkZXRhaWxlZCBleGNlcHRpb24KLQkgKiBAcGFyYW0gczIgc3RyaW5nIGZvciBzZWNvbmQgZGV0YWlsZWQgZXhjZXB0aW9uCi0JICogQHBhcmFtIGUxIGZpcnN0IGRldGFpbGVkIGV4Y2VwdGlvbgotCSAqIEBwYXJhbSBlMiBzZWNvbmQgZGV0YWlsZWQgZXhjZXB0aW9uCi0JICogQHJldHVybiBhIENvcmVFeGNlcHRpb24gd2l0aCBtdWx0aS1zdGF0dXMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFN0cmluZyBzMSwgU3RyaW5nIHMyLCBDb3JlRXhjZXB0aW9uIGUxLCBDb3JlRXhjZXB0aW9uIGUyKSB7Ci0JCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCWlmIChzID09IG51bGwpCi0JCQlzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJU3RhdHVzIGNoaWxkU3RhdHVzMSA9ICgoQ29yZUV4Y2VwdGlvbikgZTEpLmdldFN0YXR1cygpOwotCQlJU3RhdHVzIGNoaWxkU3RhdHVzMiA9ICgoQ29yZUV4Y2VwdGlvbikgZTIpLmdldFN0YXR1cygpOwotCQlpbnQgY29kZSA9IChjaGlsZFN0YXR1czEuZ2V0Q29kZSgpID09IGNoaWxkU3RhdHVzMi5nZXRDb2RlKCkpID8gY2hpbGRTdGF0dXMxLmdldENvZGUoKSA6IElTdGF0dXMuT0s7Ci0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGlkLCBjb2RlLCBzLCBudWxsKTsKLQotCQltdWx0aS5hZGQoY2hpbGRTdGF0dXMxKTsKLQkJbXVsdGkuYWRkQWxsKGNoaWxkU3RhdHVzMSk7Ci0JCW11bHRpLmFkZChjaGlsZFN0YXR1czIpOwotCQltdWx0aS5hZGRBbGwoY2hpbGRTdGF0dXMyKTsKLQotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obXVsdGkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhIERhdGUgYmFzZWQgb24gdGhlIGRlZmF1bHQgTG9jYWxlIAotCSAqIElmIHRlaCBEYXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+IHJldHVybnMgYW4gZW1wdHkgU3RyaW5nCi0JICogCi0JICogQHBhcmFtIGRhdGUgdGhlIERhdGUgdG8gZm9ybWF0Ci0JICogQHJldHVybiB0aGUgZm9ybWF0dGVkIERhdGUgYXMgYSBTdHJpbmcKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0KERhdGUgZGF0ZSkgewotCQlpZiAoZGF0ZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkYXRlRm9ybWF0LmZvcm1hdChkYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtIHNodXRkb3duIHByb2Nlc3NpbmcgZm9yIHRlbXBvcmFyeSBmaWxlIGhhbmRsaW5nLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHBsYXRmb3JtIGlzIHNodXR0aW5nIGRvd24uCi0JICogSXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGNhbGxlZCBhdCBhbnkgb3RoZXIgdGltZSB1bmRlcgotCSAqIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiBBIHNpZGUtZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyBtZXRob2QKLQkgKiBpcyB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBtYW5hZ2VkIAotCSAqIGJ5IHRoaXMgY2xhc3MgYXJlIGRlbGV0ZWQuIAotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChkaXJSb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJRmlsZSB0ZW1wID0gbmV3IEZpbGUoZGlyUm9vdCk7IC8vIHRlbXAgZGlyZWN0b3J5IHJvb3QgZm9yIHRoaXMgcnVuCi0JCWNsZWFudXBUZW1wKHRlbXApOwotCQl0ZW1wLmRlbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2xlYW51cFRlbXAoRmlsZSByb290KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IHJvb3QubGlzdEZpbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBmaWxlcyAhPSBudWxsICYmIGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpCi0JCQkJY2xlYW51cFRlbXAoZmlsZXNbaV0pOwotCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVBhdGgoRmlsZSBwYXRoLCBib29sZWFuIGlzRmlsZSkgewotCQkvLyBpZiB3ZSBhcmUgZXhwZWN0aW5nIGEgZmlsZSBiYWNrIG9mZiAxIHBhdGggZWxlbWVudAotCQlpZiAoaXNGaWxlKSB7Ci0JCQlpZiAocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKS5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsKLQkJCQkvLyBtYWtlIHN1cmUgdGhpcyBpcyBhIGZpbGUKLQkJCQlwYXRoID0gcGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCQkJaXNGaWxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBhbHJlYWR5IGV4aXN0cyAuLi4ganVzdCByZXR1cm4KLQkJaWYgKHBhdGguZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZG9lcyBub3QgZXhpc3QgLi4uIGVuc3VyZSBwYXJlbnQgZXhpc3RzCi0JCUZpbGUgcGFyZW50ID0gcGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JCXZlcmlmeVBhdGgocGFyZW50LCBmYWxzZSk7Ci0KLQkJLy8gZW5zdXJlIGRpcmVjdG9yaWVzIGFyZSBtYWRlLiBNYXJrIGZpbGVzIG9yIGRpcmVjdG9yaWVzIGZvciBkZWxldGlvbgotCQlpZiAoIWlzRmlsZSkKLQkJCXBhdGgubWtkaXIoKTsKLQkJcGF0aC5kZWxldGVPbkV4aXQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1ZlcmlmaWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1ZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTQ0NjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9WZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZTsKLSAKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHZlcmlmaWVyLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKiA8L3A+IAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVZlcmlmaWVyCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWZXJpZmllciBpbXBsZW1lbnRzIElWZXJpZmllciB7Ci0JCi0JcHJpdmF0ZSBJVmVyaWZpZXIgcGFyZW50OwotCi0JLyoqCi0JICogQHNlZSBJVmVyaWZpZXIjdmVyaWZ5KElGZWF0dXJlLCBDb250ZW50UmVmZXJlbmNlLCBib29sZWFuLCBJbnN0YWxsTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZnkoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUNvbnRlbnRSZWZlcmVuY2UgcmVmZXJlbmNlLAotCQlib29sZWFuIGlzRmVhdHVyZVZlcmlmaWNhdGlvbiwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gOwotCi0JLyoqCi0JICogQHNlZSBJVmVyaWZpZXIjdmVyaWZ5KElGZWF0dXJlLCBDb250ZW50UmVmZXJlbmNlLCBib29sZWFuLCBJbnN0YWxsTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSVZlcmlmaWVyIHBhcmVudFZlcmlmaWVyKXsKLQkJaWYgKHRoaXMucGFyZW50PT1udWxsKXsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50VmVyaWZpZXI7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFyZW50IHZlcmlmaWVyCi0JICogCi0JICogQHJldHVybiB0aGUgcGFyZW50IHZlcmlmaWVyCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJVmVyaWZpZXIgZ2V0UGFyZW50KCl7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL1ZlcnNpb25lZElkZW50aWZpZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJkNzEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvVmVyc2lvbmVkSWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBWZXJzaW9uZWQgSWRlbnRpZmllci4gVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgY29tYmluaW5nIGFuIGlkZW50aWZpY2F0aW9uDQotICogc3RyaW5nIHdpdGggYSB2ZXJzaW9uLg0KLSAqIDxwPg0KLSAqIENsaWVudHMgbWF5IGluc3RhbnRpYXRlOyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLg0KLSAqIDwvcD4gDQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBWZXJzaW9uZWRJZGVudGlmaWVyIHsNCi0JcHJpdmF0ZSBTdHJpbmcgaWQ7DQotCXByaXZhdGUgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICJfIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0IGEgdmVyc2lvbmVkIGlkZW50aWZpZXIgZnJvbSBhbiBpZGVudGlmaWVyIGFuZCBhIHN0cmluZw0KLQkgKiByZXByZXNlbnRhdGlvbiBvZiBhIHZlcnNpb24NCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyI3RvU3RyaW5nKCkNCi0JICogQHBhcmFtIGlkIGlkZW50aWZpZXIgc3RyaW5nDQotCSAqIEBwYXJhbSB2ZXJzaW9uTmFtZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdmVyc2lvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllcihTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uTmFtZSkgew0KLQkJaWYgKGlkID09IG51bGwJfHwgKGlkID0gaWQudHJpbSgpKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigNCi0JCQkJUG9saWN5LmJpbmQoIlZlcnNpb25lZElkZW50aWZpZXIuSWRPclZlcnNpb25OdWxsIiwgaWQsIHZlcnNpb25OYW1lKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMuaWQgPSBpZDsNCi0JCS8vIDE1NzA3DQotCQlpZiAodmVyc2lvbk5hbWUgIT0gbnVsbCl7DQotCQkJLy8gaWYgKFBsdWdpblZlcnNpb25JZGVudGlmaWVyLnZhbGlkYXRlVmVyc2lvbklkZW50aWZpZXIodmVyc2lvbk5hbWUpLmlzT2soKSkNCi0JCQl0cnkgew0KLQkJCQl0aGlzLnZlcnNpb24gPSBuZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIodmVyc2lvbk5hbWUpOw0KLQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSl7DQotCQkJCVVwZGF0ZUNvcmUud2FybigiSW52YWxpZCBWZXJzaW9uOiIrdmVyc2lvbk5hbWUsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotCQlpZiAodGhpcy52ZXJzaW9uPT1udWxsKQ0KLQkJCXZlcnNpb24gPSBuZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIoMCwgMCwgMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXINCi0JICogDQotCSAqIEByZXR1cm4gaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldElkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gaWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHZlcnNpb24NCi0JICogDQotCSAqIEByZXR1cm4gdmVyc2lvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZ2V0VmVyc2lvbigpIHsNCi0JCXJldHVybiB2ZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZXJzaW9uZWQgaWRlbnRpZmllci4NCi0JICogDQotCSAqIEByZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHZlcnNpb25lZCBpZGVudGlmaWVyLiBUaGUgcmVzdWx0aW5nIA0KLQkgKiBzdHJpbmcgaXMgPGlkPl88dmVyc2lvbj4sIHdoZXJlIDxpZD4gaXMgdGhlIGlkZW50aWZpZXIgYW5kIA0KLQkgKiA8dmVyc2lvbj4gaXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVyc2lvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJcmV0dXJuIGlkLmVxdWFscygiIikgPyAiIiA6IGlkICsgU0VQQVJBVE9SICsgdmVyc2lvbi50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29tcGFyZXMgdHdvIHZlcnNpb25lZCBpZGVudGlmaWVycyBmb3IgZXF1YWxpdHkNCi0JICogDQotCSAqIEBwYXJhbSBvYmogb3RoZXIgdmVyc2lvbmVkIGlkZW50aWZpZXIgdG8gY29tcGFyZSB0bw0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwsIA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBWZXJzaW9uZWRJZGVudGlmaWVyKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IChWZXJzaW9uZWRJZGVudGlmaWVyKSBvYmo7DQotCQlpZiAoIXRoaXMuaWQuZXF1YWxzKHZpZC5pZCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJcmV0dXJuIHRoaXMudmVyc2lvbi5lcXVhbHModmlkLnZlcnNpb24pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgY29tcHV0ZWQgaGFzaGNvZGUgZm9yIHRoZSB2ZXJzaW9uZWQgaWRlbnRpZmllci4NCi0JICogDQotCSAqIEByZXR1cm4gaGFzaCBjb2RlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQotCQlyZXR1cm4gdG9TdHJpbmcoKS5oYXNoQ29kZSgpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQXJjaGl2ZVJlZmVyZW5jZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0FyY2hpdmVSZWZlcmVuY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ5YWE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQXJjaGl2ZVJlZmVyZW5jZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotLyoqDQotICogU2l0ZSBhcmNoaXZlIG1vZGVsIG9iamVjdC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkFyY2hpdmVSZWZlcmVuY2UNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEFyY2hpdmVSZWZlcmVuY2VNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsNCi0JcHJpdmF0ZSBTdHJpbmcgdXJsU3RyaW5nOw0KLQlwcml2YXRlIFVSTCB1cmw7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgdW5pbml0aWFsaXplZCBtb2RlbCBvYmplY3QuDQotCSAqICANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBzaXRlIGFyY2hpdmUgInN5bWJvbGljIiBwYXRoDQotCSAqDQotCSAqIEByZXR1cm4gcGF0aCwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgew0KLQkJcmV0dXJuIHBhdGg7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIGFyY2hpdmUuDQotCSAqDQotCSAqIEByZXR1cm4gdXJsIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRVUkxTdHJpbmcoKSB7DQotCQlyZXR1cm4gdXJsU3RyaW5nOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkwgZm9yIHRoZSBhcmNoaXZlLg0KLQkgKiANCi0JICogQHJldHVybiB1cmwsIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJcmV0dXJuIHVybDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBhcmNoaXZlICJzeW1ib2xpYyIgcGF0aC4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIHBhdGggYXJjaGl2ZSAic3ltYm9saWMiIHBhdGguDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnBhdGggPSBwYXRoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB1bnJlc29sdmVkIFVSTCBzdHJpbmcgZm9yIHRoZSBhcmNoaXZlLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHVucmVzb2x2ZWQgdXJsIHN0cmluZy4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VVJMU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnVybFN0cmluZyA9IHVybFN0cmluZzsNCi0JCXRoaXMudXJsID0gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0Lg0KLQkgKiBBbnkgVVJMIHN0cmluZ3MgaW4gdGhlIG1vZGVsIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgDQotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlDQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIA0KLQkgKiByZXNvdXJjZSBidW5kbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gYmFzZSBVUkwNCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMDQotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsVVJMIGJ1bmRsZVVSTCkNCi0JCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJLy8gcmVzb2x2ZSBsb2NhbCBlbGVtZW50cw0KLQkJdXJsID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIHVybFN0cmluZyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9DYXRlZ29yeU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0NhdGVnb3J5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM2ZmRlZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0NhdGVnb3J5TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogRmVhdHVyZSBjYXRlZ29yeSBkZWZpbml0aW9uIG1vZGVsIG9iamVjdC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCAKLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIAotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4KLSAqIDwvcD4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNhdGVnb3J5Ci0gKiBAc2luY2UgMi4wCi0gKi8KLQotcHVibGljIGNsYXNzIENhdGVnb3J5TW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIGxvY2FsaXplZExhYmVsOwotCXByaXZhdGUgVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIHN0YXRpYyBDb21wYXJhdG9yIGNvbXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgbmFtZSBvZiB0aGUgY2F0ZWdvcnkuCi0JICogCi0JICogQHJldHVybiBjYXRlZ29yeSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBjYXRlZ29yeS4gSWYgdGhlIG1vZGVsCi0JICogb2JqZWN0IGhhcyBiZWVuIHJlc29sdmVkLCB0aGUgbGFiZWwgaXMgbG9jYWxpemVkLgotCSAqIAotCSAqIEByZXR1cm4gZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlpZiAobG9jYWxpemVkTGFiZWwgIT0gbnVsbCkKLQkJCXJldHVybiBsb2NhbGl6ZWRMYWJlbDsKLQkJZWxzZQotCQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgY2F0ZWdvcnkuCi0JICogCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbE5vbkxvY2FsaXplZCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBkZXRhaWxlZCBjYXRlZ29yeSBkZXNjcmlwdGlvbgotCSAqIAotCSAqIEByZXR1cm4gY2F0ZWdvcnkgZGVzY3JpcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgVVJMRW50cnlNb2RlbCBnZXREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2F0ZWdvcnkgZGlzcGxheWFibGUgbGFiZWwuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwgZGlzcGxheWFibGUgbGFiZWwsIG9yIHJlc291cmNlIGtleQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCQl0aGlzLmxvY2FsaXplZExhYmVsID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBuYW1lLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUgY2F0ZWdvcnkgbmFtZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY2F0ZWdvcnkgZGVzY3JpcHRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gY2F0ZWdvcnkgZGVzY3JpcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25Nb2RlbChVUkxFbnRyeU1vZGVsIGRlc2NyaXB0aW9uKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBNYXJrcyB0aGUgbW9kZWwgb2JqZWN0IGFzIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgbWFya1JlYWRPbmx5KCkgewotCQlzdXBlci5tYXJrUmVhZE9ubHkoKTsKLQkJbWFya1JlZmVyZW5jZVJlYWRPbmx5KGdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0LgotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIAotCSAqIHJlc291cmNlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZSBVUkwKLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwKLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLFVSTCBidW5kbGVVUkwpCi0JCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCWxvY2FsaXplZExhYmVsID0gcmVzb2x2ZU5MU3RyaW5nKGJ1bmRsZVVSTCwgbGFiZWwpOwotCi0JCS8vIGRlbGVnYXRlIHRvIHJlZmVyZW5jZXMKLQkJcmVzb2x2ZVJlZmVyZW5jZShnZXREZXNjcmlwdGlvbk1vZGVsKCksYmFzZSwgYnVuZGxlVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wYXJlIHR3byBjYXRlZ29yeSBtb2RlbHMgZm9yIGVxdWFsaXR5LgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBDYXRlZ29yeU1vZGVsKSB7Ci0JCQlDYXRlZ29yeU1vZGVsIG90aGVyQ2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCkgb2JqOwotCQkJcmVzdWx0ID0gZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2Uob3RoZXJDYXRlZ29yeS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSBoYXNoIGNvZGUgZm9yIGNhdGVnb3J5IG1vZGVsLgotCSAqIAotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlKCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKS5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21wYXJhdG9yIGZvciBjYXRlZ29yeSBtb2RlbHMuCi0JICogCi0JICogQHJldHVybiBjb21wYXJhdG9yCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcGFyYXRvciBnZXRDb21wYXJhdG9yKCkgewotCQlpZiAoY29tcCA9PSBudWxsKSB7Ci0JCQljb21wID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJLyoKLQkJCQkgKiBAc2VlIENvbXBhcmF0b3IjY29tcGFyZShPYmplY3QsT2JqZWN0KQotCQkJCSAqIFJldHVybnMgMCBpZiB2ZXJzaW9ucyBhcmUgZXF1YWwuCi0JCQkJICogUmV0dXJucyAtMSBpZiBvYmplY3QxIGlzIGFmdGVyIHRoYW4gb2JqZWN0Mi4KLQkJCQkgKiBSZXR1cm5zICsxIGlmIG9iamVjdDEgaXMgYmVmb3JlIHRoYW4gb2JqZWN0Mi4KLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQotCQkJCQlDYXRlZ29yeU1vZGVsIGNhdDEgPSAoQ2F0ZWdvcnlNb2RlbCkgbzE7Ci0JCQkJCUNhdGVnb3J5TW9kZWwgY2F0MiA9IChDYXRlZ29yeU1vZGVsKSBvMjsKLQotCQkJCQlpZiAoY2F0MS5lcXVhbHMoY2F0MikpCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJcmV0dXJuIGNhdDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhjYXQyLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gY29tcDsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Nb2RlbE9iamVjdCNnZXRQcm9wZXJ0eU5hbWUoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlyZXR1cm4gU2l0ZS5TSVRFX0ZJTEU7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQ29udGVudEVudHJ5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvQ29udGVudEVudHJ5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMDk2MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0NvbnRlbnRFbnRyeU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotDQotLyoqDQotICogQ29udGVudCBlbnRyeSBtb2RlbCBvYmplY3QuDQotICogVGhpcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gZW50cnkgbW9kZWxzLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIA0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5QbHVnaW5FbnRyeU1vZGVsDQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5Ob25QbHVnaW5FbnRyeU1vZGVsDQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZW50RW50cnlNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsNCi0NCi0JLyoqDQotCSAqIEFuIGluZGljYXRpb24gdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTktOT1dOX1NJWkUgPSAtMTsNCi0NCi0JcHJpdmF0ZSBsb25nIGRvd25sb2FkU2l6ZSA9IFVOS05PV05fU0laRTsNCi0JcHJpdmF0ZSBsb25nIGluc3RhbGxTaXplID0gVU5LTk9XTl9TSVpFOw0KLQlwcml2YXRlIFN0cmluZyBvczsNCi0JcHJpdmF0ZSBTdHJpbmcgd3M7DQotCXByaXZhdGUgU3RyaW5nIG5sOw0KLQlwcml2YXRlIFN0cmluZyBhcmNoOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIHVuaW5pdGlhbGl6ZWQgY29udGVudCBlbnRyeSBtb2RlbCBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgQ29udGVudEVudHJ5TW9kZWwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkb3dubG9hZCBzaXplIG9mIHRoZSBlbnRyeSwgaWYgaXQgY2FuIGJlIGRldGVybWluZWQuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGRvd25sb2FkIHNpemUgb2YgdGhlIGVudHJ5IGluIEtpbG9CeXRlcywgb3IgYW4gaW5kaWNhdGlvbiANCi0JICogdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZSgpIHsNCi0JCXJldHVybiBkb3dubG9hZFNpemU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgc2l6ZSBvZiB0aGUgZW50cnksIGlmIGl0IGNhbiBiZSBkZXRlcm1pbmVkLg0KLQkgKiANCi0JICogQHJldHVybiBpbnN0YWxsIHNpemUgb2YgdGhlIGVudHJ5IGluIEtpbG9CeXRlcywgb3IgYW4gaW5kaWNhdGlvbiANCi0JICogdGhlIHNpemUgY291bGQgbm90IGJlIGRldGVybWluZWQNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0SW5zdGFsbFNpemUoKSB7DQotCQlyZXR1cm4gaW5zdGFsbFNpemU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCkgew0KLQkJcmV0dXJuIG9zOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIG9wdGlvbmFsIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICoNCi0JICogQHJldHVybiB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0NCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsNCi0JCXJldHVybiB3czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24uIA0KLQkgKiANCi0JICogQHJldHVybiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7DQotCQlyZXR1cm4gYXJjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBvcHRpb25hbCBsb2NhbGUgc3BlY2lmaWNhdGlvbi4NCi0JICoNCi0JICogQHJldHVybiB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROTCgpIHsNCi0JCXJldHVybiBubDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZG93bmxvYWQgc2l6ZSBvZiB0aGUgZW50cnkuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gZG93bmxvYWRTaXplIGRvd25sb2FkIHNpemUgb2YgdGhlIGVudHJ5IGluIEtpbG9CeXRlcw0KLQkgKiBAc2luY2UgMi4wIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RG93bmxvYWRTaXplKGxvbmcgZG93bmxvYWRTaXplKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKGRvd25sb2FkU2l6ZSA8IDApDQotCQkJdGhpcy5kb3dubG9hZFNpemUgPSBVTktOT1dOX1NJWkU7DQotCQllbHNlDQotCQkJdGhpcy5kb3dubG9hZFNpemUgPSBkb3dubG9hZFNpemU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGluc3RhbGwgc2l6ZSBvZiB0aGUgZW50cnkuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW5zdGFsbFNpemUgaW5zdGFsbCBzaXplIG9mIHRoZSBlbnRyeSBpbiBLaWxvQnl0ZXMNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbFNpemUobG9uZyBpbnN0YWxsU2l6ZSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmIChpbnN0YWxsU2l6ZSA8IDApDQotCQkJdGhpcy5pbnN0YWxsU2l6ZSA9IFVOS05PV05fU0laRTsNCi0JCWVsc2UNCi0JCQl0aGlzLmluc3RhbGxTaXplID0gaW5zdGFsbFNpemU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBvcyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBPUyBpZGVudGlmaWVycyBhcyBkZWZpbmVkIGJ5IEVjbGlwc2UuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMub3MgPSBvczsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gd3MgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgV1MgaWRlbnRpZmllcnMgYXMgZGVmaW5lZCBieSBFY2xpcHNlLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRXUyhTdHJpbmcgd3MpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLndzID0gd3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIGFyY2ggY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaCBpZGVudGlmaWVycyBhcyBkZWZpbmVkIGJ5IEVjbGlwc2UuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFyY2goU3RyaW5nIGFyY2gpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmFyY2ggPSBhcmNoOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIG5sIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGxvY2FsZSBpZGVudGlmaWVycy4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5ubCA9IG5sOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRGVmYXVsdEZlYXR1cmVQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRGVmYXVsdEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNhYzY0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0RlZmF1bHRGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgZmVhdHVyZSBwYXJzZXIuDQotICogUGFyc2VzIHRoZSBmZWF0dXJlIG1hbmlmZXN0IGZpbGUgYXMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uIERlZmVycw0KLSAqIHRvIGEgbW9kZWwgZmFjdG9yeSB0byBjcmVhdGUgdGhlIGFjdHVhbCBjb25jcmV0ZSBtb2RlbCBvYmplY3RzLiBUaGUgDQotICogdXBkYXRlIGZyYW1ld29yayBzdXBwbGllcyB0d28gZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnM6DQotICogPHVsPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiA8bGk+QHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWxGYWN0b3J5DQotICogPGxpPkBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZUZlYXR1cmVGYWN0b3J5DQotICogPC91bD4NCi0gKiANCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgew0KLQ0KLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7DQotCXByaXZhdGUgRmVhdHVyZU1vZGVsRmFjdG9yeSBmYWN0b3J5Ow0KLQlwcml2YXRlIE11bHRpU3RhdHVzIHN0YXR1czsNCi0NCi0JcHJpdmF0ZSBib29sZWFuIFVSTF9BTFJFQURZX1NFRU4gPSBmYWxzZTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lHTk9SRURfRUxFTUVOVCA9IC0xOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5JVElBTCA9IDA7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JTkNMVURFUyA9IDE7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GRUFUVVJFID0gMjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0hBTkRMRVIgPSAzOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfREVTQ1JJUFRJT04gPSA0Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQ09QWVJJR0hUID0gNTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0xJQ0VOU0UgPSA2Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVVJMID0gNzsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1VQREFURSA9IDg7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ESVNDT1ZFUlkgPSA5Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUkVRVUlSRVMgPSAxMDsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lNUE9SVCA9IDExOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExVR0lOID0gMTI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9EQVRBID0gMTM7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERVMgPSAiaW5jbHVkZXMiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSID0gImluc3RhbGwtaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWVJJR0hUID0gImNvcHlyaWdodCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0UgPSAibGljZW5zZSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEUgPSAidXBkYXRlIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ09WRVJZID0gImRpc2NvdmVyeSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVJUkVTID0gInJlcXVpcmVzIjsgLy8kTk9OLU5MUy0xJA0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUID0gImltcG9ydCI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBID0gImRhdGEiOyAvLyROT04tTkxTLTEkDQotCS8vIEN1cnJlbnQgU3RhdGUgSW5mb3JtYXRpb24NCi0JU3RhY2sgc3RhdGVTdGFjayA9IG5ldyBTdGFjaygpOw0KLQ0KLQkvLyBDdXJyZW50IG9iamVjdCBzdGFjayAodXNlZCB0byBob2xkIHRoZSBjdXJyZW50IG9iamVjdCB3ZSBhcmUNCi0JLy8gcG9wdWxhdGluZyBpbiB0aGlzIHBsdWdpbiBkZXNjcmlwdG9yDQotCVN0YWNrIG9iamVjdFN0YWNrID0gbmV3IFN0YWNrKCk7DQotDQotCXByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZTsNCi0JDQotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9DQotCQlTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgZmVhdHVyZSBwYXJzZXIuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKSB7DQotCQlzdXBlcigpOw0KLQkJdHJ5IHsNCi0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsNCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUubG9nKGUpOw0KLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLmxvZyhlKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBpbml0KEZlYXR1cmVNb2RlbEZhY3RvcnkgZmFjdG9yeSkgew0KLQkJLy8gUEVSRjogc2VwYXJhdGUgaW5zdGFuY2UgY3JlYXRpb24gZnJvbSBwYXJzaW5nDQotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5Ow0KLQkJc3RhdGVTdGFjayA9IG5ldyBTdGFjaygpOw0KLQkJb2JqZWN0U3RhY2sgPSBuZXcgU3RhY2soKTsNCi0JCXN0YXR1cyA9IG51bGw7DQotCQlVUkxfQUxSRUFEWV9TRUVOID0gZmFsc2U7DQotCQkvL3BhcnNlci5yZXNldCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBpbnB1dCBzdGVhbSBhbmQgY29uc3RydWN0cyBhIGZlYXR1cmUgbW9kZWwuDQotCSAqIFRoZSBpbnB1dCBzdHJlYW0gaXMgbm90IGNsb3NlZCBhcyBwYXJ0IG9mIHRoaXMgb3BlcmF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQ0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbW9kZWwNCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQotCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU5JVElBTCkpOw0KLQkJY3VycmVudFN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsNCi0JCWlmIChvYmplY3RTdGFjay5pc0VtcHR5KCkpDQotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuTm9GZWF0dXJlVGFnIikpOyAvLyROT04tTkxTLTEkDQotCQllbHNlIHsNCi0JCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCXJldHVybiAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlTdHJpbmcgc3RhY2sgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlJdGVyYXRvciBpdGVyID0gb2JqZWN0U3RhY2suaXRlcmF0b3IoKTsNCi0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotCQkJCQlzdGFjayA9ICJcclxuIiArIGl0ZXIubmV4dCgpLnRvU3RyaW5nKCkgKyBzdGFjazsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLldyb25nUGFyc2luZ1N0YWNrIiwgc3RhY2spKTsvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFsbCBzdGF0dXMgb2JqZWN0cyBhY2N1bXVsYXRlZCBieSB0aGUgcGFyc2VyLg0KLQkgKg0KLQkgKiBAcmV0dXJuIG11bHRpLXN0YXR1cyBjb250YWluaW5nIGFjY3VtdWxhdGVkIHN0YXR1cywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBNdWx0aVN0YXR1cyBnZXRTdGF0dXMoKSB7DQotCQlyZXR1cm4gc3RhdHVzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgc3RhcnQgb2YgZWxlbWVudCB0YWdzDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiU3RhcnQgRWxlbWVudDogdXJpOiIgKyB1cmkgKyAiIGxvY2FsIE5hbWU6IiArIGxvY2FsTmFtZSArICIgcU5hbWU6IiArIHFOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0NCi0JCXN3aXRjaCAoY3VycmVudFN0YXRlKSB7DQotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOg0KLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBsb2NhbE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0lOSVRJQUwgOg0KLQkJCQloYW5kbGVJbml0aWFsU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoNCi0JCQljYXNlIFNUQVRFX0lOQ0xVREVTIDoNCi0JCQljYXNlIFNUQVRFX0hBTkRMRVIgOg0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT04gOg0KLQkJCWNhc2UgU1RBVEVfQ09QWVJJR0hUIDoNCi0JCQljYXNlIFNUQVRFX0xJQ0VOU0UgOg0KLQkJCQloYW5kbGVGZWF0dXJlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9VUkwgOg0KLQkJCQlpZiAoVVJMX0FMUkVBRFlfU0VFTikNCi0JCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlRvb01hbnlVUkx0YWciKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJaGFuZGxlVVJMU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9VUERBVEUgOg0KLQkJCWNhc2UgU1RBVEVfRElTQ09WRVJZIDoNCi0JCQkJaGFuZGxlVXBkYXRlRGlzY292ZXJ5U3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9SRVFVSVJFUyA6DQotCQkJCWhhbmRsZVJlcXVpcmVzU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9JTVBPUlQgOg0KLQkJCQloYW5kbGVJbXBvcnRTdGF0ZShsb2NhbE5hbWUsYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQkJCQkNCi0JCQljYXNlIFNUQVRFX1BMVUdJTiA6DQotCQkJY2FzZSBTVEFURV9EQVRBIDoNCi0JCQkJaGFuZGxlRmVhdHVyZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWRlZmF1bHQgOg0KLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93blN0YXJ0U3RhdGUiLCBJbnRlZ2VyLnRvU3RyaW5nKGN1cnJlbnRTdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQlicmVhazsNCi0JCX0NCi0NCi0JCWludCBuZXdTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQlpZiAobmV3U3RhdGUgIT0gU1RBVEVfSUdOT1JFRF9FTEVNRU5UKQ0KLQkJCWN1cnJlbnRTdGF0ZSA9IG5ld1N0YXRlOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgZW5kIG9mIGVsZW1lbnQgdGFncw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHsNCi0NCi0JCS8vIHZhcmlhYmxlcyB1c2VkDQotCQlVUkxFbnRyeU1vZGVsIGluZm8gPSBudWxsOw0KLQkJRmVhdHVyZU1vZGVsIGZlYXR1cmVNb2RlbCA9IG51bGw7DQotCQlTdHJpbmcgdGV4dCA9IG51bGw7DQotCQlpbnQgaW5uZXJTdGF0ZSA9IDA7DQotDQotCQlpbnQgc3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOw0KLQkJc3dpdGNoIChzdGF0ZSkgew0KLQkJCWNhc2UgU1RBVEVfSUdOT1JFRF9FTEVNRU5UIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoNCi0JCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlIikpOyAvLyROT04tTkxTLTEkDQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfRkVBVFVSRSA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJCUZlYXR1cmVNb2RlbCBmZWF0dXJlID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJZmVhdHVyZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuc2V0QW5ub3RhdGlvbih0ZXh0KTsNCi0JCQkJfQ0KLQkJCQkvL2RvIG5vdCBwb3ANCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9JTkNMVURFUyA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgew0KLQkJCQkJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwgaW5jbHVkZWRGZWF0dXJlUmVmTW9kZWwgPSAoKEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKSk7DQotCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCWZlYXR1cmVNb2RlbC5hZGRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChpbmNsdWRlZEZlYXR1cmVSZWZNb2RlbCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9IQU5ETEVSIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCkgew0KLQkJCQkJSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsIGhhbmRsZXJNb2RlbCA9IChJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRJbnN0YWxsSGFuZGxlck1vZGVsKCkgIT0gbnVsbCkNCi0JCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldCIsIGdldFN0YXRlKHN0YXRlKSkpOyAvLyROT04tTkxTLTEkDQotCQkJCQllbHNlDQotCQkJCQkJZmVhdHVyZU1vZGVsLnNldEluc3RhbGxIYW5kbGVyTW9kZWwoaGFuZGxlck1vZGVsKTsNCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0NCi0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKSArIHRleHQ7DQotCQkJCX0NCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFVSTEVudHJ5TW9kZWwpIHsNCi0JCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQl0ZXh0ID0gY2xlYW51cFRleHQodGV4dCk7DQotCQkJCQlpZiAodGV4dCAhPSBudWxsKQ0KLQkJCQkJCWluZm8uc2V0QW5ub3RhdGlvbih0ZXh0KTsNCi0NCi0JCQkJCWlubmVyU3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOw0KLQkJCQkJc3dpdGNoIChpbm5lclN0YXRlKSB7DQotCQkJCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoNCi0JCQkJCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCQkJaWYgKGZlYXR1cmVNb2RlbC5nZXREZXNjcmlwdGlvbk1vZGVsKCkgIT0gbnVsbCkNCi0JCQkJCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldCIsIGdldFN0YXRlKHN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCQkJCQllbHNlDQotCQkJCQkJCQkJZmVhdHVyZU1vZGVsLnNldERlc2NyaXB0aW9uTW9kZWwoaW5mbyk7DQotCQkJCQkJCX0NCi0JCQkJCQkJYnJlYWs7DQotDQotCQkJCQkJZGVmYXVsdCA6DQotCQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlN0YXRlSW5jbHVkZVdyb25nRWxlbWVudCIsIGdldFN0YXRlKGlubmVyU3RhdGUpLCBnZXRTdGF0ZShzdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQlicmVhazsNCi0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0NPUFlSSUdIVCA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQl3aGlsZSAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotCQkJCQl0ZXh0ID0gKFN0cmluZykgb2JqZWN0U3RhY2sucG9wKCkgKyB0ZXh0Ow0KLQkJCQl9DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBVUkxFbnRyeU1vZGVsKSB7DQotCQkJCQlpbmZvID0gKFVSTEVudHJ5TW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJdGV4dCA9IGNsZWFudXBUZXh0KHRleHQpOw0KLQkJCQkJaWYgKHRleHQgIT0gbnVsbCkgew0KLQkJCQkJCWluZm8uc2V0QW5ub3RhdGlvbih0ZXh0KTsNCi0JCQkJCX0NCi0NCi0JCQkJCWlubmVyU3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOw0KLQkJCQkJc3dpdGNoIChpbm5lclN0YXRlKSB7DQotCQkJCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoNCi0JCQkJCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCQkJaWYgKGZlYXR1cmVNb2RlbC5nZXRDb3B5cmlnaHRNb2RlbCgpICE9IG51bGwpDQotCQkJCQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuRWxlbWVudEFscmVhZHlTZXQiLCBnZXRTdGF0ZShzdGF0ZSkpKTsvLyROT04tTkxTLTEkDQotCQkJCQkJCQllbHNlDQotCQkJCQkJCQkJZmVhdHVyZU1vZGVsLnNldENvcHlyaWdodE1vZGVsKGluZm8pOw0KLQkJCQkJCQl9DQotCQkJCQkJCWJyZWFrOw0KLQ0KLQkJCQkJCWRlZmF1bHQgOg0KLQkJCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5TdGF0ZUluY2x1ZGVXcm9uZ0VsZW1lbnQiLCBnZXRTdGF0ZShpbm5lclN0YXRlKSwgZ2V0U3RhdGUoc3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJYnJlYWs7DQotDQotCQkJCQl9DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9MSUNFTlNFIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0NCi0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkDQotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKSArIHRleHQ7DQotCQkJCX0NCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFVSTEVudHJ5TW9kZWwpIHsNCi0JCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQl0ZXh0ID0gY2xlYW51cFRleHQodGV4dCk7DQotCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7DQotCQkJCQkJaW5mby5zZXRBbm5vdGF0aW9uKHRleHQpOw0KLQkJCQkJfQ0KLQ0KLQkJCQkJaW5uZXJTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQkJCQlzd2l0Y2ggKGlubmVyU3RhdGUpIHsNCi0JCQkJCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQkJCQlpZiAoZmVhdHVyZU1vZGVsLmdldExpY2Vuc2VNb2RlbCgpICE9IG51bGwpDQotCQkJCQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuRWxlbWVudEFscmVhZHlTZXQiLCBnZXRTdGF0ZShzdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJZWxzZQ0KLQkJCQkJCQkJCWZlYXR1cmVNb2RlbC5zZXRMaWNlbnNlTW9kZWwoaW5mbyk7DQotCQkJCQkJCX0NCi0JCQkJCQkJYnJlYWs7DQotDQotCQkJCQkJZGVmYXVsdCA6DQotCQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlN0YXRlSW5jbHVkZVdyb25nRWxlbWVudCIsIGdldFN0YXRlKGlubmVyU3RhdGUpLCBnZXRTdGF0ZShzdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQlicmVhazsNCi0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1VSTCA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCVVSTF9BTFJFQURZX1NFRU4gPSB0cnVlOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1VQREFURSA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBVUkxFbnRyeU1vZGVsKSB7DQotCQkJCQlpbmZvID0gKFVSTEVudHJ5TW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJCWZlYXR1cmVNb2RlbCA9IChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCQlpZiAoZmVhdHVyZU1vZGVsLmdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCkgIT0gbnVsbCkgew0KLQkJCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldCIsIGdldFN0YXRlKHN0YXRlKSkpOwkvLyROT04tTkxTLTEkDQotCQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJZmVhdHVyZU1vZGVsLnNldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKGluZm8pOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0RJU0NPVkVSWSA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBVUkxFbnRyeU1vZGVsKSB7DQotCQkJCQlpbmZvID0gKFVSTEVudHJ5TW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJCWZlYXR1cmVNb2RlbCA9IChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCQlmZWF0dXJlTW9kZWwuYWRkRGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWwoaW5mbyk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9SRVFVSVJFUyA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBGZWF0dXJlTW9kZWwpIHsNCi0JCQkJCWZlYXR1cmVNb2RlbCA9IChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCUltcG9ydE1vZGVsW10gaW1wb3J0TW9kZWxzID0gZmVhdHVyZU1vZGVsLmdldEltcG9ydE1vZGVscygpOw0KLQkJCQkJaWYgKGltcG9ydE1vZGVscy5sZW5ndGggPT0gMCkgew0KLQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlJlcXVpcmVTdGF0ZVdpdGhvdXRJbXBvcnRFbGVtZW50IikpOyAvLyROT04tTkxTLTEkDQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCWJvb2xlYW4gcGF0Y2hNb2RlID0gZmFsc2U7DQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRNb2RlbHMubGVuZ3RoOyBpKyspIHsNCi0JCQkJCQkJSW1wb3J0TW9kZWwgaW1wb3J0TW9kZWwgPSBpbXBvcnRNb2RlbHNbaV07DQotCQkJCQkJCWlmIChpbXBvcnRNb2RlbC5pc1BhdGNoKCkpIHsNCi0JCQkJCQkJCWlmIChwYXRjaE1vZGUgPT0gZmFsc2UpDQotCQkJCQkJCQkJcGF0Y2hNb2RlID0gdHJ1ZTsNCi0JCQkJCQkJCWVsc2Ugew0KLQkJCQkJCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLk11bHRpcGxlUGF0Y2hJbXBvcnRzIikpOyAvLyROT04tTkxTLTEkDQotCQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCQl9DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9JTVBPUlQgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgSW1wb3J0TW9kZWwpIHsNCi0JCQkJCUltcG9ydE1vZGVsIGltcG9ydE1vZGVsID0gKEltcG9ydE1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBGZWF0dXJlTW9kZWwpIHsNCi0JCQkJCQlmZWF0dXJlTW9kZWwgPSAoRmVhdHVyZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQkJZmVhdHVyZU1vZGVsLmFkZEltcG9ydE1vZGVsKGltcG9ydE1vZGVsKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1BMVUdJTiA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBQbHVnaW5FbnRyeU1vZGVsKSB7DQotCQkJCQlQbHVnaW5FbnRyeU1vZGVsIHBsdWdpbkVudHJ5ID0gKFBsdWdpbkVudHJ5TW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkgew0KLQkJCQkJCWZlYXR1cmVNb2RlbCA9IChGZWF0dXJlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQkJCQlmZWF0dXJlTW9kZWwuYWRkUGx1Z2luRW50cnlNb2RlbChwbHVnaW5FbnRyeSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9EQVRBIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIE5vblBsdWdpbkVudHJ5TW9kZWwpIHsNCi0JCQkJCU5vblBsdWdpbkVudHJ5TW9kZWwgbm9uUGx1Z2luRW50cnkgPSAoTm9uUGx1Z2luRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgRmVhdHVyZU1vZGVsKSB7DQotCQkJCQkJZmVhdHVyZU1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJCWZlYXR1cmVNb2RlbC5hZGROb25QbHVnaW5FbnRyeU1vZGVsKG5vblBsdWdpbkVudHJ5KTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlicmVhazsNCi0NCi0JCQlkZWZhdWx0IDoNCi0JCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLlVua25vd25FbmRTdGF0ZSIpICsgc3RhdGUpOy8vJE5PTi1OTFMtMSQNCi0JCQkJYnJlYWs7DQotCQl9DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiRW5kIEVsZW1lbnQ6IiArIHVyaSArICI6IiArIGxvY2FsTmFtZSArICI6IiArIHFOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JfQ0KLQkNCi0JLyoNCi0JICogTWV0aG9kIGNsZWFudXBUZXh0Lg0KLQkgKiBSZW1vdmVzIHByZSB3aGl0ZSBzcGFjZSBhbmQgcG9zdCB3aGl0ZSBzcGFjZQ0KLQkgKiByZXR1cm4gbnVsbCBpZiB0aGUgdGV4dCBvbmx5IGNvbnRhaW5zIHdoaXRlc3BhY2VzIChcdCBcclxuIGFuZCBzcGFjZXMpDQotCSAqIA0KLQkgKiBAcGFyYW0gdGV4dCBvciBudWxsDQotCSAqIEByZXR1cm4gU3RyaW5nDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyBjbGVhbnVwVGV4dChTdHJpbmcgdGV4dCkgew0KLQkJdGV4dCA9IHRleHQudHJpbSgpOw0KLQkJaWYgKCIiLmVxdWFscyh0ZXh0KSkgcmV0dXJuIG51bGw7IC8vJE5PTi1OTFMtMSQNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgY2hhcmFjdGVyIHRleHQNCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsNCi0JCVN0cmluZyB0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gdmFsaWQgPSB0cnVlOw0KLQ0KLQkJaWYgKHZhbGlkKSB7DQotCQkJdGV4dCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOw0KLQkJfQ0KLQ0KLQkJLy9vbmx5IHB1c2ggaWYgbm90IHVua25vd24gc3RhdGUNCi0JCWludCBzdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQlpZiAoc3RhdGUgPT0gU1RBVEVfREVTQ1JJUFRJT04gfHwgc3RhdGUgPT0gU1RBVEVfQ09QWVJJR0hUIHx8IHN0YXRlID09IFNUQVRFX0xJQ0VOU0UpDQotCQkJb2JqZWN0U3RhY2sucHVzaCh0ZXh0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSGFuZGxlIGVycm9ycw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2Vycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgew0KLQkJbG9nU3RhdHVzKGV4KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSGFuZGxlIGZhdGFsIGVycm9ycw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2ZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pDQotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJbG9nU3RhdHVzKGV4KTsNCi0JCXRocm93IGV4Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVJbml0aWFsU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7DQotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRmVhdHVyZVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoSEFORExFUikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSEFORExFUikpOw0KLQkJCXByb2Nlc3NIYW5kbGVyKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDT1BZUklHSFQpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NPUFlSSUdIVCkpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoTElDRU5TRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfTElDRU5TRSkpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoVVJMKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9VUkwpKTsNCi0JCQkvL05vIHByb2Nlc3MgYXMgVVJMIHRhZyBkb2VzIG5vdCBjb250YWluIGFueSBlbGVtZW50IGl0c2VsZg0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSU5DTFVERVMpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0lOQ0xVREVTKSk7DQotCQkJcHJvY2Vzc0luY2x1ZGVzKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoUkVRVUlSRVMpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1JFUVVJUkVTKSk7DQotCQkJcHJvY2Vzc1JlcXVpcmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhQTFVHSU4pKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1BMVUdJTikpOw0KLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhEQVRBKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9EQVRBKSk7DQotCQkJcHJvY2Vzc0RhdGEoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVSTFN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoVVBEQVRFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9VUERBVEUpKTsNCi0JCQlwcm9jZXNzVVJMSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERJU0NPVkVSWSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRElTQ09WRVJZKSk7DQotCQkJcHJvY2Vzc1VSTEluZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlcXVpcmVzU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhJTVBPUlQpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0lNUE9SVCkpOw0KLQkJCXByb2Nlc3NJbXBvcnQoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOyAvLyROT04tTkxTLTEkDQotCX0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVVwZGF0ZURpc2NvdmVyeVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoSEFORExFUikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSEFORExFUikpOw0KLQkJCXByb2Nlc3NIYW5kbGVyKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDT1BZUklHSFQpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NPUFlSSUdIVCkpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoTElDRU5TRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfTElDRU5TRSkpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoVVJMKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9VUkwpKTsNCi0JCQkvL05vIHByb2Nlc3MgYXMgVVJMIHRhZyBkb2VzIG5vdCBjb250YWluIGFueSBlbGVtZW50IGl0c2VsZg0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoSU5DTFVERVMpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0lOQ0xVREVTKSk7DQotCQkJcHJvY2Vzc0luY2x1ZGVzKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoUkVRVUlSRVMpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1JFUVVJUkVTKSk7DQotCQkJcHJvY2Vzc1JlcXVpcmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhQTFVHSU4pKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1BMVUdJTikpOw0KLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhEQVRBKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9EQVRBKSk7DQotCQkJcHJvY2Vzc0RhdGEoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhVUERBVEUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1VQREFURSkpOw0KLQkJCXByb2Nlc3NVUkxJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRElTQ09WRVJZKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ESVNDT1ZFUlkpKTsNCi0JCQlwcm9jZXNzVVJMSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlSW1wb3J0U3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhIQU5ETEVSKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9IQU5ETEVSKSk7DQotCQkJcHJvY2Vzc0hhbmRsZXIoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT04pKTsNCi0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENPUFlSSUdIVCkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ09QWVJJR0hUKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhMSUNFTlNFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9MSUNFTlNFKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhVUkwpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1VSTCkpOw0KLQkJCS8vTm8gcHJvY2VzcyBhcyBVUkwgdGFnIGRvZXMgbm90IGNvbnRhaW4gYW55IGVsZW1lbnQgaXRzZWxmDQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhJTkNMVURFUykpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU5DTFVERVMpKTsNCi0JCQlwcm9jZXNzSW5jbHVkZXMoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhSRVFVSVJFUykpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfUkVRVUlSRVMpKTsNCi0JCQlwcm9jZXNzUmVxdWlyZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKFBMVUdJTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfUExVR0lOKSk7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERBVEEpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RBVEEpKTsNCi0JCQlwcm9jZXNzRGF0YShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKElNUE9SVCkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU1QT1JUKSk7DQotCQkJcHJvY2Vzc0ltcG9ydChhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBQcm9jZXNzIGZlYXR1cmUgaW5mb3JtYXRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRmVhdHVyZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0NCi0JCS8vIGlkZW50aWZpZXIgYW5kIHZlcnNpb24NCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpIC8vJE5PTi1OTFMtMSQNCi0JCXx8IHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuSWRPclZlcnNpb25JbnZhbGlkIiwgbmV3IFN0cmluZ1tdIHsgaWQsIHZlciwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKTsJLy8kTk9OLU5MUy0xJA0KLQkJfSBlbHNlIHsNCi0JCQkvLyBjcmVhdGUgZmVhdHVyZSBtb2RlbA0KLQkJCUZlYXR1cmVNb2RlbCBmZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlTW9kZWwoKTsNCi0NCi0JCQlmZWF0dXJlLnNldEZlYXR1cmVJZGVudGlmaWVyKGlkKTsNCi0JCQlmZWF0dXJlLnNldEZlYXR1cmVWZXJzaW9uKHZlcik7DQotDQotCQkJLy8gbGFiZWwNCi0JCQlTdHJpbmcgbGFiZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkDQotCQkJZmVhdHVyZS5zZXRMYWJlbChsYWJlbCk7DQotDQotCQkJLy8gcHJvdmlkZXINCi0JCQlTdHJpbmcgcHJvdmlkZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwcm92aWRlci1uYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlmZWF0dXJlLnNldFByb3ZpZGVyKHByb3ZpZGVyKTsNCi0NCi0JCQkvL2ltYWdlDQotCQkJU3RyaW5nIGltYWdlVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaW1hZ2UiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0SW1hZ2VVUkxTdHJpbmcoaW1hZ2VVUkwpOw0KLQ0KLQkJCS8vIE9TDQotCQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0T1Mob3MpOw0KLQ0KLQkJCS8vIFdTDQotCQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0V1Mod3MpOw0KLQ0KLQkJCS8vIE5MDQotCQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0TkwobmwpOw0KLQ0KLQkJCS8vIGFyY2gNCi0JCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0QXJjaChhcmNoKTsNCi0NCi0JCQkvLyBwcmltYXJ5DQotCQkJU3RyaW5nIHByaW1hcnkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwcmltYXJ5Iik7IC8vJE5PTi1OTFMtMSQNCi0JCQlmZWF0dXJlLnNldFByaW1hcnkocHJpbWFyeSAhPSBudWxsICYmIHByaW1hcnkudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQkvLyBleGNsdXNpdmUNCi0JCQlTdHJpbmcgZXhjbHVzaXZlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZXhjbHVzaXZlIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlmZWF0dXJlLnNldEV4Y2x1c2l2ZShleGNsdXNpdmUgIT0gbnVsbCAmJiBleGNsdXNpdmUudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQkvLyBhcHBsaWNhdGlvbg0KLQkJCVN0cmluZyBhcHBsaWNhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFwcGxpY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlmZWF0dXJlLnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsNCi0NCi0JCQkvLyBhZmZpbml0eQ0KLQkJCVN0cmluZyBhZmZpbml0eSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImNvbG9jYXRpb24tYWZmaW5pdHkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0QWZmaW5pdHlGZWF0dXJlKGFmZmluaXR5KTsNCi0NCi0JCQkvLyBwcmltYXJ5IHBsdWdpbg0KLQkJCVN0cmluZyBwbHVnaW4gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWZlYXR1cmUuc2V0UHJpbWFyeVBsdWdpbklEKHBsdWdpbik7DQotDQotCQkJb2JqZWN0U3RhY2sucHVzaChmZWF0dXJlKTsNCi0NCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgew0KLQkJCQlkZWJ1ZygiRW5kIHByb2Nlc3MgRGVmYXVsdEZlYXR1cmUgdGFnOiBpZDoiIC8vJE5PTi1OTFMtMSQNCi0JCQkJK2lkICsgIiB2ZXI6IiAvLyROT04tTkxTLTEkDQotCQkJCSt2ZXIgKyAiIGxhYmVsOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrbGFiZWwgKyAiIHByb3ZpZGVyOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrcHJvdmlkZXIpOw0KLQkJCQlkZWJ1ZygiRW5kIHByb2Nlc3MgRGVmYXVsdEZlYXR1cmUgdGFnOiBpbWFnZToiICsgaW1hZ2VVUkwpOyAvLyROT04tTkxTLTEkDQotCQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IHdzOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrd3MgKyAiIG9zOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrb3MgKyAiIG5sOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrbmwgKyAiIGFwcGxpY2F0aW9uOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrYXBwbGljYXRpb24pOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBVUkwgaW5mbyB3aXRoIGVsZW1lbnQgdGV4dA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NIYW5kbGVyKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsIGhhbmRsZXIgPSBmYWN0b3J5LmNyZWF0ZUluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCgpOw0KLQ0KLQkJU3RyaW5nIGhhbmRsZXJVUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaGFuZGxlci5zZXRVUkxTdHJpbmcoaGFuZGxlclVSTCk7DQotDQotCQlTdHJpbmcgbGlicmFyeSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxpYnJhcnkiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaGFuZGxlci5zZXRMaWJyYXJ5KGxpYnJhcnkpOw0KLQ0KLQkJU3RyaW5nIGNsYXp6ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaGFuZGxlciIpOyAvLyROT04tTkxTLTEkDQotCQloYW5kbGVyLnNldEhhbmRsZXJOYW1lKGNsYXp6KTsNCi0NCi0JCW9iamVjdFN0YWNrLnB1c2goaGFuZGxlcik7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiUHJvY2Vzc2VkIEhhbmRsZXI6IHVybDoiIC8vJE5PTi1OTFMtMSQNCi0JCQkraGFuZGxlclVSTCArICIgbGlicmFyeToiIC8vJE5PTi1OTFMtMSQNCi0JCQkrbGlicmFyeSArICIgY2xhc3M6IiAvLyROT04tTkxTLTEkDQotCQkJK2NsYXp6KTsNCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBVUkwgaW5mbyB3aXRoIGVsZW1lbnQgdGV4dA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmZvKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJVVJMRW50cnlNb2RlbCBpbmYgPSBmYWN0b3J5LmNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsNCi0JCVN0cmluZyBpbmZvVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQNCi0JCWluZi5zZXRVUkxTdHJpbmcoaW5mb1VSTCk7DQotDQotCQlvYmplY3RTdGFjay5wdXNoKGluZik7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiUHJvY2Vzc2VkIEluZm86IHVybDoiICsgaW5mb1VSTCk7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBQcm9jZXNzIGluY2x1ZGVzIGluZm9ybWF0aW9uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0luY2x1ZGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQ0KLQkJLy8gaWRlbnRpZmllciBhbmQgdmVyc2lvbg0KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIHZlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikgLy8kTk9OLU5MUy0xJA0KLQkJfHwgdmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5JZE9yVmVyc2lvbkludmFsaWQiLCBuZXcgU3RyaW5nW10geyBpZCwgdmVyLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpOwkvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBpbmNsdWRlZEZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7DQotCQlpbmNsdWRlZEZlYXR1cmUuc2V0RmVhdHVyZUlkZW50aWZpZXIoaWQpOw0KLQkJaW5jbHVkZWRGZWF0dXJlLnNldEZlYXR1cmVWZXJzaW9uKHZlcik7DQotDQotCQkvLyBuYW1lDQotCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsvLyROT04tTkxTLTEkDQotCQlpbmNsdWRlZEZlYXR1cmUuc2V0TGFiZWwobmFtZSk7DQotDQotCQkvLyBvcHRpb25hbA0KLQkJU3RyaW5nIG9wdGlvbmFsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3B0aW9uYWwiKTsvLyROT04tTkxTLTEkDQotCQlib29sZWFuIGlzT3B0aW9uYWwgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShvcHRpb25hbCk7Ly8kTk9OLU5MUy0xJA0KLQkJaW5jbHVkZWRGZWF0dXJlLmlzT3B0aW9uYWwoaXNPcHRpb25hbCk7DQotDQotCQkvLyBzZWFyY2ggbG9jYXRpb24NCi0JCVN0cmluZyBsb2NhdGlvbk5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJzZWFyY2gtbG9jYXRpb24iKTsvLyROT04tTkxTLTEkDQotCQkvLyBidWcgMjcwMzANCi0JCWlmIChsb2NhdGlvbk5hbWUgPT0gbnVsbCkNCi0JCQlsb2NhdGlvbk5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJzZWFyY2hfbG9jYXRpb24iKTsvLyROT04tTkxTLTEkDQotCQlpbnQgc2VhcmNoTG9jYXRpb24gPSBJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9ST09UOw0KLQkJaWYgKCJib3RoIi5lcXVhbHNJZ25vcmVDYXNlKGxvY2F0aW9uTmFtZSkpLy8kTk9OLU5MUy0xJA0KLQkJCXNlYXJjaExvY2F0aW9uID0gSVVwZGF0ZUNvbnN0YW50cy5TRUFSQ0hfUk9PVCAmIElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1NFTEY7DQotCQlpZiAoInNlbGYiLmVxdWFsc0lnbm9yZUNhc2UobG9jYXRpb25OYW1lKSkvLyROT04tTkxTLTEkDQotCQkJc2VhcmNoTG9jYXRpb24gPSBJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9TRUxGOwkJCQkNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXRTZWFyY2hMb2NhdGlvbihzZWFyY2hMb2NhdGlvbik7DQotDQotCQkvLyBvcyBhcmNoIHdzIG5sDQotCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOy8vJE5PTi1OTFMtMSQNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXRPUyhvcyk7DQotDQotCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOy8vJE5PTi1OTFMtMSQNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXRXUyh3cyk7DQotDQotCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsvLyROT04tTkxTLTEkDQotCQlpbmNsdWRlZEZlYXR1cmUuc2V0QXJjaChhcmNoKTsNCi0JCQ0KLQkJLy8gTkwNCi0JCVN0cmluZyBubCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5sIik7IC8vJE5PTi1OTFMtMSQNCi0JCWluY2x1ZGVkRmVhdHVyZS5zZXROTChubCk7DQotDQotCQlvYmplY3RTdGFjay5wdXNoKGluY2x1ZGVkRmVhdHVyZSk7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgew0KLQkJCWRlYnVnKCJFbmQgcHJvY2VzcyBJbmNsdWRlcyB0YWc6IGlkOiIgLy8kTk9OLU5MUy0xJA0KLQkJCStpZCArICIgdmVyOiIgKyB2ZXIpOyAvLyROT04tTkxTLTEkDQotCQkJZGVidWcoIm5hbWUgPSIgKyBuYW1lICsgIiBvcHRpb25hbD0iICsgb3B0aW9uYWwgKyAiIHNlYXJjaC1sb2NhdGlvbj0iICsgbG9jYXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQlkZWJ1Zygib3M9IiArIG9zICsgIiB3cz0iICsgd3MgKyAiIGFyY2g9IiArIGFyY2gpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJfQ0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIFVSTCBpbmZvIHdpdGggbGFiZWwgYXR0cmlidXRlDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1VSTEluZm8oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlVUkxFbnRyeU1vZGVsIGluZiA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJU3RyaW5nIGluZm9VUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWluZi5zZXRVUkxTdHJpbmcoaW5mb1VSTCk7DQotCQlpbmYuc2V0QW5ub3RhdGlvbihsYWJlbCk7DQotCQkNCi0JCWlmICgid2ViIi5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKSAvLyROT04tTkxTLTEkDQotCQkJaW5mLnNldFR5cGUoSVVSTEVudHJ5LldFQl9TSVRFKTsNCi0JCWVsc2UgDQotCQkJaW5mLnNldFR5cGUoSVVSTEVudHJ5LlVQREFURV9TSVRFKTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJQcm9jZXNzZWQgVVJMSW5mbzogdXJsOiIgKyBpbmZvVVJMICsgIiBsYWJlbDoiICsgbGFiZWwrIiB0eXBlOiIrdHlwZSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0NCi0JCW9iamVjdFN0YWNrLnB1c2goaW5mKTsNCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBpbXBvcnQgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbXBvcnQoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlTdHJpbmcgcGx1Z2luSUQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIGZlYXR1cmVJRCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImZlYXR1cmUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIGlkTWF0Y2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZC1tYXRjaCIpOyAvLyROT04tTkxTLTEkDQotDQotCQlpZiAoIShwbHVnaW5JRCA9PSBudWxsIF4gZmVhdHVyZUlEID09IG51bGwpKSB7DQotCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuUGx1Z2luQW5kRmVhdHVyZUlkIikpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJLy8gc2luY2UgMi4wLjIgLCBtYW5hZ2UgZmVhdHVyZSBhbmQgcGx1Z2luIGltcG9ydA0KLQkJU3RyaW5nIGlkID0gbnVsbDsNCi0JCWlmIChwbHVnaW5JRCA9PSBudWxsKSB7DQotCQkJaWQgPSBmZWF0dXJlSUQ7DQotCQl9IGVsc2Ugew0KLQkJCWlkID0gcGx1Z2luSUQ7DQotCQl9DQotDQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLk1pc3NpbmdJZCIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsvLyROT04tTkxTLTEkDQotCQllbHNlIHsNCi0JCQlJbXBvcnRNb2RlbCBpbXAgPSBmYWN0b3J5LmNyZWF0ZUltcG9ydE1vZGVsKCk7DQotCQkJU3RyaW5nIHZlciA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCVN0cmluZyBtYXRjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm1hdGNoIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlTdHJpbmcgcGF0Y2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXRjaCIpOyAvLyROT04tTkxTLTEkDQotDQotCQkJaW1wLnNldFBhdGNoKHBhdGNoICE9IG51bGwgJiYgcGF0Y2guZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWlmICh2ZXIgPT0gbnVsbCkgew0KLQkJCQlpZiAoaW1wLmlzUGF0Y2goKSkgew0KLQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuTWlzc2luZ1BhdGNoVmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXZlciA9ICIwLjAuMCI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJbWF0Y2ggPSAiZ3JlYXRlck9yRXF1YWwiOyAvLyROT04tTkxTLTEkDQotCQkJfSBlbHNlIGlmIChtYXRjaCA9PSBudWxsKSB7DQotCQkJCWlmIChpbXAuaXNQYXRjaCgpKQ0KLQkJCQkJbWF0Y2ggPSAicGVyZmVjdCI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJZWxzZQ0KLQkJCQkJbWF0Y2ggPSAiY29tcGF0aWJsZSI7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotDQotCQkJaW1wLnNldElkZW50aWZpZXIoaWQpOw0KLQkJCWltcC5zZXRWZXJzaW9uKHZlcik7DQotCQkJaW1wLnNldEZlYXR1cmVJbXBvcnQoZmVhdHVyZUlEICE9IG51bGwpOw0KLQkJCWltcC5zZXRNYXRjaGluZ1J1bGVOYW1lKG1hdGNoKTsNCi0JCQlpbXAuc2V0TWF0Y2hpbmdJZFJ1bGVOYW1lKGlkTWF0Y2gpOw0KLQ0KLQkJCWlmIChpbXAuaXNQYXRjaCgpKSB7DQotCQkJCS8vIHBhdGNoIHJlZmVyZW5jZSBtdXN0IGJlIHBlcmZlY3QuDQotCQkJCWlmIChtYXRjaCAhPSBudWxsICYmICFtYXRjaC5lcXVhbHNJZ25vcmVDYXNlKCJwZXJmZWN0IikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIud3JvbmdNYXRjaEZvclBhdGNoIikpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJaWYgKGltcC5pc0ZlYXR1cmVJbXBvcnQoKSA9PSBmYWxzZSkgew0KLQkJCQkJaW1wLnNldFBhdGNoKGZhbHNlKTsNCi0JCQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLnBhdGNoV2l0aFBsdWdpbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCS8vIG9zIGFyY2ggd3MNCi0JCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkDQotCQkJaW1wLnNldE9TKG9zKTsNCi0NCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkDQotCQkJaW1wLnNldFdTKHdzKTsNCi0NCi0JCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWltcC5zZXRPU0FyY2goYXJjaCk7DQotDQotCQkJb2JqZWN0U3RhY2sucHVzaChpbXApOw0KLQ0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7DQotCQkJCWRlYnVnKCJQcm9jZXNzZWQgaW1wb3J0OiBpZDoiICsgaWQgKyAiIHZlcjoiICsgdmVyKTsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJZGVidWcoIlByb2Nlc3NlZCBpbXBvcnQ6IG1hdGNoOiIgKyBtYXRjaCk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotDQotCQl9DQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgaW1wb3J0IGluZm8NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUmVxdWlyZShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JfQ0KLQ0KLQkvKiANCi0JICogcHJvY2VzcyBwbHVnaW4gZW50cnkgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQbHVnaW4oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSAvLyROT04tTkxTLTEkDQotCQl8fCB2ZXIgPT0gbnVsbCB8fCB2ZXIudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLklkT3JWZXJzaW9uSW52YWxpZCIsIG5ldyBTdHJpbmdbXSB7IGlkLCB2ZXIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZSB7DQotCQkJUGx1Z2luRW50cnlNb2RlbCBwbHVnaW5FbnRyeSA9IGZhY3RvcnkuY3JlYXRlUGx1Z2luRW50cnlNb2RlbCgpOw0KLQkJCXBsdWdpbkVudHJ5LnNldFBsdWdpbklkZW50aWZpZXIoaWQpOw0KLQkJCXBsdWdpbkVudHJ5LnNldFBsdWdpblZlcnNpb24odmVyKTsNCi0NCi0JCQlTdHJpbmcgZnJhZ21lbnQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmcmFnbWVudCIpOyAvLyROT04tTkxTLTEkDQotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudChmcmFnbWVudCAhPSBudWxsICYmIGZyYWdtZW50LnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikpOy8vJE5PTi1OTFMtMSQJCQkNCi0NCi0JCQkvL3NldE9TDQotCQkJU3RyaW5nIG9zID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXBsdWdpbkVudHJ5LnNldE9TKG9zKTsNCi0NCi0JCQkvL3NldFdTDQotCQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXBsdWdpbkVudHJ5LnNldFdTKHdzKTsNCi0NCi0JCQkvL3NldE5MDQotCQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXBsdWdpbkVudHJ5LnNldE5MKG5sKTsNCi0NCi0JCQkvLyBzZXRBcmNoDQotCQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlwbHVnaW5FbnRyeS5zZXRBcmNoKGFyY2gpOw0KLQ0KLQkJCS8vIHNldFVucGFjaw0KLQkJCVN0cmluZyB1bnBhY2sgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1bnBhY2siKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXBsdWdpbkVudHJ5LnNldFVucGFjayghImZhbHNlIi5lcXVhbHNJZ25vcmVDYXNlKHVucGFjaykpOyAvLyROT04tTkxTLTEkDQotDQotCQkJLy8gZG93bmxvYWQgc2l6ZQ0KLQkJCWxvbmcgZG93bmxvYWRfc2l6ZSA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCQlTdHJpbmcgZG93bmxvYWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJkb3dubG9hZC1zaXplIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAoZG93bmxvYWQgIT0gbnVsbCAmJiAhZG93bmxvYWQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0cnkgew0KLQkJCQkJZG93bmxvYWRfc2l6ZSA9IExvbmcudmFsdWVPZihkb3dubG9hZCkubG9uZ1ZhbHVlKCk7DQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyB1c2UgVU5LTk9XTl9TSVpFDQotCQkJCX0NCi0JCQl9DQotCQkJcGx1Z2luRW50cnkuc2V0RG93bmxvYWRTaXplKGRvd25sb2FkX3NpemUpOw0KLQ0KLQkJCS8vIGluc3RhbGwgc2l6ZQkNCi0JCQlsb25nIGluc3RhbGxfc2l6ZSA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCQlTdHJpbmcgaW5zdGFsbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImluc3RhbGwtc2l6ZSIpOyAvLyROT04tTkxTLTEkDQotCQkJaWYgKGluc3RhbGwgIT0gbnVsbCAmJiAhaW5zdGFsbC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCXRyeSB7DQotCQkJCQlpbnN0YWxsX3NpemUgPSBMb25nLnZhbHVlT2YoaW5zdGFsbCkubG9uZ1ZhbHVlKCk7DQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyB1c2UgVU5LTk9XTl9TSVpFDQotCQkJCX0NCi0JCQl9DQotCQkJcGx1Z2luRW50cnkuc2V0SW5zdGFsbFNpemUoaW5zdGFsbF9zaXplKTsNCi0NCi0JCQlvYmplY3RTdGFjay5wdXNoKHBsdWdpbkVudHJ5KTsNCi0NCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgew0KLQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIFBsdWdpbjogaWQ6IiArIGlkICsgIiB2ZXI6IiArIHZlciArICIgZnJhZ21lbnQ6IiArIGZyYWdtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCQkJZGVidWcoIlByb2Nlc3NlZCBQbHVnaW46IG9zOiIgKyBvcyArICIgd3M6IiArIHdzICsgIiBubDoiICsgbmwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIFBsdWdpbjogZG93bmxvYWQgc2l6ZToiIC8vJE5PTi1OTFMtMSQNCi0JCQkJK2Rvd25sb2FkX3NpemUgKyAiIGluc3RhbGwgc2l6ZToiIC8vJE5PTi1OTFMtMSQNCi0JCQkJK2luc3RhbGxfc2l6ZSk7DQotCQkJfQ0KLQ0KLQkJfQ0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIG5vbi1wbHVnLWluIGVudHJ5IGluZm8NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGF0YShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5NaXNzaW5nSWQiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZSB7DQotCQkJTm9uUGx1Z2luRW50cnlNb2RlbCBkYXRhRW50cnkgPSBmYWN0b3J5LmNyZWF0ZU5vblBsdWdpbkVudHJ5TW9kZWwoKTsNCi0JCQlkYXRhRW50cnkuc2V0SWRlbnRpZmllcihpZCk7DQotDQotCQkJLy9zZXRPUw0KLQkJCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlkYXRhRW50cnkuc2V0T1Mob3MpOw0KLQ0KLQkJCS8vc2V0V1MNCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkDQotCQkJZGF0YUVudHJ5LnNldFdTKHdzKTsNCi0NCi0JCQkvL3NldE5MDQotCQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWRhdGFFbnRyeS5zZXROTChubCk7DQotDQotCQkJLy8gc2V0QXJjaA0KLQkJCVN0cmluZyBhcmNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXJjaCIpOyAvLyROT04tTkxTLTEkDQotCQkJZGF0YUVudHJ5LnNldEFyY2goYXJjaCk7DQotDQotCQkJLy8gZG93bmxvYWQgc2l6ZQ0KLQkJCWxvbmcgZG93bmxvYWRfc2l6ZSA9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRTsNCi0JCQlTdHJpbmcgZG93bmxvYWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJkb3dubG9hZC1zaXplIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAoZG93bmxvYWQgIT0gbnVsbCAmJiAhZG93bmxvYWQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0cnkgew0KLQkJCQkJZG93bmxvYWRfc2l6ZSA9IExvbmcudmFsdWVPZihkb3dubG9hZCkubG9uZ1ZhbHVlKCk7DQotCQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7DQotCQkJCQkvLyB1c2UgVU5LTk9XTl9TSVpFDQotCQkJCX0NCi0JCQl9DQotCQkJZGF0YUVudHJ5LnNldERvd25sb2FkU2l6ZShkb3dubG9hZF9zaXplKTsNCi0NCi0JCQkvLyBpbnN0YWxsIHNpemUJDQotCQkJbG9uZyBpbnN0YWxsX3NpemUgPSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7DQotCQkJU3RyaW5nIGluc3RhbGwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpbnN0YWxsLXNpemUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChpbnN0YWxsICE9IG51bGwgJiYgIWluc3RhbGwudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQl0cnkgew0KLQkJCQkJaW5zdGFsbF9zaXplID0gTG9uZy52YWx1ZU9mKGluc3RhbGwpLmxvbmdWYWx1ZSgpOw0KLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJCQkJLy8gdXNlIFVOS05PV05fU0laRQ0KLQkJCQl9DQotCQkJfQ0KLQkJCWRhdGFFbnRyeS5zZXRJbnN0YWxsU2l6ZShpbnN0YWxsX3NpemUpOw0KLQ0KLQkJCW9iamVjdFN0YWNrLnB1c2goZGF0YUVudHJ5KTsNCi0NCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgew0KLQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIERhdGE6IGlkOiIgKyBpZCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJZGVidWcoIlByb2Nlc3NlZCBEYXRhOiBkb3dubG9hZCBzaXplOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkrZG93bmxvYWRfc2l6ZSArICIgaW5zdGFsbCBzaXplOiIgLy8kTk9OLU5MUy0xJA0KLQkJCQkraW5zdGFsbF9zaXplKTsNCi0JCQl9DQotDQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGRlYnVnKFN0cmluZyBzKSB7DQotCQlVcGRhdGVDb3JlLmRlYnVnKCJEZWZhdWx0RmVhdHVyZVBhcnNlcjogIiArIHMpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGxvZ1N0YXR1cyhTQVhQYXJzZUV4Y2VwdGlvbiBleCkgew0KLQkJU3RyaW5nIG5hbWUgPSBleC5nZXRTeXN0ZW1JZCgpOw0KLQkJaWYgKG5hbWUgPT0gbnVsbCkNCi0JCQluYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCWVsc2UNCi0JCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMSArIG5hbWUubGFzdEluZGV4T2YoIi8iKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCVN0cmluZyBtc2c7DQotCQlpZiAobmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQltc2cgPSBQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuRXJyb3JQYXJzaW5nIiwgZXguZ2V0TWVzc2FnZSgpKTsvLyROT04tTkxTLTEkDQotCQl9IGVsc2Ugew0KLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7IG5hbWUsIEludGVnZXIudG9TdHJpbmcoZXguZ2V0TGluZU51bWJlcigpKSwgSW50ZWdlci50b1N0cmluZyhleC5nZXRDb2x1bW5OdW1iZXIoKSksIGV4LmdldE1lc3NhZ2UoKX07DQotCQkJbXNnID0gUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLkVycm9ybGluZUNvbHVtbk1lc3NhZ2UiLCB2YWx1ZXMpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWVycm9yKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBQbGF0Zm9ybS5QQVJTRV9QUk9CTEVNLCBtc2csIGV4KSk7DQotCX0NCi0NCi0JLyoNCi0JICogSGFuZGxlcyBhbiBlcnJvciBzdGF0ZSBzcGVjaWZpZWQgYnkgdGhlIHN0YXR1cy4gIFRoZSBjb2xsZWN0aW9uIG9mIGFsbCBsb2dnZWQgc3RhdHVzDQotCSAqIG9iamVjdHMgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIDxjb2RlPmdldFN0YXR1cygpPC9jb2RlPi4NCi0JICoNCi0JICogQHBhcmFtIGVycm9yIGEgc3RhdHVzIGRldGFpbGluZyB0aGUgZXJyb3IgY29uZGl0aW9uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgZXJyb3IoSVN0YXR1cyBlcnJvcikgew0KLQ0KLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7DQotCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwgUGxhdGZvcm0uUEFSU0VfUFJPQkxFTSwgUG9saWN5LmJpbmQoIkRlZmF1bHRGZWF0dXJlUGFyc2VyLkVycm9yUGFyc2luZ0ZlYXR1cmUiKSwgbnVsbCk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCXN0YXR1cy5hZGQoZXJyb3IpOw0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJVXBkYXRlQ29yZS5sb2coZXJyb3IpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEVycm9yVW5rbm93blRhZyhTdHJpbmcgbXNnKSB7DQotCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSUdOT1JFRF9FTEVNRU5UKSk7DQotCQlpbnRlcm5hbEVycm9yKG1zZyk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsNCi0JCWVycm9yKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBQbGF0Zm9ybS5QQVJTRV9QUk9CTEVNLCBtZXNzYWdlLCBudWxsKSk7DQotCX0NCi0NCi0JLyoNCi0JICogcmV0dXJuIHRoZSBzdGF0ZSBhcyBTdHJpbmcNCi0JICovDQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKGludCBzdGF0ZSkgew0KLQ0KLQkJc3dpdGNoIChzdGF0ZSkgew0KLQkJCWNhc2UgU1RBVEVfSUdOT1JFRF9FTEVNRU5UIDoNCi0JCQkJcmV0dXJuICJJZ25vcmVkIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6DQotCQkJCXJldHVybiAiSW5pdGlhbCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCQlyZXR1cm4gIkZlYXR1cmUiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9IQU5ETEVSIDoNCi0JCQkJcmV0dXJuICJJbnN0YWxsIEhhbmRsZXIiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTiA6DQotCQkJCXJldHVybiAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9JTkNMVURFUyA6DQotCQkJCXJldHVybiAiaW5jbHVkZXMiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9DT1BZUklHSFQgOg0KLQkJCQlyZXR1cm4gIkNvcHlyaWdodCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0xJQ0VOU0UgOg0KLQkJCQlyZXR1cm4gIkxpY2Vuc2UiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9VUkwgOg0KLQkJCQlyZXR1cm4gIlVSTCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX1VQREFURSA6DQotCQkJCXJldHVybiAiVXBkYXRlIFVSTCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0RJU0NPVkVSWSA6DQotCQkJCXJldHVybiAiRGlzY292ZXJ5IFVSTCI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX1JFUVVJUkVTIDoNCi0JCQkJcmV0dXJuICJSZXF1aXJlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfSU1QT1JUIDoNCi0JCQkJcmV0dXJuICJJbXBvcnQiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9QTFVHSU4gOg0KLQkJCQlyZXR1cm4gIlBsdWdpbiI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0RBVEEgOg0KLQkJCQlyZXR1cm4gIkRhdGEiOyAvLyROT04tTkxTLTEkDQotDQotCQkJZGVmYXVsdCA6DQotCQkJCXJldHVybiBQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93blN0YXRlIiwgSW50ZWdlci50b1N0cmluZyhzdGF0ZSkpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSwgaW50LCBpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSBhcmcwLCBpbnQgYXJnMSwgaW50IGFyZzIpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJc3VwZXIuaWdub3JhYmxlV2hpdGVzcGFjZShhcmcwLCBhcmcxLCBhcmcyKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDk1ZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9EZWZhdWx0U2l0ZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguKjsNCi1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgc2l0ZSBwYXJzZXIuDQotICogUGFyc2VzIHRoZSBzaXRlIG1hbmlmZXN0IGZpbGUgYXMgZGVmaW5lZCBieSB0aGUgcGxhdGZvcm0uIERlZmVycw0KLSAqIHRvIGEgbW9kZWwgZmFjdG9yeSB0byBjcmVhdGUgdGhlIGFjdHVhbCBjb25jcmV0ZSBtb2RlbCBvYmplY3RzLiBUaGUgDQotICogdXBkYXRlIGZyYW1ld29yayBzdXBwbGllcyB0d28gZmFjdG9yeSBpbXBsZW1lbnRhdGlvbnM6DQotICogPHVsPg0KLSAqIDxsaT5Ac2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbEZhY3RvcnkNCi0gKiA8bGk+QHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5CYXNlU2l0ZUZhY3RvcnkNCi0gKiA8L3VsPg0KLSAqIA0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRTaXRlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgew0KLQkNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0NCi0JCVNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0JDQotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsNCi0JcHJpdmF0ZSBTaXRlTW9kZWxGYWN0b3J5IGZhY3Rvcnk7DQotDQotCXByaXZhdGUgTXVsdGlTdGF0dXMgc3RhdHVzOw0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4gPSBmYWxzZTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lHTk9SRURfRUxFTUVOVCA9IC0xOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5JVElBTCA9IDA7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TSVRFID0gMTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0ZFQVRVUkUgPSAyOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfQVJDSElWRSA9IDM7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQVRFR09SWSA9IDQ7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQVRFR09SWV9ERUYgPSA1Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfREVTQ1JJUFRJT05fU0lURSA9IDY7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgPSA3Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEUgPSAic2l0ZSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkUgPSAiZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0RFRiA9ICJjYXRlZ29yeS1kZWYiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWSA9ICJjYXRlZ29yeSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9JTkZPX1VSTCA9ICJpbmRleC5odG1sIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvLyBDdXJyZW50IFN0YXRlIEluZm9ybWF0aW9uDQotCVN0YWNrIHN0YXRlU3RhY2sgPSBuZXcgU3RhY2soKTsNCi0NCi0JLy8gQ3VycmVudCBvYmplY3Qgc3RhY2sgKHVzZWQgdG8gaG9sZCB0aGUgY3VycmVudCBvYmplY3Qgd2UgYXJlDQotCS8vIHBvcHVsYXRpbmcgaW4gdGhpcyBwbHVnaW4gZGVzY3JpcHRvcg0KLQlTdGFjayBvYmplY3RTdGFjayA9IG5ldyBTdGFjaygpOw0KLQ0KLQlwcml2YXRlIGludCBjdXJyZW50U3RhdGU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RzIGEgc2l0ZSBwYXJzZXIuDQotCSAqLw0KLQlwdWJsaWMgRGVmYXVsdFNpdGVQYXJzZXIoKSB7DQotCQlzdXBlcigpOw0KLQkJdHJ5IHsNCi0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOw0KLQkJCXRoaXMucGFyc2VyID0gcGFyc2VyRmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsNCi0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUubG9nKGUpOw0KLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLmxvZyhlKTsNCi0JCX0NCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJDcmVhdGVkIik7IC8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBpbml0KFNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSkgew0KLQkJLy8gUEVSRjogc2VwYXJhdGUgaW5zdGFuY2UgY3JlYXRpb24gZnJvbSBwYXJzaW5nDQotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5Ow0KLQkJc3RhdGVTdGFjayA9IG5ldyBTdGFjaygpOw0KLQkJb2JqZWN0U3RhY2sgPSBuZXcgU3RhY2soKTsNCi0JCXN0YXR1cyA9IG51bGw7DQotCQlERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBpbnB1dCBzdGVhbSBhbmQgY29uc3RydWN0cyBhIHNpdGUgbW9kZWwuDQotCSAqIFRoZSBpbnB1dCBzdHJlYW0gaXMgbm90IGNsb3NlZCBhcyBwYXJ0IG9mIHRoaXMgb3BlcmF0aW9uLg0KLQkgKiANCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQ0KLQkgKiBAcmV0dXJuIHNpdGUgbW9kZWwNCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24NCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU2l0ZU1vZGVsIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQotCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSU5JVElBTCkpOw0KLQkJY3VycmVudFN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsNCi0JCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsNCi0JCWlmIChvYmplY3RTdGFjay5pc0VtcHR5KCkpDQotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuTm9TaXRlVGFnIikpOwkvLyROT04tTkxTLTEkDQotCQllbHNlIHsNCi0JCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU2l0ZU1vZGVsKSB7DQotCQkJCXJldHVybiAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlTdHJpbmcgc3RhY2sgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlJdGVyYXRvciBpdGVyID0gb2JqZWN0U3RhY2suaXRlcmF0b3IoKTsNCi0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotCQkJCQlzdGFjayA9IHN0YWNrICsgaXRlci5uZXh0KCkudG9TdHJpbmcoKSArICJcclxuIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLldyb25nUGFyc2luZ1N0YWNrIiwgc3RhY2spKTsJLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbGwgc3RhdHVzIG9iamVjdHMgYWNjdW11bGF0ZWQgYnkgdGhlIHBhcnNlci4NCi0JICoNCi0JICogQHJldHVybiBtdWx0aS1zdGF0dXMgY29udGFpbmluZyBhY2N1bXVsYXRlZCBzdGF0dXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgTXVsdGlTdGF0dXMgZ2V0U3RhdHVzKCkgew0KLQkJcmV0dXJuIHN0YXR1czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSGFuZGxlIHN0YXJ0IG9mIGVsZW1lbnQgdGFncw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsNCi0JCQlkZWJ1ZygiU3RhdGU6ICIgKyBjdXJyZW50U3RhdGUpOyAvLyROT04tTkxTLTEkDQotCQkJZGVidWcoIlN0YXJ0IEVsZW1lbnQ6IHVyaToiICsgdXJpICsgIiBsb2NhbCBOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JCX0NCi0NCi0JCXN3aXRjaCAoY3VycmVudFN0YXRlKSB7DQotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOg0KLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBsb2NhbE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsvLyROT04tTkxTLTEkDQotCQkJCWJyZWFrOw0KLQkJCWNhc2UgU1RBVEVfSU5JVElBTCA6DQotCQkJCWhhbmRsZUluaXRpYWxTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX1NJVEUgOg0KLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoNCi0JCQkJaGFuZGxlRmVhdHVyZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfQVJDSElWRSA6DQotCQkJCWhhbmRsZVNpdGVTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZIDoNCi0JCQkJaGFuZGxlQ2F0ZWdvcnlTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZX0RFRiA6DQotCQkJCWhhbmRsZUNhdGVnb3J5RGVmU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9TSVRFIDoNCi0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGIDoNCi0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWRlZmF1bHQgOg0KLQkJCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93blN0YXJ0U3RhdGUiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7Ly8kTk9OLU5MUy0xJA0KLQkJCQlicmVhazsNCi0JCX0NCi0JCWludCBuZXdTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQlpZiAobmV3U3RhdGUgIT0gU1RBVEVfSUdOT1JFRF9FTEVNRU5UKQ0KLQkJCWN1cnJlbnRTdGF0ZSA9IG5ld1N0YXRlOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBIYW5kbGUgZW5kIG9mIGVsZW1lbnQgdGFncw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2VuZEVsZW1lbnQoU3RyaW5nLCBTdHJpbmcsIFN0cmluZykNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpIHsNCi0NCi0JCVN0cmluZyB0ZXh0ID0gbnVsbDsNCi0JCVVSTEVudHJ5TW9kZWwgaW5mbyA9IG51bGw7DQotDQotCQlpbnQgc3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOw0KLQkJc3dpdGNoIChzdGF0ZSkgew0KLQkJCWNhc2UgU1RBVEVfSUdOT1JFRF9FTEVNRU5UIDoNCi0JCQljYXNlIFNUQVRFX0FSQ0hJVkUgOg0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOg0KLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0lOSVRJQUwgOg0KLQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGUiKSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkJYnJlYWs7DQotDQotCQkJY2FzZSBTVEFURV9TSVRFIDoNCi0JCQkJc3RhdGVTdGFjay5wb3AoKTsNCi0JCQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFN0cmluZykgew0KLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJU2l0ZU1vZGVsIHNpdGUgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCQlzaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKS5zZXRBbm5vdGF0aW9uKHRleHQpOw0KLQkJCQl9DQotCQkJCS8vZG8gbm90IHBvcCB0aGUgb2JqZWN0DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfRkVBVFVSRSA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCW9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZX0RFRiA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsNCi0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsNCi0JCQkJCUNhdGVnb3J5TW9kZWwgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQkJY2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLnNldEFubm90YXRpb24odGV4dCk7DQotCQkJCX0NCi0JCQkJb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fU0lURSA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQl3aGlsZSAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotCQkJCQkvLyBhZGQgdGV4dCwgcHJlc2VydmluZyBhdCBtb3N0IG9uZSBzcGFjZSBiZXR3ZWVuIHRleHQgZnJhZ21lbnRzDQotCQkJCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJaWYgKHRyYWlsaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgew0KLQkJCQkJCXRleHQgPSAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkDQotCQkJCQl9DQotCQkJCQl0ZXh0ID0gbmV3VGV4dC50cmltKCkgKyB0ZXh0Ow0KLQkJCQkJaWYgKGxlYWRpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7DQotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7DQotDQotCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7DQotDQotCQkJCVNpdGVNb2RlbCBzaXRlTW9kZWwgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQkJCS8vIG92ZXJyaWRlIGRlc2NyaXB0aW9uLg0KLQkJCQkvLyBkbyBub3QgcmFpc2UgZXJyb3IgYXMgcHJldmlvdXMgZGVzY3JpcHRpb24gbWF5IGJlIGRlZmF1bHQgb25lDQotCQkJCS8vIHdoZW4gcGFyc2luZyBzaXRlIHRhZw0KLQkJCQlpZiAoREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4pDQotCQkJCQlkZWJ1ZyhQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuRWxlbWVudEFscmVhZHlTZXQiLCBnZXRTdGF0ZShzdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJA0KLQkJCQlzaXRlTW9kZWwuc2V0RGVzY3JpcHRpb25Nb2RlbChpbmZvKTsNCi0JCQkJREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4gPSB0cnVlOw0KLQkJCQlicmVhazsNCi0NCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA6DQotCQkJCXN0YXRlU3RhY2sucG9wKCk7DQotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQl3aGlsZSAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7DQotCQkJCQkvLyBhZGQgdGV4dCwgcHJlc2VydmluZyBhdCBtb3N0IG9uZSBzcGFjZSBiZXR3ZWVuIHRleHQgZnJhZ21lbnRzDQotCQkJCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOw0KLQkJCQkJaWYgKHRyYWlsaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgew0KLQkJCQkJCXRleHQgPSAiICIgKyB0ZXh0OyAvLyROT04tTkxTLTEkDQotCQkJCQl9DQotCQkJCQl0ZXh0ID0gbmV3VGV4dC50cmltKCkgKyB0ZXh0Ow0KLQkJCQkJaWYgKGxlYWRpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7DQotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7DQotDQotCQkJCWluZm8gPSAoVVJMRW50cnlNb2RlbCkgb2JqZWN0U3RhY2sucG9wKCk7DQotCQkJCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7DQotDQotCQkJCUNhdGVnb3J5TW9kZWwgY2F0ZWdvcnkgPSAoQ2F0ZWdvcnlNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOw0KLQkJCQlpZiAoY2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpICE9IG51bGwpDQotCQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldDIiLCBnZXRTdGF0ZShzdGF0ZSksIGNhdGVnb3J5LmdldExhYmVsKCkpKTsvLyROT04tTkxTLTEkDQotCQkJCWVsc2UNCi0JCQkJCWNhdGVnb3J5LnNldERlc2NyaXB0aW9uTW9kZWwoaW5mbyk7DQotCQkJCWJyZWFrOw0KLQ0KLQkJCWRlZmF1bHQgOg0KLQkJCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRW5kU3RhdGUiLCBnZXRTdGF0ZShzdGF0ZSkpKTsvLyROT04tTkxTLTEkDQotCQkJCWJyZWFrOw0KLQkJfQ0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIkVuZCBFbGVtZW50OiIgKyB1cmkgKyAiOiIgKyBsb2NhbE5hbWUgKyAiOiIgKyBxTmFtZSk7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQNCi0JfQ0KLQ0KLQkvKioNCi0JICogSGFuZGxlIGNoYXJhY3RlciB0ZXh0DQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjY2hhcmFjdGVycyhjaGFyW10sIGludCwgaW50KQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7DQotCQlTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoY2gsIHN0YXJ0LCBsZW5ndGgpOw0KLQkJLy9vbmx5IHB1c2ggaWYgZGVzY3JpcHRpb24NCi0JCWludCBzdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7DQotCQlpZiAoc3RhdGUgPT0gU1RBVEVfREVTQ1JJUFRJT05fU0lURSB8fCBzdGF0ZSA9PSBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYpDQotCQkJb2JqZWN0U3RhY2sucHVzaCh0ZXh0KTsNCi0NCi0JfQ0KLQ0KLQkvKioNCi0JICogSGFuZGxlIGVycm9ycw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2Vycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgew0KLQkJbG9nU3RhdHVzKGV4KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSGFuZGxlIGZhdGFsIGVycm9ycw0KLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI2ZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24pDQotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJbG9nU3RhdHVzKGV4KTsNCi0JCXRocm93IGV4Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVJbml0aWFsU3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhTSVRFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9TSVRFKSk7DQotCQkJcHJvY2Vzc1NpdGUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2Ugew0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQNCi0JCQkvLyB3aGF0IHdlIHJlY2VpdmVkIHdhcyBub3QgYSBzaXRlLnhtbCwgbm8gbmVlZCB0byBjb250aW51ZQ0KLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLkludmFsaWRYTUxTdHJlYW0iKSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2l0ZVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9TSVRFKSk7DQotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7DQotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUkNISVZFKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7DQotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWV9ERUYpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOw0KLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZQ0KLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5Vbmtub3duRWxlbWVudCIsIGVsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7IC8vJE5PTi1OTFMtMSQgCQkJDQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUZlYXR1cmVTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fU0lURSkpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOw0KLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOw0KLQkJCXByb2Nlc3NBcmNoaXZlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsNCi0JCQlwcm9jZXNzQ2F0ZWdvcnlEZWYoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUlkpKTsNCi0JCQlwcm9jZXNzQ2F0ZWdvcnkoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOyAvLyROT04tTkxTLTEkIAkJCQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVDYXRlZ29yeURlZlN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0ZFQVRVUkUpKTsNCi0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEFSQ0hJVkUpKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0FSQ0hJVkUpKTsNCi0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsNCi0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZX0RFRikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUllfREVGKSk7DQotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7DQotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRikpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlDQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLlVua25vd25FbGVtZW50IiwgZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSkpKTsJLy8kTk9OLU5MUy0xJCAJCQkNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2F0ZWdvcnlTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fU0lURSkpOw0KLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOw0KLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOw0KLQkJCXByb2Nlc3NBcmNoaXZlKGF0dHJpYnV0ZXMpOw0KLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgew0KLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsNCi0JCQlwcm9jZXNzQ2F0ZWdvcnlEZWYoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWSkpIHsNCi0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUlkpKTsNCi0JCQlwcm9jZXNzQ2F0ZWdvcnkoYXR0cmlidXRlcyk7DQotCQl9IGVsc2UNCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93bkVsZW1lbnQiLCBlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOy8vJE5PTi1OTFMtMSQgCQkJDQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3Mgc2l0ZSBpbmZvDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1NpdGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsNCi0JCS8vIGNyZWF0ZSBzaXRlIG1hcA0KLQkJU2l0ZU1vZGVsIHNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGVNYXBNb2RlbCgpOw0KLQ0KLQkJLy8gaWYgVVJMIGlzIHNwZWNpZmllZCwgaXQgcmVwbGFjZXMgdGhlIFVSTCBvZiB0aGUgc2l0ZQ0KLQkJLy8gdXNlZCB0byBjYWxjdWxhdGUgdGhlIGxvY2F0aW9uIG9mIGZlYXR1cmVzIGFuZCBhcmNoaXZlcw0KLQkJU3RyaW5nIHNpdGVVUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKHNpdGVVUkwgIT0gbnVsbCAmJiAhKCIiLmVxdWFscyhzaXRlVVJMLnRyaW0oKSkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAoIXNpdGVVUkwuZW5kc1dpdGgoIi8iKSAmJiAhc2l0ZVVSTC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlzaXRlVVJMICs9ICIvIjsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlzaXRlLnNldExvY2F0aW9uVVJMU3RyaW5nKHNpdGVVUkwpOw0KLQkJfQ0KLQ0KLQkJLy8gcHJvdmlkZSBkZWZhdWx0IGRlc2NyaXB0aW9uIFVSTA0KLQkJLy8gSWYgPGRlc2NyaXB0aW9uPiBpcyBzcGVjaWZpZWQsIGZvciB0aGUgc2l0ZSwgIGl0IHRha2VzIHByZWNlZGVuY2UJCQ0KLQkJVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbiA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJZGVzY3JpcHRpb24uc2V0VVJMU3RyaW5nKERFRkFVTFRfSU5GT19VUkwpOw0KLQkJc2l0ZS5zZXREZXNjcmlwdGlvbk1vZGVsKGRlc2NyaXB0aW9uKTsNCi0NCi0JCS8vIHZlcmlmeSB3ZSBjYW4gcGFyc2UgdGhlIHNpdGUgLi4uaWYgdGhlIHNpdGUgaGFzDQotCQkvLyBhIGRpZmZlcmVudCB0eXBlIHRocm93IGFuIGV4Y2VwdGlvbiB0byBmb3JjZSByZXBhcnNpbmcNCi0JCS8vIHdpdGggdGhlIG1hdGNoaW5nIHBhcnNlcg0KLQkJU3RyaW5nIHR5cGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0eXBlIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmICghZmFjdG9yeS5jYW5QYXJzZVNpdGVUeXBlKHR5cGUpKSB7DQotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihuZXcgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uKHR5cGUpKTsNCi0JCX0NCi0JCXNpdGUuc2V0VHlwZSh0eXBlKTsNCi0JCW9iamVjdFN0YWNrLnB1c2goc2l0ZSk7DQotDQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykNCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3MgU2l0ZSB0YWc6IHNpdGVVUkw6IiArIHNpdGVVUkwgKyAiIHR5cGU6IiArIHR5cGUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIGZlYXR1cmUgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsNCi0JCVN0cmluZyB1cmxJbmZvID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmICh1cmxJbmZvID09IG51bGwgfHwgdXJsSW5mby50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCWludGVybmFsRXJyb3IoUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLk1pc3NpbmciLCAidXJsIiwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOwkvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkDQotDQotCQlmZWF0dXJlLnNldFVSTFN0cmluZyh1cmxJbmZvKTsNCi0NCi0JCVN0cmluZyB0eXBlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkDQotCQlmZWF0dXJlLnNldFR5cGUodHlwZSk7DQotDQotCQkvLyBpZGVudGlmaWVyIGFuZCB2ZXJzaW9uDQotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkDQotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkDQotDQotCQkvLyBpZiBvbmUgaXMgbnVsbCwgYW5kIG5vdCB0aGUgb3RoZXINCi0JCWlmICgoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJXiAodmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgaWQsIHZlciwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX07DQotCQkJVXBkYXRlQ29yZS53YXJuKFBvbGljeS5iaW5kKCJEZWZhdWx0RmVhdHVyZVBhcnNlci5JZE9yVmVyc2lvbkludmFsaWQiLCB2YWx1ZXMpKTsvLyROT04tTkxTLTEkDQotCQl9IGVsc2Ugew0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZUlkZW50aWZpZXIoaWQpOw0KLQkJCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24odmVyKTsNCi0JCX0NCi0NCi0JCS8vIGdldCBsYWJlbCBpZiBpdCBleGlzdHMNCi0JCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChsYWJlbCAhPSBudWxsKSB7DQotCQkJaWYgKCIiLmVxdWFscyhsYWJlbC50cmltKCkpKSAvLyROT04tTkxTLTEkDQotCQkJCWxhYmVsID0gbnVsbDsNCi0JCX0NCi0JCWZlYXR1cmUuc2V0TGFiZWwobGFiZWwpOw0KLQ0KLQkJLy8gT1MNCi0JCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZlYXR1cmUuc2V0T1Mob3MpOw0KLQ0KLQkJLy8gV1MNCi0JCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZlYXR1cmUuc2V0V1Mod3MpOw0KLQ0KLQkJLy8gTkwNCi0JCVN0cmluZyBubCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5sIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZlYXR1cmUuc2V0TkwobmwpOw0KLQ0KLQkJLy8gYXJjaA0KLQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZlYXR1cmUuc2V0QXJjaChhcmNoKTsNCi0NCi0JCS8vcGF0Y2gNCi0JCVN0cmluZyBwYXRjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGNoIik7IC8vJE5PTi1OTFMtMSQNCi0JCWZlYXR1cmUuc2V0UGF0Y2gocGF0Y2gpOw0KLQ0KLQkJU2l0ZU1vZGVsIHNpdGUgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7DQotCQlzaXRlLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlKTsNCi0JCWZlYXR1cmUuc2V0U2l0ZU1vZGVsKHNpdGUpOw0KLQ0KLQkJb2JqZWN0U3RhY2sucHVzaChmZWF0dXJlKTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJFbmQgUHJvY2Vzc2luZyBEZWZhdWx0RmVhdHVyZSBUYWc6IHVybDoiICsgdXJsSW5mbyArICIgdHlwZToiICsgdHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIGFyY2hpdmUgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBcmNoaXZlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgew0KLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGFyY2hpdmUgPSBmYWN0b3J5LmNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpOw0KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGF0aCIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJaW50ZXJuYWxFcnJvcihQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuTWlzc2luZyIsICJwYXRoIiwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKSkpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlhcmNoaXZlLnNldFBhdGgoaWQpOw0KLQ0KLQkJU3RyaW5nIHVybCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAodXJsID09IG51bGwgfHwgdXJsLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQlpbnRlcm5hbEVycm9yKFBvbGljeS5iaW5kKCJEZWZhdWx0U2l0ZVBhcnNlci5NaXNzaW5nIiwgImFyY2hpdmUiLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpKSk7CS8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQNCi0JCX0gZWxzZSB7DQotCQkJYXJjaGl2ZS5zZXRVUkxTdHJpbmcodXJsKTsNCi0NCi0JCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCQlzaXRlLmFkZEFyY2hpdmVSZWZlcmVuY2VNb2RlbChhcmNoaXZlKTsNCi0JCX0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJFbmQgcHJvY2Vzc2luZyBBcmNoaXZlOiBwYXRoOiIgKyBpZCArICIgdXJsOiIgKyB1cmwpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQ0KLQl9DQotDQotCS8qIA0KLQkgKiBwcm9jZXNzIHRoZSBDYXRlZ29yeSAgaW5mbw0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDYXRlZ29yeShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCVN0cmluZyBjYXRlZ29yeSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlID0gKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCWZlYXR1cmUuYWRkQ2F0ZWdvcnlOYW1lKGNhdGVnb3J5KTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJFbmQgcHJvY2Vzc2luZyBDYXRlZ29yeTogbmFtZToiICsgY2F0ZWdvcnkpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgY2F0ZWdvcnkgZGVmIGluZm8NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ2F0ZWdvcnlEZWYoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7DQotCQlDYXRlZ29yeU1vZGVsIGNhdGVnb3J5ID0gZmFjdG9yeS5jcmVhdGVTaXRlQ2F0ZWdvcnlNb2RlbCgpOw0KLQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQNCi0JCWNhdGVnb3J5LnNldE5hbWUobmFtZSk7DQotCQljYXRlZ29yeS5zZXRMYWJlbChsYWJlbCk7DQotDQotCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsNCi0JCXNpdGUuYWRkQ2F0ZWdvcnlNb2RlbChjYXRlZ29yeSk7DQotCQlvYmplY3RTdGFjay5wdXNoKGNhdGVnb3J5KTsNCi0NCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCWRlYnVnKCJFbmQgcHJvY2Vzc2luZyBDYXRlZ29yeURlZjogbmFtZToiICsgbmFtZSArICIgbGFiZWw6IiArIGxhYmVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCX0NCi0NCi0JLyogDQotCSAqIHByb2Nlc3MgVVJMIGluZm8gd2l0aCBlbGVtZW50IHRleHQNCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5mbyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsNCi0JCVVSTEVudHJ5TW9kZWwgaW5mID0gZmFjdG9yeS5jcmVhdGVVUkxFbnRyeU1vZGVsKCk7DQotCQlTdHJpbmcgaW5mb1VSTCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkDQotCQlpbmYuc2V0VVJMU3RyaW5nKGluZm9VUkwpOw0KLQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpDQotCQkJZGVidWcoIlByb2Nlc3NlZCBJbmZvOiB1cmw6IiArIGluZm9VUkwpOyAvLyROT04tTkxTLTEkDQotDQotCQlvYmplY3RTdGFjay5wdXNoKGluZik7DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsNCi0JCVVwZGF0ZUNvcmUuZGVidWcoIkRlZmF1bHRTaXRlUGFyc2VyIiArIHMpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgbG9nU3RhdHVzKFNBWFBhcnNlRXhjZXB0aW9uIGV4KSB7DQotCQlTdHJpbmcgbmFtZSA9IGV4LmdldFN5c3RlbUlkKCk7DQotCQlpZiAobmFtZSA9PSBudWxsKQ0KLQkJCW5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJZWxzZQ0KLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxICsgbmFtZS5sYXN0SW5kZXhPZigiLyIpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJU3RyaW5nIG1zZzsNCi0JCWlmIChuYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQNCi0JCQltc2cgPSBQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuRXJyb3JQYXJzaW5nIiwgZXguZ2V0TWVzc2FnZSgpKTsJLy8kTk9OLU5MUy0xJA0KLQkJZWxzZSB7DQotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgbmFtZSwgSW50ZWdlci50b1N0cmluZyhleC5nZXRMaW5lTnVtYmVyKCkpLCBJbnRlZ2VyLnRvU3RyaW5nKGV4LmdldENvbHVtbk51bWJlcigpKSwgZXguZ2V0TWVzc2FnZSgpfTsNCi0JCQltc2cgPSBQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuRXJyb3JMaW5lQ29sdW1uTWVzc2FnZSIsIHZhbHVlcyk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIFBsYXRmb3JtLlBBUlNFX1BST0JMRU0sIG1zZywgZXgpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBIYW5kbGVzIGFuIGVycm9yIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3RhdHVzLiAgVGhlIGNvbGxlY3Rpb24gb2YgYWxsIGxvZ2dlZCBzdGF0dXMNCi0JICogb2JqZWN0cyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgPGNvZGU+Z2V0U3RhdHVzKCk8L2NvZGU+Lg0KLQkgKg0KLQkgKiBAcGFyYW0gZXJyb3IgYSBzdGF0dXMgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBlcnJvcihJU3RhdHVzIGVycm9yKSB7DQotDQotCQlpZiAoc3RhdHVzID09IG51bGwpIHsNCi0JCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoUExVR0lOX0lELCBQbGF0Zm9ybS5QQVJTRV9QUk9CTEVNLCBQb2xpY3kuYmluZCgiRGVmYXVsdFNpdGVQYXJzZXIuRXJyb3JQYXJzaW5nU2l0ZSIpLCBudWxsKTsvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQlzdGF0dXMuYWRkKGVycm9yKTsNCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKQ0KLQkJCVVwZGF0ZUNvcmUubG9nKGVycm9yKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEVycm9yVW5rbm93blRhZyhTdHJpbmcgbXNnKSB7DQotCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfSUdOT1JFRF9FTEVNRU5UKSk7DQotCQlpbnRlcm5hbEVycm9yKG1zZyk7DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxFcnJvcihTdHJpbmcgbWVzc2FnZSkgew0KLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm4gdGhlIHN0YXRlIGFzIFN0cmluZw0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoaW50IHN0YXRlKSB7DQotDQotCQlzd2l0Y2ggKHN0YXRlKSB7DQotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOg0KLQkJCQlyZXR1cm4gIklnbm9yZWQiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoNCi0JCQkJcmV0dXJuICJJbml0aWFsIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfU0lURSA6DQotCQkJCXJldHVybiAiU2l0ZSI7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOg0KLQkJCQlyZXR1cm4gIkZlYXR1cmUiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoNCi0JCQkJcmV0dXJuICJBcmNoaXZlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOg0KLQkJCQlyZXR1cm4gIkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoNCi0JCQkJcmV0dXJuICJDYXRlZ29yeSBEZWYiOyAvLyROT04tTkxTLTEkDQotDQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgOg0KLQkJCQlyZXR1cm4gIkRlc2NyaXB0aW9uIC8gQ2F0ZWdvcnkgRGVmIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fU0lURSA6DQotCQkJCXJldHVybiAiRGVzY3JpcHRpb24gLyBTaXRlIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWRlZmF1bHQgOg0KLQkJCQlyZXR1cm4gUG9saWN5LmJpbmQoIkRlZmF1bHRTaXRlUGFyc2VyLlVua25vd25TdGF0ZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JcHJpdmF0ZSBib29sZWFuIGxlYWRpbmdTcGFjZShTdHJpbmcgc3RyKSB7DQotCQlpZiAoc3RyLmxlbmd0aCgpIDw9IDApIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KDApKTsNCi0JfQ0KLQlwcml2YXRlIGJvb2xlYW4gdHJhaWxpbmdTcGFjZShTdHJpbmcgc3RyKSB7DQotCQlpZiAoc3RyLmxlbmd0aCgpIDw9IDApIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KHN0ci5sZW5ndGgoKSAtIDEpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9GZWF0dXJlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwN2UzMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBGZWF0dXJlIG1vZGVsIG9iamVjdC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmUNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEZlYXR1cmVNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOw0KLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlVmVyc2lvbjsNCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7DQotCXByaXZhdGUgU3RyaW5nIGxvY2FsaXplZExhYmVsOw0KLQlwcml2YXRlIFN0cmluZyBwcm92aWRlcjsNCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYWxpemVkUHJvdmlkZXI7DQotCXByaXZhdGUgU3RyaW5nIGltYWdlVVJMU3RyaW5nOw0KLQlwcml2YXRlIFVSTCBpbWFnZVVSTDsNCi0JcHJpdmF0ZSBTdHJpbmcgb3M7DQotCXByaXZhdGUgU3RyaW5nIHdzOw0KLQlwcml2YXRlIFN0cmluZyBubDsNCi0JcHJpdmF0ZSBTdHJpbmcgYXJjaDsNCi0JcHJpdmF0ZSBib29sZWFuIHByaW1hcnkgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGV4Y2x1c2l2ZT1mYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgcHJpbWFyeVBsdWdpbklEOw0KLQlwcml2YXRlIFN0cmluZyBhcHBsaWNhdGlvbjsNCi0JcHJpdmF0ZSBTdHJpbmcgYWZmaW5pdHk7DQotCXByaXZhdGUgSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsIGluc3RhbGxIYW5kbGVyOw0KLQlwcml2YXRlIFVSTEVudHJ5TW9kZWwgZGVzY3JpcHRpb247DQotCXByaXZhdGUgVVJMRW50cnlNb2RlbCBjb3B5cmlnaHQ7DQotCXByaXZhdGUgVVJMRW50cnlNb2RlbCBsaWNlbnNlOw0KLQlwcml2YXRlIFVSTEVudHJ5TW9kZWwgdXBkYXRlU2l0ZUluZm87DQotCXByaXZhdGUgTGlzdCAvKm9mIEluZm9Nb2RlbCovDQotCWRpc2NvdmVyeVNpdGVJbmZvOw0KLQlwcml2YXRlIExpc3QgLypvZiBJbXBvcnRNb2RlbCovDQotCWltcG9ydHM7DQotCXByaXZhdGUgTGlzdCAvKm9mIFBsdWdpbkVudHJ5TW9kZWwqLw0KLQlwbHVnaW5FbnRyaWVzOw0KLQlwcml2YXRlIExpc3QgLypvZiBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCAqLw0KLQlmZWF0dXJlSW5jbHVkZXM7DQotCXByaXZhdGUgTGlzdCAvKm9mIE5vblBsdWdpbkVudHJ5TW9kZWwqLw0KLQlub25QbHVnaW5FbnRyaWVzOw0KLQ0KLQkvLyBwZXJmb3JtYW5jZQ0KLQlwcml2YXRlIFVSTCBidW5kbGVVUkw7DQotCXByaXZhdGUgVVJMIGJhc2U7DQotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGZlYXR1cmUgb2JqZWN0Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbXBhcmVzIDIgZmVhdHVyZSBtb2RlbHMgZm9yIGVxdWFsaXR5DQotCSAqICANCi0JICogQHBhcmFtIG9iaiBmZWF0dXJlIG1vZGVsIHRvIGNvbXBhcmUgd2l0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gbW9kZWxzIGFyZSBlcXVhbCwgDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsNCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEZlYXR1cmVNb2RlbCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJRmVhdHVyZU1vZGVsIG1vZGVsID0gKEZlYXR1cmVNb2RlbCkgb2JqOw0KLQ0KLQkJcmV0dXJuIChmZWF0dXJlSWQudG9Mb3dlckNhc2UoKS5lcXVhbHMobW9kZWwuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSkgJiYgZmVhdHVyZVZlcnNpb24udG9Mb3dlckNhc2UoKS5lcXVhbHMobW9kZWwuZ2V0RmVhdHVyZVZlcnNpb24oKSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIgYXMgYSBzdHJpbmcNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpDQotCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5DQotCQlyZXR1cm4gZmVhdHVyZUlkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHZlcnNpb24gYXMgYSBzdHJpbmcNCi0JICogDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpDQotCSAqIEByZXR1cm4gZmVhdHVyZSB2ZXJzaW9uIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgew0KLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheQ0KLQkJcmV0dXJuIGZlYXR1cmVWZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBmZWF0dXJlLiBJZiB0aGUgbW9kZWwNCi0JICogb2JqZWN0IGhhcyBiZWVuIHJlc29sdmVkLCB0aGUgbGFiZWwgaXMgbG9jYWxpemVkLg0KLQkgKiANCi0JICogQHJldHVybiBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7DQotCQlkZWxheWVkUmVzb2x2ZSgpOw0KLQkJaWYgKGxvY2FsaXplZExhYmVsICE9IG51bGwpDQotCQkJcmV0dXJuIGxvY2FsaXplZExhYmVsOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwgZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiANCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbE5vbkxvY2FsaXplZCgpIHsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0cmlldmUgdGhlIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgZmVhdHVyZSBwcm92aWRlci4gSWYgdGhlIG1vZGVsDQotCSAqIG9iamVjdCBoYXMgYmVlbiByZXNvbHZlZCwgdGhlIGxhYmVsIGlzIGxvY2FsaXplZC4NCi0JICogDQotCSAqIEByZXR1cm4gZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCkgew0KLQkJZGVsYXllZFJlc29sdmUoKTsNCi0JCWlmIChsb2NhbGl6ZWRQcm92aWRlciAhPSBudWxsKQ0KLQkJCXJldHVybiBsb2NhbGl6ZWRQcm92aWRlcjsNCi0JCWVsc2UNCi0JCQlyZXR1cm4gcHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgZmVhdHVyZSBwcm92aWRlci4NCi0JICogDQotCSAqIEByZXR1cm4gbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOb25Mb2NhbGl6ZWQoKSB7DQotCQlyZXR1cm4gcHJvdmlkZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIGZlYXR1cmUgaW1hZ2UuDQotCSAqDQotCSAqIEByZXR1cm4gdXJsIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJbWFnZVVSTFN0cmluZygpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlyZXR1cm4gaW1hZ2VVUkxTdHJpbmc7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlc29sdmVkIFVSTCBmb3IgdGhlIGltYWdlLg0KLQkgKiANCi0JICogQHJldHVybiB1cmwsIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkwgZ2V0SW1hZ2VVUkwoKSB7DQotCQlkZWxheWVkUmVzb2x2ZSgpOw0KLQkJcmV0dXJuIGltYWdlVVJMOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCkgew0KLQkJcmV0dXJuIG9zOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgb3B0aW9uYWwgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4NCi0JICogQHJldHVybiB0aGUgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0V1MoKSB7DQotCQlyZXR1cm4gd3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLg0KLQkgKiANCi0JICogQHJldHVybiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCkgew0KLQkJcmV0dXJuIGFyY2g7DQotCX0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgew0KLQkJcmV0dXJuIG5sOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmVhdHVyZSBjYW4gYmUgdXNlZCBhcyBhIHByaW1hcnkgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBpcyBhIHByaW1hcnkgZmVhdHVyZSwgDQotCSAqIG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5KCkgew0KLQkJcmV0dXJuIHByaW1hcnk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZmVhdHVyZSBtdXN0IGJlIHByb2Nlc3NlZCBhbG9uZQ0KLQkgKiBkdXJpbmcgaW5zdGFsbGF0aW9uIGFuZCBjb25maWd1cmF0aW9uLiBGZWF0dXJlcyB0aGF0DQotCSAqIGFyZSBub3QgZXhjbHVzaXZlIGNhbiBiZSBpbnN0YWxsZWQgaW4gYSBiYXRjaC4NCi0JICogDQotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZmVhdHVyZSByZXF1aXJlcw0KLQkgKiBleGNsdXNpdmUgcHJvY2Vzc2luZywgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdXNpdmUoKSB7DQotCQlyZXR1cm4gZXhjbHVzaXZlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBmZWF0dXJlIGFwcGxpY2F0aW9uDQotCSAqIA0KLQkgKiBAcmV0dXJuIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uKCkgew0KLQkJcmV0dXJuIGFwcGxpY2F0aW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgZm9yIHRoZSBjb2xvY2F0aW9uIGFmZmluaXR5IGZlYXR1cmUNCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRBZmZpbml0eUZlYXR1cmUoKSB7DQotCQlyZXR1cm4gYWZmaW5pdHk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYW5kIG9wdGlvbmFsIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgZW50cnkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGluc3RhbGwgaGFuZGxlciBlbnRyeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYNCi0JICogbm9uZSB3YXMgc3BlY2lmaWVkDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgZ2V0SW5zdGFsbEhhbmRsZXJNb2RlbCgpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXkNCi0JCXJldHVybiBpbnN0YWxsSGFuZGxlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbi4NCi0JICogDQotCSAqIEByZXR1cm4gZmVhdHVyZSByZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGdldERlc2NyaXB0aW9uTW9kZWwoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5DQotCQlyZXR1cm4gZGVzY3JpcHRpb247DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGNvcHlyaWdodCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGNvcHlyaWdodCBpbmZvcm1hdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGdldENvcHlyaWdodE1vZGVsKCkgew0KLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheQ0KLQkJcmV0dXJuIGNvcHlyaWdodDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbGljZW5zZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGZlYXR1cmUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbGljZW5zZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGdldExpY2Vuc2VNb2RlbCgpIHsNCi0JCS8vZGVsYXllZFJlc29sdmUoKTsgbm8gZGVsYXk7DQotCQlyZXR1cm4gbGljZW5zZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBpbmZvcm1hdGlvbiBlbnRyeSByZWZlcmVuY2luZyB0aGUgbG9jYXRpb24gb2YgdGhlDQotCSAqIGZlYXR1cmUgdXBkYXRlIHNpdGUuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVwZGF0ZSBzaXRlIGVudHJ5LCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5Ow0KLQkJcmV0dXJuIHVwZGF0ZVNpdGVJbmZvOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gZW50cmllcyByZWZlcmVuY2luZyBsb2NhdGlvbnMgb2Ygb3RoZXINCi0JICogdXBkYXRlIHNpdGVzLiANCi0JICogDQotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2Ygc2l0ZSBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4NCi0JICogQHNpbmNlIDIuMCANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWxbXSBnZXREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbHMoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5Ow0KLQkJaWYgKGRpc2NvdmVyeVNpdGVJbmZvID09IG51bGwgfHwgZGlzY292ZXJ5U2l0ZUluZm8uc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBVUkxFbnRyeU1vZGVsWzBdOw0KLQ0KLQkJcmV0dXJuIChVUkxFbnRyeU1vZGVsW10pIGRpc2NvdmVyeVNpdGVJbmZvLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGRpc2NvdmVyeVNpdGVJbmZvKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybiBhIGxpc3Qgb2YgcGx1Zy1pbiBkZXBlbmRlbmNpZXMgZm9yIHRoaXMgZmVhdHVyZS4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcmVxdWlyZWQgcGx1Zy1pbiBkZXBlbmRlbmNpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW1wb3J0TW9kZWxbXSBnZXRJbXBvcnRNb2RlbHMoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5Ow0KLQkJaWYgKGltcG9ydHMgPT0gbnVsbCB8fCBpbXBvcnRzLnNpemUoKSA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSW1wb3J0TW9kZWxbMF07DQotDQotCQlyZXR1cm4gKEltcG9ydE1vZGVsW10pIGltcG9ydHMudG9BcnJheShhcnJheVR5cGVGb3IoaW1wb3J0cykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBsdWctaW4gZW50cmllcyByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBhbiBlcnJheSBvZiBwbHVnLWluIGVudHJpZXMsIG9yIGFuIGVtcHR5IGFycmF5Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgUGx1Z2luRW50cnlNb2RlbFtdIGdldFBsdWdpbkVudHJ5TW9kZWxzKCkgew0KLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLnNpemUoKSA9PSAwKQ0KLQkJCXJldHVybiBuZXcgUGx1Z2luRW50cnlNb2RlbFswXTsNCi0NCi0JCXJldHVybiAoUGx1Z2luRW50cnlNb2RlbFtdKSBwbHVnaW5FbnRyaWVzLnRvQXJyYXkoYXJyYXlUeXBlRm9yKHBsdWdpbkVudHJpZXMpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiB2ZXJzaW9uZWQgaWRlbnRpZmllciByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZQ0KLQkgKiANCi0JICogQHJldHVybiBhbiBhcnJheSBvZiB2ZXJzaW9uZWQgaWRlbnRpZmllciwgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRGZWF0dXJlSW5jbHVkZUlkZW50aWZpZXIgaW5zdGVhZC4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFZlcnNpb25lZElkZW50aWZpZXJbXSBnZXRGZWF0dXJlSW5jbHVkZVZlcnNpb25lZElkZW50aWZpZXIoKSB7DQotCQkvL2RlbGF5ZWRSZXNvbHZlKCk7IG5vIGRlbGF5DQotCQlpZiAoZmVhdHVyZUluY2x1ZGVzID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyWzBdOw0KLQ0KLQkJLy8NCi0JCUl0ZXJhdG9yIGl0ZXIgPSBmZWF0dXJlSW5jbHVkZXMuaXRlcmF0b3IoKTsNCi0JCVZlcnNpb25lZElkZW50aWZpZXJbXSB2ZXJzaW9uSW5jbHVkZWQgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcltmZWF0dXJlSW5jbHVkZXMuc2l6ZSgpXTsNCi0JCWludCBpbmRleCA9IDA7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCi0JCQlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBtb2RlbCA9IChJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgaXRlci5uZXh0KCk7DQotCQkJdmVyc2lvbkluY2x1ZGVkW2luZGV4XSA9IG1vZGVsLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCQlpbmRleCsrOw0KLQkJfQ0KLQkJcmV0dXJuIHZlcnNpb25JbmNsdWRlZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZS4NCi0JICoNCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCwgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0RmVhdHVyZUluY2x1ZGVkKCkgew0KLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheQ0KLQkJaWYgKGZlYXR1cmVJbmNsdWRlcyA9PSBudWxsIHx8IGZlYXR1cmVJbmNsdWRlcy5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbMF07DQotCQlyZXR1cm4gKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSkgZmVhdHVyZUluY2x1ZGVzLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGZlYXR1cmVJbmNsdWRlcykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIG5vbi1wbHVnLWluIGVudHJpZXMgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUNCi0JICogDQotCSAqIEByZXR1cm4gYW4gZXJyYXkgb2Ygbm9uLXBsdWctaW4gZW50cmllcywgb3IgYW4gZW1wdHkgYXJyYXkuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBOb25QbHVnaW5FbnRyeU1vZGVsW10gZ2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoKSB7DQotCQlpZiAobm9uUGx1Z2luRW50cmllcyA9PSBudWxsIHx8IG5vblBsdWdpbkVudHJpZXMuc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBOb25QbHVnaW5FbnRyeU1vZGVsWzBdOw0KLQ0KLQkJcmV0dXJuIChOb25QbHVnaW5FbnRyeU1vZGVsW10pIG5vblBsdWdpbkVudHJpZXMudG9BcnJheShhcnJheVR5cGVGb3Iobm9uUGx1Z2luRW50cmllcykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZUlkIGZlYXR1cmUgaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlSWRlbnRpZmllcihTdHJpbmcgZmVhdHVyZUlkKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgdmVyc2lvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlVmVyc2lvbiBmZWF0dXJlIHZlcnNpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVZlcnNpb24oU3RyaW5nIGZlYXR1cmVWZXJzaW9uKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5mZWF0dXJlVmVyc2lvbiA9IGZlYXR1cmVWZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGRpc3BsYXlhYmxlIGxhYmVsLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGxhYmVsIGRpc3BsYXlhYmxlIGxhYmVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMubGFiZWwgPSBsYWJlbDsNCi0JCXRoaXMubG9jYWxpemVkTGFiZWwgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHByb3ZpZGVyIGRpc3BsYXlhYmxlIGxhYmVsLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIHByb3ZpZGVyIHByb3ZpZGVyIGRpc3BsYXlhYmxlIGxhYmVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFByb3ZpZGVyKFN0cmluZyBwcm92aWRlcikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsNCi0JCXRoaXMubG9jYWxpemVkUHJvdmlkZXIgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB1bnJlc29sdmVkIFVSTCBmb3IgdGhlIGZlYXR1cmUgaW1hZ2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW1hZ2VVUkxTdHJpbmcgdW5yZXNvbHZlZCBVUkwgc3RyaW5nDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEltYWdlVVJMU3RyaW5nKFN0cmluZyBpbWFnZVVSTFN0cmluZykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuaW1hZ2VVUkxTdHJpbmcgPSBpbWFnZVVSTFN0cmluZzsNCi0JCXRoaXMuaW1hZ2VVUkwgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gb3Mgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0T1MoU3RyaW5nIG9zKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5vcyA9IG9zOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gd3Mgd2luZG93aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0V1MoU3RyaW5nIHdzKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy53cyA9IHdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBubCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE5MKFN0cmluZyBubCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMubmwgPSBubDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGFyY2ggc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0QXJjaChTdHJpbmcgYXJjaCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuYXJjaCA9IGFyY2g7DQotCX0NCi0NCi0JLyoqDQotCSAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgZmVhdHVyZSBjYW4gYWN0IGFzIGEgcHJpbWFyeSBmZWF0dXJlLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIHByaW1hcnkgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBmZWF0dXJlIGNhbiBhY3QgYXMgcHJpbWFyeSwNCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQ0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UHJpbWFyeShib29sZWFuIHByaW1hcnkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnByaW1hcnkgPSBwcmltYXJ5Ow0KLQl9DQotCQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBmZWF0dXJlIGNhbiBhY3QgYXMgYSBwcmltYXJ5IGZlYXR1cmUuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gZXhjbHVzaXZlIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgZmVhdHVyZSBtdXN0IGJlDQotCSAqIHByb2Nlc3NlZCBpbmRlcGVuZGVudGx5IGZyb20gb3RoZXIgZmVhdHVyZXMsIDxjb2RlPmZhbHNlPC9jb2RlPiANCi0JICogaWYgZmVhdHVyZSBjYW4gYmUgcHJvY2Vzc2VkIGluIGEgYmF0Y2ggd2l0aCBvdGhlciBmZWF0dXJlcy4NCi0JICogDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEV4Y2x1c2l2ZShib29sZWFuIGV4Y2x1c2l2ZSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuZXhjbHVzaXZlID0gZXhjbHVzaXZlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGFwcGxpY2F0aW9uIGlkZW50aWZpZXIuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gYXBwbGljYXRpb24gZmVhdHVyZSBhcHBsaWNhdGlvbiBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyBhcHBsaWNhdGlvbikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgaWRlbnRpZmllciBvZiB0aGUgRmVhdHVyZSB0aGlzIGZlYXR1cmUgc2hvdWxkIGJlDQotCSAqIGluc3RhbGxlZCB3aXRoLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGFmZmluaXR5IHRoZSBpZGVudGlmaWVyIG9mIHRoZSBGZWF0dXJlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFmZmluaXR5RmVhdHVyZShTdHJpbmcgYWZmaW5pdHkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmFmZmluaXR5ID0gYWZmaW5pdHk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgZm9yIHRoZSBmZWF0dXJlLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGluc3RhbGxIYW5kbGVyIGluc3RhbGwgaGFuZGxlciBlbnRyeQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsSGFuZGxlck1vZGVsKEluc3RhbGxIYW5kbGVyRW50cnlNb2RlbCBpbnN0YWxsSGFuZGxlcikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuaW5zdGFsbEhhbmRsZXIgPSBpbnN0YWxsSGFuZGxlcjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBkZXNjcmlwdGlvbiBpbmZvcm1hdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBmZWF0dXJlIGRlc2NyaXB0aW9uIGluZm9ybWF0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uTW9kZWwoVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbikgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSBjb3B5cmlnaHQgaW5mb3JtYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gY29weXJpZ2h0IGZlYXR1cmUgY29weXJpZ2h0IGluZm9ybWF0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodE1vZGVsKFVSTEVudHJ5TW9kZWwgY29weXJpZ2h0KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5jb3B5cmlnaHQgPSBjb3B5cmlnaHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgbGljZW5zZSBpbmZvcm1hdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBsaWNlbnNlIGZlYXR1cmUgbGljZW5zZSBpbmZvcm1hdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlTW9kZWwoVVJMRW50cnlNb2RlbCBsaWNlbnNlKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5saWNlbnNlID0gbGljZW5zZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZmVhdHVyZSB1cGRhdGUgc2l0ZSByZWZlcmVuY2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gdXBkYXRlU2l0ZUluZm8gZmVhdHVyZSB1cGRhdGUgc2l0ZSByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoVVJMRW50cnlNb2RlbCB1cGRhdGVTaXRlSW5mbykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudXBkYXRlU2l0ZUluZm8gPSB1cGRhdGVTaXRlSW5mbzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyBhZGRpdGlvbmFsIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZXMuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gZGlzY292ZXJ5U2l0ZUluZm8gYWRkaXRpb25hbCB1cGRhdGUgc2l0ZSByZWZlcmVuY2VzDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscyhVUkxFbnRyeU1vZGVsW10gZGlzY292ZXJ5U2l0ZUluZm8pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAoZGlzY292ZXJ5U2l0ZUluZm8gPT0gbnVsbCkNCi0JCQl0aGlzLmRpc2NvdmVyeVNpdGVJbmZvID0gbnVsbDsNCi0JCWVsc2UNCi0JCQl0aGlzLmRpc2NvdmVyeVNpdGVJbmZvID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGRpc2NvdmVyeVNpdGVJbmZvKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgcGx1Zy1pbiBkZXBlbmRlbmN5IGluZm9ybWF0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGltcG9ydHMgZmVhdHVyZSBwbHVnLWluIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SW1wb3J0TW9kZWxzKEltcG9ydE1vZGVsW10gaW1wb3J0cykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmIChpbXBvcnRzID09IG51bGwpDQotCQkJdGhpcy5pbXBvcnRzID0gbnVsbDsNCi0JCWVsc2UNCi0JCQl0aGlzLmltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoaW1wb3J0cykpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHBsdWctaW4gcmVmZXJlbmNlcy4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyaWVzIGZlYXR1cmUgcGx1Zy1pbiByZWZlcmVuY2VzDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbkVudHJ5TW9kZWxzKFBsdWdpbkVudHJ5TW9kZWxbXSBwbHVnaW5FbnRyaWVzKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCkNCi0JCQl0aGlzLnBsdWdpbkVudHJpZXMgPSBudWxsOw0KLQkJZWxzZQ0KLQkJCXRoaXMucGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChwbHVnaW5FbnRyaWVzKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgbm9uLXBsdWctaW4gZGF0YSByZWZlcmVuY2VzLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIG5vblBsdWdpbkVudHJpZXMgZmVhdHVyZSBub24tcGx1Zy1pbiBkYXRhIHJlZmVyZW5jZXMNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoTm9uUGx1Z2luRW50cnlNb2RlbFtdIG5vblBsdWdpbkVudHJpZXMpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAobm9uUGx1Z2luRW50cmllcyA9PSBudWxsKQ0KLQkJCXRoaXMubm9uUGx1Z2luRW50cmllcyA9IG51bGw7DQotCQllbHNlDQotCQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KG5vblBsdWdpbkVudHJpZXMpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBhbiBhZGRpdGlvbmFsIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBkaXNjb3ZlcnlTaXRlSW5mbyB1cGRhdGUgc2l0ZSByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkRGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWwoVVJMRW50cnlNb2RlbCBkaXNjb3ZlcnlTaXRlSW5mbykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmICh0aGlzLmRpc2NvdmVyeVNpdGVJbmZvID09IG51bGwpDQotCQkJdGhpcy5kaXNjb3ZlcnlTaXRlSW5mbyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWlmICghdGhpcy5kaXNjb3ZlcnlTaXRlSW5mby5jb250YWlucyhkaXNjb3ZlcnlTaXRlSW5mbykpDQotCQkJdGhpcy5kaXNjb3ZlcnlTaXRlSW5mby5hZGQoZGlzY292ZXJ5U2l0ZUluZm8pOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGEgcGx1Zy1pbiBkZXBlbmRlbmN5IGVudHJ5Lg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGltcG9ydEVudHJ5IHBsdWctaW4gZGVwZW5kZW5jeSBlbnRyeQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRJbXBvcnRNb2RlbChJbXBvcnRNb2RlbCBpbXBvcnRFbnRyeSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmICh0aGlzLmltcG9ydHMgPT0gbnVsbCkNCi0JCQl0aGlzLmltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlpZiAoIXRoaXMuaW1wb3J0cy5jb250YWlucyhpbXBvcnRFbnRyeSkpDQotCQkJdGhpcy5pbXBvcnRzLmFkZChpbXBvcnRFbnRyeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgYSBwbHVnLWluIHJlZmVyZW5jZS4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBwbHVnaW5FbnRyeSBwbHVnLWluIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeU1vZGVsKFBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnkpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQlpZiAodGhpcy5wbHVnaW5FbnRyaWVzID09IG51bGwpDQotCQkJdGhpcy5wbHVnaW5FbnRyaWVzID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJLy9QRVJGOiBubyBMaXN0Q29udGFpbnMoKQ0KLQkJLy9pZiAoIXRoaXMucGx1Z2luRW50cmllcy5jb250YWlucyhwbHVnaW5FbnRyeSkpDQotCQl0aGlzLnBsdWdpbkVudHJpZXMuYWRkKHBsdWdpbkVudHJ5KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQWRkcyBhIGZlYXR1cmUgaWRlbnRpZmllci4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogQHBhcmFtIGluY2x1ZGUgdGhlIGluY2x1ZGVkIGZlYXR1cmUNCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwoSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwgaW5jbHVkZSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCWlmICh0aGlzLmZlYXR1cmVJbmNsdWRlcyA9PSBudWxsKQ0KLQkJCXRoaXMuZmVhdHVyZUluY2x1ZGVzID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJLy9QRVJGOiBubyBMaXN0Q29udGFpbnMoKQ0KLQkJLy9pZiAoIXRoaXMuZmVhdHVyZUluY2x1ZGVzLmNvbnRhaW5zKGluY2x1ZGUpKQ0KLQkJdGhpcy5mZWF0dXJlSW5jbHVkZXMuYWRkKGluY2x1ZGUpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGEgbm9uLXBsdWctaW4gZGF0YSByZWZlcmVuY2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gbm9uUGx1Z2luRW50cnkgbm9uLXBsdWctaW4gZGF0YSByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkTm9uUGx1Z2luRW50cnlNb2RlbChOb25QbHVnaW5FbnRyeU1vZGVsIG5vblBsdWdpbkVudHJ5KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMubm9uUGx1Z2luRW50cmllcyA9PSBudWxsKQ0KLQkJCXRoaXMubm9uUGx1Z2luRW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCS8vUEVSRjogbm8gTGlzdENvbnRhaW5zKCkNCi0JCS8vaWYgKCF0aGlzLm5vblBsdWdpbkVudHJpZXMuY29udGFpbnMobm9uUGx1Z2luRW50cnkpKQ0KLQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzLmFkZChub25QbHVnaW5FbnRyeSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgYW4gdXBkYXRlIHNpdGUgcmVmZXJlbmNlLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHBhcmFtIGRpc2NvdmVyeVNpdGVJbmZvIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVEaXNjb3ZlcnlTaXRlRW50cnlNb2RlbChVUkxFbnRyeU1vZGVsIGRpc2NvdmVyeVNpdGVJbmZvKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMuZGlzY292ZXJ5U2l0ZUluZm8gIT0gbnVsbCkNCi0JCQl0aGlzLmRpc2NvdmVyeVNpdGVJbmZvLnJlbW92ZShkaXNjb3ZlcnlTaXRlSW5mbyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJlbW92ZXMgYSBwbHVnLWluIGRlcGVuZGVuY3kgZW50cnkuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gaW1wb3J0RW50cnkgcGx1Zy1pbiBkZXBlbmRlbmN5IGVudHJ5DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUltcG9ydE1vZGVsKEltcG9ydE1vZGVsIGltcG9ydEVudHJ5KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMuaW1wb3J0cyAhPSBudWxsKQ0KLQkJCXRoaXMuaW1wb3J0cy5yZW1vdmUoaW1wb3J0RW50cnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIGEgcGx1Zy1pbiByZWZlcmVuY2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gcGx1Z2luRW50cnkgcGx1Zy1pbiByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlUGx1Z2luRW50cnlNb2RlbChQbHVnaW5FbnRyeU1vZGVsIHBsdWdpbkVudHJ5KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMucGx1Z2luRW50cmllcyAhPSBudWxsKQ0KLQkJCXRoaXMucGx1Z2luRW50cmllcy5yZW1vdmUocGx1Z2luRW50cnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZW1vdmVzIGEgbm9uLXBsdWctaW4gZGF0YSByZWZlcmVuY2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gbm9uUGx1Z2luRW50cnkgbm9uLXBsdWctaW4gZGF0YSByZWZlcmVuY2UNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlTm9uUGx1Z2luRW50cnlNb2RlbChOb25QbHVnaW5FbnRyeU1vZGVsIG5vblBsdWdpbkVudHJ5KSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJaWYgKHRoaXMubm9uUGx1Z2luRW50cmllcyAhPSBudWxsKQ0KLQkJCXRoaXMubm9uUGx1Z2luRW50cmllcy5yZW1vdmUobm9uUGx1Z2luRW50cnkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNYXJrcyB0aGUgbW9kZWwgb2JqZWN0IGFzIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIG1hcmtSZWFkT25seSgpIHsNCi0JCXN1cGVyLm1hcmtSZWFkT25seSgpOw0KLQkJbWFya1JlZmVyZW5jZVJlYWRPbmx5KGdldERlc2NyaXB0aW9uTW9kZWwoKSk7DQotCQltYXJrUmVmZXJlbmNlUmVhZE9ubHkoZ2V0Q29weXJpZ2h0TW9kZWwoKSk7DQotCQltYXJrUmVmZXJlbmNlUmVhZE9ubHkoZ2V0TGljZW5zZU1vZGVsKCkpOw0KLQkJbWFya1JlZmVyZW5jZVJlYWRPbmx5KGdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCkpOw0KLQkJbWFya0xpc3RSZWZlcmVuY2VSZWFkT25seShnZXREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbHMoKSk7DQotCQltYXJrTGlzdFJlZmVyZW5jZVJlYWRPbmx5KGdldEltcG9ydE1vZGVscygpKTsNCi0JCW1hcmtMaXN0UmVmZXJlbmNlUmVhZE9ubHkoZ2V0UGx1Z2luRW50cnlNb2RlbHMoKSk7DQotCQltYXJrTGlzdFJlZmVyZW5jZVJlYWRPbmx5KGdldE5vblBsdWdpbkVudHJ5TW9kZWxzKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuDQotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSANCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUNCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgDQotCSAqIHJlc291cmNlIGJ1bmRsZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlIFVSTA0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSB1cmwNCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSxVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCXRoaXMuYnVuZGxlVVJMID0gYnVuZGxlVVJMOw0KLQkJdGhpcy5iYXNlID0gYmFzZTsNCi0NCi0JCS8vIHBsdWdpbiBlbnRyeSBhbmQgbm9ucGx1Z2luZW50cnkgYXJlIG9wdGltaXplZCB0b28NCi0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldFBsdWdpbkVudHJ5TW9kZWxzKCksIGJhc2UsIGJ1bmRsZVVSTCk7DQotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXROb25QbHVnaW5FbnRyeU1vZGVscygpLCBiYXNlLCBidW5kbGVVUkwpOw0KLQkJDQotCQkvL1VSTFNpdGVNb2RlbCBhcmUgb3B0aW1pemVkDQotCQlyZXNvbHZlUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uTW9kZWwoKSxiYXNlLCBidW5kbGVVUkwpOw0KLQkJcmVzb2x2ZVJlZmVyZW5jZShnZXRDb3B5cmlnaHRNb2RlbCgpLGJhc2UsIGJ1bmRsZVVSTCk7DQotCQlyZXNvbHZlUmVmZXJlbmNlKGdldExpY2Vuc2VNb2RlbCgpLGJhc2UsIGJ1bmRsZVVSTCk7DQotCQlyZXNvbHZlUmVmZXJlbmNlKGdldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKCksYmFzZSwgYnVuZGxlVVJMKTsNCi0JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpLGJhc2UsIGJ1bmRsZVVSTCk7DQotCQkNCi0JCS8vIEltcG9ydCBNb2RlbHMgYXJlIG9wdGltaXplZA0KLQkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0SW1wb3J0TW9kZWxzKCksYmFzZSwgYnVuZGxlVVJMKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZGVsYXllZFJlc29sdmUoKSB7DQotDQotCQkvLyBQRVJGOiBkZWxheSByZXNvbHV0aW9uDQotCQlpZiAocmVzb2x2ZWQpDQotCQkJcmV0dXJuOw0KLQ0KLQkJcmVzb2x2ZWQgPSB0cnVlOw0KLQkJLy8gcmVzb2x2ZSBsb2NhbCBlbGVtZW50cw0KLQkJbG9jYWxpemVkTGFiZWwgPSByZXNvbHZlTkxTdHJpbmcoYnVuZGxlVVJMLCBsYWJlbCk7DQotCQlsb2NhbGl6ZWRQcm92aWRlciA9IHJlc29sdmVOTFN0cmluZyhidW5kbGVVUkwsIHByb3ZpZGVyKTsNCi0JCXRyeSB7DQotCQkJaW1hZ2VVUkwgPSByZXNvbHZlVVJMKGJhc2UsYnVuZGxlVVJMLCBpbWFnZVVSTFN0cmluZyk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7DQotCQkJVXBkYXRlQ29yZS53YXJuKCIiLGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBzZXRQcmltYXJ5UGx1Z2luLg0KLQkgKiBAcGFyYW0gcGx1Z2luDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQcmltYXJ5UGx1Z2luSUQoU3RyaW5nIHBsdWdpbikgew0KLQkJaWYgKHByaW1hcnkgJiYgcHJpbWFyeVBsdWdpbklEID09IG51bGwpIHsNCi0JCQlwcmltYXJ5UGx1Z2luSUQgPSBmZWF0dXJlSWQ7DQotCQl9DQotCQlwcmltYXJ5UGx1Z2luSUQgPSBwbHVnaW47DQotCX0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHByaW1hcnlQbHVnaW5JRC4NCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeVBsdWdpbklEKCkgew0KLQkJcmV0dXJuIHByaW1hcnlQbHVnaW5JRDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGZlYXR1cmUgaXMgcGF0Y2hpbmcgYW5vdGhlciBmZWF0dXJlLA0KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEByZXR1cm4gYm9vbGVhbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNQYXRjaCgpIHsNCi0JCUltcG9ydE1vZGVsW10gaW1wb3J0cyA9IGdldEltcG9ydE1vZGVscygpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGltcG9ydHNbaV0uaXNQYXRjaCgpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVNb2RlbEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZU1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA4YTIxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvRmVhdHVyZU1vZGVsRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcueG1sLnNheC4qOw0KLQ0KLS8qKg0KLSAqIERlZmF1bHQgZmVhdHVyZSBtb2RlbCBmYWN0b3J5Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgYmFzZSBpbXBsZW1lbnRhdGlvbiANCi0gKiBvZiB0aGlzIGZhY3RvcnkuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VGZWF0dXJlRmFjdG9yeQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZU1vZGVsRmFjdG9yeSB7DQotDQotDQotCXByaXZhdGUgc3RhdGljIERlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgbW9kZWwgZmFjdG9yeS4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlTW9kZWxGYWN0b3J5KCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbmQgcG9wdWxhdGVzIGEgZGVmYXVsdCBmZWF0dXJlIGZyb20gc3RyZWFtLg0KLQkgKiBUaGUgcGFyc2VyIGFzc3VtZXMgdGhlIHN0cmVhbSBjb250YWlucyBhIGRlZmF1bHQgZmVhdHVyZSBtYW5pZmVzdA0KLQkgKiAoZmVhdHVyZS54bWwpIGFzIGRvY3VtZW50ZWQgYnkgdGhlIHBsYXRmb3JtLg0KLQkgKiANCi0JICogQHBhcmFtIHN0cmVhbSBmZWF0dXJlIHN0cmVhbQ0KLQkgKiBAcmV0dXJuIHBvcHVsYXRlZCBmZWF0dXJlIG1vZGVsDQotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbg0KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIHBhcnNlRmVhdHVyZShJbnB1dFN0cmVhbSBzdHJlYW0pDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsNCi0JCXBhcnNlci5pbml0KHRoaXMpOw0KLQkJRmVhdHVyZU1vZGVsIGZlYXR1cmVNb2RlbCA9IG51bGw7DQotCQl0cnkgew0KLQkJCWZlYXR1cmVNb2RlbCA9IHBhcnNlci5wYXJzZShzdHJlYW0pOw0KLQkJCWlmIChwYXJzZXIuZ2V0U3RhdHVzKCkhPW51bGwpIHsNCi0JCQkJLy8gc29tZSBpbnRlcm5hbEVycm9yIHdlcmUgZGV0ZWN0ZWQNCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBwYXJzZXIuZ2V0U3RhdHVzKCk7DQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJGZWF0dXJlTW9kZWxGYWN0b3J5LkVycm9yQWNjZXNpbmdGZWF0dXJlU3RyZWFtIiksIGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gZmVhdHVyZU1vZGVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGZlYXR1cmUgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIEZlYXR1cmVNb2RlbA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVNb2RlbCBjcmVhdGVGZWF0dXJlTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEZlYXR1cmVNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbA0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgbW9kZWwNCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGluc3RhbGwgaGFuZGxlciBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsDQotCSAqIEByZXR1cm4gaW5zdGFsbCBoYW5kbGVyIGVudHJ5IG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgY3JlYXRlSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIGEgZGVmYXVsdCBpbXBvcnQgZGVwZW5kZW5jeSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgSW1wb3J0TW9kZWwNCi0JICogQHJldHVybiBpbXBvcnQgZGVwZW5kZW5jeSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgSW1wb3J0TW9kZWwgY3JlYXRlSW1wb3J0TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IEltcG9ydE1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgcGx1Zy1pbiBlbnRyeSBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgUGx1Z2luRW50cnlNb2RlbA0KLQkgKiBAcmV0dXJuIHBsdWctaW4gZW50cnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFBsdWdpbkVudHJ5TW9kZWwgY3JlYXRlUGx1Z2luRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgUGx1Z2luRW50cnlNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IG5vbi1wbHVnLWluIGVudHJ5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBOb25QbHVnaW5FbnRyeU1vZGVsDQotCSAqIEByZXR1cm4gbm9uLXBsdWctaW4gZW50cnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIE5vblBsdWdpbkVudHJ5TW9kZWwgY3JlYXRlTm9uUGx1Z2luRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgTm9uUGx1Z2luRW50cnlNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGFubm90YXRlZCBVUkwgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIFVSTEVudHJ5TW9kZWwNCi0JICogQHJldHVybiBhbm5vdGF0ZWQgVVJMIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGNyZWF0ZVVSTEVudHJ5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IFVSTEVudHJ5TW9kZWwoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9GZWF0dXJlUmVmZXJlbmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmMjI1OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVSZWZlcmVuY2UNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBleHRlbmRzIE1vZGVsT2JqZWN0IHsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsNCi0JcHJpdmF0ZSBVUkwgdXJsOw0KLQlwcml2YXRlIFN0cmluZyB1cmxTdHJpbmc7DQotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVJZDsNCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZVZlcnNpb247DQotCXByaXZhdGUgU2l0ZU1vZGVsIHNpdGU7DQotCXByaXZhdGUgU3RyaW5nIGxhYmVsOw0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGl6ZWRMYWJlbDsNCi0NCi0JLy8gcGVyZm9ybWFuY2UNCi0JcHJpdmF0ZSBVUkwgYnVuZGxlVVJMOw0KLQlwcml2YXRlIFVSTCBiYXNlOw0KLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgb3M7DQotCXByaXZhdGUgU3RyaW5nIHdzOw0KLQlwcml2YXRlIFN0cmluZyBubDsNCi0JcHJpdmF0ZSBTdHJpbmcgYXJjaDsNCi0JcHJpdmF0ZSBTdHJpbmcgcGF0Y2g7CQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4NCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBGZWF0dXJlUmVmZXJlbmNlTW9kZWwuDQotCSAqIEBwYXJhbSByZWYNCi0JICovDQotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlTW9kZWwoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIHJlZikgew0KLQkJc2V0RmVhdHVyZUlkZW50aWZpZXIocmVmLmdldEZlYXR1cmVJZGVudGlmaWVyKCkpOw0KLQkJc2V0RmVhdHVyZVZlcnNpb24ocmVmLmdldEZlYXR1cmVWZXJzaW9uKCkpOw0KLQkJc2V0VHlwZShyZWYuZ2V0VHlwZSgpKTsNCi0JCXNldFNpdGVNb2RlbChyZWYuZ2V0U2l0ZU1vZGVsKCkpOw0KLQkJc2V0TGFiZWwocmVmLmdldExhYmVsKCkpOw0KLQkJc2V0V1MocmVmLmdldFdTKCkpOw0KLQkJc2V0T1MocmVmLmdldE9TKCkpOw0KLQkJc2V0QXJjaChyZWYuZ2V0T1NBcmNoKCkpOw0KLQkJc2V0TkwocmVmLmdldE5MKCkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb21wYXJlcyAyIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscyBmb3IgZXF1YWxpdHkNCi0JICogIA0KLQkgKiBAcGFyYW0gb2JqZWN0IGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIGNvbXBhcmUgd2l0aA0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB0d28gbW9kZWxzIGFyZSBlcXVhbCwgDQotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UNCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7DQotDQotCQlpZiAob2JqZWN0ID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKGdldFVSTCgpID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotDQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZiA9IChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIG9iamVjdDsNCi0NCi0JCXJldHVybiBVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChnZXRVUkwoKSwgZi5nZXRVUkwoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSB0eXBlLg0KLQkgKiANCi0JICogQHJldHVybiBmZWF0dXJlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdA0KLQkgKiBmZWF0dXJlIHR5cGUgZm9yIHRoZSBzaXRlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCi0JCXJldHVybiB0eXBlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBzaXRlIG1vZGVsIGZvciB0aGUgcmVmZXJlbmNlLg0KLQkgKiANCi0JICogQHJldHVybiBzaXRlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTaXRlTW9kZWwgZ2V0U2l0ZU1vZGVsKCkgew0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHVucmVzb2x2ZWQgVVJMIHN0cmluZyBmb3IgdGhlIHJlZmVyZW5jZS4NCi0JICoNCi0JICogQHJldHVybiB1cmwgc3RyaW5nDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMU3RyaW5nKCkgew0KLQkJcmV0dXJuIHVybFN0cmluZzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybCBzdHJpbmcNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlkZWxheWVkUmVzb2x2ZSgpOw0KLQkJcmV0dXJuIHVybDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSBpZGVudGlmaWVyIGFzIGEgc3RyaW5nDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlI2dldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVJZGVudGlmaWVyKCkgew0KLQkJcmV0dXJuIGZlYXR1cmVJZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZmVhdHVyZSB2ZXJzaW9uIGFzIGEgc3RyaW5nDQotCSAqIA0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlI2dldFZlcnNpb25lZElkZW50aWZpZXIoKQ0KLQkgKiBAcmV0dXJuIGZlYXR1cmUgdmVyc2lvbiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlVmVyc2lvbigpIHsNCi0JCXJldHVybiBmZWF0dXJlVmVyc2lvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgcmVmZXJlbmNlZCBmZWF0dXJlIHR5cGUuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gdHlwZSByZWZlcmVuY2VkIGZlYXR1cmUgdHlwZQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy50eXBlID0gdHlwZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc2l0ZSBmb3IgdGhlIHJlZmVyZW5jZWQuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gc2l0ZSBzaXRlIGZvciB0aGUgcmVmZXJlbmNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGVNb2RlbChTaXRlTW9kZWwgc2l0ZSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuc2l0ZSA9IHNpdGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHVucmVzb2x2ZWQgVVJMIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHVucmVzb2x2ZWQgVVJMIHN0cmluZw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRVUkxTdHJpbmcoU3RyaW5nIHVybFN0cmluZykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOw0KLQkJdGhpcy51cmwgPSBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlIGlkZW50aWZpZXIuDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZUlkIGZlYXR1cmUgaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlSWRlbnRpZmllcihTdHJpbmcgZmVhdHVyZUlkKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGZlYXR1cmUgdmVyc2lvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICogDQotCSAqIEBwYXJhbSBmZWF0dXJlVmVyc2lvbiBmZWF0dXJlIHZlcnNpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVZlcnNpb24oU3RyaW5nIGZlYXR1cmVWZXJzaW9uKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5mZWF0dXJlVmVyc2lvbiA9IGZlYXR1cmVWZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuDQotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSANCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUNCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgDQotCSAqIHJlc291cmNlIGJ1bmRsZS4NCi0JICogDQotCSAqIEBwYXJhbSBiYXNlIFVSTA0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwNCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSxVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCXRoaXMuYmFzZSA9IGJhc2U7DQotCQl0aGlzLmJ1bmRsZVVSTCA9IGJ1bmRsZVVSTDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZGVsYXllZFJlc29sdmUoKSB7DQotDQotCQkvLyBQRVJGOiBkZWxheSByZXNvbHV0aW9uDQotCQlpZiAocmVzb2x2ZWQpDQotCQkJcmV0dXJuOw0KLQ0KLQkJcmVzb2x2ZWQgPSB0cnVlOw0KLQkJLy8gcmVzb2x2ZSBsb2NhbCBlbGVtZW50cw0KLQkJbG9jYWxpemVkTGFiZWwgPSByZXNvbHZlTkxTdHJpbmcoYnVuZGxlVVJMLCBsYWJlbCk7DQotCQl0cnkgew0KLQkJCXVybCA9IHJlc29sdmVVUkwoYmFzZSwgYnVuZGxlVVJMLCB1cmxTdHJpbmcpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpew0KLQkJCVVwZGF0ZUNvcmUud2FybigiIixlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCWJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS50b1N0cmluZygpICsgIiA6Iik7IC8vJE5PTi1OTFMtMSQNCi0JCWJ1ZmZlci5hcHBlbmQoIiBhdCAiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKHVybCAhPSBudWxsKQ0KLQkJCWJ1ZmZlci5hcHBlbmQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0I2dldFByb3BlcnR5TmFtZSgpDQotCSAqLw0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsNCi0JCXJldHVybiBTaXRlLlNJVEVfRklMRTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFJldHJpZXZlIHRoZSBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlLiBJZiB0aGUgbW9kZWwNCi0JICogb2JqZWN0IGhhcyBiZWVuIHJlc29sdmVkLCB0aGUgbGFiZWwgaXMgbG9jYWxpemVkLg0KLQkgKg0KLQkgKiBAcmV0dXJuIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlpZiAobG9jYWxpemVkTGFiZWwgIT0gbnVsbCkNCi0JCQlyZXR1cm4gbG9jYWxpemVkTGFiZWw7DQotCQllbHNlDQotCQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXRyaWV2ZSB0aGUgbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlLg0KLQkgKg0KLQkgKiBAcmV0dXJuIG5vbi1sb2NhbGl6ZWQgZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsTm9uTG9jYWxpemVkKCkgew0KLQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBsYWJlbC4NCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgew0KLQkJdGhpcy5sYWJlbCA9IGxhYmVsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXQgb3B0aW9uYWwgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4NCi0JICoNCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7DQotCQlyZXR1cm4gb3M7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIEdldCBvcHRpb25hbCB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsNCi0JCXJldHVybiB3czsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogR2V0IG9wdGlvbmFsIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsNCi0JCXJldHVybiBhcmNoOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBHZXQgb3B0aW9uYWwgbG9jYWxlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHRoZSBsb2NhbGUgc3BlY2lmaWNhdGlvbiBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgew0KLQkJcmV0dXJuIG5sOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBvcyBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdA0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRPUyhTdHJpbmcgb3MpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLm9zID0gb3M7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIHdzIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0DQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFdTKFN0cmluZyB3cykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMud3MgPSB3czsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBubCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0DQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE5MKFN0cmluZyBubCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMubmwgPSBubDsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gYXJjaCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdA0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyBhcmNoKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5hcmNoID0gYXJjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGF0Y2ggbW9kZS4NCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0Y2goKSB7DQotCQlyZXR1cm4gcGF0Y2g7DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHBhdGNoIG1vZGUuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQYXRjaChTdHJpbmcgcGF0Y2gpIHsNCi0JCXRoaXMucGF0Y2ggPSBwYXRjaDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ltcG9ydE1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ltcG9ydE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMWNlNDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbXBvcnRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLS8qKg0KLSAqIFBsdWctaW4gZGVwZW5kZW5jeSBtb2RlbCBvYmplY3QuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCANCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCANCi0gKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZGVsLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbXBvcnQNCi0gKiBAc2luY2UgMi4wDQotICovDQotcHVibGljIGNsYXNzIEltcG9ydE1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3Qgew0KLQ0KLQlwcml2YXRlIFN0cmluZyBpZDsNCi0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsNCi0JcHJpdmF0ZSBTdHJpbmcgbWF0Y2hpbmdJZFJ1bGVOYW1lOw0KLQlwcml2YXRlIFN0cmluZyBtYXRjaGluZ1J1bGVOYW1lOw0KLQlwcml2YXRlIGJvb2xlYW4gZmVhdHVyZUltcG9ydDsNCi0JcHJpdmF0ZSBib29sZWFuIHBhdGNoOw0KLQlwcml2YXRlIFN0cmluZyBvc0FyY2g7DQotCXByaXZhdGUgU3RyaW5nIHdzOw0KLQlwcml2YXRlIFN0cmluZyBvczsNCi0JcHJpdmF0ZSBTdHJpbmcgbmw7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgdW5pbml0aWFsaXplZCBwbHVnLWluIGRlcGVuZGVuY3kgbW9kZWwgb2JqZWN0Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIEltcG9ydE1vZGVsKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVwZW5kZW50IHBsdWctaW4gaWRlbnRpZmllci4NCi0JICoNCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldElkZW50aWZpZXIoKSBpbnN0ZWFkDQotCSAqIEByZXR1cm4gcGx1Zy1pbiBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZGVudGlmaWVyKCkgew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbnQgaWRlbnRpZmllci4NCi0JICoNCi0JICogQHJldHVybiAgaWRlbnRpZmllciwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbnQgcGx1Zy1pbiB2ZXJzaW9uLg0KLQkgKg0KLQkgKiBAZGVwcmVjYXRlZCB1c2UgZ2V0VmVyc2lvbigpIGluc3RlYWQNCi0JICogQHJldHVybiBwbHVnLWluIHZlcnNpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpblZlcnNpb24oKSB7DQotCQlyZXR1cm4gdmVyc2lvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgZGVwZW5kZW50IHZlcnNpb24uDQotCSAqDQotCSAqIEByZXR1cm4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgew0KLQkJcmV0dXJuIHZlcnNpb247DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbnQgdmVyc2lvbiBtYXRjaGluZyBydWxlIG5hbWUuDQotCSAqDQotCSAqIEByZXR1cm4gbWF0Y2hpbmcgcnVsZSBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaGluZ1J1bGVOYW1lKCkgew0KLQkJcmV0dXJuIG1hdGNoaW5nUnVsZU5hbWU7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbnQgaWQgbWF0Y2hpbmcgcnVsZSBuYW1lLg0KLQkgKg0KLQkgKiBAcmV0dXJuIG1hdGNoaW5nIHJ1bGUgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjENCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdJZFJ1bGVOYW1lKCkgew0KLQkJcmV0dXJuIG1hdGNoaW5nSWRSdWxlTmFtZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGVwZW5kZW50IHBsdWctaW4gaWRlbnRpZmllci4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQGRlcHJlY2F0ZWQgdXNlIHNldElkZW50aWZpZXIoKQ0KLQkgKiBAcGFyYW0gcGx1Z2luSWQgZGVwZW5kZW50IHBsdWctaW4gaWRlbnRpZmllcg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQbHVnaW5JZGVudGlmaWVyKFN0cmluZyBwbHVnaW5JZCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuaWQgPSBwbHVnaW5JZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGVwZW5kZW50IHBsdWctaW4gdmVyc2lvbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQGRlcHJlY2F0ZWQgdXNlIHNldFZlcnNpb24oKQ0KLQkgKiBAcGFyYW0gcGx1Z2luVmVyc2lvbiBkZXBlbmRlbnQgcGx1Zy1pbiB2ZXJzaW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBsdWdpblZlcnNpb24oU3RyaW5nIHBsdWdpblZlcnNpb24pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnZlcnNpb24gPSBwbHVnaW5WZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBkZXBlbmRlbnQgaWRlbnRpZmllci4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIGlkIGRlcGVuZGVudCBpZGVudGlmaWVyDQotCSAqIEBzaW5jZSAyLjAuMg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWQpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmlkID0gaWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGRlcGVuZGVudCB2ZXJzaW9uLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gdmVyc2lvbiBkZXBlbmRlbnQgdmVyc2lvbg0KLQkgKiBAc2luY2UgMi4wLjINCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOw0KLQl9DQotCQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZGVwZW5kZW50IHZlcnNpb24gbWF0Y2hpbmcgcnVsZSBuYW1lLiANCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIG1hdGNoaW5nUnVsZU5hbWUgZGVwZW5kZW50IHZlcnNpb24gbWF0Y2hpbmcgcnVsZS4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0TWF0Y2hpbmdSdWxlTmFtZShTdHJpbmcgbWF0Y2hpbmdSdWxlTmFtZSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMubWF0Y2hpbmdSdWxlTmFtZSA9IG1hdGNoaW5nUnVsZU5hbWU7DQotCX0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGRlcGVuZGVudCBpZCBtYXRjaGluZyBydWxlIG5hbWUuIA0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gbWF0Y2hpbmdJZFJ1bGVOYW1lIGRlcGVuZGVudCBpZCBtYXRjaGluZyBydWxlLg0KLQkgKiBAc2luY2UgMi4xDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaGluZ0lkUnVsZU5hbWUoU3RyaW5nIG1hdGNoaW5nSWRSdWxlTmFtZSkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMubWF0Y2hpbmdJZFJ1bGVOYW1lID0gbWF0Y2hpbmdJZFJ1bGVOYW1lOw0KLQl9DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBpc0ZlYXR1cmVJbXBvcnQuDQotCSAqIEByZXR1cm4gYm9vbGVhbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNGZWF0dXJlSW1wb3J0KCkgew0KLQkJcmV0dXJuIGZlYXR1cmVJbXBvcnQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBmZWF0dXJlSW1wb3J0Lg0KLQkgKiBAcGFyYW0gZmVhdHVyZUltcG9ydCBUaGUgZmVhdHVyZUltcG9ydCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVJbXBvcnQoYm9vbGVhbiBmZWF0dXJlSW1wb3J0KSB7DQotCQl0aGlzLmZlYXR1cmVJbXBvcnQgPSBmZWF0dXJlSW1wb3J0Ow0KLQl9DQotCQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGF0Y2ggbW9kZS4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKSB7DQotCQlyZXR1cm4gcGF0Y2g7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBwYXRjaCBtb2RlLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0UGF0Y2goYm9vbGVhbiBwYXRjaCkgew0KLQkJdGhpcy5wYXRjaCA9IHBhdGNoOw0KLQl9DQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBvcy4NCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1MoKSB7DQotCQlyZXR1cm4gb3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIG9zQXJjaC4NCi0JICogQHJldHVybiBTdHJpbmcNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0T1NBcmNoKCkgew0KLQkJcmV0dXJuIG9zQXJjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgd3MuDQotCSAqIEByZXR1cm4gU3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgew0KLQkJcmV0dXJuIHdzOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBvcy4NCi0JICogQHBhcmFtIG9zIFRoZSBvcyB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgew0KLQkJdGhpcy5vcyA9IG9zOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBvc0FyY2guDQotCSAqIEBwYXJhbSBvc0FyY2ggVGhlIG9zQXJjaCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE9TQXJjaChTdHJpbmcgb3NBcmNoKSB7DQotCQl0aGlzLm9zQXJjaCA9IG9zQXJjaDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgd3MuDQotCSAqIEBwYXJhbSB3cyBUaGUgd3MgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRXUyhTdHJpbmcgd3MpIHsNCi0JCXRoaXMud3MgPSB3czsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgbmwuDQotCSAqIEByZXR1cm4gU3RyaW5nDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgew0KLQkJcmV0dXJuIG5sOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBubC4NCi0JICogQHBhcmFtIG5sIFRoZSBubCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldE5MKFN0cmluZyBubCkgew0KLQkJdGhpcy5ubCA9IG5sOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhMTllZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLQotLyoqCi0gKiBJbmNsdWRlZCBGZWF0dXJlIHJlZmVyZW5jZSBtb2RlbCBvYmplY3QuCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCAKLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGV4dGVuZHMgRmVhdHVyZVJlZmVyZW5jZSB7Ci0KLQkvLyBzaW5jZSAyLjAuMgotCXByaXZhdGUgYm9vbGVhbiBpc09wdGlvbmFsOwotCXByaXZhdGUgaW50IHNlYXJjaExvY2F0aW9uOwotCQotCS8vIFRoZXNlIGFyZSBhbHJlYWR5IGRlZmluZWQgYnkgRmVhdHVyZVJlZmVyZW5jZU1vZGVsLCB3ZSBkb24ndCBuZWVkIHRvIGR1cGxpY2F0ZSB0aGVtIGhlcmUKLS8vCS8vIHNpbmNlIDIuMQotLy8JcHJpdmF0ZSBTdHJpbmcgb3M7Ci0vLwlwcml2YXRlIFN0cmluZyB3czsKLS8vCXByaXZhdGUgU3RyaW5nIGFyY2g7Ci0vLwlwcml2YXRlIFN0cmluZyBubDsKLS8vCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGluY2x1ZGVkIGZlYXR1cmUgcmVmZXJlbmNlCi0JICogCi0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQkJaXNPcHRpb25hbChmYWxzZSk7Ci0JCXNldFNlYXJjaExvY2F0aW9uKElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1JPT1QpOwotCX0KLQkKLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBpbmNsdWRlZEZlYXR1cmVSZWYgdGhlIGluY2x1ZGVkIHJlZmVyZW5jZSBtb2RlbCB0byBjb3B5Ci0JICogQHNpbmNlIDIuMQotCSAqLwotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBpbmNsdWRlZEZlYXR1cmVSZWYpIHsKLQkJc3VwZXIoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbClpbmNsdWRlZEZlYXR1cmVSZWYpOwotCQlpc09wdGlvbmFsKGluY2x1ZGVkRmVhdHVyZVJlZi5pc09wdGlvbmFsKCkpOwotCQlzZXRMYWJlbChpbmNsdWRlZEZlYXR1cmVSZWYuZ2V0TGFiZWwoKSk7Ci0JCXNldFNlYXJjaExvY2F0aW9uKGluY2x1ZGVkRmVhdHVyZVJlZi5nZXRTZWFyY2hMb2NhdGlvbigpKTsKLQkJc2V0QXJjaChpbmNsdWRlZEZlYXR1cmVSZWYuZ2V0T1NBcmNoKCkpOwotCQlzZXRXUyhpbmNsdWRlZEZlYXR1cmVSZWYuZ2V0V1MoKSk7Ci0JCXNldE9TKGluY2x1ZGVkRmVhdHVyZVJlZi5nZXRPUygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbC4KLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCXN1cGVyKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpZmVhdHVyZVJlZmVyZW5jZSk7Ci0JCWlzT3B0aW9uYWwoZmFsc2UpOwotCQlzZXRTZWFyY2hMb2NhdGlvbihJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9ST09UKTsKLQkJc2V0TGFiZWwoZ2V0TGFiZWwoKSk7CQkKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXRjaGluZyBydWxlIGZvciB0aGlzIGluY2x1ZGVkIGZlYXR1cmUuCi0JICogVGhlIHJ1bGUgd2lsbCBkZXRlcm1pbmUgdGhlIGFiaWxpdHkgb2YgdGhlIGluY2x1ZGVkIGZlYXR1cmUgdG8gbW92ZSB2ZXJzaW9uIAotCSAqIHdpdGhvdXQgY2F1c2luZyB0aGUgb3ZlcmFsbCBmZWF0dXJlIHRvIGFwcGVhciBicm9rZW4uCi0JICogCi0JICogVGhlIGRlZmF1bHQgaXMgPGNvZGU+TUFUQ0hfUEVSRkVDVDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElJbXBvcnQjUlVMRV9QRVJGRUNUCi0JICogQHNlZSBJSW1wb3J0I1JVTEVfRVFVSVZBTEVOVAotCSAqIEBzZWUgSUltcG9ydCNSVUxFX0NPTVBBVElCTEUKLQkgKiBAc2VlIElJbXBvcnQjUlVMRV9HUkVBVEVSX09SX0VRVUFMCi0JICogQHJldHVybiBpbnQgcmVwcmVzZW50YXRpb24gb2YgZmVhdHVyZSBtYXRjaGluZyBydWxlLgotCSAqIEBzaW5jZSAyLjAuMgotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDMuMCBpbmNsdWRlZCBmZWF0dXJlIHZlcnNpb24gaXMgZXhhY3RseSBzcGVjaWZpZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1hdGNoKCl7Ci0JCXJldHVybiBJbXBvcnQuUlVMRV9QRVJGRUNUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlYXJjaCBsb2NhdGlvbiBmb3IgdGhpcyBpbmNsdWRlZCBmZWF0dXJlLgotCSAqIFRoZSBsb2NhdGlvbiB3aWxsIGJlIHVzZWQgdG8gc2VhcmNoIHVwZGF0ZXMgZm9yIHRoaXMgZmVhdHVyZS4KLQkgKiAKLQkgKiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5TRUFSQ0hfUk9PVDwvY29kZT4KLQkgKiAKLQkgKiBAc2VlIElVcGRhdGVDb25zdGFudHMjU0VBUkNIX1JPT1QKLQkgKiBAc2VlIElVcGRhdGVDb25zdGFudHMjU0VBUkNIX1NFTEYKLQkgKiBAcmV0dXJuIGludCByZXByZXNlbnRhdGlvbiBvZiBmZWF0dXJlIHNlYXJjaGluZyBydWxlLgotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCi0JcHVibGljIGludCBnZXRTZWFyY2hMb2NhdGlvbigpewotCQlyZXR1cm4gc2VhcmNoTG9jYXRpb247Ci0JfQotCQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpc09wdGlvbmFsCi0JICogCi0JICogQHJldHVybiBpc09wdGlvbmFsCi0JICogQHNpbmNlIDIuMC4xCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIGlzT3B0aW9uYWw7Ci0JfQotCi0KLQkKLQotCS8qKgotCSAqIFNldHMgdGhlIGlzT3B0aW9uYWwuCi0JICogQHBhcmFtIGlzT3B0aW9uYWwgVGhlIGlzT3B0aW9uYWwgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgaXNPcHRpb25hbChib29sZWFuIGlzT3B0aW9uYWwpIHsKLQkJdGhpcy5pc09wdGlvbmFsID0gaXNPcHRpb25hbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBtYXRjaGluZ1J1bGUuCi0JICogQHBhcmFtIG1hdGNoaW5nUnVsZSBUaGUgbWF0Y2hpbmdSdWxlIHRvIHNldAotCSAqIEBkZXByZWNhdGVkIHNpbmNlIDMuMCBpbmNsdWRlZCBmZWF0dXJlIHZlcnNpb24gaXMgZXhhY3RseSBzcGVjaWZpZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXRjaGluZ1J1bGUoaW50IG1hdGNoaW5nUnVsZSkgewotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNlYXJjaExvY2F0aW9uLgotCSAqIEBwYXJhbSBzZWFyY2hMb2NhdGlvbiBUaGUgc2VhcmNoTG9jYXRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VhcmNoTG9jYXRpb24oaW50IHNlYXJjaExvY2F0aW9uKSB7Ci0JCXRoaXMuc2VhcmNoTG9jYXRpb24gPSBzZWFyY2hMb2NhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0luc3RhbGxBYm9ydGVkRXhjZXB0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0luc3RhbGxBYm9ydGVkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMGQxYTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiB0aGUgdXNlciBjYW5jZWxsZWQgYW4gaW5zdGFsbGF0aW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgdGhlIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIGVuY2xvc2luZyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbihTdHJpbmcgbXNnLEV4Y2VwdGlvbiBlKSB7Ci0JCXN1cGVyKG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIsSVN0YXR1cy5PSyxtc2csZSkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW5zdGFsbEhhbmRsZXJFbnRyeU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZGQwODguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9JbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotLyoqCi0gKiBJbnN0YWxsIGhhbmRsZXIgZW50cnkgbW9kZWwgb2JqZWN0LgotICogQW4gb2JqZWN0IHdoaWNoIHJlcHJlc2VudHMgdGhlIGRlZmluaXRpb24gb2YgYSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIGluc3RhbnRpYXRlIG9yIHN1YmNsYXNzIHRoZSBwcm92aWRlZCAKLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JbnN0YWxsSGFuZGxlckVudHJ5Ci0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQlwcml2YXRlIFN0cmluZyB1cmxTdHJpbmc7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCXByaXZhdGUgU3RyaW5nIGxpYnJhcnk7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSB1bmluaXRpYWxpemVkIGluc3RhbGwgaGFuZGxlciBlbnRyeSBtb2RlbCBvYmplY3QuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBJbnN0YWxsSGFuZGxlckVudHJ5TW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIHN0cmluZyB1c2VkIGZvciBicm93c2VyLXRyaWdnZXJlZCBpbnN0YWxsYXRpb24gaGFuZGxpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHVybCBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkxTdHJpbmcoKSB7Ci0JCXJldHVybiB1cmxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIHVzZWQgZm9yIGJyb3dzZXItdHJpZ2dlcmVkIGluc3RhbGxhdGlvbiBoYW5kbGluZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VzdG9tIGluc3RhbGxlciBsaWJyYXJ5LgotCSAqCi0JICogQHJldHVybiBsaWJyYXJ5IHBhdGgsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGlicmFyeSgpIHsKLQkJcmV0dXJuIGxpYnJhcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VzdG9tIGluc3RhbGxlci4KLQkgKgotCSAqIEByZXR1cm4gaGFuZGxlciBuYW1lLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJOYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIFVSTCBzdHJpbmcgdXNlZCBmb3IgYnJvd3Nlci10cmlnZ2VyZWQgaW5zdGFsbGF0aW9uIGhhbmRsaW5nLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICoKLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHRyaWdnZXQgcGFnZSBVUkwgc3RyaW5nLCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVSTFN0cmluZyhTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOwotCQl0aGlzLnVybCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBsaWJyYXJ5IG5hbWUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBsaWJyYXJ5IG5hbWUsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlicmFyeShTdHJpbmcgbGlicmFyeSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxpYnJhcnkgPSBsaWJyYXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGluc3RhbGwgaGFuZGxlciwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRIYW5kbGVyTmFtZShTdHJpbmcgbmFtZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIG1vZGVsIG9iamVjdC4KLQkgKiBBbnkgVVJMIHN0cmluZ3MgaW4gdGhlIG1vZGVsIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgCi0JICogYmFzZSBVUkwgYXJndW1lbnQuIEFueSB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUgbW9kZWwgdGhhdCBhcmUKLQkgKiBzcGVjaWZpZWQgYXMgdHJhbnNsYXRpb24ga2V5cyBhcmUgbG9jYWxpemVkIHVzaW5nIHRoZSBzdXBwbGllZCAKLQkgKiByZXNvdXJjZSBidW5kbGUuCi0JICogCi0JICogQHBhcmFtIGJhc2UgVVJMCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSxVUkwgYnVuZGxlVVJMKQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJLy8gcmVzb2x2ZSBsb2NhbCBlbGVtZW50cwotCQl1cmwgPSByZXNvbHZlVVJMKGJhc2UsYnVuZGxlVVJMLCB1cmxTdHJpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL0ludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGZkZWQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsNCi0NCi0vKioNCi0gKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gdGhlIHR5cGUgb2YgdGhlIHNpdGUgZGlzY292ZXJlZCBpbiB0aGUgc2l0ZSBtYW5pZmVzdA0KLSAqIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gdGhlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIGNvbmNyZXRlIHNpdGUgZmFjdG9yeS4NCi0gKiANCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5TaXRlTW9kZWxGYWN0b3J5I2NhblBhcnNlU2l0ZVR5cGUoU3RyaW5nKQ0KLSAqIEBzaW5jZSAyLjANCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgbmV3U2l0ZVR5cGU7DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3QgdGhlIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoZSBkZXRlY3RlZCBzaXRlIHR5cGUNCi0JICogDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24oU3RyaW5nIG5ld1R5cGUpIHsNCi0JCXN1cGVyKCk7DQotCQluZXdTaXRlVHlwZSA9IG5ld1R5cGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNpdGUgdHlwZSBkZXRlY3RlZCBpbiB0aGUgcGFyc2VkIHNpdGUgbWFuaWZlc3QNCi0JICogDQotCSAqIEByZXR1cm4gc2l0ZSB0eXBlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3VHlwZSgpIHsNCi0JCXJldHVybiBuZXdTaXRlVHlwZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL01vZGVsT2JqZWN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL01vZGVsT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNjJjMWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9Nb2RlbE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotLyoqDQotICogUm9vdCBtb2RlbCBvYmplY3QuIEV4dGVuZGVkIGJ5IGFsbCBtb2RlbCBvYmplY3RzLg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBhbmQgbXVzdCBiZSBzdWJjbGFzc2VkLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bw0KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjaw0KLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuDQotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4NCi0gKiA8L3A+DQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsT2JqZWN0IGV4dGVuZHMgUGxhdGZvcm1PYmplY3Qgew0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gcmVhZE9ubHkgPSBmYWxzZTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVGSVggPSAiJSI7IC8vJE5PTi1OTFMtMSQNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ET1VCTEVfUFJFRklYID0gS0VZX1BSRUZJWCArIEtFWV9QUkVGSVg7DQotDQotCXByaXZhdGUgc3RhdGljIE1hcCBidW5kbGVzOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIGJhc2UgbW9kZWwgb2JqZWN0Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIE1vZGVsT2JqZWN0KCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBDaGVja3MgdGhhdCB0aGlzIG1vZGVsIG9iamVjdCBpcyB3cml0ZWFibGUuICBBIHJ1bnRpbWUgZXhjZXB0aW9uDQotCSAqIGlzIHRocm93biBpZiBpdCBpcyBub3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhc3NlcnRJc1dyaXRlYWJsZSgpIHsNCi0JCUFzc2VydC5pc1RydWUoIWlzUmVhZE9ubHkoKSwgUG9saWN5LmJpbmQoIk1vZGVsT2JqZWN0Lk1vZGVsUmVhZE9ubHkiKSk7CS8vJE5PTi1OTFMtMSQNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGlzIG1vZGVsIG9iamVjdCBhbmQgYWxsIG9mIGl0cyBkZXNjZW5kZW50cyB0byBiZSByZWFkLW9ubHkuDQotCSAqIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIGltcGxlbWVudGF0aW9uLg0KLQkgKiANCi0JICogQHNlZSAjaXNSZWFkT25seQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBtYXJrUmVhZE9ubHkoKSB7DQotCQlyZWFkT25seSA9IHRydWU7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBtb2RlbCBvYmplY3QgaXMgcmVhZC1vbmx5Lg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG1vZGVsIG9iamVjdCBpcyByZWFkLW9ubHksDQotCSAqCQk8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEBzZWUgI21hcmtSZWFkT25seQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgew0KLQkJcmV0dXJuIHJlYWRPbmx5Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxlZ2F0ZSBzZXR0aW5nIG9mIHJlYWQtb25seQ0KLQkgKg0KLQkgKiBAcGFyYW0gbyBvYmplY3QgdG8gZGVsZWdhdGUgdG8uIE11c3QgYmUgb2YgdHlwZSBNb2RlbE9iamVjdC4NCi0JICogQHNlZSAjaXNSZWFkT25seQ0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBtYXJrUmVmZXJlbmNlUmVhZE9ubHkoTW9kZWxPYmplY3Qgbykgew0KLQkJaWYgKG8gPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlvLm1hcmtSZWFkT25seSgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBEZWxlZ2F0ZSBzZXR0aW5nIG9mIHJlYWQtb25seQ0KLQkgKg0KLQkgKiBAcGFyYW0gbyBvYmplY3QgYXJyYXkgdG8gZGVsZWdhdGUgdG8uIEVhY2ggZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgTW9kZWxPYmplY3QuDQotCSAqIEBzZWUgI2lzUmVhZE9ubHkNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgbWFya0xpc3RSZWZlcmVuY2VSZWFkT25seShNb2RlbE9iamVjdFtdIG8pIHsNCi0JCWlmIChvID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvLmxlbmd0aDsgaSsrKSB7DQotCQkJb1tpXS5tYXJrUmVhZE9ubHkoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgZWxlbWVudC4gVGhpcyBtZXRob2QgYWxsb3dzIGFueSByZWxhdGl2ZSBVUkwgc3RyaW5ncw0KLQkgKiB0byBiZSByZXNvbHZlZCB0byBhY3R1YWwgVVJMLiBJdCBhbHNvIGFsbG93cyBhbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MNCi0JICogdG8gYmUgbG9jYWxpemVkLg0KLQkgKiANCi0JICogU3ViY2xhc3NlcyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCByZXNvbHV0aW9uLg0KLQkgKiBAcGFyYW0gYmFzZSBiYXNlIFVSTC4NCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMLg0KLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogRGVsZWdhdGUgcmVzb2x1dGlvbiB0byByZWZlcmVuY2VkIG1vZGVsDQotCSAqDQotCSAqIEBwYXJhbSBvIG9iamVjdCB0byBkZWxlZ2F0ZSB0by4gTXVzdCBiZSBvZiB0eXBlIE1vZGVsT2JqZWN0Lg0KLQkgKiBAcGFyYW0gdXJsIGJhc2UgVVJMLg0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwuDQotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHJlc29sdmVSZWZlcmVuY2UoTW9kZWxPYmplY3QgbywgVVJMIHVybCwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlpZiAobyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCW8ucmVzb2x2ZSh1cmwsIGJ1bmRsZVVSTCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIERlbGVnYXRlIHJlc29sdXRpb24gdG8gbGlzdCBvZiByZWZlcmVuY2VkIG1vZGVscw0KLQkgKg0KLQkgKiBAcGFyYW0gbyBvYmplY3QgYXJyYXkgdG8gZGVsZWdhdGUgdG8uIEVhY2ggZWxlbWVudCBtdXN0IGJlIG9mIHR5cGUgTW9kZWxPYmplY3QuDQotCSAqIEBwYXJhbSB1cmwgYmFzZSBVUkwuDQotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTC4NCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUxpc3RSZWZlcmVuY2UoTW9kZWxPYmplY3RbXSBvLCBVUkwgdXJsLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCWlmIChvID09IG51bGwpDQotCQkJcmV0dXJuOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvLmxlbmd0aDsgaSsrKSB7DQotCQkJb1tpXS5yZXNvbHZlKHVybCwgYnVuZGxlVVJMKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmVzb2x2ZSBhIFVSTCBiYXNlZCBvbiBjb250ZXh0DQotCSAqDQotCSAqIEBwYXJhbSBjb250ZXh0IGJhc2UgVVJMLg0KLQkgKiBAcGFyYW0gYnVuZGxlVVJMIHJlc291cmNlIGJ1bmRsZSBVUkwuDQotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdXJsIHN0cmluZyBmcm9tIG1vZGVsLg0KLQkgKiBAcmV0dXJuIFVSTCwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBVUkwgcmVzb2x2ZVVSTChVUkwgY29udGV4dCwgVVJMIGJ1bmRsZVVSTCwgU3RyaW5nIHVybFN0cmluZykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotDQotCQkvLyBVUkwgc3RyaW5nIHdhcyBub3Qgc3BlY2lmaWVkDQotCQlpZiAodXJsU3RyaW5nID09IG51bGwgfHwgdXJsU3RyaW5nLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQkvLyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBOTC1zZW5zaXRpdmUgVVJMDQotCQlTdHJpbmcgcmVzb2x2ZWRVcmxTdHJpbmcgPSByZXNvbHZlTkxTdHJpbmcoYnVuZGxlVVJMLCB1cmxTdHJpbmcpOw0KLQ0KLQkJcmVzb2x2ZWRVcmxTdHJpbmcgPSByZXNvbHZlUGxhdGZyb21Db25maWd1cmF0aW9uKHJlc29sdmVkVXJsU3RyaW5nKTsNCi0NCi0JCS8vIGlmIHdlIGRvbid0IGhhdmUgYSBiYXNlIHVybCwgdXNlIG9ubHkgdGhlIHN1cHBsaWVkIHN0cmluZw0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IFVSTChyZXNvbHZlZFVybFN0cmluZyk7DQotDQotCQkvLyBvdGhlcndpc2UgcmV0dXJuIG5ldyBVUkwgaW4gY29udGV4dCBvZiBiYXNlIFVSTA0KLQkJcmV0dXJuIG5ldyBVUkwoY29udGV4dCwgcmVzb2x2ZWRVcmxTdHJpbmcpOw0KLQl9DQotCS8qKg0KLQkgKiBSZXNvbHZlcyB0aGUgVVJMIGJhc2VkIG9uIHBsYXRmcm9tIENvbmZpZ3VyYXRpb24NCi0JICogJG9zJFwkd3MkXGxpY2Vuc2UudHh0IHdpbGwgYmVjb21lDQotCSAqIHdpbjMyXHdpbjMyXGxpY2Vuc2UudHh0IG9uIGEgc3lzdGVtIHdoZXJlIG9zPXdpbjMyIGFuZCB3cz13aW4zMg0KLQkgKiANCi0JICogQHBhcmFtIHJlc29sdmVkVXJsU3RyaW5nDQotCSAqIEByZXR1cm4gU3RyaW5nDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlUGxhdGZyb21Db25maWd1cmF0aW9uKFN0cmluZyByZXNvbHZlZFVybFN0cmluZykgew0KLQkJaW50IG9zSW5kZXggPSByZXNvbHZlZFVybFN0cmluZy5pbmRleE9mKCIkb3MkIik7IC8vJE5PTi1OTFMtMSQNCi0JCWlmIChvc0luZGV4ICE9IC0xKQ0KLQkJCXJldHVybiBnZXRFeHRlbmRlZFN0cmluZyhyZXNvbHZlZFVybFN0cmluZyk7DQotDQotCQlpbnQgd3NJbmRleCA9IHJlc29sdmVkVXJsU3RyaW5nLmluZGV4T2YoIiR3cyQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKHdzSW5kZXggIT0gLTEpDQotCQkJcmV0dXJuIGdldEV4dGVuZGVkU3RyaW5nKHJlc29sdmVkVXJsU3RyaW5nKTsNCi0NCi0JCWludCBubEluZGV4ID0gcmVzb2x2ZWRVcmxTdHJpbmcuaW5kZXhPZigiJG5sJCIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAobmxJbmRleCAhPSAtMSkNCi0JCQlyZXR1cm4gZ2V0RXh0ZW5kZWRTdHJpbmcocmVzb2x2ZWRVcmxTdHJpbmcpOw0KLQ0KLQkJaW50IGFyY2hJbmRleCA9IHJlc29sdmVkVXJsU3RyaW5nLmluZGV4T2YoIiRhcmNoJCIpOyAvLyROT04tTkxTLTEkDQotCQlpZiAoYXJjaEluZGV4ICE9IC0xKQ0KLQkJCXJldHVybiBnZXRFeHRlbmRlZFN0cmluZyhyZXNvbHZlZFVybFN0cmluZyk7DQotDQotCQlyZXR1cm4gcmVzb2x2ZWRVcmxTdHJpbmc7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5kZWRTdHJpbmcoU3RyaW5nIHJlc29sdmVkVXJsU3RyaW5nKSB7DQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgocmVzb2x2ZWRVcmxTdHJpbmcpOw0KLQkJcGF0aCA9IGdldEV4cGFuZGVkUGF0aChwYXRoKTsNCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiUmVzb2x2ZWQgOiIgKyByZXNvbHZlZFVybFN0cmluZyArICIgYXM6IiArIHBhdGgudG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotDQotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJUGF0aCBnZXRFeHBhbmRlZFBhdGgoSVBhdGggcGF0aCkgew0KLQkJU3RyaW5nIGZpcnN0ID0gcGF0aC5zZWdtZW50KDApOw0KLQkJaWYgKGZpcnN0ICE9IG51bGwpIHsNCi0JCQlJUGF0aCByZXN0ID0gZ2V0RXhwYW5kZWRQYXRoKHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKSk7DQotCQkJaWYgKGZpcnN0LmVxdWFscygiJHdzJCIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcGF0aCA9IG5ldyBQYXRoKFNpdGVNYW5hZ2VyLmdldFdTKCkpLmFwcGVuZChyZXN0KTsNCi0JCQl9IGVsc2UgaWYgKGZpcnN0LmVxdWFscygiJG9zJCIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcGF0aCA9IG5ldyBQYXRoKFNpdGVNYW5hZ2VyLmdldE9TKCkpLmFwcGVuZChyZXN0KTsNCi0JCQl9IGVsc2UgaWYgKGZpcnN0LmVxdWFscygiJG5sJCIpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcGF0aCA9IG5ldyBQYXRoKFNpdGVNYW5hZ2VyLmdldE5MKCkpLmFwcGVuZChyZXN0KTsNCi0JCQl9IGVsc2UgaWYgKGZpcnN0LmVxdWFscygiJGFyY2gkIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlwYXRoID0gbmV3IFBhdGgoU2l0ZU1hbmFnZXIuZ2V0T1NBcmNoKCkpLmFwcGVuZChyZXN0KTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gcGF0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIHJlc291cmNlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhcmd1bWVudCANCi0JICogdmFsdWUgYW5kIGJ1bmRsZS4NCi0JICogSWYgdGhlIGFyZ3VtZW50IHZhbHVlIHNwZWNpZmllcyBhIHJlc291cmNlIGtleSwgdGhlIHN0cmluZw0KLQkgKiBpcyBsb29rZWQgdXAgaW4gdGhlIGdpdmVuIHJlc291cmNlIGJ1bmRsZS4gSWYgdGhlIGFyZ3VtZW50IGRvZXMgbm90DQotCSAqIHNwZWNpZnkgYSB2YWxpZCBrZXksIHRoZSBhcmd1bWVudCBpdHNlbGYgaXMgcmV0dXJuZWQgYXMgdGhlDQotCSAqIHJlc291cmNlIHN0cmluZy4gVGhlIGtleSBsb29rdXAgaXMgcGVyZm9ybWVkIGFnYWluc3QgdGhlDQotCSAqIHNwZWNpZmllZCByZXNvdXJjZSBidW5kbGUuIElmIGEgcmVzb3VyY2Ugc3RyaW5nIA0KLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSByZXNvdXJjZSBidW5kbGUNCi0JICogdGhlIGtleSB2YWx1ZSwgb3IgYW55IGRlZmF1bHQgdGV4dCBmb2xsb3dpbmcgdGhlIGtleSBpbiB0aGUNCi0JICogYXJndW1lbnQgdmFsdWUgaXMgcmV0dXJuZWQgYXMgdGhlIHJlc291cmNlIHN0cmluZy4NCi0JICogQSBrZXkgaXMgaWRlbnRpZmllZCBhcyBhIHN0cmluZyBiZWdpbmluZyB3aXRoIHRoZSAiJSIgY2hhcmFjdGVyLg0KLQkgKiBOb3RlIHRoYXQgdGhlICIlIiBjaGFyYWN0ZXIgaXMgc3RyaXBwZWQgb2ZmIHByaW9yIHRvIGxvb2t1cA0KLQkgKiBpbiB0aGUgcmVzb3VyY2UgYnVuZGxlLg0KLQkgKiA8cD4NCi0JICogRm9yIGV4YW1wbGUsIGFzc3VtZSByZXNvdXJjZSBidW5kbGUgcGx1Z2luLnByb3BlcnRpZXMgY29udGFpbnMNCi0JICogbmFtZSA9IFByb2plY3QgTmFtZQ0KLQkgKiA8cHJlPg0KLQkgKiAgICAgcmVzb2x2ZU5MU3RyaW5nKGIsIkhlbGxvIFdvcmxkIikgcmV0dXJucyAiSGVsbG8gV29ybGQiPC9saT4NCi0JICogICAgIHJlc29sdmVOTFN0cmluZyhiLCIlbmFtZSIpIHJldHVybnMgIlByb2plY3QgTmFtZSI8L2xpPg0KLQkgKiAgICAgcmVzb2x2ZU5MU3RyaW5nKGIsIiVuYW1lIEhlbGxvIFdvcmxkIikgcmV0dXJucyAiUHJvamVjdCBOYW1lIjwvbGk+DQotCSAqICAgICByZXNvbHZlTkxTdHJpbmcoYiwiJWFiY2QgSGVsbG8gV29ybGQiKSByZXR1cm5zICJIZWxsbyBXb3JsZCI8L2xpPg0KLQkgKiAgICAgcmVzb2x2ZU5MU3RyaW5nKGIsIiVhYmNkIikgcmV0dXJucyAiJWFiY2QiPC9saT4NCi0JICogICAgIHJlc29sdmVOTFN0cmluZyhiLCIlJW5hbWUiKSByZXR1cm5zICIlbmFtZSI8L2xpPg0KLQkgKiA8L3ByZT4NCi0JICogPC9wPg0KLQkgKiANCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgdXJsLg0KLQkgKiBAcGFyYW0gc3RyaW5nIHRyYW5zbGF0YWJsZSBzdHJpbmcgZnJvbSBtb2RlbA0KLQkgKiBAcmV0dXJuIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlTkxTdHJpbmcoVVJMIGJ1bmRsZVVSTCwgU3RyaW5nIHN0cmluZykgew0KLQ0KLQkJaWYgKHN0cmluZyA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQ0KLQkJU3RyaW5nIHMgPSBzdHJpbmcudHJpbSgpOw0KLQ0KLQkJaWYgKHMuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBzdHJpbmc7DQotDQotCQlpZiAoIXMuc3RhcnRzV2l0aChLRVlfUFJFRklYKSkNCi0JCQlyZXR1cm4gc3RyaW5nOw0KLQ0KLQkJaWYgKHMuc3RhcnRzV2l0aChLRVlfRE9VQkxFX1BSRUZJWCkpDQotCQkJcmV0dXJuIHMuc3Vic3RyaW5nKDEpOw0KLQ0KLQkJaW50IGl4ID0gcy5pbmRleE9mKCIgIik7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyBrZXkgPSBpeCA9PSAtMSA/IHMgOiBzLnN1YnN0cmluZygwLCBpeCk7DQotCQlTdHJpbmcgZGZsdCA9IGl4ID09IC0xID8gcyA6IHMuc3Vic3RyaW5nKGl4ICsgMSk7DQotDQotCQlSZXNvdXJjZUJ1bmRsZSBiID0gZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlVVJMKTsNCi0NCi0JCWlmIChiID09IG51bGwpDQotCQkJcmV0dXJuIGRmbHQ7DQotDQotCQl0cnkgew0KLQkJCXJldHVybiBiLmdldFN0cmluZyhrZXkuc3Vic3RyaW5nKDEpKTsNCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIGRmbHQ7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgYSBjb25jcmV0ZSBhcnJheSB0eXBlIGZvciB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZA0KLQkgKiBsaXN0LiBUaGUgbWV0aG9kIGFzc3VtZXMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgbGlzdCBhcmUgdGhlIHNhbWUNCi0JICogY29uY3JldGUgdHlwZSBhcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4NCi0JICogDQotCSAqIEBwYXJhbSBsIGxpc3QNCi0JICogQHJldHVybiBjb25jcmV0ZSBhcnJheSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXJyYXkgdHlwZQ0KLQkgKiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAodGhlIGxpc3QgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBPYmplY3RbXSBhcnJheVR5cGVGb3IoTGlzdCBsKSB7DQotCQlpZiAobCA9PSBudWxsIHx8IGwuc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG51bGw7DQotCQlyZXR1cm4gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsLmdldCgwKS5nZXRDbGFzcygpLCAwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIGNvbmNyZXRlIGFycmF5IHR5cGUgZm9yIHRoZSBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkDQotCSAqIHNldC4gVGhlIG1ldGhvZCBhc3N1bWVzIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIHNldCBhcmUgdGhlIHNhbWUNCi0JICogY29uY3JldGUgdHlwZSBhcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2V0Lg0KLQkgKiANCi0JICogQHBhcmFtIHMgc2V0DQotCSAqIEByZXR1cm4gY29uY3JldGUgYXJyYXkgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFycmF5IHR5cGUNCi0JICogY291bGQgbm90IGJlIGRldGVybWluZWQgKHRoZSBzZXQgaXMgPGNvZGU+bnVsbDwvY29kZT4gb3IgZW1wdHkpDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXByb3RlY3RlZCBPYmplY3RbXSBhcnJheVR5cGVGb3IoU2V0IHMpIHsNCi0JCWlmIChzID09IG51bGwgfHwgcy5zaXplKCkgPT0gMCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCUl0ZXJhdG9yIGkgPSBzLml0ZXJhdG9yKCk7DQotCQlyZXR1cm4gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShpLm5leHQoKS5nZXRDbGFzcygpLCAwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JCSogSGVscGVyIG1ldGhvZCB0byBhY2Nlc3MgcmVzb3VjZSBidW5kbGUgZm9yIGZlYXR1cmUuIFRoZSBkZWZhdWx0IA0KLQkJKiBpbXBsZW1lbnRhdGlvbiBhdHRlbXB0cyB0byBsb2FkIHRoZSBhcHByb3ByaWF0ZWx5IGxvY2FsaXplZCANCi0JCSogZmVhdHVyZS5wcm9wZXJ0aWVzIGZpbGUuDQotCQkqIA0KLQkJKiBAcGFyYW0gdXJsIGJhc2UgVVJMIHVzZWQgdG8gbG9hZCB0aGUgcmVzb3VyY2UgYnVuZGxlLg0KLQkJKiBAcmV0dXJuIHJlc291cmNlIGJ1bmRsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCQkqIEBzaW5jZSAyLjANCi0JCSovDQotCXByb3RlY3RlZCBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShVUkwgdXJsKSB7DQotDQotCQlpZiAodXJsID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQlpZiAoYnVuZGxlcyA9PSBudWxsKSB7DQotCQkJYnVuZGxlcyA9IG5ldyBIYXNoTWFwKCk7DQotCQl9IGVsc2Ugew0KLQkJCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IChSZXNvdXJjZUJ1bmRsZSkgYnVuZGxlcy5nZXQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCWlmIChidW5kbGUgIT0gbnVsbCkNCi0JCQkJcmV0dXJuIGJ1bmRsZTsNCi0JCX0NCi0NCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7DQotCQl0cnkgew0KLQkJCXVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5hc0RpcmVjdG9yeVVSTCh1cmwpOw0KLQkJCUNsYXNzTG9hZGVyIGwgPSBuZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgdXJsIH0sIG51bGwpOw0KLQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShnZXRQcm9wZXJ0eU5hbWUoKSwgTG9jYWxlLmdldERlZmF1bHQoKSwgbCk7DQotCQkJYnVuZGxlcy5wdXQodXJsLnRvRXh0ZXJuYWxGb3JtKCksIGJ1bmRsZSk7DQotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICI6IiArIHVybC50b0V4dGVybmFsRm9ybSgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gYnVuZGxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgZ2V0UHJvcGVydHlOYW1lLg0KLQkgKiBAcmV0dXJuIFN0cmluZw0KLQkgKi8NCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7DQotCQlyZXR1cm4gRmVhdHVyZS5GRUFUVVJFX0ZJTEU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9Ob25QbHVnaW5FbnRyeU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL05vblBsdWdpbkVudHJ5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjNTZhZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL05vblBsdWdpbkVudHJ5TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLS8qKg0KLSAqIE5vbi1wbHVnLWluIGVudHJ5IG1vZGVsIG9iamVjdC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLk5vblBsdWdpbkVudHJ5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBOb25QbHVnaW5FbnRyeU1vZGVsIGV4dGVuZHMgQ29udGVudEVudHJ5TW9kZWwgew0KLQ0KLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgdW5pbml0aWFsaXplZCBub24tcGx1Zy1pbiBlbnRyeSBtb2RlbCBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgTm9uUGx1Z2luRW50cnlNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGVudHJ5IGlkZW50aWZpZXIuDQotCSAqDQotCSAqIEByZXR1cm4gZW50cnkgaWRlbnRpZmllciwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgew0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBlbnRyeSBpZGVudGlmaWVyLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gaWQgZW50cnkgaWRlbnRpZmllci4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWQpIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmlkID0gaWQ7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9QbHVnaW5FbnRyeU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1BsdWdpbkVudHJ5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxNTRkMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1BsdWdpbkVudHJ5TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsNCi0NCi0NCi0vKioNCi0gKiBQbHVnLWluIGVudHJ5IG1vZGVsIG9iamVjdC4NCi0gKiA8cD4NCi0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IA0KLSAqIGNhc2VzIGNsaWVudHMgc2hvdWxkIGluc3RlYWQgaW5zdGFudGlhdGUgb3Igc3ViY2xhc3MgdGhlIHByb3ZpZGVkIA0KLSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbW9kZWwuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvDQotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrDQotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4NCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLg0KLSAqIDwvcD4NCi0gKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlBsdWdpbkVudHJ5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBQbHVnaW5FbnRyeU1vZGVsIGV4dGVuZHMgQ29udGVudEVudHJ5TW9kZWwgew0KLQ0KLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsNCi0JcHJpdmF0ZSBTdHJpbmcgcGx1Z2luVmVyc2lvbjsNCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIHVucGFjayA9IHRydWU7DQotCQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIHVuaW5pdGlhbGl6ZWQgcGx1Zy1pbiBlbnRyeSBtb2RlbCBvYmplY3QuDQotCSAqIA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgUGx1Z2luRW50cnlNb2RlbCgpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENvbXBhcmVzIHR3byBwbHVnLWluIG1vZGVscyBmb3IgZXF1YWxpdHkNCi0JICogDQotCSAqIEBwYXJhbSBvYmogb3RoZXIgbW9kZWwgdG8gY29tcGFyZSB0bw0KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb2RlbHMgYXJlIGVxdWFsLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBQbHVnaW5FbnRyeU1vZGVsKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlQbHVnaW5FbnRyeU1vZGVsIG1vZGVsID0gKFBsdWdpbkVudHJ5TW9kZWwpIG9iajsNCi0JCQ0KLQkJcmV0dXJuICgNCi0JCQkoZ2V0UGx1Z2luSWRlbnRpZmllcigpLmVxdWFscyhtb2RlbC5nZXRQbHVnaW5JZGVudGlmaWVyKCkpKQ0KLQkJCQkmJiAoZ2V0UGx1Z2luVmVyc2lvbigpLmVxdWFscyhtb2RlbC5nZXRQbHVnaW5WZXJzaW9uKCkpKQ0KLQkJCQkmJiAoaXNGcmFnbWVudCgpID09IG1vZGVsLmlzRnJhZ21lbnQoKSkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIGlkZW50aWZpZXIgZm9yIHRoaXMgZW50cnkuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIGlkZW50aWZpZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjAgDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkZW50aWZpZXIoKSB7DQotCQlyZXR1cm4gcGx1Z2luSWQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gdmVyc2lvbiBmb3IgdGhpcyBlbnRyeS4NCi0JICogDQotCSAqIEByZXR1cm4gdGhlIHBsdWctaW4gdmVyc2lvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luVmVyc2lvbigpIHsNCi0JCXJldHVybiBwbHVnaW5WZXJzaW9uOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW50cnkgZGVzY3JpYmVzIGEgZnVsbCBwbHVnLWluLCBvciANCi0JICogYSBwbHVnLWluIGZyYWdtZW50Lg0KLQkgKiANCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZW50cnkgaXMgYSBwbHVnLWluIGZyYWdtZW50LCANCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSBlbnRyeSBpcyBhIHBsdWctaW4NCi0JICogQHNpbmNlIDIuMCANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7DQotCQlyZXR1cm4gaXNGcmFnbWVudDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgZW50cnkgcGx1Zy1pbiBpZGVudGlmaWVyLg0KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5Lg0KLQkgKg0KLQkgKiBAcGFyYW0gcGx1Z2luSWQgdGhlIGVudHJ5IGlkZW50aWZpZXIuDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBsdWdpbklkZW50aWZpZXIoU3RyaW5nIHBsdWdpbklkKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBlbnRyeSBwbHVnLWluIHZlcnNpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBwbHVnaW5WZXJzaW9uIHRoZSBlbnRyeSB2ZXJzaW9uLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQbHVnaW5WZXJzaW9uKFN0cmluZyBwbHVnaW5WZXJzaW9uKSB7DQotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOw0KLQkJdGhpcy5wbHVnaW5WZXJzaW9uID0gcGx1Z2luVmVyc2lvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBlbnRyeSByZXByZXNlbnRzIGEgZnJhZ21lbnQgb3IgcGx1Zy1pbi4NCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIGlzRnJhZ21lbnQgZnJhZ21lbnQgc2V0dGluZw0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBpc0ZyYWdtZW50KGJvb2xlYW4gaXNGcmFnbWVudCkgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMuaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4gSW5kaWNhdGVzIHdoZXRoZXIgcGx1Z2luIHNob3VsZCBiZSB1bnBhY2tlZCBkdXJpbmcgaW5zdGFsbGF0aW9uDQotCSAqIG9yIGNhbiBydW4gZnJvbSBhIGphcg0KLQkgKiBAc2luY2UgMy4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc1VucGFjaygpIHsNCi0JCS8vIFRPRE8gdGhpcyBpcyBhIGNhbmRpZGF0ZSBmb3IgSVBsdWdpbkVudHJ5IEFQSQ0KLQkJcmV0dXJuIHVucGFjazsNCi0JfQ0KLQkvKioNCi0JICogQHBhcmFtIHVucGFjayBTZXRzIHdoZXRoZXIgcGx1Z2luIHNob3VsZCBiZSB1bnBhY2tlZCBkdXJpbmcgaW5zdGFsbGF0aW9uDQotCSAqIG9yIGNhbiBydW4gZnJvbSBhIGphcg0KLQkgKiBAc2luY2UgMy4wDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRVbnBhY2soYm9vbGVhbiB1bnBhY2spIHsNCi0JCS8vIFRPRE8gdGhpcyBpcyBhIGNhbmRpZGF0ZSBmb3IgSVBsdWdpbkVudHJ5IEFQSQ0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudW5wYWNrID0gdW5wYWNrOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KLQkJU3RyaW5nIG1zZyA9IChnZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpP2dldFBsdWdpbklkZW50aWZpZXIoKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkDQotCQltc2cgKz0gZ2V0UGx1Z2luVmVyc2lvbigpIT1udWxsPyIgIitnZXRQbHVnaW5WZXJzaW9uKCkudG9TdHJpbmcoKToiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQltc2cgKz0gaXNGcmFnbWVudCgpPyIgZnJhZ21lbnQiOiIgcGx1Z2luIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQlyZXR1cm4gbXNnOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvU2l0ZU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1NpdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY0MGRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvU2l0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOwotCi0vKioKLSAqIFNpdGUgbW9kZWwgb2JqZWN0LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG1heSBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZCBieSBjbGllbnRzLiBIb3dldmVyLCBpbiBtb3N0IAotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgCi0gKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1vZGVsLgotICogPC9wPgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgU2l0ZU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3QgewotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQlwcml2YXRlIFVSTEVudHJ5TW9kZWwgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBMaXN0IC8qb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsKi8KLQlmZWF0dXJlUmVmZXJlbmNlczsKLQlwcml2YXRlIExpc3QgLypvZiBBcmNoaXZlUmVmZXJlbmNlTW9kZWwqLwotCWFyY2hpdmVSZWZlcmVuY2VzOwotCXByaXZhdGUgU2V0IC8qb2YgQ2F0ZWdvcnlNb2RlbCovCi0JY2F0ZWdvcmllczsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTFN0cmluZzsKLQlwcml2YXRlIFVSTCBsb2NhdGlvblVSTDsKLQlwcml2YXRlIENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlndXJlZFNpdGVNb2RlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBzaXRlIG1vZGVsIG9iamVjdC4KLQkgKiAKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiogCi0JICogUmV0dXJucyB0aGUgc2l0ZSB0eXBlLgotCSAqIAotCSAqIEByZXR1cm4gc2l0ZSB0eXBlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXRlIGRlc2NyaXB0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gc2l0ZSBkZXNjcmlwdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBVUkxFbnRyeU1vZGVsIGdldERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscyBvbiB0aGlzIHNpdGUuCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSB7Ci0JCWlmIChmZWF0dXJlUmVmZXJlbmNlcyA9PSBudWxsIHx8IGZlYXR1cmVSZWZlcmVuY2VzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsWzBdOwotCi0JCXJldHVybiAoU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdKSBmZWF0dXJlUmVmZXJlbmNlcy50b0FycmF5KGFycmF5VHlwZUZvcihmZWF0dXJlUmVmZXJlbmNlcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWxzCi0JICogb24gdGhpcyBzaXRlCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZQotCSAqIG5vIGFyY2hpdmVzIGtub3duIHRvIHRoaXMgc2l0ZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKSB7Ci0JCWlmIChhcmNoaXZlUmVmZXJlbmNlcyA9PSBudWxsIHx8IGFyY2hpdmVSZWZlcmVuY2VzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBBcmNoaXZlUmVmZXJlbmNlTW9kZWxbMF07Ci0KLQkJcmV0dXJuIChBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSkgYXJjaGl2ZVJlZmVyZW5jZXMudG9BcnJheShhcnJheVR5cGVGb3IoYXJjaGl2ZVJlZmVyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3J5IG1vZGVscyBmb3IgdGhpcyBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2Ygc2l0ZSBjYXRlZ29yeSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ2F0ZWdvcnlNb2RlbFtdIGdldENhdGVnb3J5TW9kZWxzKCkgewotCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsIHx8IGNhdGVnb3JpZXMuc2l6ZSgpPT0wKQotCQkJcmV0dXJuIG5ldyBDYXRlZ29yeU1vZGVsWzBdOwotCi0JCXJldHVybiAoQ2F0ZWdvcnlNb2RlbFtdKSBjYXRlZ29yaWVzLnRvQXJyYXkoYXJyYXlUeXBlRm9yKGNhdGVnb3JpZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bnJlc29sdmVkIFVSTCBzdHJpbmcgZm9yIHRoZSBzaXRlLgotCSAqCi0JICogQHJldHVybiB1cmwgc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMU3RyaW5nKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvblVSTCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uVVJMOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgdHlwZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIHNpdGUgdHlwZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZSBkZXNjcmlwdGlvbi4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBzaXRlIGRlc2NyaXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uTW9kZWwoVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbikgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZmVhdHVyZSByZWZlcmVuY2VzIGZvciB0aGlzIHNpdGUuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVJlZmVyZW5jZXMgYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZVJlZmVyZW5jZXMpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLmZlYXR1cmVSZWZlcmVuY2VzID0gbnVsbDsKLQkJZWxzZQotCQkJdGhpcy5mZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmZWF0dXJlUmVmZXJlbmNlcykpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFyY2hpdmUgcmVmZXJlbmNlcyBmb3IgdGhpcyBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmVSZWZlcmVuY2VzIGFuIGFycmF5IG9mIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVscwotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKEFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVSZWZlcmVuY2VzKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCWlmIChhcmNoaXZlUmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcyA9IG51bGw7Ci0JCWVsc2UKLQkJCXRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoYXJjaGl2ZVJlZmVyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlIGNhdGVnb3JpZXMuCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcmllcyBhbiBhcnJheSBvZiBjYXRlZ29yeSBtb2RlbHMKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlNb2RlbHMoQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCkKLQkJCXRoaXMuY2F0ZWdvcmllcyA9IG51bGw7Ci0JCWVsc2UgewotCQkJdGhpcy5jYXRlZ29yaWVzID0gbmV3IFRyZWVTZXQoQ2F0ZWdvcnlNb2RlbC5nZXRDb21wYXJhdG9yKCkpOwotCQkJdGhpcy5jYXRlZ29yaWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNhdGVnb3JpZXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHVucmVzb2x2ZWQgVVJMIGZvciB0aGUgc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvblVSTFN0cmluZyB1cmwgZm9yIHRoZSBzaXRlIChhcyBhIHN0cmluZykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubG9jYXRpb25VUkxTdHJpbmcgPSBsb2NhdGlvblVSTFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgdG8gc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHRoaXMuZmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXRoaXMuZmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIFBFUkY6IGRvIG5vdCBjaGVjayBpZiBhbHJlYWR5IHByZXNlbnQgCi0JCS8vaWYgKCF0aGlzLmZlYXR1cmVSZWZlcmVuY2VzLmNvbnRhaW5zKGZlYXR1cmVSZWZlcmVuY2UpKQotCQkJdGhpcy5mZWF0dXJlUmVmZXJlbmNlcy5hZGQoZmVhdHVyZVJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhbiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbCB0byBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGFyY2hpdmVSZWZlcmVuY2UgYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKEFyY2hpdmVSZWZlcmVuY2VNb2RlbCBhcmNoaXZlUmVmZXJlbmNlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCWlmICh0aGlzLmFyY2hpdmVSZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLmFyY2hpdmVSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIXRoaXMuYXJjaGl2ZVJlZmVyZW5jZXMuY29udGFpbnMoYXJjaGl2ZVJlZmVyZW5jZSkpCi0JCQl0aGlzLmFyY2hpdmVSZWZlcmVuY2VzLmFkZChhcmNoaXZlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgY2F0ZWdvcnkgbW9kZWwgdG8gc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBtb2RlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeU1vZGVsKENhdGVnb3J5TW9kZWwgY2F0ZWdvcnkpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHRoaXMuY2F0ZWdvcmllcyA9PSBudWxsKQotCQkJdGhpcy5jYXRlZ29yaWVzID0gbmV3IFRyZWVTZXQoQ2F0ZWdvcnlNb2RlbC5nZXRDb21wYXJhdG9yKCkpOwotCQlpZiAoIXRoaXMuY2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpCi0JCQl0aGlzLmNhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwgZnJvbSBzaXRlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmZXJlbmNlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCWlmICh0aGlzLmZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpCi0JCQl0aGlzLmZlYXR1cmVSZWZlcmVuY2VzLnJlbW92ZShmZWF0dXJlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsIGZyb20gc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlUmVmZXJlbmNlIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbChBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZVJlZmVyZW5jZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQlpZiAodGhpcy5hcmNoaXZlUmVmZXJlbmNlcyAhPSBudWxsKQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcy5yZW1vdmUoYXJjaGl2ZVJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIGNhdGVnb3J5IG1vZGVsIGZyb20gc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBtb2RlbAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDYXRlZ29yeU1vZGVsKENhdGVnb3J5TW9kZWwgY2F0ZWdvcnkpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHRoaXMuY2F0ZWdvcmllcyAhPSBudWxsKQotCQkJdGhpcy5jYXRlZ29yaWVzLnJlbW92ZShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogTWFya3MgdGhlIG1vZGVsIG9iamVjdCBhcyByZWFkLW9ubHkuCi0JICogCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtSZWFkT25seSgpIHsKLQkJc3VwZXIubWFya1JlYWRPbmx5KCk7Ci0JCW1hcmtSZWZlcmVuY2VSZWFkT25seShnZXREZXNjcmlwdGlvbk1vZGVsKCkpOwotCQltYXJrTGlzdFJlZmVyZW5jZVJlYWRPbmx5KGdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKSk7Ci0JCW1hcmtMaXN0UmVmZXJlbmNlUmVhZE9ubHkoZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpKTsKLQkJbWFya0xpc3RSZWZlcmVuY2VSZWFkT25seShnZXRDYXRlZ29yeU1vZGVscygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIAotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgCi0JICogcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0JCS8vIEFyY2hpdmVzIGFuZCBmZWF0dXJlIGFyZSByZWxhdGl2ZSB0byBsb2NhdGlvbiBVUkwKLQkJLy8gaWYgdGhlIFNpdGUgZWxlbWVudCBoYXMgYSBVUkwgdGFnOiBzZWUgc3BlYwkKLQkJbG9jYXRpb25VUkwgPSByZXNvbHZlVVJMKGJhc2UsIGJ1bmRsZVVSTCwgZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSk7Ci0JCWlmIChsb2NhdGlvblVSTCA9PSBudWxsKQotCQkJbG9jYXRpb25VUkwgPSBiYXNlOwotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCksIGxvY2F0aW9uVVJMLCBidW5kbGVVUkwpOwotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCksIGxvY2F0aW9uVVJMLCBidW5kbGVVUkwpOwotCi0JCXJlc29sdmVSZWZlcmVuY2UoZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLCBiYXNlLCBidW5kbGVVUkwpOwotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRDYXRlZ29yeU1vZGVscygpLCBiYXNlLCBidW5kbGVVUkwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsIGdldENvbmZpZ3VyZWRTaXRlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbmZpZ3VyZWRTaXRlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJlZFNpdGVNb2RlbChDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ3VyZWRTaXRlTW9kZWwpIHsKLQkJdGhpcy5jb25maWd1cmVkU2l0ZU1vZGVsID0gY29uZmlndXJlZFNpdGVNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0I2dldFByb3BlcnR5TmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiBTaXRlLlNJVEVfRklMRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvU2l0ZU1vZGVsRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9TaXRlTW9kZWxGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZDU3NDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9TaXRlTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy54bWwuc2F4Lio7DQotDQotLyoqDQotICogRGVmYXVsdCBzaXRlIG1vZGVsIGZhY3RvcnkuDQotICogPHA+DQotICogVGhpcyBjbGFzcyBtYXkgYmUgaW5zdGFudGlhdGVkIG9yIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4gSG93ZXZlciwgaW4gbW9zdCANCi0gKiBjYXNlcyBjbGllbnRzIHNob3VsZCBpbnN0ZWFkIHN1YmNsYXNzIHRoZSBwcm92aWRlZCBiYXNlIGltcGxlbWVudGF0aW9uIA0KLSAqIG9mIHRoaXMgZmFjdG9yeS4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBTaXRlTW9kZWxGYWN0b3J5IHsNCi0JDQotCXByaXZhdGUgc3RhdGljIERlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOw0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIGRlZmF1bHQgc2l0ZSBmYWN0b3J5Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFNpdGVNb2RlbEZhY3RvcnkoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZhY3RvcnkgY2FuIGhhbmRsZSB0aGUgc3BlY2lmaWVkIHNpdGUgdHlwZS4gVGhpcw0KLQkgKiBtZXRob2QgaXMgaW50ZW5kZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLg0KLQkgKiANCi0JICogQHBhcmFtIHR5cGUgc2l0ZSB0eXBlIGlkZW50aWZpZXINCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdHlwZSBjYW4gYmUgaGFuZGxlZCwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7DQotCQkvLyByZXR1cm4gdHJ1ZSBpZiB0eXBlIHdhcyBub3Qgc3BlY2lmaWVkIChpZS4gaXMgbnVsbCBvciBlbXB0eSBzdHJpbmcpDQotCQlyZXR1cm4gKHR5cGUgPT0gbnVsbCB8fCB0eXBlLnRyaW0oKS5lcXVhbHMoIiIpKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGFuZCBwb3B1bGF0ZXMgYSBkZWZhdWx0IHNpdGUgZnJvbSBzdHJlYW0uDQotCSAqIFRoZSBwYXJzZXIgYXNzdW1lcyB0aGUgc3RyZWFtIGNvbnRhaW5zIGEgZGVmYXVsdCBzaXRlIG1hbmlmZXN0DQotCSAqIChzaXRlLnhtbCkgYXMgZG9jdW1lbnRlZCBieSB0aGUgcGxhdGZvcm0uDQotCSAqIA0KLQkgKiBAcGFyYW0gc3RyZWFtIHNpdGUgc3RyZWFtDQotCSAqIEByZXR1cm4gcG9wdWxhdGVkIHNpdGUgbW9kZWwNCi0JICogQGV4Y2VwdGlvbiBDb3JlRXhjZXB0aW9uDQotCSAqIEBleGNlcHRpb24gSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTaXRlTW9kZWwgcGFyc2VTaXRlKElucHV0U3RyZWFtIHN0cmVhbSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQkJU2l0ZU1vZGVsIHJlc3VsdCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXBhcnNlci5pbml0KHRoaXMpOw0KLQkJCXJlc3VsdCA9IHBhcnNlci5wYXJzZShzdHJlYW0pOw0KLQkJCWlmIChwYXJzZXIuZ2V0U3RhdHVzKCkhPW51bGwpIHsNCi0JCQkJLy8gc29tZSBpbnRlcm5hbEVycm9yIHdlcmUgZGV0ZWN0ZWQNCi0JCQkJSVN0YXR1cyBzdGF0dXMgPSBwYXJzZXIuZ2V0U3RhdHVzKCk7DQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7DQotCQkJfQ0KLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBpbnZhbGlkIFNpdGUgdHlwZQ0KLQkJCWlmIChlLmdldEV4Y2VwdGlvbigpIGluc3RhbmNlb2YgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uKSB7DQotCQkJCXRocm93IChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24pIGUuZ2V0RXhjZXB0aW9uKCk7DQotCQkJfQ0KLQ0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlTW9kZWxPYmplY3QuRXJyb3JQYXJzaW5nU2l0ZVN0cmVhbSIpLGUpOyAvLyROT04tTkxTLTEkDQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZU1vZGVsT2JqZWN0LkVycm9yQWNjZXNzaW5nU2l0ZVN0cmVhbSIpLGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IHNpdGUgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIFNpdGVNb2RlbA0KLQkgKiBAcmV0dXJuIHNpdGUgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFNpdGVNb2RlbCBjcmVhdGVTaXRlTWFwTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IFNpdGVNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IHNpdGUgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwuDQotCSAqIA0KLQkgKiBAc2VlIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwNCi0JICogQHJldHVybiBzaXRlIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBBcmNoaXZlUmVmZXJlbmNlTW9kZWwNCi0JICogQHJldHVybiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbA0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIENyZWF0ZSBhIGRlZmF1bHQgYW5ub3RhdGVkIFVSTCBtb2RlbC4NCi0JICogDQotCSAqIEBzZWUgVVJMRW50cnlNb2RlbA0KLQkgKiBAcmV0dXJuIGFubm90YXRlZCBVUkwgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwgY3JlYXRlVVJMRW50cnlNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgVVJMRW50cnlNb2RlbCgpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGUgYSBkZWZhdWx0IGNhdGVnb3J5IG1vZGVsLg0KLQkgKiANCi0JICogQHNlZSBDYXRlZ29yeU1vZGVsDQotCSAqIEByZXR1cm4gY2F0ZWdvcnkgbW9kZWwNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIENhdGVnb3J5TW9kZWwgY3JlYXRlU2l0ZUNhdGVnb3J5TW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IENhdGVnb3J5TW9kZWwoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL1VSTEVudHJ5TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvVVJMRW50cnlNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjgxZTZjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2NvcmUvbW9kZWwvVVJMRW50cnlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEFubm90YXRlZCBVUkwgbW9kZWwgb2JqZWN0Lg0KLSAqIDxwPg0KLSAqIFRoaXMgY2xhc3MgbWF5IGJlIGluc3RhbnRpYXRlZCBvciBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuIEhvd2V2ZXIsIGluIG1vc3QgDQotICogY2FzZXMgY2xpZW50cyBzaG91bGQgaW5zdGVhZCBpbnN0YW50aWF0ZSBvciBzdWJjbGFzcyB0aGUgcHJvdmlkZWQgDQotICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtb2RlbC4NCi0gKiA8L3A+DQotICogPHA+DQotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8NCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sNCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbg0KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuDQotICogPC9wPg0KLSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuVVJMRW50cnkNCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIFVSTEVudHJ5TW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7DQotCQ0KLQlwcml2YXRlIFN0cmluZyBhbm5vdGF0aW9uOw0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGl6ZWRBbm5vdGF0aW9uOw0KLQlwcml2YXRlIFN0cmluZyB1cmxTdHJpbmc7DQotCXByaXZhdGUgVVJMIHVybDsNCi0JDQotCXByaXZhdGUgaW50IHR5cGUgPSBJVVJMRW50cnkuVVBEQVRFX1NJVEU7DQotCQ0KLQkvL3BlcmZvcm1hbmNlDQotCXByaXZhdGUgVVJMIGJ1bmRsZVVSTDsNCi0JcHJpdmF0ZSBVUkwgYmFzZTsNCi0JcHJpdmF0ZSBib29sZWFuIHJlc29sdmVkPWZhbHNlOw0KLQkNCi0JLyoqDQotCSAqIENyZWF0ZXMgYSB1bmluaXRpYWxpemVkIGFubm90YXRlZCBVUkwgbW9kZWwgb2JqZWN0Lg0KLQkgKiANCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTEVudHJ5TW9kZWwoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotCQkNCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHVybCBhbm5vdGF0aW9uLiBJZiB0aGUgbW9kZWwgb2JqZWN0IGhhcyBiZWVuIHJlc29sdmVkLCANCi0JICogdGhlIGFubm90YXRpb24gaXMgbG9jYWxpemVkLg0KLQkgKiANCi0JICogQHJldHVybiB1cmwgYW5ub3RhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbigpIHsNCi0JCWRlbGF5ZWRSZXNvbHZlKCk7DQotCQlpZiAobG9jYWxpemVkQW5ub3RhdGlvbiAhPSBudWxsKQ0KLQkJCXJldHVybiBsb2NhbGl6ZWRBbm5vdGF0aW9uOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBhbm5vdGF0aW9uOw0KLQl9DQotCQkNCi0JLyoqDQotCSAqIHJldHVybnMgdGhlIG5vbi1sb2NhbGl6ZWQgdXJsIGFubm90YXRpb24uDQotCSAqIA0KLQkgKiBAcmV0dXJuIG5vbi1sb2NhbGl6ZWQgdXJsIGFubm90YXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25Ob25Mb2NhbGl6ZWQoKSB7DQotCQlyZXR1cm4gYW5ub3RhdGlvbjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCB1cmwgc3RyaW5nLg0KLQkgKg0KLQkgKiBAcmV0dXJuIHVybCBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+DQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMU3RyaW5nKCkgew0KLQkJZGVsYXllZFJlc29sdmUoKTsNCi0JCXJldHVybiB1cmxTdHJpbmc7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIHRoZSByZXNvbHZlZCBVUkwuDQotCSAqIA0KLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlkZWxheWVkUmVzb2x2ZSgpOw0KLQkJcmV0dXJuIHVybDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIGFubm90YXRpb24uDQotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuDQotCSAqDQotCSAqIEBwYXJhbSBhbm5vdGF0aW9uIGFubm90YXRpb24NCi0JICogQHNpbmNlIDIuMA0KLQkgKi8JDQotCXB1YmxpYyB2b2lkIHNldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb24pIHsNCi0JCWFzc2VydElzV3JpdGVhYmxlKCk7DQotCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOw0KLQkJdGhpcy5sb2NhbGl6ZWRBbm5vdGF0aW9uID0gbnVsbDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIHVybCBzdHJpbmcNCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4NCi0JICoNCi0JICogQHBhcmFtIHVybFN0cmluZyB1cmwgc3RyaW5nDQotCSAqIEBzaW5jZSAyLjANCi0JICovCQ0KLQlwdWJsaWMgdm9pZCBzZXRVUkxTdHJpbmcoU3RyaW5nIHVybFN0cmluZykgew0KLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsNCi0JCXRoaXMudXJsU3RyaW5nID0gdXJsU3RyaW5nOw0KLQkJdGhpcy51cmwgPSBudWxsOw0KLQl9DQotCQ0KLQkvKioNCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0Lg0KLQkgKiBBbnkgVVJMIHN0cmluZ3MgaW4gdGhlIG1vZGVsIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgDQotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlDQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIA0KLQkgKiByZXNvdXJjZSBidW5kbGUuDQotCSAqIA0KLQkgKiBAcGFyYW0gYmFzZSBVUkwNCi0JICogQHBhcmFtIGJ1bmRsZVVSTCAgcmVzb3VyY2UgYnVuZGxlIHVybA0KLQkgKiBAZXhjZXB0aW9uIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLCBVUkwgYnVuZGxlVVJMKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCXRoaXMuYmFzZSA9IGJhc2U7DQotCQl0aGlzLmJ1bmRsZVVSTCA9IGJ1bmRsZVVSTDsNCi0JfQ0KLQ0KLQ0KLQlwcml2YXRlIHZvaWQgZGVsYXllZFJlc29sdmUoKSB7DQotCQkNCi0JCS8vUEVSRjogZGVsYXkgcmVzb2x1dGlvbg0KLQkJaWYgKHJlc29sdmVkKXJldHVybjsNCi0JCQ0KLQkJcmVzb2x2ZWQ9IHRydWU7DQotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzDQotCQlsb2NhbGl6ZWRBbm5vdGF0aW9uID0gcmVzb2x2ZU5MU3RyaW5nKGJ1bmRsZVVSTCwgYW5ub3RhdGlvbik7DQotCQl0cnkgew0KLQkJCXVybCA9IHJlc29sdmVVUkwoYmFzZSxidW5kbGVVUkwsIHVybFN0cmluZyk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7DQotCQkJVXBkYXRlQ29yZS53YXJuKCIiLGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHNwZWNpZmllZCB0eXBlLg0KLQkgKiANCi0JICogQHNpbmNlIDIuMQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXRUeXBlKCkgew0KLQkJcmV0dXJuIHR5cGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIE1ldGhvZCBzZXRUeXBlLg0KLQkgKiBAcGFyYW0gaQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VHlwZShpbnQgaSkgew0KLQkJdHlwZSA9IGk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9tb2RlbC9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhhNjY1ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL21vZGVsL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+DQotPGh0bWw+DQotPGhlYWQ+DQotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPg0KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4NCi0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotUHJvdmlkZXMgbW9kZWwgc3VwcG9ydCBmb3IgZXh0ZW5kaW5nIHRoZSBiYXNlIGluc3RhbGxhdGlvbg0KLWFuZCB1cGRhdGUgc2VydmljZXMuDQotPGgyPg0KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+DQotVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGEgY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlZmF1bHQgbW9kZWwNCi1vYmplY3RzIGFuZCBwYXJzZXJzIHVzZWQgZm9yIHdyaXRpbmcgcGx1Z2dhYmxlIHN1cHBvcnQgb2YgYWx0ZXJuYXRlIGZlYXR1cmUNCi1wYWNrYWdpbmcgc2NoZW1lcyBhbmQgdXBkYXRlIHNpdGUgYWNjZXNzIG1lY2hhbmlzbXMuIEluIGdlbmVyYWwsIG1vc3QgZGV2ZWxvcGVycw0KLWRvIG5vdCBuZWVkIHRvIGRpcmVjdGx5IHVzZSB0aGUgY2xhc3NlcyBkZWZpbmVkIGluIHRoaXMgcGFja2FnZS4gSW5zdGVhZCwNCi10aGV5IGNhbiB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGNvbnRhaW5lZA0KLWluIHBhY2thZ2UgPGI+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L2I+Lg0KLTxwPkNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIHdvdWxkIHR5cGljYWxseSBvbmx5IGJlIHVzZWQgZGlyZWN0bHkgd2hlbiB3cml0aW5nDQotYW5kIGFsdGVybmF0ZSBzZXQgb2YgbW9kZWwgb2JqZWN0cyBmb3IgYSBmZWF0dXJlIGFuZCB0eXBlIGltcGxlbWVudGF0aW9uLg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvY29yZS9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL3BhY2thZ2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0MTE0MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9jb3JlL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+DQotPGh0bWw+DQotPGhlYWQ+DQotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+DQotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPg0KLSAgIDxtZXRhIG5hbWU9IkdFTkVSQVRPUiIgY29udGVudD0iTW96aWxsYS80LjcyIFtlbl0gKFdpbmRvd3MgTlQgNS4wOyBVKSBbTmV0c2NhcGVdIj4NCi0gICA8dGl0bGU+UGFja2FnZS1sZXZlbCBKYXZhZG9jPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotUHJvdmlkZXMgc3VwcG9ydCBmb3IgZXh0ZW5kaW5nIHRoZSBiYXNlIGluc3RhbGxhdGlvbg0KLWFuZCB1cGRhdGUgc2VydmljZXMuDQotPGgyPg0KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+DQotVGhpcyBwYWNrYWdlIHNwZWNpZmllcyB0aGUgQVBJIHJlcXVpcmVkIGZvciB3cml0aW5nIHBsdWdnYWJsZSBzdXBwb3J0IG9mDQotYWx0ZXJuYXRlIGZlYXR1cmUgcGFja2FnaW5nIHNjaGVtZXMgYW5kIHVwZGF0ZSBzaXRlIGFjY2VzcyBtZWNoYW5pc21zLg0KLUZvciB0aGUgbW9zdCBwYXJ0LCB0aGUgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyBpbiB0aGlzIHBhY2thZ2UgaW1wbGVtZW50DQotYSBjb2RlIHBhdHRlcm4gPHR0PmNsYXNzIEZvbyBleHRlbmRzIEZvb01vZGVsIGltcGxlbWVudHMgSUZvbzwvdHQ+LiBUaGUNCi1pbnRlcmZhY2UgKDx0dD5JRm9vPC90dD4gaW4gdGhlIHBhdHRlcm4pIGRlZmluZXMgdGhlIGFjdHVhbCBBUEkuIFRoZSBjb252ZW5pZW5jZQ0KLWNsYXNzZXMgKDx0dD5Gb288L3R0PiBpbiB0aGUgcGF0dGVybikgcHJvdmlkZSBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbg0KLW9mIHRoZSBBUEkgYmFzZWQgb24gYSBtb2RlbCAoPHR0PklGb29Nb2RlbDwvdHQ+IGluIHRoZSBwYXR0ZXJuKSBjb250YWluZWQNCi1pbiBwYWNrYWdlIDxiPm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsPC9iPi4gSW4gZ2VuZXJhbCwgZGV2ZWxvcGVycw0KLXNob3VsZCBleHRlbmQgdGhlIGNvbnZlbmllbmNlIGNsYXNzZXMgcmF0aGVyIHRoYW4gY29tcGxldGVseSByZWltcGxlbWVudGluZw0KLXRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlcy4NCi08L2JvZHk+DQotPC9odG1sPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQXNzZXJ0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmM4MDRjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQXNzZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotIA0KLS8qKg0KLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcw0KLSAqIGluIGNvZGUuIFRoZSBzdGF0aWMgcHJlZGljYXRlIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUNCi0gKiB0eXBlIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLg0KLSAqIDxwPg0KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZQ0KLSAqIHRocm93biB3aGVuIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5DQotICogdW5zcGVjaWZpZWQgYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbg0KLSAqIHRoZXNlIGJlaW5nIHRocm93biAob3Igbm90IHRocm93bikuIDxiPklmIHlvdSBmaW5kIHlvdXJzZWxmIGluIHRoZQ0KLSAqIHBvc2l0aW9uIHdoZXJlIHlvdSBuZWVkIHRvIGNhdGNoIGFuIGFzc2VydGlvbiBmYWlsdXJlLCB5b3UgaGF2ZSBtb3N0IA0KLSAqIGNlcnRhaW5seSB3cml0dGVuIHlvdXIgcHJvZ3JhbSBpbmNvcnJlY3RseS48L2I+DQotICogPC9wPg0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgew0KLQkNCi0JLyoqDQotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24NCi0JICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+Lg0KLQkgKiA8cD4NCi0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcyB0aGF0IGNhdGNoIA0KLQkgKiBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8gdW5leHBlY3RlZA0KLQkgKiBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuDQotCSAqIDwvcD4NCi0JICovDQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gew0KLQ0KLQkJLyoqDQotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4NCi0JCSAqLw0KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsNCi0JCX0NCi0JCQ0KLQkJLyoqDQotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLg0KLQkJICovDQotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsNCi0JCSAgICBzdXBlcihkZXRhaWwpOw0KLQkJfQ0KLQl9DQotLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLw0KLXByaXZhdGUgQXNzZXJ0KCkgew0KLX0NCi0vKioNCi0gKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzDQotICogbm90IDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+DQotICogaXMgdGhyb3duLg0KLSAqDQotICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvbWUgb2YgdGhlIGNoZWNrDQotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4NCi0gKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpDQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkDQotICovDQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uKSB7DQotCS8vIHN1Y2NlZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZQ0KLQlpZiAoZXhwcmVzc2lvbikgew0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JcmV0dXJuIGlzTGVnYWwoZXhwcmVzc2lvbiwgIiIpOy8vJE5PTi1OTFMtMSQNCi19DQotLyoqDQotICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcw0KLSAqIG5vdCA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPg0KLSAqIGlzIHRocm93bi4NCi0gKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4NCi0gKg0KLSAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBvdXRjb21lIG9mIHRoZSBjaGVjaw0KLSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbg0KLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuDQotICogICAgaWYgdGhlIGNoZWNrIGZhaWxzKQ0KLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZA0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsNCi0JaWYgKCFleHByZXNzaW9uKQ0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsNCi0JcmV0dXJuIGV4cHJlc3Npb247DQotfQ0KLS8qKg0KLSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gb2JqZWN0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPi4gSWYgdGhpcw0KLSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAqIDxwPg0KLSAqIEFzIGEgZ2VuZXJhbCBydWxlLCBwYXJhbWV0ZXJzIHBhc3NlZCB0byBBUEkgbWV0aG9kcyBtdXN0IG5vdCBiZQ0KLSAqIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyA8Yj5leHBsaWNpdGx5PC9iPiBhbGxvd2VkIGluIHRoZSBtZXRob2Qncw0KLSAqIHNwZWNpZmljYXRpb24uIFNpbWlsYXJseSwgcmVzdWx0cyByZXR1cm5lZCBmcm9tIEFQSSBtZXRob2RzIGFyZSBuZXZlcg0KLSAqIDxjb2RlPm51bGw8L2NvZGU+IHVubGVzcyA8Yj5leHBsaWNpdGx5PC9iPiBhbGxvd2VkIGluIHRoZSBtZXRob2Qncw0KLSAqIHNwZWNpZmljYXRpb24uIEltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byBtYWtlIHJlZ3VsYXIgdXNlIG9mIA0KLSAqIDxjb2RlPkFzc2VydC5pc05vdE51bGw8L2NvZGU+IHRvIGVuc3VyZSB0aGF0IDxjb2RlPm51bGw8L2NvZGU+IA0KLSAqIHBhcmFtZXRlcnMgYXJlIGRldGVjdGVkIGFzIGVhcmx5IGFzIHBvc3NpYmxlLg0KLSAqIDwvcD4NCi0gKiBNZXRob2QgdGhyb3dzIGFuIHVuc3BlY2lmaWVkIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIG9iamVjdA0KLSAqICAgaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWx1ZSB0byB0ZXN0DQotICovDQotcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0KSB7DQotCS8vIHN1Y2NlZWQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZQ0KLQlpZiAob2JqZWN0ICE9IG51bGwpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQlpc05vdE51bGwob2JqZWN0LCAiIik7Ly8kTk9OLU5MUy0xJA0KLX0NCi0vKioNCi0gKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMNCi0gKiBpcyBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4NCi0gKiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4NCi0gKiA8cD4NCi0gKiBBcyBhIGdlbmVyYWwgcnVsZSwgcGFyYW1ldGVycyBwYXNzZWQgdG8gQVBJIG1ldGhvZHMgbXVzdCBub3QgYmUNCi0gKiA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgPGI+ZXhwbGljaXRseTwvYj4gYWxsb3dlZCBpbiB0aGUgbWV0aG9kJ3MNCi0gKiBzcGVjaWZpY2F0aW9uLiBTaW1pbGFybHksIHJlc3VsdHMgcmV0dXJuZWQgZnJvbSBBUEkgbWV0aG9kcyBhcmUgbmV2ZXINCi0gKiA8Y29kZT5udWxsPC9jb2RlPiB1bmxlc3MgPGI+ZXhwbGljaXRseTwvYj4gYWxsb3dlZCBpbiB0aGUgbWV0aG9kJ3MNCi0gKiBzcGVjaWZpY2F0aW9uLiBJbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gbWFrZSByZWd1bGFyIHVzZSBvZiANCi0gKiA8Y29kZT5Bc3NlcnQuaXNOb3ROdWxsPC9jb2RlPiB0byBlbnN1cmUgdGhhdCA8Y29kZT5udWxsPC9jb2RlPiANCi0gKiBwYXJhbWV0ZXJzIGFyZSBkZXRlY3RlZCBhcyBlYXJseSBhcyBwb3NzaWJsZS4NCi0gKiA8L3A+DQotICogQW4gdW5zcGVjaWZpZWQgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlIG9iamVjdA0KLSAqICAgaXMgPGNvZGU+bnVsbDwvY29kZT4NCi0gKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWx1ZSB0byB0ZXN0DQotICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uDQotICovDQotcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgew0KLQlpZiAob2JqZWN0ID09IG51bGwpDQotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCJudWxsIGFyZ3VtZW50OyIgKyBtZXNzYWdlKTsvLyROT04tTkxTLTEkDQotfQ0KLS8qKg0KLSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcw0KLSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAqDQotICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvbWUgb2YgdGhlIGNoZWNrDQotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4NCi0gKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpDQotICovDQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24pIHsNCi0JLy8gc3VjY2VlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlDQotCWlmIChleHByZXNzaW9uKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQlyZXR1cm4gaXNUcnVlKGV4cHJlc3Npb24sICIiKTsvLyROT04tTkxTLTEkDQotfQ0KLS8qKg0KLSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcw0KLSAqIGlzIG5vdCB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KLSAqIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQgZGVidWdnaW5nLg0KLSAqDQotICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIG91dGNvbWUgb2YgdGhlIGNoZWNrDQotICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uDQotICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4NCi0gKiAgICBpZiB0aGUgY2hlY2sgZmFpbHMpDQotICovDQotcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7DQotCWlmICghZXhwcmVzc2lvbikNCi0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oImFzc2VydGlvbiBmYWlsZWQ7ICIrbWVzc2FnZSk7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gZXhwcmVzc2lvbjsNCi19DQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQmFzZVNpdGVMb2NhbEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQmFzZVNpdGVMb2NhbEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkODQ5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Jhc2VTaXRlTG9jYWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7DQotLyoqDQotICogDQotICovDQotcHVibGljIGNsYXNzIEJhc2VTaXRlTG9jYWxGYWN0b3J5IHsNCi0JLyoNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbigpOw0KLQl9DQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsIGNyZWF0ZUNvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsKCkgew0KLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoKTsNCi0JfQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsIGNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IENvbmZpZ3VyZWRTaXRlKCk7DQotCX0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgQ29uZmlndXJhdGlvblBvbGljeSgpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsIGNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoU2l0ZU1vZGVsIHNpdGUsIGludCBwb2xpY3kpIHsNCi0JCS8vY3JlYXRlIGNvbmZpZyBzaXRlDQotCQlDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ1NpdGUgPSB0aGlzLmNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoKTsNCi0JCWNvbmZpZ1NpdGUuc2V0U2l0ZU1vZGVsKHNpdGUpOw0KLQkJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIHBvbGljeU1vZGVsID0gdGhpcy5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsNCi0JCXBvbGljeU1vZGVsLnNldFBvbGljeShwb2xpY3kpOw0KLQkJY29uZmlnU2l0ZS5zZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwocG9saWN5TW9kZWwpOw0KLQkJKChDb25maWd1cmF0aW9uUG9saWN5KSBwb2xpY3lNb2RlbCkuc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25maWdTaXRlKTsNCi0JCXJldHVybiBjb25maWdTaXRlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyYXRpb25BY3Rpdml0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTM1M2ExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvbkFjdGl2aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuKjsNCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbkFjdGl2aXR5DQotCWV4dGVuZHMgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwNCi0JaW1wbGVtZW50cyBJQWN0aXZpdHksIElXcml0YWJsZSB7DQotCQkNCi0JLyoqDQotCSAqIERlZmF1bHQgY29uc3RydWN0b3INCi0JICovCQkNCi0JcHVibGljIENvbmZpZ3VyYXRpb25BY3Rpdml0eSgpIHsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIHdpdGggYWN0aW9uDQotCSAqLw0KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5KGludCBhY3Rpb24pIHsNCi0JCXN1cGVyKCk7DQotCQlzZXRBY3Rpb24oYWN0aW9uKTsNCi0JCXNldFN0YXR1cyhTVEFUVVNfTk9LKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJV3JpdGFibGUjd3JpdGUoaW50LCBQcmludFdyaXRlcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBpbmRlbnQsIFByaW50V3JpdGVyIHcpIHsNCi0vLwkJU3RyaW5nIGdhcD0gIiI7IC8vJE5PTi1OTFMtMSQNCi0vLwkJZm9yIChpbnQgaT0gMDsgaSA8IGluZGVudDsgaSsrKQ0KLS8vCQkJZ2FwICs9ICIgIjsgLy8kTk9OLU5MUy0xJA0KLS8vCQlTdHJpbmcgaW5jcmVtZW50PSAiIjsgLy8kTk9OLU5MUy0xJA0KLS8vCQlmb3IgKGludCBpPSAwOyBpIDwgSVdyaXRhYmxlLklOREVOVDsgaSsrKQ0KLS8vCQkJaW5jcmVtZW50ICs9ICIgIjsgLy8kTk9OLU5MUy0xJA0KLS8vCQkJDQotLy8JCS8vIEFDVElWSVRZCQ0KLS8vCQl3LnByaW50KGdhcCArICI8IiArIEluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyLkFDVElWSVRZICsgIiAiKTsNCi0vLwkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotLy8JCXcucHJpbnRsbigiYWN0aW9uPVwiIiArIGdldEFjdGlvbigpICsgIlwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0vLwkJaWYgKGdldExhYmVsKCkgIT0gbnVsbCkgew0KLS8vCQkJdy5wcmludGxuKGdhcCArIGluY3JlbWVudCsgImxhYmVsPVwiIiArIFVwZGF0ZU1hbmFnZXJVdGlscy5Xcml0ZXIueG1sU2FmZShnZXRMYWJlbCgpKSArICJcIiAiKTsNCi0vLwkJCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLS8vCQl9DQotLy8JCXcucHJpbnRsbihnYXAgKyBpbmNyZW1lbnQrImRhdGU9XCIiICsgZ2V0RGF0ZSgpLmdldFRpbWUoKSArICJcIiAiKTsNCi0vLwkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotLy8JCXcucHJpbnRsbihnYXAgKyBpbmNyZW1lbnQrInN0YXR1cz1cIiIgKyBnZXRTdGF0dXMoKSArICJcIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotLy8NCi0vLwkJLy8gZW5kDQotLy8JCXcucHJpbnRsbihnYXAgKyAiPC8iICsgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIuQUNUSVZJVFkgKyAiPiIpOw0KLS8vCQkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0vLwkJdy5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJAkJDQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSUFjdGl2aXR5I2dldEluc3RhbGxDb25maWd1cmF0aW9uKCkNCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB7DQotCQlyZXR1cm4gKElJbnN0YWxsQ29uZmlndXJhdGlvbikgZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7DQotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mIENvbmZpZ3VyYXRpb25BY3Rpdml0eSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKHRoaXMgPT0gb3RoZXIpDQotCQkJcmV0dXJuIHRydWU7DQotCQkNCi0JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IChDb25maWd1cmF0aW9uQWN0aXZpdHkpIG90aGVyOw0KLQkJcmV0dXJuIGdldEFjdGlvbigpID09IGFjdGl2aXR5LmdldEFjdGlvbigpDQotCQkJCSYmIGdldExhYmVsKCkuZXF1YWxzKGFjdGl2aXR5LmdldExhYmVsKCkpDQotCQkJCSYmIGdldFN0YXR1cygpID09IGFjdGl2aXR5LmdldFN0YXR1cygpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29uZmlndXJhdGlvblBvbGljeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uUG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZDdlYWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmF0aW9uUG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIA0KLSAqLw0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUG9saWN5IGV4dGVuZHMgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIHsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwuDQotCSAqLw0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeSgpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29weSBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLg0KLQkgKi8NCi0JcHVibGljIENvbmZpZ3VyYXRpb25Qb2xpY3koQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kpIHsNCi0JCXN1cGVyKCk7DQotCQlzZXRQb2xpY3koY29uZmlnUG9saWN5LmdldFBvbGljeSgpKTsNCi0JCXNldENvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyhjb25maWdQb2xpY3kuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkpOw0KLQkJc2V0VW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMoY29uZmlnUG9saWN5LmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCkpOw0KLQkJc2V0Q29uZmlndXJlZFNpdGVNb2RlbChjb25maWdQb2xpY3kuZ2V0Q29uZmlndXJlZFNpdGVNb2RlbCgpKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNpbmNlIDIuMA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzVW5jb25maWd1cmVkKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UpIHsNCi0NCi0JCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBmZWF0dXJlIGlzIHBhcnQgb2YgdGhlIGNvbmZpZ3VyZWQgbGlzdA0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChmZWF0dXJlUmVmZXJlbmNlLmVxdWFscyhyZWZzW2ldKSkgew0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlKSB7DQotDQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCS8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBwYXJ0IG9mIHRoZSBjb25maWd1cmVkIGxpc3QNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UuZXF1YWxzKHJlZnNbaV0pKSB7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogYWRkcyB0aGUgZmVhdHVyZSB0byB0aGUgbGlzdCBvZiBmZWF0dXJlcyBpZiB0aGUgcG9saWN5IGlzIFVTRVJfSU5DTFVERQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29uZmlndXJlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWZlcmVuY2UsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyLCBib29sZWFuIGNyZWF0ZUFjdGl2aXR5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoaXNDb25maWd1cmVkKGZlYXR1cmVSZWZlcmVuY2UpKSAvLyBhbHJlYWR5IGNvbmZpZ3VyZWQNCi0JCQlyZXR1cm47DQotDQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSByZWZlcmVuY2UgdG8gY29uZmlndXJlIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlmZWF0dXJlID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChmZWF0dXJlUmVmZXJlbmNlKSkgew0KLQkJCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsNCi0JCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciByZXRyaWV2aW5nIGZlYXR1cmU6IiArIHVybFN0cmluZywgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChmZWF0dXJlID09IG51bGwpIHsNCi0JCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsNCi0JCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJA0KLQkJCVVwZGF0ZUNvcmUud2FybigiVGhlIGZlYXR1cmUgdG8gdW5jb25maWd1cmUgaXMgbnVsbDogZmVhdHVyZSByZWZlcmVuY2UgaXM6IiArIHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0NCi0JCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcg0KLQkJSW5zdGFsbEhhbmRsZXJQcm94eSBoYW5kbGVyID0gbnVsbDsNCi0JCWlmIChjYWxsSW5zdGFsbEhhbmRsZXIgJiYgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkgIT0gbnVsbCkNCi0JCQloYW5kbGVyID0gbmV3IEluc3RhbGxIYW5kbGVyUHJveHkoSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0NPTkZJR1VSRSwgZmVhdHVyZSwgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCksIG51bGwpOw0KLQkJYm9vbGVhbiBzdWNjZXNzID0gZmFsc2U7DQotCQlUaHJvd2FibGUgb3JpZ2luYWxFeGNlcHRpb24gPSBudWxsOw0KLQ0KLQkJLy8gZG8gdGhlIGNvbmZpZ3VyZSBhY3Rpb24NCi0JCXRyeSB7DQotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkNCi0JCQkJaGFuZGxlci5jb25maWd1cmVJbml0aWF0ZWQoKTsNCi0NCi0JCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBudWxsOw0KLQkJCWlmIChjcmVhdGVBY3Rpdml0eSkgew0KLQkJCQlhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9DT05GSUdVUkUpOw0KLQkJCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsNCi0JCQl9DQotDQotCQkJYWRkQ29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgZmVhdHVyZVJlZmVyZW5jZSk7DQotDQotCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rDQotCQkJaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsNCi0JCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gaW5zdGFsbENvbmZpZyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbikgU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOw0KLQkJCQlpbnN0YWxsQ29uZmlnLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsNCi0JCQl9DQotDQotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkNCi0JCQkJaGFuZGxlci5jb21wbGV0ZUNvbmZpZ3VyZSgpOw0KLQ0KLQkJCXN1Y2Nlc3MgPSB0cnVlOw0KLQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0JCQlvcmlnaW5hbEV4Y2VwdGlvbiA9IHQ7DQotCQl9IGZpbmFsbHkgew0KLQkJCVRocm93YWJsZSBuZXdFeGNlcHRpb24gPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCWlmIChoYW5kbGVyICE9IG51bGwpDQotCQkJCQloYW5kbGVyLmNvbmZpZ3VyZUNvbXBsZXRlZChzdWNjZXNzKTsNCi0JCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLQkJCQluZXdFeGNlcHRpb24gPSB0Ow0KLQkJCX0NCi0JCQlpZiAob3JpZ2luYWxFeGNlcHRpb24gIT0gbnVsbCkgLy8gb3JpZ2luYWwgZXhjZXB0aW9uIHdpbnMNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmVycm9yIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgb3JpZ2luYWxFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkDQotCQkJaWYgKG5ld0V4Y2VwdGlvbiAhPSBudWxsKQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIuZXJyb3IiLCBmZWF0dXJlLmdldExhYmVsKCkpLCBuZXdFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIGNoZWNrIGlmIHRoZSBwbHVnaW5zIHRvIHVuY29uZmlndXJlIGFyZSByZXF1aXJlZCBieSBvdGhlciBjb25maWd1cmVkIGZlYXR1cmUgYW5kDQotCSAqIGFkZHMgdGhlIGZlYXR1cmUgdG8gdGhlIGxpc3Qgb2YgdW5jb25maWd1cmVkIGZlYXR1cmVzIA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gdW5jb25maWd1cmUoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSwgYm9vbGVhbiBjYWxsSW5zdGFsbEhhbmRsZXIsIGJvb2xlYW4gY3JlYXRlQWN0aXZpdHkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChpc1VuY29uZmlndXJlZChmZWF0dXJlUmVmZXJlbmNlKSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSBhbHJlYWR5IHVuY29uZmlndXJlZCIpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotDQotCQlpZiAoZmVhdHVyZVJlZmVyZW5jZSA9PSBudWxsKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSByZWZlcmVuY2UgdG8gdW5jb25maWd1cmUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7DQotCQl0cnkgew0KLQkJCWZlYXR1cmUgPSBmZWF0dXJlUmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKGZlYXR1cmVSZWZlcmVuY2UpKSB7DQotCQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOw0KLQkJCQlTdHJpbmcgdXJsU3RyaW5nID0gKHVybCAhPSBudWxsKSA/IHVybC50b0V4dGVybmFsRm9ybSgpIDogIjxubyBmZWF0dXJlIHJlZmVyZW5jZSB1cmw+IjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHJldHJpZXZpbmcgZmVhdHVyZToiICsgdXJsU3RyaW5nLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOw0KLQkJCVN0cmluZyB1cmxTdHJpbmcgPSAodXJsICE9IG51bGwpID8gdXJsLnRvRXh0ZXJuYWxGb3JtKCkgOiAiPG5vIGZlYXR1cmUgcmVmZXJlbmNlIHVybD4iOyAvLyROT04tTkxTLTEkDQotCQkJVXBkYXRlQ29yZS53YXJuKCJUaGUgZmVhdHVyZSB0byB1bmNvbmZpZ3VyZSBpcyBudWxsOiBmZWF0dXJlIHJlZmVyZW5jZSBpczoiICsgdXJsU3RyaW5nKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCS8vIFNldHVwIG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcg0KLQkJSW5zdGFsbEhhbmRsZXJQcm94eSBoYW5kbGVyID0gbnVsbDsNCi0JCWlmIChjYWxsSW5zdGFsbEhhbmRsZXIgJiYgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkgIT0gbnVsbCkgew0KLQkJCWhhbmRsZXIgPSBuZXcgSW5zdGFsbEhhbmRsZXJQcm94eShJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fVU5DT05GSUdVUkUsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpLCBudWxsKTsNCi0JCX0NCi0NCi0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOw0KLQkJVGhyb3dhYmxlIG9yaWdpbmFsRXhjZXB0aW9uID0gbnVsbDsNCi0NCi0JCS8vIGRvIHRoZSB1bmNvbmZpZ3VyZSBhY3Rpb24NCi0JCXRyeSB7DQotDQotCQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbnVsbDsNCi0JCQlpZiAoY3JlYXRlQWN0aXZpdHkpIHsNCi0JCQkJYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fVU5DT05GSUdVUkUpOw0KLQkJCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsNCi0JCQl9DQotDQotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gaW5zdGFsbENvbmZpZyA9IG51bGw7DQotDQotCQkJLy8gb25seSBhc2sgZm9yIGluc3RhbGwgY29uZmlnIGlzIGFjdGl2aXR5IGNyZWF0ZWQuDQotCQkJLy8gcHJldmVudHMgbG9vcHMgZHVyaW5nIHJlY29uY2lsaWF0aW9uDQotCQkJaWYgKGFjdGl2aXR5ICE9IG51bGwpDQotCQkJCWluc3RhbGxDb25maWcgPSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsNCi0NCi0JCQkvLyBBbGxvdyB1bmNvbmZpZ3VyZSBpZiB0aGUgZmVhdHVyZSBpcyBvcHRpb25hbCBmcm9tIGFsbCB0aGUgcGFyZW50cw0KLQkJCS8vIG9yIGlmIHRoZSBmZWF0dXJlIGlzIG1hbmRhdG9yeSBhbmQgbm9uIG9mIGl0cyBwYXJlbnQgYXJlIGNvbmZpZ3VyZWQNCi0JCQkvLyByZW1vdmVkLCBub3QgYSBjb3JlIGlzc3VlIChzbyBkZWVwIGRvd24pDQotCQkJLy9pZiAodmFsaWRhdGVOb0NvbmZpZ3VyZWRQYXJlbnRzKGZlYXR1cmUpKSB7DQotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkNCi0JCQkJaGFuZGxlci51bmNvbmZpZ3VyZUluaXRpYXRlZCgpOw0KLQkJCWFkZFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCkgZmVhdHVyZVJlZmVyZW5jZSk7DQotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkNCi0JCQkJaGFuZGxlci5jb21wbGV0ZVVuY29uZmlndXJlKCk7DQotDQotCQkJLy8gZXZlcnl0aGluZyBkb25lIG9rDQotCQkJaWYgKGFjdGl2aXR5ICE9IG51bGwpIHsNCi0JCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOw0KLQkJCQlpbnN0YWxsQ29uZmlnLmFkZEFjdGl2aXR5KGFjdGl2aXR5KTsNCi0JCQl9DQotCQkJc3VjY2VzcyA9IHRydWU7DQotCQkJLy99IGVsc2Ugew0KLQkJCS8vCWlmIChhY3Rpdml0eSAhPSBudWxsKSB7DQotCQkJLy8JCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX05PSyk7DQotCQkJLy8JCWluc3RhbGxDb25maWcuYWRkQWN0aXZpdHlNb2RlbCgoQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwpIGFjdGl2aXR5KTsNCi0JCQkvLwl9DQotCQkJLy99DQotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgew0KLQkJCW9yaWdpbmFsRXhjZXB0aW9uID0gdDsNCi0JCX0gZmluYWxseSB7DQotCQkJVGhyb3dhYmxlIG5ld0V4Y2VwdGlvbiA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkNCi0JCQkJCWhhbmRsZXIudW5jb25maWd1cmVDb21wbGV0ZWQoc3VjY2Vzcyk7DQotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsNCi0JCQkJbmV3RXhjZXB0aW9uID0gdDsNCi0JCQl9DQotCQkJaWYgKG9yaWdpbmFsRXhjZXB0aW9uICE9IG51bGwpIC8vIG9yaWdpbmFsIGV4Y2VwdGlvbiB3aW5zDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5lcnJvciIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIG9yaWdpbmFsRXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJA0KLQkJCWlmIChuZXdFeGNlcHRpb24gIT0gbnVsbCkNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLmVycm9yIiwgZmVhdHVyZS5nZXRMYWJlbCgpKSwgbmV3RXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJaWYgKCFzdWNjZXNzKSB7DQotCQkJVVJMIHVybCA9IGZlYXR1cmVSZWZlcmVuY2UuZ2V0VVJMKCk7DQotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byB1bmNvbmZpZ3VyZToiICsgdXJsU3RyaW5nKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIHN1Y2Nlc3M7DQotCX0NCi0NCi0JLyoqDQotCSAqIENhbGN1bGF0ZXMgdGhlIHBsdWdpbiBsaXN0IGZvciB0aGUgcG9saWN5LiBGb3IgIklOQ0xVREUiIHBvbGljeSwgdGhpcw0KLQkgKiBjb3JyZXNwb25kcyB0byB0aGUgcGx1Z2lucyBmb3IgY29uZmlndXJlZCBmZWF0dXJlcy4gRm9yICJFWENMVURFIg0KLQkgKiBwb2xpY3ksIHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBsdWdpbnMgZm9yIHVuY29uZmlndXJlZCBmZWF0dXJlcyB0aGF0DQotCSAqIGFyZSBub3QgcmVmZXJlbmNlZCBieSBhbnkgY29uZmlndXJlZCBmZWF0dXJlcy4NCi0JICovDQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQbHVnaW5QYXRoKElTaXRlIHNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVN0cmluZ1tdIHBsdWdpblBhdGhzOw0KLQkJLy8gTm90ZTogU2luY2UgMy4wTTcgd2UgbGVhdmUgcGF0Y2hlZCBmZWF0dXJlcyBjb25maWd1cmVkLA0KLQkJLy8gYW5kIHRha2UgdGhpcyBpbnRvIGFjY291bnQgd2hlbiBjb21wdXRpbmcgY29uZmlndXJlZCBwbHVnaW5zDQotCQkvLyBhbGwgdW5jb25maWd1cmVkIGZlYXR1cmVzLiBOb3RlIHRoYXQgcGF0Y2hlZCBmZWF0dXJlcyBhcmUgc3RpbGwNCi0JCS8vIGNvbmZpZ3VyZWQNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gdW5jb25maWd1cmVkRmVhdHVyZXMgPSBnZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJLy8gYWxsIGNvbmZpZ3VyZWQgZmVhdHVyZXMsIGluY2x1ZGluZyBwYXRjaGVzIGFuZCBwYXRjaGVkIGZlYXR1cmVzDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJaWYgKCFpc0VuYWJsZWQoKSkgew0KLQkJCWlmIChnZXRQb2xpY3koKSA9PSBJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSkgew0KLQkJCQkvLyBkaXNhYmxlZCBzaXRlLCBJTkNMVURFIHBvbGljeQ0KLQkJCQlwbHVnaW5QYXRocyA9IG5ldyBTdHJpbmdbMF07DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gZGlzYWJsZWQgc2l0ZSwgRVhDTFVERSBwb2xpY3kNCi0JCQkJcGx1Z2luUGF0aHMgPSBnZXRBbGxLbm93blBsdWdpblN0cmluZ3Moc2l0ZSwNCi0JCQkJCQljb25maWd1cmVkRmVhdHVyZXMsIHVuY29uZmlndXJlZEZlYXR1cmVzKTsNCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCS8vIFBhdGNoZWRGZWF0dXJlcyAobWF5IGhhdmUgbm8gcGF0Y2hlcykgd2l0aCBjb3JyZXNwb25kaW5nIHBhdGNoZXMNCi0JCQlQYXRjaGVkRmVhdHVyZVtdIHBhdGNoZWRGZWF0dXJlcyA9IGJ1aWxkUGF0Y2hlZEZlYXR1cmVzKGNvbmZpZ3VyZWRGZWF0dXJlcyk7DQotCQkJaWYgKGdldFBvbGljeSgpID09IElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKSB7DQotCQkJCS8vIGVuYWJsZWQgc2l0ZSwgSU5DTFVERSBwb2xpY3kNCi0JCQkJcGx1Z2luUGF0aHMgPSBnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhzaXRlLCBwYXRjaGVkRmVhdHVyZXMpOw0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIGVuYWJsZWQgc2l0ZSwgRVhDTFVERSBwb2xpY3kgLSB0aGUgdXN1YWwgc2NlbmFyaW8gZm9yIGxvY2FsDQotCQkJCS8vIHNpdGUuDQotCQkJCS8vIHJldHVybiBhbGwga25vd24gTUlOVVMgY29uZmlndXJlZCBwbHVnaW5zDQotCQkJCXBsdWdpblBhdGhzID0gc3VidHJhY3QoZ2V0QWxsS25vd25QbHVnaW5TdHJpbmdzKHNpdGUsDQotCQkJCQkJY29uZmlndXJlZEZlYXR1cmVzLCB1bmNvbmZpZ3VyZWRGZWF0dXJlcyksDQotCQkJCQkJZ2V0Q29uZmlndXJlZFBsdWdpblN0cmluZ3Moc2l0ZSwgcGF0Y2hlZEZlYXR1cmVzKSk7DQotCQkJfQ0KLQkJfQ0KLQkJLy9UUkFDRQ0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsNCi0JCQlVcGRhdGVDb3JlDQotCQkJCQkuZGVidWcoIkdldFBsdWdpblBhdGggZm9yOiAiIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJKyAoKHNpdGUgPT0gbnVsbCkgPyAiPE5vIHNpdGU+IiA6IHNpdGUuZ2V0VVJMKCkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkJCS50b1N0cmluZygpKSk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5QYXRocy5sZW5ndGg7IGkrKykgew0KLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJUbyB3cml0ZToiICsgcGx1Z2luUGF0aHNbaV0pOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHBsdWdpblBhdGhzOw0KLQl9DQotCQ0KLQkvKioNCi0JICogT2J0YWlucyBQYXRjaGVkRmVhdHVyZXMgLSBub24gcGF0Y2ggZmVhdHVyZXMgd2l0aCBjb3JyZXNwb25kaW5nIHBhdGNoZXMgaWYgYW55DQotCSAqIA0KLQkgKiBAcGFyYW0gZmVhdHVyZXMNCi0JICogICAgICAgICAgICBhcnJheSBvZiBmZWF0dXJlcyB0byBvcGVyYXRlIHdpdGgNCi0JICogQHJldHVybiBQYXRjaGVzDQotCSAqLw0KLQlwcml2YXRlIFBhdGNoZWRGZWF0dXJlW10gYnVpbGRQYXRjaGVkRmVhdHVyZXMoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcykgew0KLQkJLy8gUGF0Y2hlZEZlYXR1cmVzIGJ5IFZlcnNpb25lZElkZW50aWZpZXINCi0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOw0KLQkJLy8gQ3JlYXRlIGEgbWFwIG9mIGZlYXR1cmVzIChub3QgcGF0Y2hlcykNCi0JCWZvciAoaW50IGYgPSAwOyBmIDwgZmVhdHVyZXMubGVuZ3RoOyBmKyspIHsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gZmVhdHVyZXNbZl07DQotCQkJdHJ5IHsNCi0JCQkJaWYoZmVhdHVyZVJlZi5pc1BhdGNoKCkpew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aSA9IGZlYXR1cmVSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOw0KLQkJCQltYXAucHV0KHZpLCBuZXcgUGF0Y2hlZEZlYXR1cmUoZmVhdHVyZXNbZl0pKTsNCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCX0NCi0JCX0NCi0JCS8vIGF0dGFjaCBwYXRjaGVzIHRvIGZlYXR1cmVzDQotCQlmb3IgKGludCBmID0gMDsgZiA8IGZlYXR1cmVzLmxlbmd0aDsgZisrKSB7DQotCQkJSUZlYXR1cmVSZWZlcmVuY2UgcGF0Y2hDYW5kaWRhdGUgPSBmZWF0dXJlc1tmXTsNCi0JCQl0cnkgew0KLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcGF0Y2hDYW5kaWRhdGUuZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJSUltcG9ydFtdIGltcG9ydHMgPSBmZWF0dXJlLmdldEltcG9ydHMoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlJSW1wb3J0IG9uZUltcG9ydCA9IGltcG9ydHNbaV07DQotCQkJCQlpZiAoIW9uZUltcG9ydC5pc1BhdGNoKCkpDQotCQkJCQkJY29udGludWU7DQotCQkJCQkvLyBpdCBpcyBhIHBhdGNoIGZvcg0KLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwYXRjaGVkSWRlbnRpZmllciA9DQotCQkJCQkJb25lSW1wb3J0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCQkJCVBhdGNoZWRGZWF0dXJlIHBmPShQYXRjaGVkRmVhdHVyZSkgbWFwLmdldChwYXRjaGVkSWRlbnRpZmllcik7DQotCQkJCQlpZiAocGYhPW51bGwpIHsNCi0JCQkJCQlwZi5hZGRQYXRjaChwYXRjaENhbmRpZGF0ZSk7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCS8vIHBhdGNoZWQgZmVhdHVyZSBub3QgZW5hYmxlZA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQl9DQotCQl9DQotCQlDb2xsZWN0aW9uIHBhdGNoZWRGZWF0dXJlcz1tYXAudmFsdWVzKCk7DQotCQlyZXR1cm4gKFBhdGNoZWRGZWF0dXJlW10pcGF0Y2hlZEZlYXR1cmVzLnRvQXJyYXkobmV3IFBhdGNoZWRGZWF0dXJlW3BhdGNoZWRGZWF0dXJlcy5zaXplKCldKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldENvbmZpZ3VyZWRGZWF0dXJlcygpIHsNCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIHJlc3VsdCA9IGdldENvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07DQotCQllbHNlDQotCQkJcmV0dXJuIChJRmVhdHVyZVJlZmVyZW5jZVtdKSByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFVuY29uZmlndXJlZEZlYXR1cmVzKCkgew0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gcmVzdWx0ID0gZ2V0VW5jb25maWd1cmVkRmVhdHVyZXNNb2RlbCgpOw0KLQkJaWYgKHJlc3VsdC5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBjb25maWd1cmVkU2l0ZS4NCi0JICogQHJldHVybiBSZXR1cm5zIGEgSUNvbmZpZ3VyZWRTaXRlDQotCSAqLw0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgew0KLQkJcmV0dXJuIChJQ29uZmlndXJlZFNpdGUpIGdldENvbmZpZ3VyZWRTaXRlTW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogcmVtb3ZlcyBhIGZlYXR1cmUgcmVmZXJlbmNlDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVGZWF0dXJlUmVmZXJlbmNlKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYpIHsNCi0JCWlmIChmZWF0dXJlUmVmIGluc3RhbmNlb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSB7DQotCQkJcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZSgoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBmZWF0dXJlUmVmKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBwbHVnaW4gcGF0aCBmb3IgdGhlIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlLiBGb3INCi0JICogICAgICAgICBmZWF0dXJlcyB0aGF0IGhhdmUgcGF0Y2hlcywgcGx1Z2luIHBhdGggd2lsbA0KLQkgKiAgICAgICAgIHBvaW50IHRvIHBsdWdpbiB3aXRoIHRoZSBzYW1lIElEIHByb3ZpZGVkIGJ5IHRoZSBwYXRjaCBpZiBpdA0KLQkgKiAgICAgICAgIGV4aXN0cy4gRWFjaCBwbHVnaW4gcGF0aCBvbmx5IGFwcGVhcnMgb25jZSBbYnVnIDIxNzUwXQ0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb25maWd1cmVkUGx1Z2luU3RyaW5ncyhJU2l0ZSBzaXRlLCBQYXRjaGVkRmVhdHVyZVtdIGZlYXR1cmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTil7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJDT05GSUdVUkVEIFBMVUdJTlMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkNCi0JCS8vIFVzZSBzZXQgdG8gZWxpbWluYXRlIHBsdWdpbnMgd2l0aCBzYW1lIElEIGFuZCB2ZXJzaW9uLg0KLQkJLy8gRGlmZmVyZW50IHZlcnNpb25zIG9mIHBsdWdpbnMgd2l0aCBzYW1lIElEIGFyZSBhbGxvd2VkIGlmIGNvbWluZyBmcm9tIGRpZmZlcmVudCBmZWF0dXJlcw0KLQkJU2V0IGZlYXR1cmVQbHVnaW5zID0gbmV3IEhhc2hTZXQoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlGZWF0dXJlUGx1Z2luW10gcGx1Z2lucyA9IGZlYXR1cmVzW2ldLmdldFBsdWdpbnMoKTsNCi0JCQlmZWF0dXJlUGx1Z2lucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwbHVnaW5zKSk7DQotCQl9DQotCQlTZXQgcGx1Z2luU3RyaW5ncyA9IGdldFBsdWdpblN0cmluZ3Moc2l0ZSwgKEZlYXR1cmVQbHVnaW5bXSkgZmVhdHVyZVBsdWdpbnMudG9BcnJheShuZXcgRmVhdHVyZVBsdWdpbltmZWF0dXJlUGx1Z2lucy5zaXplKCldKSk7DQotCQlyZXR1cm4gKFN0cmluZ1tdKSBwbHVnaW5TdHJpbmdzLnRvQXJyYXkobmV3IFN0cmluZ1twbHVnaW5TdHJpbmdzLnNpemUoKV0pOw0KLQl9DQotCS8qKg0KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHBsdWdpbiBwYXRoIGZvciBldmVyeSBwbHVnaW4gaW4ga25vd24gZmVhdHVyZXMNCi0JICovDQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsS25vd25QbHVnaW5TdHJpbmdzKElTaXRlIHNpdGUsIElGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZCxJRmVhdHVyZVJlZmVyZW5jZVtdIHVuY29uZmlndXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pew0KLQkJCVVwZGF0ZUNvcmUud2FybigiQUxMIFBMVUdJTlMiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJLy8gQWRkIGZlYXR1cmVzLCBwYXRjaGVkIGZlYXR1cmVzLCBvciBwYXRjaGVzDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGFsbD1uZXcgSUZlYXR1cmVSZWZlcmVuY2VbY29uZmlndXJlZC5sZW5ndGgrdW5jb25maWd1cmVkLmxlbmd0aF07DQotCQlTeXN0ZW0uYXJyYXljb3B5KGNvbmZpZ3VyZWQsIDAsIGFsbCwgMCwgY29uZmlndXJlZC5sZW5ndGgpOw0KLQkJU3lzdGVtLmFycmF5Y29weSh1bmNvbmZpZ3VyZWQsIDAsIGFsbCwgY29uZmlndXJlZC5sZW5ndGgsIHVuY29uZmlndXJlZC5sZW5ndGgpOw0KLQkJLy8NCi0JCVNldCBwYXRjaGVkUGx1Z2lucyA9IG5ldyBIYXNoU2V0KCk7DQotCQlmb3IgKGludCBpPTA7IGk8IGFsbC5sZW5ndGg7IGkrKykgew0KLQkJCXRyeSB7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhbGxbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJOdWxsIEZlYXR1cmUiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQ0KLQkJCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJCS8vIGFkZCBldmVyeSBwbHVnaW4gdG8gdGhlIG1hcA0KLQkJCQlmb3IgKGludCBlbnRyID0gMDsgZW50ciA8IGVudHJpZXMubGVuZ3RoOyBlbnRyKyspIHsNCi0JCQkJCXBhdGNoZWRQbHVnaW5zLmFkZChuZXcgRmVhdHVyZVBsdWdpbihlbnRyaWVzW2VudHJdLCBmZWF0dXJlKSk7DQotCQkJCX0NCi0NCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOw0KLQkJCX0NCi0JCX0NCi0JCVNldCBwbHVnaW5TdHJpbmdzID0gZ2V0UGx1Z2luU3RyaW5ncyhzaXRlLCAgKEZlYXR1cmVQbHVnaW5bXSlwYXRjaGVkUGx1Z2lucy50b0FycmF5KG5ldyBGZWF0dXJlUGx1Z2luW3BhdGNoZWRQbHVnaW5zLnNpemUoKV0pKTsNCi0JCXJldHVybiAoU3RyaW5nW10pIHBsdWdpblN0cmluZ3MudG9BcnJheShuZXcgU3RyaW5nW3BsdWdpblN0cmluZ3Muc2l6ZSgpXSk7DQotCX0NCi0JLyoqDQotCSAqIEBwYXJhbSBzaXRlDQotCSAqIEBwYXJhbSBwbHVnaW5zW10NCi0JICogQHJldHVybiB2YWxpZCBzdHJpbmcgcG9pbnRpbmcgdG8gcGx1Z2lucyBpbiBnaXZlbiBmZWF0dXJlcw0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgU2V0IGdldFBsdWdpblN0cmluZ3MoSVNpdGUgc2l0ZSwgRmVhdHVyZVBsdWdpbltdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVNldCBwbHVnaW5TdHJpbmdzPW5ldyBIYXNoU2V0KCk7DQotCQlmb3IgKGludCBpPTA7IGk8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsNCi0JCQlJUGx1Z2luRW50cnkgZW50cnkgPSBwbHVnaW5zW2ldLmdldEVudHJ5KCk7DQotCQkJSUZlYXR1cmUgZmVhdHVyZT1wbHVnaW5zW2ldLmdldEZlYXR1cmUoKTsNCi0NCi0JCQkvLyBvYnRhaW4gdGhlIHBhdGggb2YgdGhlIHBsdWdpbiBkaXJlY3RvcmllcyBvbiB0aGUgc2l0ZQ0KLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSBmZWF0dXJlQ29udGVudFJlZmVyZW5jZSA9IG51bGw7DQotCQkJdHJ5IHsNCi0JCQkJZmVhdHVyZUNvbnRlbnRSZWZlcmVuY2UgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKGVudHJ5LCBudWxsIC8qSVByb2dyZXNzTW9uaXRvciovDQotCQkJCSk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQl9DQotDQotCQkJLy8gdHJhbnNmb3JtIGludG8gYSB2YWxpZCBTdHJpbmcNCi0JCQlpZiAoZmVhdHVyZUNvbnRlbnRSZWZlcmVuY2UgIT0gbnVsbCkgew0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZlYXR1cmVDb250ZW50UmVmZXJlbmNlLmxlbmd0aDsgaisrKSB7DQotCQkJCQlVUkwgdXJsID0gc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCkuZ2V0QXJjaGl2ZVJlZmVyZW5jZShmZWF0dXJlQ29udGVudFJlZmVyZW5jZVtqXS5nZXRJZGVudGlmaWVyKCkpOw0KLQkJCQkJaWYgKHVybCAhPSBudWxsKSB7DQotCQkJCQkJLy8gbWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgc2l0ZQ0KLQkJCQkJCVN0cmluZyBwYXRoID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTEFzU3RyaW5nKHNpdGUuZ2V0VVJMKCksIHVybCk7DQotCQkJCQkJLy8gYWRkIGVuZCAiLyINCi0JCQkJCQlwYXRoICs9IChwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSB8fCBwYXRoLmVuZHNXaXRoKCIvIikpID8gIiIgOiAiLyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCQkJcGx1Z2luU3RyaW5ncy5hZGQocGF0aCk7DQotCQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pDQotCQkJCQkJCVVwZGF0ZUNvcmUud2FybigiQWRkIHBsdWdpbjogIiArIHBhdGggKyAiIHRvIHRoZSBsaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHBsdWdpblN0cmluZ3M7DQotCX0NCi0NCi0JLyoqDQotCSAqCSBPYnRhaW5zIHN0cmluZ3MgZXhpc3RpbmcgaW4gdGhlIGFsbFN0cmluZ3MgYXJyYXksIGJ1dCBub3QgaW4gdGhlIHN0cmluZ3NUb1JlbW92ZQ0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmdbXSBzdWJ0cmFjdChTdHJpbmdbXSBhbGxTdHJpbmdzLCBTdHJpbmdbXSBzdHJpbmdzVG9SZW1vdmUpIHsNCi0JCUhhc2hTZXQgcmVzdWx0TGlzdCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoYWxsU3RyaW5ncykpOw0KLQkJcmVzdWx0TGlzdC5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChzdHJpbmdzVG9SZW1vdmUpKTsNCi0JCXJldHVybiAoU3RyaW5nW10pcmVzdWx0TGlzdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0TGlzdC5zaXplKCldKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbmZpZ3VyZWRTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxN2FlYWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25maWd1cmVkU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotCi0vKioKLSAqIEEgQ29uZmlndXJlZCBzaXRlIG1hbmFnZXMgdGhlIENvbmZpZ3VyZWQgYW5kIHVuY29uZmlndXJlZCBmZWF0dXJlcyBvZiBhIFNpdGUKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlIGV4dGVuZHMgQ29uZmlndXJlZFNpdGVNb2RlbCBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVF9TSVRFX01BUktFUiA9ICIuZWNsaXBzZXByb2R1Y3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9TSVRFX01BUktFUiA9ICIuZWNsaXBzZWV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3RlbmVycwkKLQlwcml2YXRlIExpc3RlbmVyc0xpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyc0xpc3QoKTsKLQotCS8vIHZlcmlmaWNhdGlvbiBzdGF0dXMKLQlwcml2YXRlIElTdGF0dXMgdmVyaWZ5U3RhdHVzOwotCi0JLy8gdHJhbnNpZW50OiB0cnVlIGlmIHRoZSBzaXRlIHdhcyBqdXN0IGNyZWF0ZWQgc28gd2UgY2FuIHJlbW92ZSBpdAotCXByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4ganVzdENyZWF0ZWQgPSBmYWxzZTsKLQotCS8qCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBDb25maWd1cmVkU2l0ZSgpIHsKLQl9Ci0KLQkvKgotCSAqIENvcHkgQ29uc3RydWN0b3IKLQkgKiBBcyBvZiBub3csIGNvbmZpZ1NpdGUgY2FuIG9ubHkgYmUgb2YgdHlwZSBDb25maWd1cmVkU2l0ZQotCSAqLwotCXB1YmxpYyBDb25maWd1cmVkU2l0ZShJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSkgewotCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgY29uZmlnU2l0ZTsKLQkJc2V0U2l0ZU1vZGVsKGNTaXRlLmdldFNpdGVNb2RlbCgpKTsKLQkJc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKG5ldyBDb25maWd1cmF0aW9uUG9saWN5KGNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKSkpOwotCQlzZXRVcGRhdGFibGUoY1NpdGUuaXNVcGRhdGFibGUoKSk7Ci0JCXNldEVuYWJsZWQoY1NpdGUuaXNFbmFibGVkKCkpOwotCQlzZXRQcmV2aW91c1BsdWdpblBhdGgoY1NpdGUuZ2V0UHJldmlvdXNQbHVnaW5QYXRoKCkpOwotCQlzZXRQbGF0Zm9ybVVSTFN0cmluZyhjU2l0ZS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKTsKLQl9Ci0KLQkvKgotCSAqICBBZGRzIGEgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNpbnN0YWxsKElGZWF0dXJlLElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc3RhbGwoZmVhdHVyZSwgbnVsbCwgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjaW5zdGFsbChJRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2UsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbChJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCS8vIGNoYW5nZSB0aGUgc3RhdHVzIGlmIGp1c3RDcmVhdGVkCi0JCWlmIChqdXN0Q3JlYXRlZCkganVzdENyZWF0ZWQ9ZmFsc2U7Ci0KLQkJLy8gQ29uZmlnU2l0ZSBpcyByZWFkIG9ubHkgCi0JCWlmICghaXNVcGRhdGFibGUoKSkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5Ob25JbnN0YWxsYWJsZVNpdGUiLCBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCUlTdGF0dXMgc3RhdHVzID0gdmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJZXJyb3JNZXNzYWdlICs9ICIgIiArIHN0YXR1cy5nZXRNZXNzYWdlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBmZWF0dXJlIGlzIG51bGwKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5OdWxsRmVhdHVyZVRvSW5zdGFsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UsIG51bGwpOwotCQl9Ci0KLQkJLy8gZmVhdHVyZSByZWZlcmVuY2UgdG8gcmV0dXJuCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGxlZEZlYXR1cmVSZWY7Ci0JCUlGZWF0dXJlIGluc3RhbGxlZEZlYXR1cmUgPSBudWxsOwotCi0JCS8vIGNyZWF0ZSB0aGUgQWN0aXZpdHkgKElOU1RBTEwpCi0JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX0lOU1RBTEwpOwotCQlhY3Rpdml0eS5zZXRMYWJlbChmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYWN0aXZpdHkuc2V0RGF0ZShuZXcgRGF0ZSgpKTsKLQotCQl0cnkgewotCQkJaW5zdGFsbGVkRmVhdHVyZVJlZiA9IGdldFNpdGUoKS5pbnN0YWxsKGZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsKLQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJTdWNlc3NmdWxseSBpbnN0YWxsZWQ6ICIgKyBpbnN0YWxsZWRGZWF0dXJlUmVmLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChpbnN0YWxsZWRGZWF0dXJlUmVmICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnN0YWxsZWRGZWF0dXJlID0gaW5zdGFsbGVkRmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQotCQkJLy8gbm90aWZ5IGxpc3RlbmVycwotCQkJT2JqZWN0W10gc2l0ZUxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpbnN0YWxsZWRGZWF0dXJlICE9IG51bGwpIHsKLQkJCQkJSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKChJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMaXN0ZW5lcnNbaV0pOwotCQkJCQlsaXN0ZW5lci5mZWF0dXJlSW5zdGFsbGVkKGluc3RhbGxlZEZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub3Qgb2ssIHNldCBBY3Rpdml0eSBzdGF0dXMKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX05PSyk7Ci0JCQl0aHJvdyBlOwotCQl9IGZpbmFsbHkgewotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbikgY3VycmVudCkuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOwotCQl9Ci0JCS8vIGNhbGwgdGhlIGNvbmZpZ3VyZSB0YXNrCQotCQlpZiAoaW5zdGFsbGVkRmVhdHVyZSAhPSBudWxsKQotCQkJY29uZmlndXJlKGluc3RhbGxlZEZlYXR1cmUsIG9wdGlvbmFsRmVhdHVyZXMsIGZhbHNlKTsKLQkJLypjYWxsSW5zdGFsbEhhbmRsZXIqLwotCi0JCXJldHVybiBpbnN0YWxsZWRGZWF0dXJlUmVmOwotCX0KLQotCS8qCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjcmVtb3ZlKElGZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBDb25maWdTaXRlIGlzIHJlYWQgb25seQotCQlpZiAoIWlzVXBkYXRhYmxlKCkpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuTm9uVW5pbnN0YWxsYWJsZVNpdGUiLCBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSwgbnVsbCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIEFjdGl2aXR5Ci0JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX1JFTU9WRSk7Ci0JCWFjdGl2aXR5LnNldExhYmVsKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhY3Rpdml0eS5zZXREYXRlKG5ldyBEYXRlKCkpOwotCi0JCXRyeSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSByZWZlcmVuY2VUb1JlbW92ZSA9IG51bGw7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWYubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmVhdHVyZVJlZltpXS5lcXVhbHMocmVmKSkgewotCQkJCQlyZWZlcmVuY2VUb1JlbW92ZSA9IGZlYXR1cmVSZWZbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gd2UgZm91bmQgYSBmZWF0dXJlIHJlZmVyZW5jZSBvbiB0aGUgc2l0ZSBtYXRjaGluZyB0aGUgZmVhdHVyZQkJCQotCQkJaWYgKHJlZmVyZW5jZVRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQkvLyBDaGVjayBpZiBmZWF0dXJlIGlzIHVuY29uZmlndXJlZCBiZWZvcmUgd2UgcmVtb3ZlIGl0Ci0JCQkJLy8gb3VyIFVJIHdpbGwgY2hlY2suCi0JCQkJLy8gRm9yIG5vbi1VSSBhcHBsaWNhdGlvbiwgdGhyb3cgZXJyb3IgaXMgZmVhdHVyZSBpcyBjb25maWd1cmVkCi0JCQkJaWYgKGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5pc0NvbmZpZ3VyZWQocmVmZXJlbmNlVG9SZW1vdmUpKSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmVUb1JlbW92ZSA9ICgoSUZlYXR1cmVSZWZlcmVuY2UpIHJlZmVyZW5jZVRvUmVtb3ZlKS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQlTdHJpbmcgZmVhdHVyZUxhYmVsID0gKGZlYXR1cmVUb1JlbW92ZSA9PSBudWxsKSA/IG51bGwgOiBmZWF0dXJlVG9SZW1vdmUuZ2V0TGFiZWwoKTsKLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLlVuYWJsZVRvUmVtb3ZlQ29uZmlndXJlZEZlYXR1cmUiIC8vJE5PTi1OTFMtMSQKLQkJCQkJLCBmZWF0dXJlTGFiZWwpLCBudWxsKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5VbmFibGVUb0ZpbmRGZWF0dXJlIiwgZmVhdHVyZS5nZXRVUkwoKS50b1N0cmluZygpKSwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUKLQkJCWdldFNpdGUoKS5yZW1vdmUoZmVhdHVyZSwgbW9uaXRvcik7Ci0JCQlnZXRDb25maWd1cmF0aW9uUG9saWN5KCkucmVtb3ZlRmVhdHVyZVJlZmVyZW5jZShyZWZlcmVuY2VUb1JlbW92ZSk7Ci0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sKLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMKLQkJCU9iamVjdFtdIHNpdGVMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSkuZmVhdHVyZVJlbW92ZWQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfTk9LKTsKLQkJCXRocm93IGU7Ci0JCX0gZmluYWxseSB7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBjdXJyZW50KS5hZGRBY3Rpdml0eShhY3Rpdml0eSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2NvbmZpZ3VyZShJRmVhdHVyZSkgCi0JICovCi0JcHVibGljIHZvaWQgY29uZmlndXJlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY29uZmlndXJlKGZlYXR1cmUsIG51bGwsIHRydWUgLypjYWxsSW5zdGFsbEhhbmRsZXIqLwotCQkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsIGJvb2xlYW4gY2FsbEluc3RhbGxIYW5kbGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0aW5nIHRvIGNvbmZpZ3VyZSBhIG51bGwgZmVhdHVyZSBpbiBzaXRlOiIgKyBnZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlnUG9saWN5ID0gZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCQlpZiAoY29uZmlnUG9saWN5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYm90dG9tIHVwIGFwcHJvYWNoLCBzYW1lIGNvbmZpZ3VyZWRTaXRlCi0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlblJlZiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAob3B0aW9uYWxGZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQljaGlsZHJlblJlZiA9IGNoaWxkcmVuVG9Db25maWd1cmUoY2hpbGRyZW5SZWYsIG9wdGlvbmFsRmVhdHVyZXMpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblJlZi5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBjaGlsZCA9IGNoaWxkcmVuUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJY29uZmlndXJlKGNoaWxkLCBvcHRpb25hbEZlYXR1cmVzLCBjYWxsSW5zdGFsbEhhbmRsZXIpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2lsbCBza2lwIGFueSBiYWQgY2hpbGRyZW4KLQkJCQlpZiAoIWNoaWxkcmVuUmVmW2ldLmlzT3B0aW9uYWwoKSkKLQkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY29uZmlndXJlIGNoaWxkIGZlYXR1cmU6ICIgKyBjaGlsZHJlblJlZltpXSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCi0JCS8vIGNvbmZpZ3VyZSByb290IGZlYXR1cmUgCQotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCWNvbmZpZ1BvbGljeS5jb25maWd1cmUoZmVhdHVyZVJlZmVyZW5jZSwgY2FsbEluc3RhbGxIYW5kbGVyLCB0cnVlKTsKLQotCQkvLyBub3RpZnkgbGlzdGVuZXJzCi0JCU9iamVjdFtdIHNpdGVMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJKChJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIpIHNpdGVMaXN0ZW5lcnNbaV0pLmZlYXR1cmVDb25maWd1cmVkKGZlYXR1cmUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIG9wdGlvbmFsIGNoaWxkcmVuIHRvIGNvbmZpZ3VyZQotCSAqIAotCSAqIEBwYXJhbSBjaGlsZHJlbiBhbGwgdGhlIG5lc3RlZCBmZWF0dXJlcwotCSAqIEBwYXJhbSBvcHRpb25hbGZlYXR1cmVzIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGluc3RhbGwKLQkgKiBAcmV0dXJuIElGZWF0dXJlUmVmZXJlbmNlW10KLQkgKi8KLQlwcml2YXRlIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlblRvQ29uZmlndXJlKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzKSB7Ci0KLQkJTGlzdCBjaGlsZHJlblRvSW5zdGFsbCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBvcHRpb25hbEZlYXR1cmVUb0NvbmZpZ3VyZSA9IGNoaWxkcmVuW2ldOwotCQkJaWYgKCFvcHRpb25hbEZlYXR1cmVUb0NvbmZpZ3VyZS5pc09wdGlvbmFsKCkpIHsKLQkJCQljaGlsZHJlblRvSW5zdGFsbC5hZGQob3B0aW9uYWxGZWF0dXJlVG9Db25maWd1cmUpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbmFsZmVhdHVyZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJLy8gbXVzdCBjb21wYXJlIGZlYXR1cmUgYXMgb3B0aW9uYWxGZWF0dXJlcyBhcmUgZnJvbSB0aGUgaW5zdGFsbCBzaXRlCi0JCQkJCS8vIHdoZXJlIGNoaWxkcmVuIGFyZSBvbiB0aGUgbG9jYWwgc2l0ZQotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgaW5zdGFsbGVkQ2hpbGRyZW4gPSBvcHRpb25hbGZlYXR1cmVzW2pdLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoaW5zdGFsbGVkQ2hpbGRyZW4uZXF1YWxzKG9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlLmdldEZlYXR1cmUobnVsbCkpKSB7Ci0JCQkJCQkJY2hpbGRyZW5Ub0luc3RhbGwuYWRkKG9wdGlvbmFsRmVhdHVyZVRvQ29uZmlndXJlKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbY2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpXTsKLQkJaWYgKGNoaWxkcmVuVG9JbnN0YWxsLnNpemUoKSA+IDApIHsKLQkJCWNoaWxkcmVuVG9JbnN0YWxsLnRvQXJyYXkocmVzdWx0KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSN1bmNvbmZpZ3VyZShJRmVhdHVyZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bmNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHRoZSBmaXJzdCBjYWxsIHNvdWxkIGRpc2FibGUgd2l0aG91dCBjaGVja2luZyBmb3IgZW5hYmxlIHBhcmVudAotCQlyZXR1cm4gdW5jb25maWd1cmUoZmVhdHVyZSwgdHJ1ZSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB1bmNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBib29sZWFuIGluY2x1ZGVQYXRjaGVzLCBib29sZWFuIHZlcmlmeUVuYWJsZVBhcmVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0KLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgRmVhdHVyZSBSZWZlcmVuY2UgZm9yIGZlYXR1cmUiICsgZmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY29uZmlnUG9saWN5ID0gZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCQlpZiAoY29uZmlnUG9saWN5ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gdmVyaWZ5IG5vIGVuYWJsZSBwYXJlbnQKLQkJaWYgKHZlcmlmeUVuYWJsZVBhcmVudCAmJiAhdmFsaWRhdGVOb0NvbmZpZ3VyZWRQYXJlbnRzKGZlYXR1cmUpKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlRoZSBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSArICIgdG8gZGlzYWJsZSBpcyBuZWVkZWQgYnkgYW5vdGhlciBlbmFibGUgZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2xlYW4gc3VjZXNzZnVsbHlVbmNvbmZpZ3VyZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN1Y2Vzc2Z1bGx5VW5jb25maWd1cmVkID0gY29uZmlnUG9saWN5LnVuY29uZmlndXJlKGZlYXR1cmVSZWZlcmVuY2UsIHRydWUsIHRydWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVSTCB1cmwgPSBmZWF0dXJlUmVmZXJlbmNlLmdldFVSTCgpOwotCQkJU3RyaW5nIHVybFN0cmluZyA9ICh1cmwgIT0gbnVsbCkgPyB1cmwudG9FeHRlcm5hbEZvcm0oKSA6ICI8bm8gZmVhdHVyZSByZWZlcmVuY2UgdXJsPiI7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlIiArIHVybFN0cmluZywgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJaWYgKHN1Y2Vzc2Z1bGx5VW5jb25maWd1cmVkKSB7Ci0JCQkvLyAyLjAuMjogdW5jb25maWd1cmUgcGF0Y2hlcyB0aGF0IHJlZmVyZW5jZSB0aGlzIGZlYXR1cmUuCi0JCQkvLyBBIHBhdGNoIGlzIGEgZmVhdHVyZSB0aGF0IGNvbnRhaW5zIGFuIGltcG9ydAotCQkJLy8gc3RhdGVtZW50IHdpdGggcGF0Y2g9InRydWUiIGFuZCBhbiBpZC92ZXJzaW9uCi0JCQkvLyB0aGF0IG1hdGNoZXMgYW4gYWxyZWFkeSBpbnN0YWxsZWQgYW5kIGNvbmZpZ3VyZWQKLQkJCS8vIGZlYXR1cmUuIFdoZW4gcGF0Y2hlZCBmZWF0dXJlIGlzIHVuY29uZmlndXJlZCwKLQkJCS8vIGFsbCB0aGUgcGF0Y2hlcyB0aGF0IHJlZmVyZW5jZSBpdCBtdXN0IGJlIAotCQkJLy8gdW5jb25maWd1cmVkIGFzIHdlbGwKLQkJCS8vIChpbiBjb250cmFzdCwgcGF0Y2hlZCBmZWF0dXJlcyBjYW4gYmUKLQkJCS8vIGNvbmZpZ3VyZWQgd2l0aG91dCB0aGUgcGF0Y2hlcykuCi0JCQlpZiAoaW5jbHVkZVBhdGNoZXMpCi0JCQkJdW5jb25maWd1cmVQYXRjaGVzKGZlYXR1cmUpOwotCi0JCQkvLyB0b3AgZG93biBhcHByb2FjaCwgc2FtZSBjb25maWd1cmVkU2l0ZQotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuUmVmID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuUmVmLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZlYXR1cmUgY2hpbGQgPSBjaGlsZHJlblJlZltpXS5nZXRGZWF0dXJlKG51bGwpOyAvLyBkaXNhYmxlIHRoZSBleGFjdCBmZWF0dXJlCi0JCQkJCXVuY29uZmlndXJlKGNoaWxkLCBpbmNsdWRlUGF0Y2hlcywgdHJ1ZSk7IC8vIGNoZWNrIGZvciBwYXJlbnQgYXMgd2Ugc2hvdWxkIGJlIHRoZSBvbmx5IHBhcmVudC4KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2tpcCBhbnkgYmFkIGNoaWxkcmVuCi0JCQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHVuY29uZmlndXJlIGNoaWxkIGZlYXR1cmU6ICIgKyBjaGlsZHJlblJlZltpXSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMKLQkJCU9iamVjdFtdIHNpdGVMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikgc2l0ZUxpc3RlbmVyc1tpXSk7Ci0JCQkJbGlzdGVuZXIuZmVhdHVyZVVuY29uZmlndXJlZChmZWF0dXJlKTsKLQkJCX0KLQotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlVUkwgdXJsID0gZmVhdHVyZVJlZmVyZW5jZS5nZXRVUkwoKTsKLQkJCVN0cmluZyB1cmxTdHJpbmcgPSAodXJsICE9IG51bGwpID8gdXJsLnRvRXh0ZXJuYWxGb3JtKCkgOiAiPG5vIGZlYXR1cmUgcmVmZXJlbmNlIHVybD4iOyAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byB1bmNvbmZpZ3VyZToiICsgdXJsU3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBMb29rIGZvciBmZWF0dXJlcyB0aGF0IGhhdmUgYW4gaW1wb3J0IHJlZmVyZW5jZQotCSAqIHRoYXQgcG9pbnRzIHRvIHRoaXMgZmVhdHVyZSBhbmQgd2hlcmUgcGF0Y2g9dHJ1ZS4KLQkgKiBVbmNvbmZpZ3VyZSBhbGwgdGhlIG1hdGNoaW5nIHBhdGNoZXMsIGJ1dAotCSAqIGRvIG5vdCBkbyB0aGUgc2FtZSBsb29rdXAgZm9yIHRoZW0KLQkgKiBiZWNhdXNlIHBhdGNoZXMgY2Fubm90IGhhdmUgcGF0Y2hlcyB0aGVtc2VsdmVzLgotCSAqLwotCi0JcHJpdmF0ZSB2b2lkIHVuY29uZmlndXJlUGF0Y2hlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZnJlZnMgPSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgZnJlZiA9IGZyZWZzW2ldOwotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBjYW5kaWRhdGUgPSBmcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGNhbmRpZGF0ZS5lcXVhbHMoZmVhdHVyZSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKFVwZGF0ZVV0aWxzLmlzUGF0Y2goZmVhdHVyZSwgY2FuZGlkYXRlKSkKLQkJCQkJdW5jb25maWd1cmUoY2FuZGlkYXRlLCBmYWxzZSwgZmFsc2UpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb25maWd1cmVkU2l0ZSNnZXRDb25maWd1cmVkRmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldENvbmZpZ3VyZWRGZWF0dXJlcygpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKQotCQkJcmV0dXJuIGdldFJhd0NvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IElTaXRlRmVhdHVyZVJlZmVyZW5jZVswXTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUNvbmZpZ3VyZWRTaXRlI2dldENvbmZpZ3VyZWRGZWF0dXJlcygpCi0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0NvbmZpZ3VyZWRGZWF0dXJlcygpIHsKLQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWdQb2xpY3kgPSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCk7Ci0JCWlmIChjb25maWdQb2xpY3kgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlWzBdOwotCi0JCXJldHVybiBjb25maWdQb2xpY3kuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JfQotCi0JLyoKLQkgKiBhZGRzIGNvbmZpZ3VyZWQgYW5kIHVuY29uZmlndXJlZCBmZWF0dXJlIHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpIHsKLQotCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ1BvbGljeSA9IGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQkJaWYgKGNvbmZpZ1BvbGljeSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbMF07Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXMgPSBnZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJaW50IGNvbmZMZW4gPSBjb25maWd1cmVkRmVhdHVyZXMubGVuZ3RoOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHVuY29uZmlndXJlZEZlYXR1cmVzID0gY29uZmlnUG9saWN5LmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWludCB1bmNvbmZMZW4gPSB1bmNvbmZpZ3VyZWRGZWF0dXJlcy5sZW5ndGg7Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbY29uZkxlbiArIHVuY29uZkxlbl07Ci0JCWlmIChjb25mTGVuID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShjb25maWd1cmVkRmVhdHVyZXMsIDAsIHJlc3VsdCwgMCwgY29uZkxlbik7Ci0JCX0KLQkJaWYgKHVuY29uZkxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkodW5jb25maWd1cmVkRmVhdHVyZXMsIDAsIHJlc3VsdCwgY29uZkxlbiwgdW5jb25mTGVuKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBDb25maWd1cmUgYW5kIHVuY29uZmlndXJlIGFwcHJvcHJpYXRlIGZlYXR1cmUgdG8KLQkgKiBiZWNvbWUgJ2xpa2UnIGN1cnJlbnRDb25maWd1cmF0aW9uIHdoaWNoIGlzIHRoZSBjb25maWd1cmF0aW9uCi0JICogdGhlIHVzZXIgd2FudHMgdG8gcmV2ZXJ0IHRvLgotCSAqIAotCSAqIEFsbCBmZWF0dXJlcyBmcm9tIGN1cnJlbnRDb25maWd1cmF0aW9uIHNob3VsZCBiZSBjb25maWd1cmVkCi0JICovCi0JcHVibGljIHZvaWQgcmV2ZXJ0VG8oSUNvbmZpZ3VyZWRTaXRlIG9sZENvbmZpZ3VyYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2JsZW1IYW5kbGVyIGhhbmRsZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0KLQkJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlndXJlZFNpdGUgPSAoQ29uZmlndXJlZFNpdGUpIG9sZENvbmZpZ3VyYXRpb247Ci0KLQkJLy8gcmV0cmlldmUgdGhlIGZlYXR1cmUgdGhhdCB3ZXJlIGNvbmZpZ3VyZWQKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjb25maWd1cmVkRmVhdHVyZXMgPSBvbGRDb25maWd1cmVkU2l0ZS52YWxpZENvbmZpZ3VyZWRGZWF0dXJlcyhoYW5kbGVyKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyZWRGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmNvbmZpZ3VyZShjb25maWd1cmVkRmVhdHVyZXNbaV0sIHRydWUsIHRydWUpOwotCQl9Ci0KLQkJLy8gY2FsY3VsYXRlIGFsbCB0aGUgZmVhdHVyZXMgd2UgaGF2ZSB0byB1bmNvbmZpZ3VyZSBmcm9tIHRoZSBjdXJyZW50IHN0YXRlIHRvIHRoaXMgc3RhdGUKLQkJLy8gaW4gdGhlIGhpc3RvcnkuIAkJCQkKLQkJTGlzdCBmZWF0dXJlVG9VbmNvbmZpZ3VyZSA9IG9sZENvbmZpZ3VyZWRTaXRlLmNhbGN1bGF0ZVVuY29uZmlndXJlZEZlYXR1cmVzKGNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0KLQkJLy8gZm9yIGVhY2ggdW5jb25maWd1cmVkIGZlYXR1cmUgY2hlY2sgaWYgaXQgc3RpbGwgZXhpc3RzCi0JCS8vIGlmIHNvIGFkZCBhcyB1bmNvbmZpZ3VyZWQKLQkJSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVUb1VuY29uZmlndXJlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgZWxlbWVudCA9IChJRmVhdHVyZVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQl0cnkgewotCQkJCS8vIGRvIG5vdCBsb2cgYWN0aXZpdHkKLQkJCQlnZXRDb25maWd1cmF0aW9uUG9saWN5KCkudW5jb25maWd1cmUoZWxlbWVudCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgbm8gZmVhdHVyZSB0byB1bmNvbmZpZ3VyZQotCQkJCVN0cmluZyB1cmwgPSBlbGVtZW50LmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCQkJSVNpdGUgc2l0ZSA9IGVsZW1lbnQuZ2V0U2l0ZSgpOwotCQkJCVN0cmluZyBzaXRlU3RyaW5nID0gKHNpdGUgIT0gbnVsbCkgPyBzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgOiBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuTm9TaXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLkNhbm5vdEZpbmRGZWF0dXJlVG9VbmNvbmZpZ3VyZSIsIHVybCwgc2l0ZVN0cmluZyksIGUpOyAvLyROT04tTkxTLTEkIAotCQkJfQotCQl9Ci0JCS8vfSAvLyBlbmQgVVNFUl9FWENMVURFCi0JfQotCi0JLyoKLQkgKiBXZSBoYXZlIHRvIGtlZXAgb3VyIGNvbmZpZ3VyZWQgZmVhdHVyZQotCSAqIGNoZWNrIGlmIHRoZXkgYXJlIGFsbCB2YWxpZAotCSAqIFJldHVybiB0aGUgdmFsaWQgY29uZmlndXJlZCBmZWF0dXJlcwotCSAqLwotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2VbXSB2YWxpZENvbmZpZ3VyZWRGZWF0dXJlcyhJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlpZiAoY29uZmlndXJlZEZlYXR1cmVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0KLQkJCQkvLyBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgZmVhdHVyZQotCQkJCXRyeSB7Ci0JCQkJCWZlYXR1cmUgPSBjb25maWd1cmVkRmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aWZ5IHdlIGNhbm5vdCBmaW5kIHRoZSBmZWF0dXJlCi0JCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKLQkJCQkJU3RyaW5nIGZlYXR1cmVTdHJpbmcgPSBjb25maWd1cmVkRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCQkJaWYgKCFoYW5kbGVyLnJlcG9ydFByb2JsZW0oUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLkNhbm5vdEZpbmRGZWF0dXJlVG9Db25maWd1cmUiLCBmZWF0dXJlU3RyaW5nKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyB2ZXJpZnkgYWxsIHRoZSBwbHVnaW5zIHN0aWxsIGV4aXN0Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQkvLyBnZXQgcGx1Z2luIGlkZW50aWZpZXIKLQkJCQkJTGlzdCBzaXRlUGx1Z2luSWRlbnRpZmllcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCUlTaXRlIHNpdGUgPSBmZWF0dXJlLmdldFNpdGUoKTsKLQkJCQkJSVBsdWdpbkVudHJ5W10gc2l0ZVBsdWdpbkVudHJpZXMgPSBudWxsOwotCi0JCQkJCWlmIChzaXRlICE9IG51bGwpIHsKLQkJCQkJCXNpdGVQbHVnaW5FbnRyaWVzID0gc2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCQkJCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l0ZVBsdWdpbkVudHJpZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCQkJSVBsdWdpbkVudHJ5IGVudHJ5ID0gc2l0ZVBsdWdpbkVudHJpZXNbaW5kZXhdOwotCQkJCQkJCXNpdGVQbHVnaW5JZGVudGlmaWVycy5hZGQoZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChzaXRlUGx1Z2luRW50cmllcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlJUGx1Z2luRW50cnlbXSBmZWF0dXJlUGx1Z2luRW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGZlYXR1cmVQbHVnaW5FbnRyaWVzLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCQkJCUlQbHVnaW5FbnRyeSBjdXJyZW50RmVhdHVyZVBsdWdpbkVudHJ5ID0gZmVhdHVyZVBsdWdpbkVudHJpZXNbaW5kZXhdOwotCQkJCQkJCWlmICghY29udGFpbnMoY3VycmVudEZlYXR1cmVQbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIHNpdGVQbHVnaW5JZGVudGlmaWVycykpIHsKLQkJCQkJCQkJLy8gdGhlIHBsdWdpbiBkZWZpbmVkIGJ5IHRoZSBmZWF0dXJlCi0JCQkJCQkJCS8vIGRvZXNuJ3Qgc2VlbSB0byBleGlzdCBvbiB0aGUgc2l0ZQotCQkJCQkJCQlTdHJpbmcgbXNnID0gIkVycm9yIHZlcmlmeWluZyBleGlzdGVuY2Ugb2YgcGx1Z2luOiIgKyBjdXJyZW50RmVhdHVyZVBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCVVwZGF0ZUNvcmUubG9nKG1zZywgbmV3IEV4Y2VwdGlvbigpKTsKLQotCQkJCQkJCQlTdHJpbmcgc2l0ZVN0cmluZyA9IChzaXRlICE9IG51bGwpID8gc2l0ZS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpIDogUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLk5vU2l0ZSIpOwkvLyROT04tTkxTLTEkCi0JCQkJCQkJCVN0cmluZyBlcnJvckxhYmVsID0gUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLkNhbm5vdEZpbmRQbHVnaW5FbnRyeSIsIGN1cnJlbnRGZWF0dXJlUGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksIHNpdGVTdHJpbmcpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKGVycm9yTGFiZWwpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmICghaGFuZGxlci5yZXBvcnRQcm9ibGVtKFBvbGljeS5iaW5kKGVycm9yTGFiZWwpKSkgewotCQkJCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9IC8vIGVuZCBpZiBub3QgZm91bmQgaW4gc2l0ZQotCQkJCQkJfSAvLyBlbmQgZm9yCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IC8vIGVuZCBmb3IgY29uZmlndXJlZCBmZWF0dXJlCi0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyZWRGZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIFdlIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiBjYWxjdWxhdGluZyB0aGUgZGVsdGEgYmV0d2VlbiB3aGF0IHdhcyBjb25maWd1cmVkIGluIHRoZSBjdXJyZW50Ci0JICogY29uZmlndXJhdGlvbiB0aGF0IGlzIG5vdCBjb25maWd1cmVkIG5vdwotCSAqIAotCSAqIHdlIGhhdmUgdG8gZmlndXJlIG91dCB3aGF0IGZlYXR1cmUgaGF2ZSBiZWVuIHVuY29uZmlndXJlZCBmb3IgdGhlIHdob2xlCi0JICogaGlzdG9yeSBiZXR3ZWVuIGN1cnJlbnQgYW5kIHVzLi4uIAotCSAqIAotCSAqIGlzIGl0IGFzIHNpbXBsZSBhcyAgZ2V0IGFsbCBjb25maWd1cmVkLCBhbmQgdW5jb25maWd1cmVkLAotCSAqIHRoZSBkbyB0aGUgZGVsdGEgd2l0aCB3aGF0IHNob3VsZCBiZSBjb25maWd1cmVkCi0JICogCi0JICovCi0JcHJpdmF0ZSBMaXN0IGNhbGN1bGF0ZVVuY29uZmlndXJlZEZlYXR1cmVzKElGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJU2V0IGZlYXR1cmVUb1VuY29uZmlndXJlU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQotCQkvLyBsb29wIGZvciBhbGwgaGlzdG9yeQotCQkvLyB0cnkgdG8gc2VlIGlmIHRoZSBjb25maWd1cmVkIHNpdGUgZXhpc3RlZAotCQkvLyBpZiBpdCBkb2VzLCBnZXQgdGhlIHVuY29uZmlndXJlZCBmZWF0dXJlcyAKLQkJLy8gYW5kIHRoZSBjb25maWd1cmVkIG9uZQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBoaXN0b3J5ID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGhpc3RvcnkubGVuZ3RoOyBpKyspIHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBlbGVtZW50ID0gaGlzdG9yeVtpXTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGNvbmZpZ1NpdGVzID0gZWxlbWVudC5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY29uZmlnU2l0ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBjb25maWdTaXRlc1tqXTsKLQkJCQlpZiAoY29uZmlnU2l0ZS5nZXRTaXRlKCkuZXF1YWxzKGdldFNpdGUoKSkpIHsKLQkJCQkJZmVhdHVyZVRvVW5jb25maWd1cmVTZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29uZmlnU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKSkpOwotCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZVNldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSB0aGUgdW5jb25maWd1cmVkIGZlYXR1cmUgd2UgZm91bmQgdGhhdCBhcmUgbm93IHRvIGJlIGNvbmZpZ3VyZWQgCi0JCS8vICh0aGV5IG1heSBoYXZlIGJlZW4gdW5jb25maWd1cmVkIGluIHRoZSBwYXN0LCBidXQgdGhlIHJldmVydCBtYWtlcyB0aGVtIGNvbmZpZ3VyZWQpCi0JCUxpc3QgZmVhdHVyZVRvVW5jb25maWd1cmVMaXN0ID0gcmVtb3ZlKGNvbmZpZ3VyZWRGZWF0dXJlcywgZmVhdHVyZVRvVW5jb25maWd1cmVTZXQpOwotCi0JCXJldHVybiBmZWF0dXJlVG9VbmNvbmZpZ3VyZUxpc3Q7Ci0JfQotCi0JLyoKLQkgKiBVdGlsaXRpZXM6IFJlbW92ZSBhbiBhcnJheSBvZiBmZWF0dXJlIHJlZmVyZW5jZXMKLQkgKiBmcm9tIGEgbGlzdAotCSAqLwotCXByaXZhdGUgTGlzdCByZW1vdmUoSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmcywgU2V0IHNldCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoc2V0ID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCS8vIGlmIGFuIGVsZW1lbnQgb2YgdGhlIGxpc3QgaXMgTk9UIGZvdW5kIGluIHRoZSBhcnJheSwKLQkJLy8gYWRkIGl0IHRvIHRoZSByZXN1bHQgbGlzdAkJCQotCQlJdGVyYXRvciBpdGVyID0gc2V0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSUZlYXR1cmVSZWZlcmVuY2UgZWxlbWVudCA9IChJRmVhdHVyZVJlZmVyZW5jZSkgaXRlci5uZXh0KCk7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnQuZXF1YWxzKGZlYXR1cmVSZWZzW2ldKSkgewotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWZvdW5kKQotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEkgaGF2ZSBpc3N1ZXMgd2hlbiBydW5uaW5nIGxpc3QuY29udGFpbih2ZXJzaW9uZWRJZGVudGlmaWVyKQotCSAqIFRoZSBjb2RlIHJ1bnMgdGhlIE9iamVjdC5lcXVhbHMgaW5zdGVhZCBvZiB0aGUgVmVyc2lvbmVkSWRlbnRpZmllci5lcXVhbHMKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoVmVyc2lvbmVkSWRlbnRpZmllciBpZCwgTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJaWYgKGxpc3QgIT0gbnVsbCAmJiAhbGlzdC5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgIWZvdW5kKSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBlbGVtZW50ID0gKFZlcnNpb25lZElkZW50aWZpZXIpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChlbGVtZW50LmVxdWFscyhpZCkpIHsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZm91bmQ7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeSBnZXRDb25maWd1cmF0aW9uUG9saWN5KCkgewotCQlyZXR1cm4gKENvbmZpZ3VyYXRpb25Qb2xpY3kpIGdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7Ci0JCXJldHVybiAoSVNpdGUpIGdldFNpdGVNb2RlbCgpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEJyb2tlblN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0KLQkJSVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19IQVBQWSwgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gY2hlY2sgdGhlIFBsdWdpbnMgb2YgYWxsIHRoZSBmZWF0dXJlcwotCQkvLyBldmVyeSBwbHVnaW4gb2YgdGhlIGZlYXR1cmUgbXVzdCBiZSBvbiB0aGUgc2l0ZQotCQlJUGx1Z2luRW50cnlbXSBzaXRlRW50cmllcyA9IGdldFNpdGUoKS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVzRW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlJUGx1Z2luRW50cnlbXSByZXN1bHQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZihmZWF0dXJlc0VudHJpZXMsIHNpdGVFbnRyaWVzKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIChyZXN1bHQubGVuZ3RoICE9IDApKSB7Ci0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5GZWF0dXJlVW5IYXBweSIpOyAvLyROT04tTkxTLTEkCi0JCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSwgbXNnLCBudWxsKTsKLQotCQkJZm9yIChpbnQgayA9IDA7IGsgPCByZXN1bHQubGVuZ3RoOyBrKyspIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkID0gcmVzdWx0W2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQlPYmplY3RbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyAiIiwgIiIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQkJdmFsdWVzID0gbmV3IE9iamVjdFtdIHsgaWQuZ2V0SWRlbnRpZmllcigpLCBpZC5nZXRWZXJzaW9uKCl9OwotCQkJCX0KLQkJCQlTdHJpbmcgbXNnMSA9IFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5NaXNzaW5nUGx1Z2luc0Jyb2tlbkZlYXR1cmUiLCB2YWx1ZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlQ29yZS53YXJuKG1zZzEpOwotCQkJCUlTdGF0dXMgc3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZLCBtc2cxLCBudWxsKTsKLQkJCQltdWx0aS5hZGQoc3RhdHVzKTsKLQkJCX0KLQkJCXJldHVybiBtdWx0aTsKLQkJfQotCi0JCS8vIGNoZWNrIG9zLCBhcmNoLCBhbmQgd3MKLQotCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5GZWF0dXJlSGFwcHkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19IQVBQWSwgbXNnLCBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCWlmICghaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGdldENvbmZpZ3VyYXRpb25Qb2xpY3koKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlID0gZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCWlmIChmZWF0dXJlUmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19XQVJOSU5HUykKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBmZWF0dXJlUmVmZXJlbmNlIGZvciBmZWF0dXJlOiIgKyBmZWF0dXJlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBnZXRDb25maWd1cmF0aW9uUG9saWN5KCkuaXNDb25maWd1cmVkKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZ2V0U2l0ZSgpID09IG51bGwpCi0JCQlyZXR1cm4gIk5vIFNpdGUiOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRTaXRlKCkuZ2V0VVJMKCkgPT0gbnVsbCkKLQkJCXJldHVybiAiTm8gVVJMIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJQ29uZmlndXJlZFNpdGUjdmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2ZXJpZnlVcGRhdGFibGVTdGF0dXMoKSB7Ci0KLQkJaWYgKHZlcmlmeVN0YXR1cyAhPSBudWxsKQotCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQotCQlVUkwgc2l0ZVVSTCA9IGdldFNpdGUoKS5nZXRVUkwoKTsKLQkJaWYgKHNpdGVVUkwgPT0gbnVsbCkgewotCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5TaXRlVVJMTnVsbCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQkJfQotCi0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2Uoc2l0ZVVSTC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLk5vbkxvY2FsU2l0ZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQkJfQotCi0JCVN0cmluZyBzaXRlTG9jYXRpb24gPSBzaXRlVVJMLmdldEZpbGUoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2F0aW9uKTsKLQotCQkvLyBnZXQgdGhlIHByb2R1Y3QgbmFtZSBvZiB0aGUgcHJpdmF0ZSBtYXJrZXIKLQkJLy8gaWYgdGhlcmUgaXMgbm8gcHJpdmF0ZSBtYXJrZXIsIGNoZWNrIGlmIHRoZSBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGUKLQkJLy8gaWYgdGhlcmUgaXMgYSBtYXJrZXIgYW5kIHRoaXMgaXMgYSBkaWZmZXJlbnQgcHJvZHVjdCwgcmV0dXJuIGZhbHNlCi0JCS8vIG90aGVyd2lzZSBkb24ndCBjaGVjayBpZiB3ZSBhcmUgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZQotCQlTdHJpbmcgcHJvZHVjdE5hbWUgPSBnZXRQcm9kdWN0TmFtZShmaWxlKTsKLQkJaWYgKHByb2R1Y3ROYW1lICE9IG51bGwpIHsKLQkJCWlmICghcHJvZHVjdE5hbWUuZXF1YWxzKGdldFByb2R1Y3RJZGVudGlmaWVyKCJpZCIsIGdldFByb2R1Y3RGaWxlKCkpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5Ob3RTYW1lUHJvZHVjdElkIiwgcHJvZHVjdE5hbWUpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB2ZXJpZnlTdGF0dXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlGaWxlIGNvbnRhaW5lciA9IGdldFNpdGVDb250YWluaW5nKGZpbGUpOwotCQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5Db250YWluZWRJbkFub3RoZXJTaXRlIiwgY29udGFpbmVyLmdldEFic29sdXRlUGF0aCgpKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdmVyaWZ5U3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFjYW5Xcml0ZShmaWxlKSkgewotCQkJdmVyaWZ5U3RhdHVzID0gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIFBvbGljeS5iaW5kKCJDb25maWd1cmVkU2l0ZS5SZWFkT25seVNpdGUiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB2ZXJpZnlTdGF0dXM7Ci0JCX0KLQotCQl2ZXJpZnlTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldFVwZGF0YWJsZSh0cnVlKTsKLQkJcmV0dXJuIHZlcmlmeVN0YXR1czsKLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBjYW4gd3JpdGUgb24gdGhlIGZpbGUgc3lzdGVtCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjYW5Xcml0ZShGaWxlIGZpbGUpIHsKLQkJaWYgKCFmaWxlLmlzRGlyZWN0b3J5KCkgJiYgZmlsZS5nZXRQYXJlbnRGaWxlKCkgIT0gbnVsbCkgewotCQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0KLQkJRmlsZSB0cnlGaWxlID0gbnVsbDsKLQkJRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5RmlsZSA9IG5ldyBGaWxlKGZpbGUsICJ0b0RlbGV0ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0cnlGaWxlKTsKLQkJCW91dC53cml0ZSgwKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQkJaWYgKHRyeUZpbGUgIT0gbnVsbCkKLQkJCQl0cnlGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBjb250YWlucyBhIG1hcmtlcgotCSAqIGlmIG5vdCBhc2sgYWxsIGRpcmVjdG9yeSBjaGlsZHJlbiB0byBjaGVjawotCSAqIGlmIG9uZSB2YWxpZGF0ZXMgdGhlIGNvbmRpdGlvbiwgcmV0dXJucyB0aGUgbWFya2VyCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRTaXRlQ29udGFpbmluZyhGaWxlIGZpbGUpIHsKLQotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVXBkYXRlQ29yZS53YXJuKCJJc0NvbnRhaW5lZDogQ2hlY2tpbmcgZm9yIG1hcmtlcnMgYXQ6IiArIGZpbGUpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmaWxlLmV4aXN0cygpICYmIGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZSBwcm9kdWN0RmlsZSA9IG5ldyBGaWxlKGZpbGUsIFBST0RVQ1RfU0lURV9NQVJLRVIpOwotCQkJRmlsZSBleHRlbnNpb25GaWxlID0gbmV3IEZpbGUoZmlsZSwgRVhURU5TSU9OX1NJVEVfTUFSS0VSKTsKLQkJCWlmIChwcm9kdWN0RmlsZS5leGlzdHMoKSB8fCBleHRlbnNpb25GaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBmaWxlOwotLy8JCQkvLyBkbyBub3QgY2hlY2sgaWYgYSBtYXJrZXIgZXhpc3RzIGluIHRoZSBjdXJyZW50IGJ1dCBzdGFydCBmcm9tIHRoZSBwYXJlbnQKLS8vCQkJLy8gdGhlIGN1cnJlbnQgaXMgYW5hbHl6ZSBieSBnZXRQcm9kdWN0bmFtZSgpCi0vLwkJCWlmIChmaWxlLmdldFBhcmVudEZpbGUoKSAhPSBudWxsKSB7Ci0vLwkJCQlGaWxlIHByaXZhdGVGaWxlID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksIFBSSVZBVEVfU0lURV9NQVJLRVIpOwotLy8JCQkJaWYgKHByaXZhdGVGaWxlLmV4aXN0cygpKQotLy8JCQkJCXJldHVybiBmaWxlLmdldFBhcmVudEZpbGUoKTsKLS8vCQkJfQotCQl9Ci0JCXJldHVybiBnZXRTaXRlQ29udGFpbmluZyhmaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9kdWN0IGlmIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcml2YXRlIFNpdGUgbWFya3VwIGlzIG5vdAotCSAqIHRoZSBzYW1lIGFzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBwcm9kdWN0IHRoZSB3b3JrYmVuY2ggd2FzIHN0YXJ0ZWQgd2l0aC4KLQkgKiBJZiB0aGUgcHJvZHVjdCBpcyB0aGUgc2FtZSwgcmV0dXJuIG51bGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKEZpbGUgZmlsZSkgewotCi0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlGaWxlIG1hcmtlckZpbGUgPSBuZXcgRmlsZShmaWxlLCBFWFRFTlNJT05fU0lURV9NQVJLRVIgKTsKLQkJaWYgKCFtYXJrZXJGaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUZpbGUgcHJvZHVjdEZpbGUgPSBnZXRQcm9kdWN0RmlsZSgpOwotCQlTdHJpbmcgcHJvZHVjdElkID0gbnVsbDsKLQkJU3RyaW5nIHByaXZhdGVJZCA9IG51bGw7Ci0JCWlmIChwcm9kdWN0RmlsZSAhPSBudWxsKSB7Ci0JCQlwcm9kdWN0SWQgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigiaWQiLCBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXByaXZhdGVJZCA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJpZCIsIG1hcmtlckZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHJvZHVjdElkID09IG51bGwpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlByb2R1Y3QgSUQgaXMgbnVsbCBhdDoiICsgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoIXByb2R1Y3RJZC5lcXVhbHNJZ25vcmVDYXNlKHByaXZhdGVJZCkpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlByb2R1Y3QgaWQgYXQiICsgcHJvZHVjdEZpbGUgKyAiIERpZmZlcmVudCB0aGFuOiIgKyBtYXJrZXJGaWxlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9kdWN0SWRlbnRpZmllcigibmFtZSIsIG1hcmtlckZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIHZlcnNpb24gPSBnZXRQcm9kdWN0SWRlbnRpZmllcigidmVyc2lvbiIsIG1hcmtlckZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG1hcmtlcklEID0gKG5hbWUgPT0gbnVsbCkgPyB2ZXJzaW9uIDogbmFtZSArICI6IiArIHZlcnNpb247IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobWFya2VySUQgPT0gbnVsbCkKLQkJCQkJbWFya2VySUQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBtYXJrZXJJRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHByaXZhdGVJZDsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiUHJvZHVjdCBNYXJrZXIgZG9lc24ndCBleGlzdDoiICsgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgZnJvbSB0aGUgcHJvcGVydHkgZmlsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcm9kdWN0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllciwgRmlsZSBwcm9wZXJ0eUZpbGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydHlGaWxlKTsKLQkJCVByb3BlcnR5UmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoaW4pOwotCQkJcmVzdWx0ID0gYnVuZGxlLmdldFN0cmluZyhpZGVudGlmaWVyKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRXhjZXB0aW9uIHJlYWRpbmcgcHJvcGVydHkgZmlsZToiICsgcHJvcGVydHlGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRXhjZXB0aW9uIHJlYWRpbmcgJyIgKyBpZGVudGlmaWVyICsgIicgZnJvbSBwcm9wZXJ0eSBmaWxlOiIgKyBwcm9wZXJ0eUZpbGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiA9PSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIHByb2R1Y3QgZnJvbSB0aGUgcHJvcGVydHkgZmlsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0UHJvZHVjdEZpbGUoKSB7Ci0KLQkJU3RyaW5nIHByb2R1Y3RJbnN0YWxsRGlyZWN0b3J5ID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLmdldEZpbGUoKTsKLQkJaWYgKHByb2R1Y3RJbnN0YWxsRGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCUZpbGUgcHJvZHVjdEZpbGUgPSBuZXcgRmlsZShwcm9kdWN0SW5zdGFsbERpcmVjdG9yeSwgUFJPRFVDVF9TSVRFX01BUktFUik7Ci0JCQlpZiAocHJvZHVjdEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gcHJvZHVjdEZpbGU7Ci0JCQl9IGVsc2UgewotCQkJCVVwZGF0ZUNvcmUud2FybigiUHJvZHVjdCBtYXJrZXIgZG9lc24ndCBleGlzdDoiICsgcHJvZHVjdEZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCByZXRyaWV2ZSBpbnN0YWxsIFVSTCBmcm9tIEJvb3RMb2FkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JLypwYWNrYWdlKi8KLQlib29sZWFuIGNyZWF0ZVByaXZhdGVTaXRlTWFya2VyKCkgewotCQlVUkwgc2l0ZVVSTCA9IGdldFNpdGUoKS5nZXRVUkwoKTsKLQkJaWYgKHNpdGVVUkwgPT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gY3JlYXRlIG1hcmtlci4gVGhlIFNpdGUgdXJsIGlzIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2Uoc2l0ZVVSTC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgcHJpdmF0ZSBtYXJrZXIuIFRoZSBTaXRlIGlzIG5vdCBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBzaXRlTG9jYXRpb24gPSBzaXRlVVJMLmdldEZpbGUoKTsKLQkJRmlsZSBwcm9kdWN0RmlsZSA9IGdldFByb2R1Y3RGaWxlKCk7Ci0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOwotCQlpZiAocHJvZHVjdEZpbGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByb2R1Y3RJZCA9IGdldFByb2R1Y3RJZGVudGlmaWVyKCJpZCIsIHByb2R1Y3RGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2R1Y3ROYW1lID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoIm5hbWUiLCBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBwcm9kdWN0VmVyID0gZ2V0UHJvZHVjdElkZW50aWZpZXIoInZlcnNpb24iLCBwcm9kdWN0RmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChwcm9kdWN0SWQgIT0gbnVsbCkgewotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgRVhURU5TSU9OX1NJVEVfTUFSS0VSKTsKLQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJT3V0cHV0U3RyZWFtIG91dCA9IG51bGw7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRXcml0ZXIgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCQlvdXRXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgIlVURjgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJb3V0V3JpdGVyLndyaXRlKCJpZD0iICsgcHJvZHVjdElkKyJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmIChwcm9kdWN0TmFtZSAhPSBudWxsKQotCQkJCQkJCW91dFdyaXRlci53cml0ZSgibmFtZT0iICsgcHJvZHVjdE5hbWUrIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJaWYgKHByb2R1Y3RWZXIgIT0gbnVsbCkKLQkJCQkJCQlvdXRXcml0ZXIud3JpdGUoInZlcnNpb249IiArIHByb2R1Y3RWZXIrIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQkJCQlqdXN0Q3JlYXRlZCA9IHRydWU7Ci0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBjcmVhdGUgcHJpdmF0ZSBNYXJrZXIgYXQ6IiArIGZpbGUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlmIChvdXRXcml0ZXIgIT0gbnVsbCkKLQkJCQkJCQkJb3V0V3JpdGVyLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCQkJCW91dC5jbG9zZSgpOwotCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VjY2VzczsKLQl9Ci0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIFNpdGUgY29udGFpbnMKLQkgKiAuZWNsaXBzZWV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uU2l0ZSgpIHsKLQkJcmV0dXJuIGNvbnRhaW5zTWFya2VyKEVYVEVOU0lPTl9TSVRFX01BUktFUik7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpcmVjdG9yeSBvZiB0aGUgU2l0ZSBjb250YWlucwotCSAqIC5lY2xpcHNlZXh0ZW5zaW9uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9kdWN0U2l0ZSgpIHsKLQkJcmV0dXJuIGNvbnRhaW5zTWFya2VyKFBST0RVQ1RfU0lURV9NQVJLRVIpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIFNpdGUgY29udGFpbnMKLQkgKiAuZWNsaXBzZWV4dGVuc2lvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJpdmF0ZVNpdGUoKSB7Ci0JCXJldHVybiBpc0V4dGVuc2lvblNpdGUoKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc01hcmtlcihTdHJpbmcgbWFya2VyKSB7Ci0JCUlTaXRlIHNpdGUgPSBnZXRTaXRlKCk7Ci0JCWlmIChzaXRlID09IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29udGFpbnMgTWFya2VyczpUaGUgc2l0ZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVVSTCB1cmwgPSBzaXRlLmdldFVSTCgpOwotCQlpZiAodXJsID09IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29udGFpbnMgTWFya2VyczpTaXRlIFVSTCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVDb3JlLndhcm4oIkNvbnRhaW5zIE1hcmtlcnM6Tm9uIGZpbGUgcHJvdG9jb2wiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29udGFpbnMgTWFya2VyczpUaGUgc2l0ZSBkb2Vzbid0IGV4aXN0OiIgKyBmaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUZpbGUgZXh0ZW5zaW9uID0gbmV3IEZpbGUoZmlsZSwgbWFya2VyKTsKLQkJaWYgKCFleHRlbnNpb24uZXhpc3RzKCkpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29udGFpbnMgTWFya2VyczpUaGUgZXh0ZW5zaW9uZmlsZSBkb2VzIG5vdCBleGlzdDoiICsgZXh0ZW5zaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBTaXRlIGlzIGFscmVhZHkgbmF0aXZlbHkgbGlua2VkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOYXRpdmVseUxpbmtlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBsYXRmb3JtU3RyaW5nID0gZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKTsKLQkJaWYgKHBsYXRmb3JtU3RyaW5nID09IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiVW5hYmxlIHRvIHJldHJpZXZlIHBsYXRmb3JtU3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVVSTCBzaXRlVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBzaXRlIGV4aXN0cyBhbmQgaXMgdXBkYXRhYmxlCi0JCQkvLyB1cGRhdGUgY29uZmlnU2l0ZQotCQkJVVJMIHVybFRvQ2hlY2sgPSBuZXcgVVJMKHBsYXRmb3JtU3RyaW5nKTsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeSBlbnRyeSA9IHJ1bnRpbWVDb25maWcuZmluZENvbmZpZ3VyZWRTaXRlKHVybFRvQ2hlY2spOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZW50cnkuaXNOYXRpdmVseUxpbmtlZCgpOwotCQkJfSBlbHNlIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBzaXRlOiIgKyBwbGF0Zm9ybVN0cmluZyArICIgZnJvbSBwbGF0Zm9ybS4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCS8vIGNoZWNrIGJ5IGNvbXBhcmluZyBVUkxzCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnlbXSBzaXRlcyA9IHJ1bnRpbWVDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2l0ZVVSTCA9IHNpdGVzW2ldLmdldFVSTCgpOwotCQkJCVVSTCByZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUoc2l0ZVVSTCk7Ci0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKHJlc29sdmVkVVJMLCB1cmxUb0NoZWNrKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIkNvbmZpZ3VyZWRTaXRlLlVuYWJsZVJlc29sdmVVUkwiLCBwbGF0Zm9ybVN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZywgZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiQ29uZmlndXJlZFNpdGUuVW5hYmxlVG9BY2Nlc3NTaXRlIiwgbmV3IE9iamVjdFtdIHsgc2l0ZVVSTCB9KTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSogd2UgaGF2ZSB0byBjaGVjayB0aGF0IG5vIGNvbmZpZ3VyZWQvZW5hYmxlIHBhcmVudCBpbmNsdWRlIHRoaXMgZmVhdHVyZQotCSovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlTm9Db25maWd1cmVkUGFyZW50cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ29uZmlndXJhdGlvblBvbGljeTogdmFsaWRhdGUgRmVhdHVyZSBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBwYXJlbnRzID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFBhcmVudEZlYXR1cmVzKGZlYXR1cmUsIGdldENvbmZpZ3VyZWRGZWF0dXJlcygpLCBmYWxzZSk7Ci0JCXJldHVybiAocGFyZW50cy5sZW5ndGggPT0gMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Nvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNDgxYmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Db25uZWN0aW9uVGhyZWFkTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aHJlYWRzIHRoYXQgYXJlIGRpc3BhdGNoZWQgdG8gCi0gKiBvYnRhaW5lZCBhIHZhbGlkIGlucHV0IHN0cmVhbSBmcm9tIGFuIEhUVFAgY29ubmVjdGlvbi4KLSAqIFNpbmNlIG9idGFpbmluZyBhbiBpbnB1dCBzdHJlYW0gaXMgYW4gSS9PIG9wZXJhdGlvbgotICogdGhhdCBtYXkgYmxvY2sgZm9yIGEgbG9uZyB0aW1lLCBpdCBpcyBwZXJmb3JtZWQKLSAqIG9uIGEgc2VwYXJhdGUgdGhyZWFkIHRvIGtlZXAgdGhlIFVJIHJlc3BvbnNpdmUuCi0gKiA8cD4KLSAqIEluIGNhc2UgdGhhdCBhIGNvbm5lY3Rpb24gYmxvY2tzIGFuZCBkb2VzIG5vdAotICogdGVybWluYXRlIHdpdGggYW4gSU9FeGNlcHRpb24gYWZ0ZXIgYSB0aW1lb3V0LCAKLSAqIGFjdGl2ZSB0aHJlYWRzIG1heSBhY2N1bXVsYXRlLiBUaGUgbWFuYWdlciB3aWxsCi0gKiByZWZ1c2UgdG8gY3JlYXRlIG1vcmUgdGhhbiBNQVhfQ09VTlQgdGhyZWFkcyBhbmQKLSAqIGluc3RlYWQgd2lsbCB0aHJvdyBhIENvcmVFeGNlcHRpb24gd2l0aCBhIGNoaWxkCi0gKiBzdGF0dXMgb2JqZWN0IGZvciBlYWNoIGNvbm5lY3Rpb24gdGhhdCBpcyBzdGlsbCBwZW5kaW5nLgotICogPHA+Ci0gKiBJZiB0aGUgY29ubmVjdGlvbiBpcyByZXNwb25zaXZlIGJ1dCBzbG93LCB0aGUgdXNlcgotICogbWF5IGNhbmNlbCBpdC4gSW4gdGhhdCBjYXNlLCB0aGUgbWFuYWdlciB3aWxsCi0gKiBjbG9zZSB0aGUgc3RyZWFtIHRvIGF2b2lkIHJlc291cmNlIGxlYWsuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlciB7Ci0JLy8gc2V0IGNvbm5lY3Rpb24gdGltZW91dCB0byAxIG1pbnV0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUX1RJTUVPVVQgPSAiNjAwMDAiOyAvLyROT04tTkxTLTEkCi0JLy8gc2V0IHJlYWQgdGltZW91dCB0byAxIG1pbnV0ZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX1RJTUVPVVQgPSAiNjAwMDAiOyAvLyROT04tTkxTLTEkCi0JLy8gbWF4IG51bWJlciBvZiBhY3RpdmUgdGhyZWFkcwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfQ09VTlQgPSA5OwotCXByaXZhdGUgVmVjdG9yIHRocmVhZHM7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbVJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcml2YXRlIEh0dHBVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb247Ci0JCXByaXZhdGUgRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQkJcHJpdmF0ZSBJbnB1dFN0cmVhbSBpczsKLQkJcHJpdmF0ZSBib29sZWFuIGRpc2Nvbm5lY3RlZDsKLQotCQlwdWJsaWMgU3RyZWFtUnVubmFibGUoSHR0cFVSTENvbm5lY3Rpb24gdXJsQ29ubmVjdGlvbikgewotCQkJdGhpcy51cmxDb25uZWN0aW9uID0gdXJsQ29ubmVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJCXJldHVybiBpczsKLQkJfQotCi0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJcmV0dXJuIHVybENvbm5lY3Rpb24uZ2V0VVJMKCk7Ci0JCX0KLQotCQlwdWJsaWMgRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKLQkJCXJldHVybiBleGNlcHRpb247Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQkJdXJsQ29ubmVjdGlvbi5kaXNjb25uZWN0KCk7Ci0JCQlkaXNjb25uZWN0ZWQgPSB0cnVlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQlpcyA9IHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQlpZiAoZGlzY29ubmVjdGVkKSB7Ci0JCQkJCS8vIFRoZSBjb25uZWN0aW9uIHdhcyBzbG93LCBidXQgcmV0dXJuZWQKLQkJCQkJLy8gYSB2YWxpZCBpbnB1dCBzdHJlYW0uIEhvd2V2ZXIsCi0JCQkJCS8vIHRoZSB1c2VyIGNhbmNlbGVkIHRoZSBjb25uZWN0aW9uCi0JCQkJCS8vIHNvIHdlIG11c3QgY2xvc2UgdG8gYXZvaWQgCi0JCQkJCS8vIHJlc291cmNlIGxlYWsuCi0JCQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIGRvbid0IGNhcmUKLQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJaXMgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlleGNlcHRpb24gPSBlOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgQ29ubmVjdGlvblRocmVhZCBleHRlbmRzIFRocmVhZCB7Ci0JCXByaXZhdGUgU3RyZWFtUnVubmFibGUgcnVubmFibGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkKFN0cmVhbVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCQlzdXBlcihydW5uYWJsZSwgInVwZGF0ZS1jb25uZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJlYW1SdW5uYWJsZSBnZXRSdW5uYWJsZSgpIHsKLQkJCXJldHVybiBydW5uYWJsZTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlcigpIHsKLQkJLy8gSW4gY2FzZSB3ZSBhcmUgcnVubmluZyBTdW4ncyBjb2RlLgotCQlzZXRJZk5vdERlZmF1bHRQcm9wZXJ0eSgic3VuLm5ldC5jbGllbnQuZGVmYXVsdENvbm5lY3RUaW1lb3V0IiwgQ09OTkVDVF9USU1FT1VUKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJZk5vdERlZmF1bHRQcm9wZXJ0eSgic3VuLm5ldC5jbGllbnQuZGVmYXVsdFJlYWRUaW1lb3V0IiwgUkVBRF9USU1FT1VUKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldElmTm90RGVmYXVsdFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKG9sZFZhbHVlPT1udWxsIHx8IG9sZFZhbHVlLmVxdWFscygiLTEiKSkgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBUaHJlYWQgY3JlYXRlVGhyZWFkKFN0cmVhbVJ1bm5hYmxlIHJ1bm5hYmxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXZhbGlkYXRlRXhpc3RpbmdUaHJlYWRzKCk7Ci0JCWlmICh0aHJlYWRzID09IG51bGwpCi0JCQl0aHJlYWRzID0gbmV3IFZlY3RvcigpOwotCQlUaHJlYWQgdCA9IG5ldyBDb25uZWN0aW9uVGhyZWFkKHJ1bm5hYmxlKTsKLQkJdC5zZXREYWVtb24odHJ1ZSk7Ci0JCXRocmVhZHMuYWRkKHQpOwotCQlyZXR1cm4gdDsKLQl9Ci0KLQkvKgotCSAqIFJlbW92ZXMgdGhyZWFkcyB0aGF0IGFyZSBub3QgYWxpdmUgYW55IG1vcmUgZnJvbSB0aGUgCi0JICogbGlzdCBhbmQgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBhdCBtb3N0IE1BWF9DT1VOVCB0aHJlYWRzCi0JICogc3RpbGwgd29ya2luZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVFeGlzdGluZ1RocmVhZHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh0aHJlYWRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQkKLQkJaW50IGFsaXZlQ291bnQgPSBwdXJnZVRlcm1pbmF0ZWRUaHJlYWRzKCk7Ci0KLQkJaWYgKGFsaXZlQ291bnQgPiBNQVhfQ09VTlQpIHsKLQkJCUFycmF5TGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCVN0cmluZyBwbHVnaW5JZCA9Ci0JCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGhyZWFkcy5zaXplKCk7IGkrKykgewotCQkJCUNvbm5lY3Rpb25UaHJlYWQgdCA9IChDb25uZWN0aW9uVGhyZWFkKSB0aHJlYWRzLmdldChpKTsKLQkJCQlTdHJpbmcgdXJsID0gdC5nZXRSdW5uYWJsZSgpLmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJCXBsdWdpbklkLAotCQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJCVBvbGljeS5iaW5kKAotCQkJCQkJCSJDb25uZWN0aW9uVGhyZWFkTWFuYWdlci51bnJlc3BvbnNpdmVVUkwiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJdXJsKSwKLQkJCQkJCW51bGwpOwotCQkJCWNoaWxkcmVuLmFkZChzdGF0dXMpOwotCQkJfQotCQkJTXVsdGlTdGF0dXMgcGFyZW50U3RhdHVzID0KLQkJCQluZXcgTXVsdGlTdGF0dXMoCi0JCQkJCXBsdWdpbklkLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkoSVN0YXR1c1tdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJU3RhdHVzW2NoaWxkcmVuLnNpemUoKV0pLAotCQkJCQlQb2xpY3kuYmluZCgiQ29ubmVjdGlvblRocmVhZE1hbmFnZXIudG9vTWFueUNvbm5lY3Rpb25zIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihwYXJlbnRTdGF0dXMpOwotCQl9Ci0JfQotCQotCS8qCi0JICogUmVtb3ZlcyB0ZXJtaW5hdGVkIHRocmVhZHMgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJucwotCSAqIHRoZSBudW1iZXIgb2YgdGhvc2Ugc3RpbGwgYWN0aXZlLgotCSAqLwotCQotCXByaXZhdGUgaW50IHB1cmdlVGVybWluYXRlZFRocmVhZHMoKSB7Ci0JCWludCBhbGl2ZUNvdW50ID0gMDsKLQotCQlPYmplY3RbXSBhcnJheSA9IHRocmVhZHMudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlUaHJlYWQgdCA9IChUaHJlYWQpIGFycmF5W2ldOwotCQkJaWYgKCF0LmlzQWxpdmUoKSkKLQkJCQl0aHJlYWRzLnJlbW92ZSh0KTsKLQkJCWVsc2UKLQkJCQlhbGl2ZUNvdW50Kys7Ci0JCX0KLQkJcmV0dXJuIGFsaXZlQ291bnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCS8vIFdlIG1pZ2h0IHdhbnQgdG8ga2lsbCB0aGUgYWN0aXZlIHRocmVhZHMgYnV0Ci0JCS8vIHRoaXMgaXMgbm90IHJlYWxseSBuZWNlc3Nhcnkgc2luY2UgdGhleSBhcmUgYWxsCi0JCS8vIGRhZW1vbnMgYW5kIHdpbGwgbm90IHByZXZlbnQgSlZNIHRvIHRlcm1pbmF0ZS4KLQkJdGhyZWFkcy5jbGVhcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0NvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDcxOTM2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIKLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudENvbnN1bWVyIGltcGxlbWVudHMgSUNvbnRlbnRDb25zdW1lciB7Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVmYXVsdEluc3RhbGxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RlZmF1bHRJbnN0YWxsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGZjZDhkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRGVmYXVsdEluc3RhbGxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSmFyQ29udGVudFJlZmVyZW5jZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogRGVmYXVsdCBJbXBsZW1lbnRhdGlvbiBvZiBJbnN0YWxsSGFuZGxlcgotICovCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEluc3RhbGxIYW5kbGVyIGV4dGVuZHMgQmFzZUluc3RhbGxIYW5kbGVyIHsKLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjbm9uUGx1Z2luRGF0YURvd25sb2FkZWQoSU5vblBsdWdpbkVudHJ5W10sIElWZXJpZmljYXRpb25MaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBub25QbHVnaW5EYXRhRG93bmxvYWRlZCgKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRGF0YSwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gdmVyaWZ5IG5vbi1wbHVnaW4gYXJjaGl2ZXMuIFRoZSBEZWZhdWx0SW5zdGFsbEhhbmRsZXIgYXNzdW1lcwotCQkvLyB0aGUgdmVyaWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBmZWF0dXJlIGlzIGFibGUgdG8gdmVyaWZ5IHRoZQotCQkvLyBkYXRhIGFyY2hpdmVzLgotCQlpZiAobm9uUGx1Z2luRGF0YSA9PSBudWxsIHx8IG5vblBsdWdpbkRhdGEubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5ub25QbHVnaW5FbnRyaWVzID0gbm9uUGx1Z2luRGF0YTsKLQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSB0aGlzLmZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOwotCQlJVmVyaWZpZXIgdmVyaWZpZXIgPSBwcm92aWRlci5nZXRWZXJpZmllcigpOwotCQlpZiAodmVyaWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMubm9uUGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJQ29udGVudFJlZmVyZW5jZVtdIGFyY2hpdmVzID0KLQkJCQlwcm92aWRlci5nZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG5vblBsdWdpbkVudHJpZXNbaV0sIHRoaXMubW9uaXRvcik7Ci0JCQlJVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdDsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXJjaGl2ZXMubGVuZ3RoOyBqKyspIHsKLQotCQkJCS8vIHNlZSBpZiB0aGUgZGF0YSBlbnRyeSBpcyBhIGphcgotCQkJCUNvbnRlbnRSZWZlcmVuY2UgYXJjaGl2ZSA9IGFyY2hpdmVzW2pdOwotCQkJCWlmICghKGFyY2hpdmVzW2pdIGluc3RhbmNlb2YgSmFyQ29udGVudFJlZmVyZW5jZSkKLQkJCQkJJiYgYXJjaGl2ZXNbal0uZ2V0SWRlbnRpZmllcigpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl0cnkgewotCQkJCQkJYXJjaGl2ZSA9Ci0JCQkJCQkJbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZXNbal0uZ2V0SWRlbnRpZmllcigpLCBhcmNoaXZlc1tqXS5hc0ZpbGUoKSk7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXJlc3VsdCA9IHZlcmlmaWVyLnZlcmlmeSh0aGlzLmZlYXR1cmUsIGFyY2hpdmUsIGZhbHNlLCB0aGlzLm1vbml0b3IpOwotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJcHJvbXB0Rm9yVmVyaWZpY2F0aW9uKHJlc3VsdCwgbGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIpCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gcGx1Z2lucyBoYXZlIGJlZW4gaW5zdGFsbGVkLiBDaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkKLQkJLy8gbm9uLXBsdWdpbiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZSBoYW5kbGVkLgotCQlpZiAodGhpcy5ub25QbHVnaW5FbnRyaWVzID09IG51bGwgfHwgdGhpcy5ub25QbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCS8vIGluc3RhbGwgbm9uLXBsdWdpbiBhcmNoaXZlcwotCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IHRoaXMuZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5ub25QbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlW10gYXJjaGl2ZSA9Ci0JCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhub25QbHVnaW5FbnRyaWVzW2ldLCB0aGlzLm1vbml0b3IpOwotCQkJSUNvbnRlbnRDb25zdW1lciBub25QbHVnaW5Db25zdW1lciA9IGNvbnN1bWVyLm9wZW4obm9uUGx1Z2luRW50cmllc1tpXSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGFyY2hpdmUubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgaWQgPSBhcmNoaXZlW2pdLmdldElkZW50aWZpZXIoKTsKLQkJCQlpZiAoaWQuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHRoZSBub24tcGx1Z2luIGFyY2hpdmUgaXMgYSBqYXIuIFVucGFjayBpdCBpbnRvCi0JCQkJCS8vIGEgZGlyZWN0b3J5IGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBhcmNoaXZlIGlkCi0JCQkJCXRyeSB7Ci0JCQkJCQlmaW5hbCBTdHJpbmcgcHJlZml4ID0gaWQuc3Vic3RyaW5nKDAsIGlkLmxlbmd0aCgpIC0gNCkgKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyUmVmID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoIiIsIGFyY2hpdmVbal0uYXNGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ29udGVudFNlbGVjdG9yKCkgewotCQkJCQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBlbnRyeSkgewotCQkJCQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlyZXR1cm4gcHJlZml4ICsgZW50cnkuZ2V0TmFtZSgpOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCQlDb250ZW50UmVmZXJlbmNlW10gZW50cmllcyA9IGphclJlZi5wZWVrKHNlbGVjdG9yLCB0aGlzLm1vbml0b3IpOwotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBlbnRyaWVzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJbm9uUGx1Z2luQ29uc3VtZXIuc3RvcmUoZW50cmllc1trXSwgdGhpcy5tb25pdG9yKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzCi0JCQkJCQkJLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWNhdGlvblNlcnZpY2UuQ2FuY2VsSW5zdGFsbCIsIGlkKSwJLy8kTk9OLU5MUy0xJAotCQkJCQkJZSk7Ci0JCQkJCX0KLQotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBub24tcGx1Z2luIGFyY2hpdmUgaXMgbm90IGEgamFyLiBJbnN0YWxsIGl0IGFzaXMuCi0JCQkJCW5vblBsdWdpbkNvbnN1bWVyLnN0b3JlKGFyY2hpdmVbal0sIHRoaXMubW9uaXRvcik7Ci0JCQkJfQotCQkJfQotCQkJbm9uUGx1Z2luQ29uc3VtZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb21wdEZvclZlcmlmaWNhdGlvbigKLQkJSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQsCi0JCUlWZXJpZmljYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgcmVzdWx0ID0gbGlzdGVuZXIucHJvbXB0KHZlcmlmaWNhdGlvblJlc3VsdCk7Ci0KLQkJaWYgKHJlc3VsdCA9PSBJVmVyaWZpY2F0aW9uTGlzdGVuZXIuQ0hPSUNFX0FCT1JUKSB7Ci0JCQlFeGNlcHRpb24gZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJCXRocm93IG5ldyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uU2VydmljZS5DYW5jZWxJbnN0YWxsIiksZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAocmVzdWx0ID09IElWZXJpZmljYXRpb25MaXN0ZW5lci5DSE9JQ0VfRVJST1IpIHsKLQkJCXRocm93IFV0aWxpdGllcwotCQkJCS5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmljYXRpb25TZXJ2aWNlLlVuc3VjZXNzZnVsVmVyaWZpY2F0aW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCXZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25FeGNlcHRpb24oKSk7Ci0JCX0KLQotCQlyZXR1cm47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9EZWx0YUluc3RhbGxIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RlbHRhSW5zdGFsbEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAzYjhjYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0RlbHRhSW5zdGFsbEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBJbnN0YWxsIGhhbmRsZXIgZm9yIHBhcnRpYWwgcGx1Z2luIGRlbGl2ZXJ5OiBjb3B5IGRlbHRhIGNvbnRlbnQgZnJvbSBvbGQgcGx1Z2luIGludG8gdGhlIG5ldyBvbmUuCi0gKiBUaGUgbmV3IHBsdWdpbiBzaG91bGQgb25seSBjb250YWluIGZpbGVzIHRoYXQgaGF2ZSBjaGFuZ2VkLgotICovCi1wdWJsaWMgY2xhc3MgRGVsdGFJbnN0YWxsSGFuZGxlciBleHRlbmRzIEJhc2VJbnN0YWxsSGFuZGxlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9YTUwgPSAicGx1Z2luLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRlJBR01FTlRfWE1MID0gImZyYWdtZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUVUQV9NQU5JRkVTVCA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJRmVhdHVyZSBvbGRGZWF0dXJlOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlSW5zdGFsbChvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZUNvbnRlbnRDb25zdW1lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZUluc3RhbGwoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChwbHVnaW5FbnRyaWVzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoIWZlYXR1cmUuaXNQYXRjaCgpKSB7Ci0JCQkJLy8gR2V0IHRoZSBvbGQgZmVhdHVyZQotCQkJCUlGZWF0dXJlW10gb2xkRmVhdHVyZXMgPSBVcGRhdGVVdGlscwotCQkJCQkJLmdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUpOwotCQkJCWlmIChvbGRGZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJCW9sZEZlYXR1cmUgPSBvbGRGZWF0dXJlc1swXTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2xkRmVhdHVyZSA9IFVwZGF0ZVV0aWxzLmdldFBhdGNoZWRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCWlmIChvbGRGZWF0dXJlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJSVBsdWdpbkVudHJ5W10gb2xkUGx1Z2lucyA9IG9sZEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVBsdWdpbkVudHJ5IG5ld1BsdWdpbiA9IHBsdWdpbkVudHJpZXNbaV07Ci0JCQkJSVBsdWdpbkVudHJ5IG9sZFBsdWdpbiA9Ci0JCQkJCWdldFBsdWdpbkVudHJ5KAotCQkJCQkJb2xkUGx1Z2lucywKLQkJCQkJCW5ld1BsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQlpZiAob2xkUGx1Z2luID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCXRyeSB7Ci0JCQkJCW92ZXJsYXlQbHVnaW4ob2xkUGx1Z2luLCBuZXdQbHVnaW4sIGNvbnN1bWVyKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJCQkJbmV3IFN0YXR1cygKLQkJCQkJCQlTdGF0dXMuRVJST1IsCi0JCQkJCQkJVXBkYXRlVXRpbHMuZ2V0UGx1Z2luSWQoKSwKLQkJCQkJCQkxLAotCQkJCQkJCSIiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJZSkpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCS8vaWYgKGNvbnRlbnRDb25zdW1lciAhPSBudWxsKQotCQkJLy8JY29udGVudENvbnN1bWVyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVBsdWdpbkVudHJ5IGdldFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeVtdIHBsdWdpbnMsIFN0cmluZyBpZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAocGx1Z2luc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhpZCkpCi0JCQkJcmV0dXJuIHBsdWdpbnNbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlZmVyZW5jZUV4aXN0cygKLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMsCi0JCUNvbnRlbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCVN0cmluZyBpZCA9IHJlZi5nZXRJZGVudGlmaWVyKCk7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykKLQkJCWlmIChpZC5lcXVhbHMocmVmZXJlbmNlc1tpXS5nZXRJZGVudGlmaWVyKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3ZlcmxheVBsdWdpbigKLQkJSVBsdWdpbkVudHJ5IG9sZFBsdWdpbiwKLQkJSVBsdWdpbkVudHJ5IG5ld1BsdWdpbiwKLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29uc3VtZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmKG5ld1BsdWdpbiBpbnN0YW5jZW9mIFBsdWdpbkVudHJ5ICYmICEoKFBsdWdpbkVudHJ5KW5ld1BsdWdpbikuaXNVbnBhY2soKSl7Ci0JCQkvLyBwYXJ0aWFsIHBsdWctaW5zIChpbiBwYXRjaGVzKSBtdXN0IGFsd2F5cyBiZSB1bnBhY2tlZAotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBjb3B5IHRoZSBjb250ZW50IG9mIHRoZSBvbGQgcGx1Z2luIG92ZXIgdGhlIG5ldyBvbmUsIGJ1dCBvbmx5Ci0JCS8vIHRob3NlIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IG9uIHRoZSB0YXJnZXQKLQkJQ29udGVudFJlZmVyZW5jZVtdIG9sZFJlZmVyZW5jZXMgPQotCQkJb2xkRmVhdHVyZQotCQkJCS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkKLQkJCQkuZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcygKLQkJCQlvbGRQbHVnaW4sCi0JCQkJbnVsbCk7Ci0JCUNvbnRlbnRSZWZlcmVuY2VbXSBuZXdSZWZlcmVuY2VzID0KLQkJCWZlYXR1cmUKLQkJCQkuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpCi0JCQkJLmdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoCi0JCQkJbmV3UGx1Z2luLAotCQkJCW51bGwpOwotCi0JCVVSTCBuZXdVUkwgPSBuZXcgVVJMKGNvbnN1bWVyLmdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0VVJMKCksCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRICi0JCQkJCQkrIG5ld1BsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCVN0cmluZyBwbHVnaW5QYXRoID0gbmV3VVJMLmdldEZpbGUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRSZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaXNQbHVnaW5NYW5pZmVzdChvbGRSZWZlcmVuY2VzW2ldKQotCQkJCXx8IHJlZmVyZW5jZUV4aXN0cyhuZXdSZWZlcmVuY2VzLCBvbGRSZWZlcmVuY2VzW2ldKSkKLQkJCQljb250aW51ZTsKLQotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpbnB1dCA9IG9sZFJlZmVyZW5jZXNbaV0uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPQotCQkJCQluZXcgRmlsZShwbHVnaW5QYXRoLCBvbGRSZWZlcmVuY2VzW2ldLmdldElkZW50aWZpZXIoKSk7Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKAotCQkJCQlpbnB1dCwKLQkJCQkJdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwKLQkJCQkJbnVsbCk7Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrUGVybWlzc2lvbnMoCi0JCQkJCW9sZFJlZmVyZW5jZXNbaV0sCi0JCQkJCXBsdWdpblBhdGgpOwotCQkJCS8vIDIwMzA1Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmKGlucHV0ICE9IG51bGwpewotCQkJCQl0cnl7Ci0JCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGx1Z2luTWFuaWZlc3QoQ29udGVudFJlZmVyZW5jZSByZWYpIHsKLQkJU3RyaW5nIGlkID0gcmVmLmdldElkZW50aWZpZXIoKTsKLQkJcmV0dXJuIFBMVUdJTl9YTUwuZXF1YWxzKGlkKSB8fCBGUkFHTUVOVF9YTUwuZXF1YWxzKGlkKSB8fCBNRVRBX01BTklGRVNULmVxdWFscyhpZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9FcnJvclJlY292ZXJ5TG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Vycm9yUmVjb3ZlcnlMb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkMjUxMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0Vycm9yUmVjb3ZlcnlMb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLQotCi0vKioKLSAqIHNpbmdsZXRvbiBwYXR0ZXJuLgotICogbWFuYWdlcyB0aGUgZXJyb3IvcmVjb3ZlciBsb2cgZmlsZQotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JSZWNvdmVyeUxvZyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVDT1ZFUllfT04gPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9SRUNPVkVSWV9MT0cgPSAiZXJyb3JfcmVjb3ZlcnkubG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRU5UUllfS0VZID0gIkxvZ0VudHJ5LiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUVVJOX0NBUlJJQUdFID0gIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9PRl9GSUxFID0gImVvZj1lb2YiOyAvLyROT04tTkxTLTEkCi0KLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX0lOU1RBTExfTE9HID0gCSJTVEFSVF9JTlNUQUxMX0xPRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fRU5UUlkgPSAJCSJQTFVHSU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfRU5UUlkgPSAJCSJGUkFHTUVOVCI7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX01BTklGRVNUX0VOVFJZID0gCQkiQlVORExFX01BTklGRVNUIjsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSkFSX0VOVFJZID0gCQkJIkJVTkRMRSI7CSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9FTlRSWSA9IAkJIkZFQVRVUkUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0lOU1RBTExFRCA9IAkJIkFMTF9GRUFUVVJFU19JTlNUQUxMRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVOQU1FX0VOVFJZID0gCQkiUkVOQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9JTlNUQUxMX0xPRyA9IAkiRU5EX0lOU1RBTExfTE9HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVJUX1JFTU9WRV9MT0cgPSAJIlJFTU9WRV9MT0ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX0FCT1VUX1JFTU9WRSA9CSJFTkRfQUJPVVRfVE9fUkVNT1ZFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9FTlRSWSA9IAkJIkRFTEVURSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfUkVNT1ZFX0xPRyA9IAkJIkVORF9SRU1PVkVfTE9HIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZvcmNlUmVtb3ZlID0gZmFsc2U7Ci0KLQlwcml2YXRlIHN0YXRpYyBFcnJvclJlY292ZXJ5TG9nIGluc3Q7Ci0JcHJpdmF0ZSBGaWxlV3JpdGVyIG91dDsKLQlwcml2YXRlIGludCBpbmRleDsKLQlwcml2YXRlIExpc3QgcGF0aHM7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG9wZW4gPSBmYWxzZTsKLQlwcml2YXRlIGludCBuYk9mT3BlbiA9IDA7Ci0JCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRXJyb3JSZWNvdmVyeUxvZy4KLQkgKi8KLQlwcml2YXRlIEVycm9yUmVjb3ZlcnlMb2coKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBFcnJvclJlY292ZXJ5TG9nIGdldExvZygpIHsKLQkJaWYgKGluc3QgPT0gbnVsbCl7Ci0JCQlpbnN0ID0gbmV3IEVycm9yUmVjb3ZlcnlMb2coKTsKLQkJfQotCQlyZXR1cm4gaW5zdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgYSB1bmlxdWUgaWRlbnRpZmVyIGZvciB0aGUgZmlsZSwgZW5zdXJlIHVuaXF1ZW5lc3MgdXAgdG8gbm93Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKFN0cmluZyBwYXRoKSB7Ci0JCQotCQlpZiAocGF0aD09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQkvLyB2ZXJpZnkgaWYgaXQgd2lsbCBiZSBhIGRpcmVjdG9yeSB3aXRob3V0IGNyZWF0aW5nIHRoZSBmaWxlCi0JCS8vIGFzIGl0IGRvZXNuJ3QgZXhpc3QgeWV0Ci0JCWlmIChwYXRoLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSB8fCBwYXRoLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBwYXRoOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJU3RyaW5nIG5ld05hbWUgPQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihmaWxlLmdldE5hbWUoKSwgbmV3IERhdGUoKSk7Ci0JCXdoaWxlIChuZXcgRmlsZShuZXdOYW1lKS5leGlzdHMoKSkgewotCQkJbmV3TmFtZSA9Ci0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihmaWxlLmdldE5hbWUoKSwgbmV3IERhdGUoKSk7Ci0JCX0KLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksbmV3TmFtZSk7Ci0JCXJldHVybiBuZXdGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIGxvZyBmaWxlIAotCSAqIFdlIGRvIG5vdCBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRSZWNvdmVyeUxvZ0ZpbGUoKSB7Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9Ci0JCQlDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCVVSTCBsb2NhdGlvbiA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IGxvY2F0aW9uLmdldEZpbGUoKTsKLQkJRmlsZSBwbGF0Zm9ybUNvbmZpZ3VyYXRpb24gPSBuZXcgRmlsZShsb2NhdGlvblN0cmluZyk7Ci0JCWlmICghcGxhdGZvcm1Db25maWd1cmF0aW9uLmlzRGlyZWN0b3J5KCkpIHBsYXRmb3JtQ29uZmlndXJhdGlvbiA9IHBsYXRmb3JtQ29uZmlndXJhdGlvbi5nZXRQYXJlbnRGaWxlKCk7Ci0JCXJldHVybiBuZXcgRmlsZShwbGF0Zm9ybUNvbmZpZ3VyYXRpb24sIEVSUk9SX1JFQ09WRVJZX0xPRyk7Ci0JfQotCi0KLQkvKioKLQkgKiBPcGVuIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuKFN0cmluZyBsb2dFbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAob3BlbikgewotCQkJbmJPZk9wZW4rKzsJCQkKLQkJCVVwZGF0ZUNvcmUud2FybigiT3BlbiBuZXN0ZWQgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7CQkJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJRmlsZSBsb2dGaWxlID0gbnVsbDsJCQotCQl0cnkgewotCQkJbG9nRmlsZSA9IGdldFJlY292ZXJ5TG9nRmlsZSgpOwotCQkJb3V0ID0gbmV3IEZpbGVXcml0ZXIobG9nRmlsZSk7Ci0JCQlpbmRleCA9IDA7Ci0JCQlwYXRocz1udWxsOwotCQkJb3Blbj10cnVlOwotCQkJbmJPZk9wZW49MDsKLQkJCVVwZGF0ZUNvcmUud2FybigiU3RhcnQgbmV3IEVycm9yL1JlY292ZXJ5IGxvZyAjIituYk9mT3BlbisiOiIrbG9nRW50cnkpOwkJCQkJCQkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCVBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuVW5hYmxlVG9Mb2ciLCBuZXcgT2JqZWN0W10geyBsb2dGaWxlIH0pLCAvLyROT04tTkxTLTEkCi0JCQkJZSk7Ci0JCX0KLQkJCi0JCWFwcGVuZChsb2dFbnRyeSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgdG8gdGhlIGxvZyBhbmQgZmx1c2gKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmQoU3RyaW5nIGxvZ0VudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9nRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoIW9wZW4pIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkludGVybmFsIEVycm9yOiBUaGUgRXJyb3IvUmVjb3ZlcnkgbG9nIGlzIG5vdCBvcGVuOiIrbG9nRW50cnkpOwkJCQkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoTE9HX0VOVFJZX0tFWSk7Ci0JCQlidWZmZXIuYXBwZW5kKGluZGV4KTsKLQkJCWJ1ZmZlci5hcHBlbmQoIj0iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChsb2dFbnRyeSk7Ci0JCQlidWZmZXIuYXBwZW5kKFJFVFVSTl9DQVJSSUFHRSk7Ci0KLQkJCW91dC53cml0ZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JCQlvdXQuZmx1c2goKTsKLQkJCWluZGV4Kys7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCVBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuVW5hYmxlVG9Mb2ciLCBuZXcgT2JqZWN0W10geyBsb2dGaWxlIH0pLCAvLyROT04tTkxTLTEkCi0JCQkJZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHN0cmluZyB0byB0aGUgbG9nIGFuZCBmbHVzaAotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZFBhdGgoU3RyaW5nIGxvZ0VudHJ5LCBTdHJpbmcgcGF0aCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsb2dFbnRyeSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHBhdGgpOwotCQlhcHBlbmQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkKLQkJYWRkUGF0aChwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbnkgb3BlbiByZWNvdmVyeSBsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZShTdHJpbmcgbG9nRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCWlmIChuYk9mT3Blbj4wKXsKLQkJCVVwZGF0ZUNvcmUud2FybigiQ2xvc2UgbmVzdGVkIEVycm9yL1JlY292ZXJ5IGxvZyAjIituYk9mT3BlbisiOiIrbG9nRW50cnkpOwkJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5iT2ZPcGVuLS07CQkJCi0JCQlyZXR1cm47Ci0JCX0JCQkKLQkJCi0JCVVwZGF0ZUNvcmUud2FybigiQ2xvc2UgRXJyb3IvUmVjb3ZlcnkgbG9nICMiK25iT2ZPcGVuKyI6Iitsb2dFbnRyeSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhcHBlbmQobG9nRW50cnkpOwotCQlpZiAob3V0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3V0LndyaXRlKEVORF9PRl9GSUxFKTsKLQkJCQlvdXQuZmx1c2goKTsKLQkJCQlvdXQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsgLy9lYXQgdGhlIGV4Y2VwdGlvbgotCQkJfSBmaW5hbGx5IHsKLQkJCQlvdXQgPSBudWxsOwotCQkJCW9wZW49ZmFsc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxldGUgdGhlIGZpbGUgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGUoKSB7Ci0JCS8vRmlsZSBsb2dGaWxlID0gZ2V0UmVjb3ZlcnlMb2dGaWxlKCk7Ci0JCWdldFJlY292ZXJ5TG9nRmlsZSgpOwotCQkvL2lmIChsb2dGaWxlLmV4aXN0cygpKQotCQkJLy9sb2dGaWxlLmRlbGV0ZSgpOwkKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUGF0aChTdHJpbmcgcGF0aCl7Ci0JCWlmIChwYXRocz09bnVsbCkgcGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXBhdGhzLmFkZChwYXRoKTsKLQl9Ci0JCi0JLyoqIAotCSAqIHJlY292ZXIgYW4gaW5zdGFsbCBvciByZW1vdmUgdGhhdCBkaWRuJ3QgZmluaXNoCi0JICogRGVsZXRlIGZpbGUgZm9yIGFuIHVuZmluaXNoZWQgZGVsZXRlCi0JICogRGVsZXRlIGZpbGUgZm9yIGFuIHVuZmluc2hlZCBpbnN0YWxsIGlmIG5vdCBhbGwgdGhlIGZpbGVzIHdlcmUgaW5zdGFsbGVkCi0JICogUmVuYW1lIFhNTCBmaWxlcyBmb3IgYW4gaW5zdGFsbCBpZiBhbGwgdGhlIGZpbGVzIHdlcmUgaW5zdGFsbGVkIGJ1dCBub3QgcmVuYW1lZAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJlY292ZXIoKXsKLQkJCi0JCUlTdGF0dXMgbWFpblN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLnJlY292ZXJpbmdTdGF0dXMiKSxudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhtYWluU3RhdHVzLmdldFBsdWdpbigpLG1haW5TdGF0dXMuZ2V0Q29kZSgpLG1haW5TdGF0dXMuZ2V0TWVzc2FnZSgpLG51bGwpOwotCi0JCS8vY2hlY2sgaWYgcmVjb3ZlcnkgaXMgb24KLQkJaWYgKCFSRUNPVkVSWV9PTil7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlJlY292ZXJpbmcgaXMgdHVybmVkIG9mZi4gQWJvcnQgcmVjb3ZlcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0JCQotCQlGaWxlIGxvZ0ZpbGUgPSBnZXRSZWNvdmVyeUxvZ0ZpbGUoKTsKLQkJaWYgKCFsb2dGaWxlLmV4aXN0cygpKXsKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5jYW5ub3RGaW5kTG9nRmlsZSIpK2xvZ0ZpbGUsbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbXVsdGk7Ci0JCX0KLQkJCi0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJUHJvcGVydGllcyBwcm9wID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShsb2dGaWxlKTsKLQkJCXByb3AgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcC5sb2FkKGluKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZWFkOiIrbG9nRmlsZSxlKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLm5vUHJvcGVydHlGaWxlIikrbG9nRmlsZSxlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBtdWx0aTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyBlb2YgPSBwcm9wLmdldFByb3BlcnR5KCJlb2YiKTsgLy8kTk9OLU5MUy0xJAotCQlpZihlb2YhPW51bGwgJiYgZW9mLmVxdWFscygiZW9mIikpeyAvLyROT04tTkxTLTEkCi0JCQkvLyBhbGwgaXMgZ29vZAotCQkJZGVsZXRlKCk7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkZvdW5kIGxvZyBmaWxlLiBMb2cgZmlsZSBjb250YWlucyBlbmQtb2YtZmlsZS4gTm8gbmVlZCB0byBwcm9jZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSyxudWxsLG51bGwpKTsKLQkJCXJldHVybiBtdWx0aTsKLQkJfQotCQkKLQkJU3RyaW5nIHJlY292ZXJ5ID0gcHJvcC5nZXRQcm9wZXJ0eShMT0dfRU5UUllfS0VZKyIwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlY292ZXJ5PT1udWxsKXsKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5ub0xvZ0VudHJ5IikrbG9nRmlsZSxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBtdWx0aTsJCQkKLQkJfQotCQotCQlpZihyZWNvdmVyeS5lcXVhbHNJZ25vcmVDYXNlKFNUQVJUX0lOU1RBTExfTE9HKSl7Ci0JCQltdWx0aS5hZGRBbGwocHJvY2Vzc1JlY292ZXJJbnN0YWxsKHByb3ApKTsKLQkJCXJldHVybiBtdWx0aTsKLQkJfQotCQkKLQkJaWYocmVjb3ZlcnkuZXF1YWxzSWdub3JlQ2FzZShTVEFSVF9SRU1PVkVfTE9HKSl7Ci0JCQltdWx0aS5hZGRBbGwocHJvY2Vzc1JlY292ZXJSZW1vdmUocHJvcCkpOwotCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0KLQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLm5vUmVjb3ZlcnlUb0V4ZWN1dGUiKStsb2dGaWxlLG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbXVsdGk7CQotCX0KLQkKLQkvKgotCSAqIGNyZWF0ZXMgYSBTdGF0dXMKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNTZXZlcml0eSwgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpewotCQlTdHJpbmcgaWQgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkKLQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1zZyE9bnVsbCkKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChtc2cpOwotCQlpZiAoZSE9bnVsbCl7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIlxyXG5bIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChlLnRvU3RyaW5nKCkpOwotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKCJdXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc3RhdHVzU2V2ZXJpdHksIGlkLCBJU3RhdHVzLk9LLCBjb21wbGV0ZVN0cmluZy50b1N0cmluZygpLCBlKTsKLQl9CQotCQotCS8qCi0JICogCi0JICovCi0JIHByaXZhdGUgSVN0YXR1cyBwcm9jZXNzUmVjb3Zlckluc3RhbGwoUHJvcGVydGllcyBwcm9wKXsKLQkgCQotCQlJU3RhdHVzIG1haW5TdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywiIixudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhtYWluU3RhdHVzLmdldFBsdWdpbigpLG1haW5TdGF0dXMuZ2V0Q29kZSgpLCIiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JIAkKLQkgCUNvbGxlY3Rpb24gdmFsdWVzID0gcHJvcC52YWx1ZXMoKTsKLQkgCQotCSAJaWYodmFsdWVzLmNvbnRhaW5zKEVORF9JTlNUQUxMX0xPRykpewotCQkJLy8gYWxsIGlzIGdvb2QKLQkJCWRlbGV0ZSgpOwotCQkJVXBkYXRlQ29yZS53YXJuKCJGb3VuZCBsb2cgZmlsZS4gTG9nIGZpbGUgY29udGFpbnMgRU5EX0lOU1RBTExfTE9HLiBObyBuZWVkIHRvIHByb2Nlc3MgcmVuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSyxudWxsLG51bGwpKTsKLQkJCXJldHVybiBtdWx0aTsKLQkgCX0KLQkgCQotCSAJaWYgKHZhbHVlcy5jb250YWlucyhBTExfSU5TVEFMTEVEKSAmJiAhZm9yY2VSZW1vdmUpewotCSAJCS8vIGZpbmlzaCBpbnN0YWxsIGJ5IHJlbmFtaW5nCi0JIAkJaW50IGluZGV4ID0gMDsKLQkgCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JIAkJU3RyaW5nIHZhbCA9IHByb3AuZ2V0UHJvcGVydHkoTE9HX0VOVFJZX0tFWStpbmRleCk7Ci0JIAkJd2hpbGUodmFsIT1udWxsICYmICFmb3VuZCl7Ci0JIAkJCWlmKHZhbC5lcXVhbHNJZ25vcmVDYXNlKEFMTF9JTlNUQUxMRUQpKSBmb3VuZCA9IHRydWU7Ci0JIAkJCUlTdGF0dXMgcmVuYW1lU3RhdHVzID0gcHJvY2Vzc1JlbmFtZSh2YWwpOwotCSAJCQlVcGRhdGVDb3JlLmxvZyhyZW5hbWVTdGF0dXMpOwotCSAJCQlpZihyZW5hbWVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9SVN0YXR1cy5PSyl7Ci0JIAkJCQltdWx0aS5hZGQocmVuYW1lU3RhdHVzKTsKLQkgCQkJfQotCSAJCQlpbmRleCsrOwotCSAJCQl2YWwgPSBwcm9wLmdldFByb3BlcnR5KExPR19FTlRSWV9LRVkraW5kZXgpOwkgCQkJCi0JIAkJfQotCSAJCWlmICh2YWw9PW51bGwpewotCSAJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIHZhbHVlIGZvciA6IitMT0dfRU5UUllfS0VZK2luZGV4KTsgLy8kTk9OLU5MUy0xJAotCSAJCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cud3JvbmdMb2dGaWxlIikrTE9HX0VOVFJZX0tFWStpbmRleCxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbXVsdGk7Ci0JIAkJfQotCSAJCS8vIHByb2Nlc3MgcmVjb3ZlcnkgZmluaXNoZWQKLQkgCQlkZWxldGUoKTsKLQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgbG9nIGZpbGUuIFN1Y2Nlc3NmdWxseSByZWNvdmVyZWQgYnkgcmVuYW1pbmcuIEZlYXR1cmUgaXMgaW5zdGFsbGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssbnVsbCxudWxsKSk7Ci0JIAl9IGVsc2UgewotCSAJCS8vIHJlbW92ZSBhbGwgYmVjYXVzZSBpbnN0YWxsIGRpZCBub3QgbGF5IG91dCBhbGwgdGhlIGZpbGVzCi0JIAkJLy8gb3IgcmVjb3ZlcnkgaXMgbm90IGFsbG93ZWQKLQkgCQlpbnQgaW5kZXggPSAwOwotCSAJCVN0cmluZyB2YWwgPSBwcm9wLmdldFByb3BlcnR5KExPR19FTlRSWV9LRVkraW5kZXgpOwotCSAJCXdoaWxlKHZhbCE9bnVsbCl7Ci0JIAkJCUlTdGF0dXMgcmVtb3ZlU3RhdHVzID0gcHJvY2Vzc1JlbW92ZSh2YWwpOwotCSAJCQlVcGRhdGVDb3JlLmxvZyhyZW1vdmVTdGF0dXMpOwotCSAJCQlpZihyZW1vdmVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9SVN0YXR1cy5PSyl7Ci0JIAkJCQltdWx0aS5hZGRBbGwocmVtb3ZlU3RhdHVzKTsKLQkgCQkJfQotCSAJCQlpbmRleCsrOwotCSAJCQl2YWwgPSBwcm9wLmdldFByb3BlcnR5KExPR19FTlRSWV9LRVkraW5kZXgpOwkgCQkJCi0JIAkJfQotCSAJCS8vIHByb2Nlc3MgcmVjb3ZlcnkgZmluaXNoZWQKLQkgCQlkZWxldGUoKTsKLQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgbG9nIGZpbGUuIFN1Y2Nlc3NmdWxseSByZWNvdmVyZWQgYnkgcmVtb3ZpbmcuIEZlYXR1cmUgaXMgcmVtb3ZlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLG51bGwsbnVsbCkpOwotCSAJfQotCSAJcmV0dXJuIG11bHRpOwotCSB9Ci0JIAotCSAvKgotCSAgKiAKLQkgICovCi0JICBwcml2YXRlIElTdGF0dXMgcHJvY2Vzc1JlbmFtZShTdHJpbmcgdmFsKXsKLQkgIAkKLQkJLy8gZ2V0IHRoZSBwYXRoCi0JCWludCBpbmRleCA9IC0xOwotCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBudWxsOwotCSAgCWlmICh2YWwuc3RhcnRzV2l0aChQTFVHSU5fRU5UUlkpKXsKLQkgIAkJaW5kZXggPSBQTFVHSU5fRU5UUlkubGVuZ3RoKCk7Ci0JICAJCW5ld0ZpbGVOYW1lPSAicGx1Z2luLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkgIAl9IGVsc2UgaWYgKHZhbC5zdGFydHNXaXRoKEJVTkRMRV9NQU5JRkVTVF9FTlRSWSkpewotCSAgCQlpbmRleCA9IEJVTkRMRV9NQU5JRkVTVF9FTlRSWS5sZW5ndGgoKTsKLQkgIAkJbmV3RmlsZU5hbWU9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQkgIAl9ZWxzZSBpZiAodmFsLnN0YXJ0c1dpdGgoRlJBR01FTlRfRU5UUlkpKXsKLQkgIAkJaW5kZXggPSBGUkFHTUVOVF9FTlRSWS5sZW5ndGgoKTsKLQkgIAkJbmV3RmlsZU5hbWU9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JICAJfSBlbHNlIGlmICh2YWwuc3RhcnRzV2l0aChGRUFUVVJFX0VOVFJZKSl7Ci0JICAJCWluZGV4ID0gRkVBVFVSRV9FTlRSWS5sZW5ndGgoKTsKLQkgIAkJbmV3RmlsZU5hbWU9ICJmZWF0dXJlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQkgIAl9IGVsc2UgaWYgKHZhbC5zdGFydHNXaXRoKEJVTkRMRV9KQVJfRU5UUlkpKXsKLQkgIAkJaW5kZXggPSBCVU5ETEVfSkFSX0VOVFJZLmxlbmd0aCgpOwotCSAgCX0KLQkgIAkKLQkgIAlpZiAoaW5kZXg9PS0xKXsKLQkgIAkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLm5vQWN0aW9uIikrdmFsLG51bGwpOyAvLyROT04tTkxTLTEkCi0JICAJfQotCSAgCQotCSAgCVN0cmluZyBvbGROYW1lID0gdmFsLnN1YnN0cmluZyhpbmRleCsxKTsKLQkgIAkvLyBvbGRuYW1lIGlzIGNvbS5waWQvcGx1Z2luIyMjIyMueG1sCi0JICAJLy8gb3Igb2xkbmFtZSBpcyBjb20ucGlkL3BpZF9wdmVyLmphciMjIyMjIy50bXAKLQkgIAlGaWxlIG9sZEZpbGUgPSBuZXcgRmlsZShvbGROYW1lKTsKLQkgIAlGaWxlIG5ld0ZpbGU7Ci0JICAJaWYodmFsLnN0YXJ0c1dpdGgoQlVORExFX0pBUl9FTlRSWSkpewotCSAgCQluZXdGaWxlID0gbmV3IEZpbGUob2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcoMCwgb2xkRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sYXN0SW5kZXhPZigiLmphciIpKyIuamFyIi5sZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgIAl9ZWxzZXsKLQkgIAkJbmV3RmlsZSA9IG5ldyBGaWxlKG9sZEZpbGUuZ2V0UGFyZW50RmlsZSgpLG5ld0ZpbGVOYW1lKTsKLQkgIAl9Ci0JICAJaWYgKCFvbGRGaWxlLmV4aXN0cygpKXsKLQkgIAkJaWYgKG5ld0ZpbGUuZXhpc3RzKCkpewotCSAgCQkJLy8gb2sgdGhlIGZpbGUgaGFzIGJlZW4gcmVuYW1lZCBhcHBhcmVudGx5Ci0JCQkgIAlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cuZmlsZUFscmVhZHlSZW5hbWVkIikrbmV3RmlsZSxudWxsKTsJICAJCQkJIC8vJE5PTi1OTFMtMSQKLQkgIAkJfSBlbHNlIHsKLQkgIAkJCS8vIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QsIGxvZyBhcyBwcm9ibGVtLCBhbmQgZm9yY2UgdGhlIHJlbW92YWwgb2YgdGhlIGZlYXR1cmUKLQkJICAJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5jYW5ub3RGaW5kRmlsZSIpK29sZEZpbGUsbnVsbCk7CSAgCQkJIC8vJE5PTi1OTFMtMSQKLQkgIAkJfQotCSAgCX0gCQotCSAgCQotCQlib29sZWFuIHN1Y2VzcyA9IGZhbHNlOwotCQlpZiAobmV3RmlsZS5leGlzdHMoKSkgewotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ld0ZpbGUpOwotCQkJVXBkYXRlQ29yZS53YXJuKCJSZW1vdmluZyBhbHJlYWR5IGV4aXN0aW5nIGZpbGU6IituZXdGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXN1Y2VzcyA9IG9sZEZpbGUucmVuYW1lVG8obmV3RmlsZSk7Ci0JCQkKLQkJaWYoIXN1Y2Vzcyl7Ci0JCQlTdHJpbmcgbXNnID0oUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cub2xkVG9OZXciKStvbGRGaWxlK25ld0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsbXNnLG51bGwpOwotCQl9Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSyxQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5yZW5hbWVkIikrb2xkRmlsZStQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy50byIpK25ld0ZpbGUsbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCSAgfQotCSAgCi0JIC8qCi0JICAqIAotCSAgKi8KLQkgIHByaXZhdGUgSVN0YXR1cyBwcm9jZXNzUmVtb3ZlKFN0cmluZyB2YWwpewotCSAgCQotCQlJU3RhdHVzIG1haW5TdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywiIixudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhtYWluU3RhdHVzLmdldFBsdWdpbigpLG1haW5TdGF0dXMuZ2V0Q29kZSgpLCIiLG51bGwpOwkgIAkgLy8kTk9OLU5MUy0xJAotCSAgCQotCQkvLyBnZXQgdGhlIHBhdGgKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWlmICh2YWwuc3RhcnRzV2l0aChCVU5ETEVfSkFSX0VOVFJZKSl7Ci0JICAJCWluZGV4ID0gQlVORExFX0pBUl9FTlRSWS5sZW5ndGgoKTsKLQkgIAl9Ci0JICAJCi0JICAJaWYgKGluZGV4PT0tMSl7Ci0JICAJCXJldHVybiBjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixQb2xpY3kuYmluZCgiRXJyb3JSZWNvdmVyeUxvZy5ub0FjdGlvbiIpK3ZhbCxudWxsKTsgLy8kTk9OLU5MUy0xJAotCSAgCX0KLQkgIAkKLQkgIAlTdHJpbmcgb2xkTmFtZSA9IHZhbC5zdWJzdHJpbmcoaW5kZXgrMSk7Ci0JICAJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUob2xkTmFtZSk7Ci0JICAJaWYgKCFvbGRGaWxlLmV4aXN0cygpKXsKLSAgCQkJLy8gdGhlIGphciBvciBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgbG9nIGFzIHByb2JsZW0sIGFuZCBmb3JjZSB0aGUgcmVtb3ZhbCBvZiB0aGUgZmVhdHVyZQotCSAgCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cuY2Fubm90RmluZEZpbGUiKStvbGRGaWxlLG51bGwpKTsJICAJCQkgLy8kTk9OLU5MUy0xJAotCSAgCQlyZXR1cm4gbXVsdGk7Ci0JICAJfSAJCSAgCQotCQltdWx0aS5hZGRBbGwocmVtb3ZlRnJvbUZpbGVTeXN0ZW0ob2xkRmlsZSkpOwotCi0JCXJldHVybiBtdWx0aTsKLQkgIH0JCi0JICAKLQkvKioKLQkgKiByZXR1cm4gYSBtdWx0aSBzdGF0dXMsIAotCSAqIHRoZSBjaGlsZHJlbiBhcmUgdGhlIGZpbGUgdGhhdCBjb3VsZG4ndCBiZSByZW1vdmVkCi0JICovCi0JcHVibGljIElTdGF0dXMgcmVtb3ZlRnJvbUZpbGVTeXN0ZW0oRmlsZSBmaWxlKSB7Ci0JCQotCQlJU3RhdHVzIG1haW5TdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywiIixudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlNdWx0aVN0YXR1cyBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhtYWluU3RhdHVzLmdldFBsdWdpbigpLG1haW5TdGF0dXMuZ2V0Q29kZSgpLCIiLG51bGwpOwkJIC8vJE5PTi1OTFMtMSQKLQkJCi0JCWlmICghZmlsZS5leGlzdHMoKSl7Ci0JCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cubm9GaWxldG9SZW1vdmUiKStmaWxlLG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG11bHRpOwotCQl9Ci0JCQkKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsKLQkJCWlmIChmaWxlcyAhPSBudWxsKSAvLyBiZSBjYXJlZnVsIHNpbmNlIGZpbGUubGlzdCgpIGNhbiByZXR1cm4gbnVsbAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpewotCQkJCQltdWx0aS5hZGRBbGwocmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmlsZSwgZmlsZXNbaV0pKSk7Ci0JCQkJfQotCQl9Ci0JCQotCQlpZiAoIWZpbGUuZGVsZXRlKCkpIHsKLQkJCVN0cmluZyBtc2cgPSAiVW5hYmxlIHRvIHJlbW92ZSBmaWxlIiArZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsgLy8kTk9OLU5MUy0xJCAKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUixtc2csbnVsbCkpOwotCQl9Ci0JCXJldHVybiBtdWx0aTsKLQl9CQotCQotCS8qCi0JICogCi0JICovCi0JIHByaXZhdGUgSVN0YXR1cyBwcm9jZXNzUmVjb3ZlclJlbW92ZShQcm9wZXJ0aWVzIHByb3ApewotCSAJCi0JCUlTdGF0dXMgbWFpblN0YXR1cyA9IGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCIiLG51bGwpOyAvLyROT04tTkxTLTEkCi0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKG1haW5TdGF0dXMuZ2V0UGx1Z2luKCksbWFpblN0YXR1cy5nZXRDb2RlKCksIiIsbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkgCQotCSAJQ29sbGVjdGlvbiB2YWx1ZXMgPSBwcm9wLnZhbHVlcygpOwotCSAJCi0JIAlpZih2YWx1ZXMuY29udGFpbnMoRU5EX1JFTU9WRV9MT0cpKXsKLQkJCS8vIGFsbCBpcyBnb29kCi0JCQlkZWxldGUoKTsKLQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgbG9nIGZpbGUuIExvZyBmaWxlIGNvbnRhaW5zIEVORF9SRU1PVkVfTE9HLiBObyBuZWVkIHRvIHByb2Nlc3MgcmVuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSyxudWxsLG51bGwpKTsKLQkJCXJldHVybiBtdWx0aTsKLQkgCX0KLQkgCQotCSAJaWYgKCF2YWx1ZXMuY29udGFpbnMoRU5EX0FCT1VUX1JFTU9WRSkpewotCSAJCS8vIGZpbmlzaCBpbnN0YWxsIGJ5IHJlbmFtaW5nCi0gCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLFBvbGljeS5iaW5kKCJFcnJvclJlY292ZXJ5TG9nLnJlbW92ZUZlYXR1cmUiKSxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbXVsdGk7Ci0JIAl9IGVsc2UgewotCSAJCS8vIGZpbmlzaCBpbnN0YWxsIGJ5IHJlbmFtaW5nCi0JIAkJaW50IGluZGV4ID0gMDsKLQkgCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JIAkJU3RyaW5nIHZhbCA9IHByb3AuZ2V0UHJvcGVydHkoTE9HX0VOVFJZX0tFWStpbmRleCk7Ci0JIAkJd2hpbGUodmFsIT1udWxsICYmICFmb3VuZCl7Ci0JIAkJCWlmKHZhbC5lcXVhbHNJZ25vcmVDYXNlKEVORF9BQk9VVF9SRU1PVkUpKSBmb3VuZCA9IHRydWU7Ci0JIAkJCUlTdGF0dXMgcmVuYW1lU3RhdHVzID0gcHJvY2Vzc1JlbW92ZSh2YWwpOwotCSAJCQlVcGRhdGVDb3JlLmxvZyhyZW5hbWVTdGF0dXMpOwotCSAJCQlpZihyZW5hbWVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSE9SVN0YXR1cy5PSyl7Ci0JIAkJCQltdWx0aS5hZGQocmVuYW1lU3RhdHVzKTsKLQkgCQkJfQotCSAJCQlpbmRleCsrOwotCSAJCQl2YWwgPSBwcm9wLmdldFByb3BlcnR5KExPR19FTlRSWV9LRVkraW5kZXgpOwkgCQkJCi0JIAkJfQotCSAJCWlmICh2YWw9PW51bGwpewotCSAJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIHZhbHVlIGZvciA6IitMT0dfRU5UUllfS0VZK2luZGV4KTsgLy8kTk9OLU5MUy0xJAotCSAJCQltdWx0aS5hZGQoY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsUG9saWN5LmJpbmQoIkVycm9yUmVjb3ZlcnlMb2cud3JvbmdMb2dGaWxlIikrTE9HX0VOVFJZX0tFWStpbmRleCxudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbXVsdGk7Ci0JIAkJfQotCSAJCS8vIHByb2Nlc3MgcmVjb3ZlcnkgZmluaXNoZWQKLQkgCQlkZWxldGUoKTsKLQkJCVVwZGF0ZUNvcmUud2FybigiRm91bmQgbG9nIGZpbGUuIFN1Y2Nlc3NmdWxseSByZWNvdmVyZWQgYnkgZGVsZXRpbmcuIEZlYXR1cmUgaXMgcmVtb3ZlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLG51bGwsbnVsbCkpOwotCSAJfQotCSAJcmV0dXJuIG11bHRpOwotCSB9CSAgICAKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhODlmMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcgotICogPC9wPgotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlQ29udGVudENvbnN1bWVyIGV4dGVuZHMgTW9kZWxPYmplY3QKLQlpbXBsZW1lbnRzIElGZWF0dXJlQ29udGVudENvbnN1bWVyIHsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRG93bmxvYWRFeGNlcHRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOGY2NzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRG93bmxvYWRFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBFeGNlcHRpb24gdGhyb3duIHdoZW4gSU9FeGNlcHRpb24gZHVyaW5nIGRvd25sb2FkaW5nIGZlYXR1cmVzCi0gKiAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCS8qKgotCSAqIENvbnN0cnVjdCB0aGUgZXhjZXB0aW9uIGluZGljYXRpbmcgZW5jbG9zaW5nIENvcmVFeGNlcHRpb24KLQkgKiAKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHVibGljIEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbihTdHJpbmcgbXNnLCBFeGNlcHRpb24gZSkgewotCQlzdXBlcigKLQkJCW5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5JTkZPLAotCQkJCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RhdHVzLk9LLAotCQkJCW1zZywKLQkJCQllKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDE1NDAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLQ0KLSANCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIENvbnRlbnRDb25zdW1lciBJbXBsZW1lbnRhdGlvbiBmb3IgYSBGZWF0dXJlRXhlY3V0YWJsZQ0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRDb25zdW1lciBleHRlbmRzIEZlYXR1cmVDb250ZW50Q29uc3VtZXIgew0KLQ0KLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7DQotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQ9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gYWJvcnRlZD0gZmFsc2U7CQ0KLQlwcml2YXRlIElTaXRlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsNCi0JcHJpdmF0ZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBwYXJlbnQgPSBudWxsOw0KLQlwcml2YXRlIExpc3QgLyogb2YgSUZlYXR1cmVDb250ZW50Q09uc3VtZXIgKi8gY2hpbGRyZW47DQotDQotCS8qDQotCSAqIEBzZWUgSUNvbnRlbnRDb25zdW1lciNvcGVuKElOb25QbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5KQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJQ29udGVudENvbnN1bWVyIGNvbnMgPSBuZXcgTm9uUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIoDQotCQkJZ2V0Q29udGVudENvbnN1bWVyKCkub3Blbihub25QbHVnaW5FbnRyeSkpOw0KLQkJcmV0dXJuIGNvbnM7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJQ29udGVudENvbnN1bWVyI29wZW4oSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUNvbnRlbnRDb25zdW1lciBjb25zID0gbmV3IFBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyKGdldENvbnRlbnRDb25zdW1lcigpLm9wZW4ocGx1Z2luRW50cnkpKTsNCi0JCXJldHVybiBjb25zOwkJDQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJQ29udGVudENvbnN1bWVyI2FkZENoaWxkKElGZWF0dXJlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQ2hpbGQoSUZlYXR1cmUgY2hpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlGZWF0dXJlQ29udGVudENvbnN1bWVyIGNoaWxkQ29uc3VtZXIgPSBjaGlsZC5nZXRGZWF0dXJlQ29udGVudENvbnN1bWVyKCk7DQotCQljaGlsZENvbnN1bWVyLnNldFBhcmVudCh0aGlzKTsNCi0JCWlmIChjaGlsZHJlbj09bnVsbCkgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7DQotCQljaGlsZHJlbi5hZGQoY2hpbGRDb25zdW1lcik7DQotCQlyZXR1cm47DQotCX0NCi0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlnZXRDb250ZW50Q29uc3VtZXIoKS5zdG9yZShjb250ZW50UmVmZXJlbmNlLCBtb25pdG9yKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2Nsb3NlKCkNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQ0KLQkJaWYgKCFjbG9zZWQgJiYgZ2V0UGFyZW50KCkhPW51bGwpew0KLQkJCWNsb3NlZD10cnVlOw0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQkJDQotCQkvLyBwYXJlbnQgY29uc3VtZXIsIGxvZyB3ZSBhcmUgYWJvdXQgdG8gcmVuYW1lDQotCQkvLyBsb2cgZmlsZXMgaGF2ZSBiZWVuIGRvd25sb2FkZWQNCi0JCWlmIChnZXRQYXJlbnQoKT09bnVsbCl7DQotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmQoRXJyb3JSZWNvdmVyeUxvZy5BTExfSU5TVEFMTEVEKTsNCi0JCX0NCi0JCQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmPSBudWxsOw0KLQkJaWYgKGNvbnRlbnRDb25zdW1lciAhPSBudWxsKQ0KLQkJCXJlZiA9IGNvbnRlbnRDb25zdW1lci5jbG9zZSgpOw0KLQkJDQotCQkvLyBjbG9zZSBuZXN0ZWQgZmVhdHVyZQ0KLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJY2hpbGRyZW5baV0uY2xvc2UoKTsNCi0JCX0NCi0JCQkJCQkJDQotCQlyZXR1cm4gcmVmOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjc2V0RmVhdHVyZShJRmVhdHVyZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJdGhpcy5mZWF0dXJlPSBmZWF0dXJlOw0KLQl9DQotDQotCS8qDQotCSAqIFNldHMgdGhlIHBhcmVudCANCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFBhcmVudChJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBmZWF0dXJlQ29udGVudENvbnN1bWVyKSB7DQotCQl0aGlzLnBhcmVudD0gZmVhdHVyZUNvbnRlbnRDb25zdW1lcjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm5zIHRoZSBDb250ZW50IENvbnN1bWVyIGZvciB0aGUgZmVhdHVyZQ0KLQkgKiANCi0JICogUmlnaHQgbm93IHdlIGFyZSB0aGUgb25seSBvbmUgdG8gaW1wbGVtZW50IFNpdGVDb250ZW50Q29uc3VtZXINCi0JICogTmVlZCB0byBiZSBleHBvc2VkIGFzIEFQSSBwb3N0IHYyLjANCi0JICovDQotCXByaXZhdGUgSVNpdGVDb250ZW50Q29uc3VtZXIgZ2V0Q29udGVudENvbnN1bWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKGNvbnRlbnRDb25zdW1lciA9PSBudWxsKQ0KLQkJCWlmIChmZWF0dXJlLmdldFNpdGUoKSBpbnN0YW5jZW9mIFNpdGVGaWxlKSB7DQotCQkJCVNpdGVGaWxlIHNpdGU9IChTaXRlRmlsZSkgZmVhdHVyZS5nZXRTaXRlKCk7DQotCQkJCWNvbnRlbnRDb25zdW1lcj0gc2l0ZS5jcmVhdGVTaXRlQ29udGVudENvbnN1bWVyKGZlYXR1cmUpOw0KLQkJCX0gZWxzZSB7DQotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOw0KLQkJCX0NCi0JCXJldHVybiBjb250ZW50Q29uc3VtZXI7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNhYm9ydCgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChhYm9ydGVkKSByZXR1cm47DQotCQkNCi0JCUlGZWF0dXJlQ29udGVudENvbnN1bWVyW10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCXRyeSB7DQotCQkJY2hpbGRyZW5baV0uYWJvcnQoKTsNCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7DQotCQkJCS8vZG8gTm90aGluZw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGRvIG5vdCBjbG9zZSBwbHVnaW4gYW5kIG5vbiBwbHVnaW4gY29udGVudCBjb25zdW1lcg0KLQkJLy8gdGhlIGNvbnRlbnRDb25zdW1lciB3aWxsIGFib3J0IHRoZW0NCi0JCS8vIHdlIGRvIG5vdCBuZWVkIHRvIGFib3J0IHRoZSBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciBhbmQgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZQ0KLQ0KLQkJLy9pbXBsZW1lbnQgdGhlIGNsZWFudXANCi0JCWlmIChjb250ZW50Q29uc3VtZXIhPW51bGwpDQotCQkJY29udGVudENvbnN1bWVyLmFib3J0KCk7DQotCQkNCi0JCWFib3J0ZWQgPSB0cnVlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50Q29uc3VtZXIjZ2V0RmVhdHVyZSgpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpew0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciNnZXRQYXJlbnQoKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldFBhcmVudCgpew0KLQkJcmV0dXJuIHBhcmVudDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudENvbnN1bWVyI2dldENoaWxkcmVuKCkNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lcltdIGdldENoaWxkcmVuKCl7DQotCQlpZiAoY2hpbGRyZW49PW51bGwgfHwgY2hpbGRyZW4uc2l6ZSgpID09IDApDQotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZUNvbnRlbnRDb25zdW1lclswXTsNCi0NCi0JCXJldHVybiAoSUZlYXR1cmVDb250ZW50Q29uc3VtZXJbXSkgY2hpbGRyZW4udG9BcnJheShhcnJheVR5cGVGb3IoY2hpbGRyZW4pKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjYzMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGEgRXhlY3V0YWJsZSBGZWF0dXJlIENvbnRlbnQgUHJvdmlkZXINCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JLyoNCi0JICogQ29uc3RydWN0b3IgDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIoVVJMIHVybCkgew0KLQkJc3VwZXIodXJsKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBSZXR1cm4gdGhlIHBhdGggZm9yIGEgcGx1Z2luRW50cnkNCi0JICovDQotCXByaXZhdGUgU3RyaW5nIGdldFBhdGgoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KQ0KLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBBcmNoaXZlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgcGx1Z2luIGVudHJ5DQotCQlJU2l0ZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGdldEZlYXR1cmUoKS5nZXRTaXRlKCkuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpOw0KLQkJVVJMIGZpbGVVUkwgPSBwcm92aWRlci5nZXRBcmNoaXZlUmVmZXJlbmNlKGdldFBhdGhJRChwbHVnaW5FbnRyeSkpOw0KLQkJU3RyaW5nIHJlc3VsdCA9IGZpbGVVUkwuZ2V0RmlsZSgpOw0KLQ0KLQkJaWYgKCFyZXN1bHQuZW5kc1dpdGgoIi5qYXIiKSAmJiAhcmVzdWx0LmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgLy8kTk9OLU5MUy0xJA0KLQkJCXJlc3VsdCArPSBGaWxlLnNlcGFyYXRvcjsNCi0JCUZpbGUgcGx1Z2luUGF0aCA9IG5ldyBGaWxlKHJlc3VsdCk7DQotCQlpZiAoIXBsdWdpblBhdGguZXhpc3RzKCkpDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuRmlsZURvZXNOb3RFeGlzdCIsIHJlc3VsdCkpOwkvLyROT04tTkxTLTEkDQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIFJldHVybnMgdGhlIHBhdGggZm9yIHRoZSBGZWF0dXJlDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyBnZXRGZWF0dXJlUGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0RmVhdHVyZSgpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0NCi0JCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMNCi0JCWlmICghKHJlc3VsdC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikgfHwgcmVzdWx0LmVuZHNXaXRoKCIvIikpKSAvLyROT04tTkxTLTEkDQotCQkJcmVzdWx0ICs9IEZpbGUuc2VwYXJhdG9yOw0KLQkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShyZXN1bHQpOw0KLQkJaWYgKCFwbHVnaW5EaXIuZXhpc3RzKCkpDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuRmlsZURvZXNOb3RFeGlzdCIsIHJlc3VsdCkpOyAvLyROT04tTkxTLTEkDQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIFJldHVybnMgYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgZGlyZWN0b3J5DQotCSAqIFJlY3Vyc2l2ZSBjYWxsDQotCSAqLw0KLQlwcml2YXRlIExpc3QgZ2V0RmlsZXMoRmlsZSBkaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JCWlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQlTdHJpbmcgbXNnID0NCi0JCQkJUG9saWN5LmJpbmQoDQotCQkJCQkiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuSW52YWxpZERpcmVjdG9yeSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCWRpci5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotDQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKG1zZyk7DQotDQotCQl9DQotDQotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7DQotCQlpZiAoZmlsZXMgIT0gbnVsbCkNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7DQotCQkJCWlmIChmaWxlc1tpXS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQlyZXN1bHQuYWRkQWxsKGdldEZpbGVzKGZpbGVzW2ldKSk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXN1bHQuYWRkKGZpbGVzW2ldKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRWZXJpZmllcigpDQotCSAqLw0KLQlwdWJsaWMgSVZlcmlmaWVyIGdldFZlcmlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250ZW50UmVmZXJlbmNlIHJlc3VsdCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlKEZlYXR1cmUuRkVBVFVSRV9YTUwsIG5ldyBVUkwoZ2V0VVJMKCksIEZlYXR1cmUuRkVBVFVSRV9YTUwpKTsNCi0NCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJIkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvQ3JlYXRlVVJMRm9yIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSArICIgIiArIEZlYXR1cmUuRkVBVFVSRV9YTUwpLCAvLyROT04tTkxTLTEkDQotCQkJCWUpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCS8vIGV4ZWN1dGFibGUgZmVhdHVyZSBkb2VzIG5vdCBjb250YWluIGFyY2hpdmVzDQotCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygNCi0JCUlQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07DQotCQlTdHJpbmcgYXJjaGl2ZUlEID0gZ2V0UGF0aElEKHBsdWdpbkVudHJ5KTsNCi0JCXRyeSB7DQotCQkJRmlsZSBhcmNoaXZlRmlsZSA9IG5ldyBGaWxlKGdldFBhdGgocGx1Z2luRW50cnkpKTsNCi0JCQlpZighYXJjaGl2ZUZpbGUuaXNEaXJlY3RvcnkoKSAmJiBhcmNoaXZlRmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSl7IC8vJE5PTi1OTFMtMSQNCi0JCQkJcmVzdWx0WzBdID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlELCBhcmNoaXZlRmlsZSk7CQkJCQ0KLQkJCX0gZWxzZSB7DQotCQkJCXJlc3VsdFswXSA9DQotCQkJCQluZXcgQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIGFyY2hpdmVGaWxlKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCQlQb2xpY3kuYmluZCgNCi0JCQkJCQkiRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZVBsdWdpbkVudHJ5IiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSwNCi0JCQkJCWUpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKA0KLQkJSU5vblBsdWdpbkVudHJ5IG5vblBsdWdpbkVudHJ5LA0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsNCi0JCVVSTCBmaWxlVVJMOw0KLQ0KLQkJLy90cnkgew0KLQkJLy8gZ2V0IHRoZSBVUkwgb2YgdGhlIEFyY2hpdmUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBwbHVnaW4gZW50cnkNCi0JCUlTaXRlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0RmVhdHVyZSgpLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7DQotCQlmaWxlVVJMID0gcHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShnZXRQYXRoSUQobm9uUGx1Z2luRW50cnkpKTsNCi0NCi0JCVN0cmluZyBmaWxlU3RyaW5nID0gZmlsZVVSTC5nZXRGaWxlKCk7DQotCQlGaWxlIG5vblBsdWdpbkRhdGEgPSBuZXcgRmlsZShmaWxlU3RyaW5nKTsNCi0JCWlmICghbm9uUGx1Z2luRGF0YS5leGlzdHMoKSkNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJUG9saWN5LmJpbmQoIkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLkZpbGVEb2VzTm90RXhpc3QiLCBmaWxlU3RyaW5nKSwgLy8kTk9OLU5MUy0xJA0KLQkJCQludWxsKTsgDQotDQotCQl0cnkgew0KLQkJCXJlc3VsdFswXSA9DQotCQkJCW5ldyBDb250ZW50UmVmZXJlbmNlKG5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKSwgbm9uUGx1Z2luRGF0YS50b1VSTCgpKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJIkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvUmV0cmlldmVOb25QbHVnaW5FbnRyeSIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCW5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKS50b1N0cmluZygpKSwNCi0JCQkJZSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJQ29udGVudFJlZmVyZW5jZVtdIGNvbnRlbnRSZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07DQotCQljb250ZW50UmVmZXJlbmNlc1swXSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKG51bGwsIGdldFVSTCgpKTsNCi0JCXJldHVybiBjb250ZW50UmVmZXJlbmNlczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVFbnRyeUFyY2hpdmVzQ29udGVudFJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOw0KLQkJdHJ5IHsNCi0JCQlGaWxlIGZlYXR1cmVEaXIgPSBuZXcgRmlsZShnZXRGZWF0dXJlUGF0aCgpKTsNCi0JCQlMaXN0IGZpbGVzID0gZ2V0RmlsZXMoZmVhdHVyZURpcik7DQotCQkJcmVzdWx0ID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbZmlsZXMuc2l6ZSgpXTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgew0KLQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsNCi0JCQkJcmVzdWx0W2ldID0gbmV3IENvbnRlbnRSZWZlcmVuY2UoY3VycmVudEZpbGUuZ2V0TmFtZSgpLCBjdXJyZW50RmlsZS50b1VSTCgpKTsNCi0JCQl9DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oDQotCQkJCVBvbGljeS5iaW5kKA0KLQkJCQkJIkZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvUmV0cmlldmVGZWF0dXJlRW50cnlDb250ZW50UmVmIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSwNCi0JCQkJZSk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhJUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldFBsdWdpbkVudHJ5Q29udGVudFJlZmVyZW5jZXMoDQotCQlJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbkVudHJ5LCBtb25pdG9yKTsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZXN1bHQgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsNCi0NCi0JCXRyeSB7DQotCQkJaWYgKHJlZmVyZW5jZXNbMF0gaW5zdGFuY2VvZiBKYXJDb250ZW50UmVmZXJlbmNlKSB7DQotCQkJCXJlc3VsdCA9ICgoSmFyQ29udGVudFJlZmVyZW5jZSlyZWZlcmVuY2VzWzBdKS5wZWVrKG51bGwsIG1vbml0b3IpOw0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc3ViZGlyZWN0b3JpZXMNCi0JCQkJRmlsZSBwbHVnaW5EaXIgPSBuZXcgRmlsZShnZXRQYXRoKHBsdWdpbkVudHJ5KSk7DQotCQkJCVVSTCBwbHVnaW5VUkwgPSBwbHVnaW5EaXIudG9VUkwoKTsNCi0JCQkJTGlzdCBmaWxlcyA9IGdldEZpbGVzKHBsdWdpbkRpcik7DQotCQkJCXJlc3VsdCA9IG5ldyBDb250ZW50UmVmZXJlbmNlW2ZpbGVzLnNpemUoKV07DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7DQotCQkJCQlGaWxlIGN1cnJlbnRGaWxlID0gKEZpbGUpIGZpbGVzLmdldChpKTsNCi0JCQkJCVN0cmluZyByZWxhdGl2ZVN0cmluZyA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkxBc1N0cmluZyhwbHVnaW5VUkwsIGN1cnJlbnRGaWxlLnRvVVJMKCkpOw0KLQkJCQkJcmVzdWx0W2ldID0gbmV3IENvbnRlbnRSZWZlcmVuY2UocmVsYXRpdmVTdHJpbmcsIGN1cnJlbnRGaWxlLnRvVVJMKCkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQlQb2xpY3kuYmluZCgNCi0JCQkJCSJGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpdmVBcmNoaXZlQ29udGVudFJlZiIpIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSsgcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCksDQotCQkJCWUpOw0KLQkJfQ0KLQkJDQotCQkvL1syMDg2Nl0gd2UgZGlkIG5vdCBwcmVzZXJ2ZSBleGVjdXRhYmxlIGJpdA0KLQkJdmFsaWRhdGVQZXJtaXNzaW9ucyhyZXN1bHQpOw0KLQkJDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVFeGVjdXRhYmxlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDg0NzFlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotDQotLyoqDQotICogRmVhdHVyZUZhY3RvcnkgZm9yIEV4ZWN1dGFibGUgRmVhdHVyZXMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5IGV4dGVuZHMgQmFzZUZlYXR1cmVGYWN0b3J5IHsNCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUZhY3RvcnkjY3JlYXRlRmVhdHVyZShVUkwsSVNpdGUsSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFVSTCB1cmwsIElTaXRlIHNpdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJVGFyZ2V0RmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIGZlYXR1cmVTdHJlYW0gPSBudWxsOw0KLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkNCi0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0NCi0JCWlmICh1cmwgPT0gbnVsbCkNCi0JCQlyZXR1cm4gY3JlYXRlRmVhdHVyZShzaXRlKTsNCi0NCi0JCS8vIHRoZSBVUkwgc2hvdWxkIHBvaW50IHRvIGEgZGlyZWN0b3J5DQotCQl1cmwgPSB2YWxpZGF0ZSh1cmwpOw0KLQ0KLQkJdHJ5IHsNCi0JCQlJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCQkvLyBQRVJGOiBEbyBub3QgY3JlYXRlIEZlYXR1cmVDb250ZW50Q29uc3VtZXINCi0JCQkvL0lGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lciA9bmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyKCk7DQotDQotCQkJVVJMIG5vblJlc29sdmVkVVJMID0gY29udGVudFByb3ZpZGVyLmdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShudWxsKS5hc1VSTCgpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKG5vblJlc29sdmVkVVJMKTsNCi0JCQlmZWF0dXJlU3RyZWFtID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQocmVzb2x2ZWRVUkwpLmdldElucHV0U3RyZWFtKCk7DQotDQotCQkJZmVhdHVyZSA9IChUYXJnZXRGZWF0dXJlKSB0aGlzLnBhcnNlRmVhdHVyZShmZWF0dXJlU3RyZWFtKTsNCi0JCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7DQotDQotCQkJZmVhdHVyZS5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7DQotCQkJLy8gUEVSRjogRmVhdHVyZUNvbnRlbnRDb25zdW1lcg0KLQkJCS8vZmVhdHVyZS5zZXRDb250ZW50Q29uc3VtZXIoY29udGVudENvbnN1bWVyKTsNCi0NCi0JCQlmZWF0dXJlLnJlc29sdmUodXJsLCB1cmwpOw0KLQkJCWZlYXR1cmUubWFya1JlYWRPbmx5KCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBlOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRmVhdHVyZUZhY3RvcnkuQ3JlYXRpbmdFcnJvciIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0gZmluYWxseSB7DQotCQkJdHJ5IHsNCi0JCQkJaWYgKGZlYXR1cmVTdHJlYW0gIT0gbnVsbCkNCi0JCQkJCWZlYXR1cmVTdHJlYW0uY2xvc2UoKTsNCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBGZWF0dXJlTW9kZWxGYWN0b3J5I2NyZWF0ZUZlYXR1cmVNb2RlbCgpDQotCSAqLw0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIGNyZWF0ZUZlYXR1cmVNb2RlbCgpIHsNCi0JCXJldHVybiBuZXcgVGFyZ2V0RmVhdHVyZSgpOw0KLQl9DQotDQotCS8qDQotCSAqIENyZWF0ZXMgYW4gZW1wdHkgZmVhdHVyZSBvbiB0aGUgc2l0ZSANCi0JICovDQotCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlUYXJnZXRGZWF0dXJlIGZlYXR1cmUgPSBudWxsOw0KLQ0KLQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKG51bGwpOw0KLQkJSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudENvbnN1bWVyKCk7DQotCQlmZWF0dXJlID0gKFRhcmdldEZlYXR1cmUpIGNyZWF0ZUZlYXR1cmVNb2RlbCgpOw0KLQkJZmVhdHVyZS5zZXRTaXRlKHNpdGUpOw0KLQkJZmVhdHVyZS5zZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7DQotCQlmZWF0dXJlLnNldENvbnRlbnRDb25zdW1lcihjb250ZW50Q29uc3VtZXIpOw0KLQ0KLQkJLy8gZG8gbm90IG1hcmsgcmVhZCBvbmx5IHlldC4uLgkNCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotDQotCS8qDQotCSAqIHZhbGlkYXRlcyBhIFVSTCBhcyBhIGRpcmVjdG9yeSBVUkwNCi0JICovDQotCXByaXZhdGUgVVJMIHZhbGlkYXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmICh1cmwgPT0gbnVsbCkNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5Lk51bGxVUkwiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWlmICghKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSB8fCB1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSB8fCB1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKEZlYXR1cmUuRkVBVFVSRV9YTUwpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJdHJ5IHsNCi0JCQkJU3RyaW5nIHBhdGggPSB1cmwuZ2V0RmlsZSgpICsgIi8iOyAvLyROT04tTkxTLTEkDQotCQkJCXVybCA9IG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHBhdGgpOw0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuQ2Fubm90Q3JlYXRlVVJMIiwgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMWY4OWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eS4qOw0KLQ0KLS8qKg0KLSAqIENvbnRlbnQgUHJvdmlkZXIgb2YgYSBGZWF0dXJlIFBhY2thZ2UNCi0gKi8NCi1wdWJsaWMgY2xhc3MgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgRmVhdHVyZUNvbnRlbnRQcm92aWRlciB7DQotDQotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZSBsb2NhbE1hbmlmZXN0ID0gbnVsbDsNCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlRmlsZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVswXTsNCi0JcHJpdmF0ZSBJVmVyaWZpZXIgamFyVmVyaWZpZXIgPSBudWxsOw0KLQ0KLQkvKg0KLQkgKiBmaWx0ZXIgZm9yIGZpbGUgd2l0aCAuamFyDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVuYW1lRmlsdGVyIGZpbHRlciA9IG5ldyBGaWxlbmFtZUZpbHRlcigpIHsNCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsNCi0JCQlyZXR1cm4gbmFtZS5lbmRzV2l0aChGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuSkFSX0VYVEVOU0lPTik7DQotCQl9DQotCX07DQotDQotCS8qDQotCSAqIENvbnN0cnVjdG9yIA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7DQotCQlzdXBlcih1cmwpOw0KLQl9DQotDQotCS8qDQotCSAqIFJldHVybnMgYSBuZXcgdmVyaWZpZXIgZm9yIGVhY2ggdG9wLWxldmVsIGluc3RhbGwNCi0JICogKGlmIHRoZSB2ZXJpZmllciBoYXMgYSBwYXJlbnQsIHJldHVybiB0aGUgdmVyaWZpZXINCi0JICogb3RoZXJ3aXNlIHJlaW5pdGlhbGl6ZSkNCi0JICovDQotCXB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoamFyVmVyaWZpZXIgPT0gbnVsbCB8fCBqYXJWZXJpZmllci5nZXRQYXJlbnQoKSA9PSBudWxsKSB7DQotCQkJamFyVmVyaWZpZXIgPSBuZXcgSmFyVmVyaWZpZXIoKTsNCi0JCQlyZXR1cm4gamFyVmVyaWZpZXI7DQotCQl9DQotDQotCQkvLyByZS1pbml0IHdpbGwgYmUgZG9uZSBpZiB0aGUgcGFyZW50IGNoYW5nZXMNCi0JCXJldHVybiBqYXJWZXJpZmllcjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZSgpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZSBnZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gY2hlY2sgdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBsb2NhbCBjb3B5IG9mIHRoZSBtYW5pZmVzdA0KLQkJaWYgKGxvY2FsTWFuaWZlc3QgIT0gbnVsbCkNCi0JCQlyZXR1cm4gbG9jYWxNYW5pZmVzdDsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSBmZWF0dXJlQXJjaGl2ZVJlZmVyZW5jZSA9IGdldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKG1vbml0b3IpOw0KLQkJSmFyQ29udGVudFJlZmVyZW5jZSBmZWF0dXJlSmFyUmVmZXJlbmNlID0gbnVsbDsNCi0JCXRyeSB7DQotDQotCQkJLy8gZm9yY2UgZmVhdHVyZSBhcmNoaXZlIHRvIGxvY2FsLg0KLQkJCS8vIFRoaXMgY29udGVudCBwcm92aWRlciBhbHdheXMgYXNzdW1lcyBleGFjdGx5IDEgYXJjaGl2ZSBmaWxlIChpbmRleCBbMF0pCQkNCi0JCQlmZWF0dXJlSmFyUmVmZXJlbmNlID0gKEphckNvbnRlbnRSZWZlcmVuY2UpIGFzTG9jYWxSZWZlcmVuY2UoZmVhdHVyZUFyY2hpdmVSZWZlcmVuY2VbMF0sIG51bGwpOw0KLQkJCS8vIHdlIG5lZWQgdG8gdW5wYWNrIGFyY2hpdmUgbG9jYWxseSBmb3IgVUkgYnJvd3NlciByZWZlcmVuY2VzIHRvIGJlIHJlc29sdmVkIGNvcnJlY3RseQ0KLQkJCWxvY2FsRmVhdHVyZUZpbGVzID0gZmVhdHVyZUphclJlZmVyZW5jZS51bnBhY2soZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCBudWxsLCBtb25pdG9yKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBlcnJvclJldHJpZXZpbmcoRmVhdHVyZS5GRUFUVVJFX1hNTCwgZmVhdHVyZUphclJlZmVyZW5jZSwgZ2V0VVJMKCksIGUpOyAvLyROT04tTkxTLTEkIA0KLQkJfQ0KLQ0KLQkJLy8gZmluZCB0aGUgbWFuaWZlc3QgaW4gdGhlIHVucGFja2VkIGZlYXR1cmUgZmlsZXMNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlRmlsZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAobG9jYWxGZWF0dXJlRmlsZXNbaV0uZ2V0SWRlbnRpZmllcigpLmVxdWFscyhGZWF0dXJlLkZFQVRVUkVfWE1MKSkgew0KLQkJCQlsb2NhbE1hbmlmZXN0ID0gbG9jYWxGZWF0dXJlRmlsZXNbaV07DQotCQkJCS8vIGNhY2hlIHJlZmVyZW5jZSB0byBtYW5pZmVzdA0KLQkJCQlyZXR1cm4gbG9jYWxNYW5pZmVzdDsNCi0JCQl9DQotCQl9DQotDQotCQkvLyB0aGUgbWFuaWZlc3QgaGFzIG5vdCBiZWVuIGZvdW5kDQotCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10geyBGZWF0dXJlLkZFQVRVUkVfWE1MLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpfTsNCi0JCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuTm9NYW5pZmVzdEZpbGUiLCB2YWx1ZXMpLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkIA0KLQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZ2V0RmVhdHVyZSgpLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCUlOb25QbHVnaW5FbnRyeVtdIG5vbkVudHJpZXMgPSBnZXRGZWF0dXJlKCkuZ2V0Tm9uUGx1Z2luRW50cmllcygpOw0KLQkJTGlzdCBsaXN0QWxsQ29udGVudFJlZiA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSBhbGxDb250ZW50UmVmID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMF07DQotDQotCQkvLyBmZWF0dXJlDQotCQlsaXN0QWxsQ29udGVudFJlZi5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhtb25pdG9yKSkpOw0KLQ0KLQkJLy8gcGx1Z2lucw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJbGlzdEFsbENvbnRlbnRSZWYuYWRkQWxsKEFycmF5cy5hc0xpc3QoZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhlbnRyaWVzW2ldLCBtb25pdG9yKSkpOw0KLQkJfQ0KLQ0KLQkJLy8gbm9uIHBsdWdpbnMNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9uRW50cmllcy5sZW5ndGg7IGkrKykgew0KLQkJCWxpc3RBbGxDb250ZW50UmVmLmFkZEFsbChBcnJheXMuYXNMaXN0KGdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobm9uRW50cmllc1tpXSwgbW9uaXRvcikpKTsNCi0JCX0NCi0NCi0JCS8vIHRyYW5zZm9ybSBMaXN0IGluIEFycmF5DQotCQlpZiAobGlzdEFsbENvbnRlbnRSZWYuc2l6ZSgpID4gMCkgew0KLQkJCWFsbENvbnRlbnRSZWYgPSBuZXcgQ29udGVudFJlZmVyZW5jZVtsaXN0QWxsQ29udGVudFJlZi5zaXplKCldOw0KLQkJCWxpc3RBbGxDb250ZW50UmVmLnRvQXJyYXkoYWxsQ29udGVudFJlZik7DQotCQl9DQotDQotCQlyZXR1cm4gYWxsQ29udGVudFJlZjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVFbnRyeUFyY2hpdmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8xIGphciBmaWxlIDwtPiAxIGZlYXR1cmUNCi0JCS8vIHdlIHdpbGwgcmV0dXJuIHRoZSBKQVIgZmlsZSANCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbMV07DQotCQlDb250ZW50UmVmZXJlbmNlIGN1cnJlbnRSZWZlcmVuY2UgPSBudWxsOw0KLQkJU3RyaW5nIGFyY2hpdmVJRCA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCWFyY2hpdmVJRCA9IChnZXRGZWF0dXJlKCkgIT0gbnVsbCkgPyBnZXRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgOiAiIjsJLy8kTk9OLU5MUy0xJA0KLQkJCWN1cnJlbnRSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZShhcmNoaXZlSUQsIGdldFVSTCgpKTsNCi0JCQljdXJyZW50UmVmZXJlbmNlID0gYXNMb2NhbFJlZmVyZW5jZShjdXJyZW50UmVmZXJlbmNlLCBtb25pdG9yKTsNCi0JCQlyZWZlcmVuY2VzWzBdID0gY3VycmVudFJlZmVyZW5jZTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBlcnJvclJldHJpZXZpbmcoYXJjaGl2ZUlELCBjdXJyZW50UmVmZXJlbmNlLCBnZXRGZWF0dXJlKCkuZ2V0VVJMKCksIGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gcmVmZXJlbmNlczsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gMSBwbHVnaW4gPC0+IDEgamFyDQotCQkvLyB3ZSByZXR1cm4gdGhlIEpBUiBmaWxlCQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBuZXcgQ29udGVudFJlZmVyZW5jZVsxXTsNCi0JCVN0cmluZyBhcmNoaXZlSUQgPSBnZXRQYXRoSUQocGx1Z2luRW50cnkpOw0KLQkJSVNpdGUgc2l0ZSA9IChnZXRGZWF0dXJlKCkgPT0gbnVsbCkgPyBudWxsIDogZ2V0RmVhdHVyZSgpLmdldFNpdGUoKTsNCi0JCUlTaXRlQ29udGVudFByb3ZpZGVyIHNpdGVDb250ZW50UHJvdmlkZXIgPSAoc2l0ZSA9PSBudWxsKSA/IG51bGwgOiBzaXRlLmdldFNpdGVDb250ZW50UHJvdmlkZXIoKTsNCi0JCVVSTCB1cmwgPSAoc2l0ZUNvbnRlbnRQcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBzaXRlQ29udGVudFByb3ZpZGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoYXJjaGl2ZUlEKTsNCi0NCi0JCXRyeSB7DQotCQkJcmVmZXJlbmNlc1swXSA9IGFzTG9jYWxSZWZlcmVuY2UobmV3IEphckNvbnRlbnRSZWZlcmVuY2UoYXJjaGl2ZUlELCB1cmwpLCBtb25pdG9yKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBlcnJvclJldHJpZXZpbmcoYXJjaGl2ZUlELCByZWZlcmVuY2VzWzBdLCBnZXRGZWF0dXJlKCkuZ2V0VVJMKCksIGUpOw0KLQkJfQ0KLQkJcmV0dXJuIHJlZmVyZW5jZXM7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGFyY2hpdmUgPSBmZWF0dXJlLzxpZD5fPHZlcj4vPGZpbGU+DQotCQlTdHJpbmcgYXJjaGl2ZUlEID0gU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCArICgoZ2V0RmVhdHVyZSgpICE9IG51bGwpID8gZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpIDogIiIpOyAvLyROT04tTkxTLTEkDQotCQlhcmNoaXZlSUQgKz0gIi8iICsgbm9uUGx1Z2luRW50cnkuZ2V0SWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkDQotDQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzFdOw0KLQkJQ29udGVudFJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJSVNpdGUgc2l0ZSA9IChnZXRGZWF0dXJlKCkgPT0gbnVsbCkgPyBudWxsIDogZ2V0RmVhdHVyZSgpLmdldFNpdGUoKTsNCi0JCQlJU2l0ZUNvbnRlbnRQcm92aWRlciBzaXRlQ29udGVudFByb3ZpZGVyID0gKHNpdGUgPT0gbnVsbCkgPyBudWxsIDogc2l0ZS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7DQotCQkJVVJMIHVybCA9IChzaXRlQ29udGVudFByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHNpdGVDb250ZW50UHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShhcmNoaXZlSUQpOw0KLQ0KLQkJCWN1cnJlbnRSZWZlcmVuY2UgPSBuZXcgQ29udGVudFJlZmVyZW5jZShub25QbHVnaW5FbnRyeS5nZXRJZGVudGlmaWVyKCksIHVybCk7DQotCQkJY3VycmVudFJlZmVyZW5jZSA9IGFzTG9jYWxSZWZlcmVuY2UoY3VycmVudFJlZmVyZW5jZSwgbW9uaXRvcik7DQotCQkJcmVmZXJlbmNlc1swXSA9IGN1cnJlbnRSZWZlcmVuY2U7DQotDQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgZXJyb3JSZXRyaWV2aW5nKGFyY2hpdmVJRCwgY3VycmVudFJlZmVyZW5jZSwgZ2V0RmVhdHVyZSgpLmdldFVSTCgpLCBlKTsNCi0JCX0NCi0NCi0JCXJldHVybiByZWZlcmVuY2VzOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlyZXR1cm4gbG9jYWxGZWF0dXJlRmlsZXM7IC8vIHJldHVybiBjYWNoZWQgZmVhdHVyZSByZWZlcmVuY2VzDQotCQkvLyBOb3RlOiBhc3N1bWVzIHRoaXMgY29udGVudCBwcm92aWRlciBpcyBhbHdheXMgY2FsbGVkIGZpcnN0IHRvDQotCQkvLyAgICAgICBnZXQgdGhlIGZlYXR1cmUgbWFuaWZlc3QuIFRoaXMgZm9yY2VzIHRoZSBmZWF0dXJlIGZpbGVzDQotCQkvLyAgICAgICB0byBiZSB1bnBhY2tlZCBhbmQgY2FjaGVzIHRoZSByZWZlcmVuY2VzDQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5FbnRyeSwgbW9uaXRvcik7DQotCQlDb250ZW50UmVmZXJlbmNlW10gcGx1Z2luUmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOw0KLQ0KLQkJdHJ5IHsNCi0JCQlpZiAocmVmZXJlbmNlc1swXSBpbnN0YW5jZW9mIEphckNvbnRlbnRSZWZlcmVuY2UpIHsNCi0JCQkJSmFyQ29udGVudFJlZmVyZW5jZSBsb2NhbFJlZiA9IChKYXJDb250ZW50UmVmZXJlbmNlKSBhc0xvY2FsUmVmZXJlbmNlKHJlZmVyZW5jZXNbMF0sIG1vbml0b3IpOw0KLQkJCQlwbHVnaW5SZWZlcmVuY2VzID0gbG9jYWxSZWYucGVlayhudWxsLCBtb25pdG9yKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQkvLyByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIHN1YmRpcmVjdG9yaWVzDQotCQkJCUxpc3QgZmlsZXMgPSBnZXRGaWxlcyhyZWZlcmVuY2VzWzBdLmFzRmlsZSgpKTsNCi0JCQkJcGx1Z2luUmVmZXJlbmNlcyA9IG5ldyBDb250ZW50UmVmZXJlbmNlW2ZpbGVzLnNpemUoKV07DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJRmlsZSBjdXJyZW50RmlsZSA9IChGaWxlKSBmaWxlcy5nZXQoaSk7DQotCQkJCQlwbHVnaW5SZWZlcmVuY2VzW2ldID0gbmV3IENvbnRlbnRSZWZlcmVuY2UobnVsbCwgY3VycmVudEZpbGUudG9VUkwoKSk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy9bMjA4NjZdIHdlIGRpZCBub3QgcHJlc2VydmUgZXhlY3V0YWJsZSBiaXQNCi0JCQl2YWxpZGF0ZVBlcm1pc3Npb25zKHBsdWdpblJlZmVyZW5jZXMpOw0KLQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IGVycm9yUmV0cmlldmluZyhwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgcmVmZXJlbmNlc1swXSwgZ2V0RmVhdHVyZSgpLmdldFVSTCgpLCBlKTsNCi0JCX0NCi0JCXJldHVybiBwbHVnaW5SZWZlcmVuY2VzOw0KLQl9DQotDQotCS8qDQotCSAqIHJldHVybiBhbGwgdGhlIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcnkNCi0JICovDQotCXByaXZhdGUgTGlzdCBnZXRGaWxlcyhGaWxlIGRpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLQkJaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkNCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oUG9saWN5LmJpbmQoIkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5JbnZhbGlkRGlyZWN0b3J5IiwgZGlyLmdldFBhdGgoKSkpOyAvLyROT04tTkxTLTEkDQotDQotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7DQotCQlpZiAoZmlsZXMgIT0gbnVsbCkgLy8gYmUgY2FyZWZ1bCBzaW5jZSBpdCBjYW4gYmUgbnVsbA0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsNCi0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQkJCXJlc3VsdC5hZGRBbGwoZ2V0RmlsZXMoZmlsZXNbaV0pKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCXJlc3VsdC5hZGQoZmlsZXNbaV0pOw0KLQkJCQl9DQotCQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBlcnJvclJldHJpZXZpbmcoU3RyaW5nIG9iaiwgQ29udGVudFJlZmVyZW5jZSBhcmNoaXZlLCBVUkwgdXJsLCBFeGNlcHRpb24gZSkgew0KLQ0KLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tdIHsgb2JqIH07DQotDQotCQlyZXR1cm4gVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5FcnJvclJldHJpZXZpbmciLCB2YWx1ZXMpLCBlKTsgLy8kTk9OLU5MUy0xJAkgCQ0KLQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVBhY2thZ2VkRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDdkZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGFja2FnZWRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiBGYWN0b3J5IGZvciBGZWF0dXJlIFBhY2thZ2VkDQotICovDQotcHVibGljIGNsYXNzIEZlYXR1cmVQYWNrYWdlZEZhY3RvcnkgZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3Rvcnkgew0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCxJU2l0ZSxJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoVVJMIHVybCxJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7DQotCQlJbnB1dFN0cmVhbSBmZWF0dXJlU3RyZWFtID0gbnVsbDsNCi0JCWlmIChtb25pdG9yID09IG51bGwpDQotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQltb25pdG9yLmJlZ2luVGFzayhudWxsLDIpOw0KLQkJbW9uaXRvci53b3JrZWQoMSk7DQotCQkJDQotCQkJCQkNCi0JCXRyeSB7CQ0KLQkJCUlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIodXJsKTsJDQotCQkJQ29udGVudFJlZmVyZW5jZSBtYW5pZmVzdCA9IGNvbnRlbnRQcm92aWRlci5nZXRGZWF0dXJlTWFuaWZlc3RSZWZlcmVuY2UobnVsbC8qSVByb2dyZXNzTW9uaXRvciovKTsNCi0JCQlmZWF0dXJlU3RyZWFtID0gbWFuaWZlc3QuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlmZWF0dXJlID0gKEZlYXR1cmUpcGFyc2VGZWF0dXJlKGZlYXR1cmVTdHJlYW0pOw0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkNCi0JCQkvLyBpZiB0aGVyZSBpcyBubyB1cGRhdGUgVVJMIGZvciB0aGUgRmVhdHVyZQ0KLQkJCS8vIHVzZSB0aGUgU2l0ZSBVUkwNCi0JCQlpZiAoZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKT09bnVsbCl7DQotCQkJCVVSTEVudHJ5TW9kZWwgZW50cnlNb2RlbCA9IGNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsNCi0JCQkJVVJMIHNpdGVVcmwgPSBzaXRlLmdldFVSTCgpOw0KLQkJCQlpZiAoc2l0ZVVybCE9bnVsbCl7DQotCQkJCQllbnRyeU1vZGVsLnNldFVSTFN0cmluZyhzaXRlVXJsLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCQkJZW50cnlNb2RlbC5yZXNvbHZlKHNpdGVVcmwsbnVsbCk7DQotCQkJCQlmZWF0dXJlLnNldFVwZGF0ZVNpdGVFbnRyeU1vZGVsKGVudHJ5TW9kZWwpOw0KLQkJCQl9DQotCQkJfQkNCi0JCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQlmZWF0dXJlLnNldFNpdGUoc2l0ZSk7CQkJCQkJDQotCQkJVVJMIGJhc2VVcmwgPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCWJhc2VVcmwgPSBuZXcgVVJMKG1hbmlmZXN0LmFzVVJMKCksIi4iKTsgLy8gbWFrZSBzdXJlIHdlIGhhdmUgVVJMIHRvIGZlYXR1cmUgZGlyZWN0b3J5IC8vJE5PTi1OTFMtMSQNCi0JCQl9IGNhdGNoKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CQ0KLQkJCX0NCi0JCQlmZWF0dXJlLnJlc29sdmUoYmFzZVVybCwgYmFzZVVybCk7DQotCQkJZmVhdHVyZS5tYXJrUmVhZE9ubHkoKTsJCQkNCi0JCX0gIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KLQkJCXRocm93IGU7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeyANCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiRmVhdHVyZUZhY3RvcnkuQ3JlYXRpbmdFcnJvciIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX1maW5hbGx5IHsNCi0JCQl0cnkgew0KLQkJCQlpZiAoZmVhdHVyZVN0cmVhbSE9bnVsbCkJDQotCQkJCQlmZWF0dXJlU3RyZWFtLmNsb3NlKCk7DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmZWF0dXJlOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmVhdHVyZVBsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjM2Q4NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0vKioKLSAqIEFuIElQbHVnaW5FbnRyeSAtIElGZWF0dXJlIHBhaXIuCi0gKiBUaGUgSUZlYXR1cmUgaXMgYSBmZWF0dWUgb3IgYSBwYXRjaCB3aWNoIGRlbGl2ZXJlZCB0aGUgcGx1Z2luCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGx1Z2luIHsKLQlwcml2YXRlIElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHVibGljIEZlYXR1cmVQbHVnaW4oSVBsdWdpbkVudHJ5IGVudHJ5LCBJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXBsdWdpbkVudHJ5ID0gZW50cnk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCXB1YmxpYyBJUGx1Z2luRW50cnkgZ2V0RW50cnkoKSB7Ci0JCXJldHVybiBwbHVnaW5FbnRyeTsKLQl9Ci0JcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQkvKioKLQkgKiBQbHVnaW5zIGFyZSBlcXVhbCBpZiB0aGVpciBJRHMgYW5kIHZlcnNpb25zIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBGZWF0dXJlUGx1Z2luKSB7Ci0JCQlGZWF0dXJlUGx1Z2luIHAgPSAoRmVhdHVyZVBsdWdpbikgbzsKLQkJCXJldHVybiBnZXRFbnRyeSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMocC5nZXRFbnRyeSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0RW50cnkoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuaGFzaENvZGUoKTsKLQl9Ci0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHBsdWdpbkVudHJ5ICsgIiBpbiAiICsgZmVhdHVyZTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GZWF0dXJlVHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxZDI5Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZlYXR1cmVUeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiBNYW5hZ2VzIEZlYXR1cmVGYWN0b3J5IGV4dGVuc2lvbiBwb2ludA0KLSAqLw0KLXB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlVHlwZUZhY3Rvcnkgew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBGZWF0dXJlVHlwZUZhY3RvcnkgaW5zdDsNCi0JcHJpdmF0ZSBNYXAgZmFjdG9yaWVzOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lNUExFX0VYVEVOU0lPTl9JRCA9ICJmZWF0dXJlVHlwZXMiOwkvLyROT04tTkxTLTEkCQ0KLQ0KLQkvKg0KLQkgKiBoaWRlIGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwcml2YXRlIEZlYXR1cmVUeXBlRmFjdG9yeSgpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBTaW5nbGV0b24gcGF0dGVybg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBGZWF0dXJlVHlwZUZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7DQotCQlpZiAoaW5zdCA9PSBudWxsKQ0KLQkJCWluc3QgPSBuZXcgRmVhdHVyZVR5cGVGYWN0b3J5KCk7DQotCQlyZXR1cm4gaW5zdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm4gdGhlIGZhY3RvcnkgZm9yIHRoZSBhc3NvY2lhdGVkIHR5cGUNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZUZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJLy8NCi0JCU9iamVjdCBpbnN0YW5jZSA9IGdldEZhY3RvcmllcygpLmdldCh0eXBlKTsNCi0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7DQotCQkJaW5zdGFuY2UgPSBjcmVhdGVGYWN0b3J5Rm9yKHR5cGUpOw0KLQkJCWdldEZhY3RvcmllcygpLnB1dCh0eXBlLCBpbnN0YW5jZSk7DQotCQl9DQotCQlyZXR1cm4gKElGZWF0dXJlRmFjdG9yeSkgaW5zdGFuY2U7DQotCX0NCi0NCi0JLyoNCi0JICogY3JlYXRlcyBhIGZhY3RvcnkgZm9yIHRoZSBhc3NvY2lhdGVkIHR5cGUgYW5kIGNhY2hlIGl0IA0KLQkgKi8NCi0JcHJpdmF0ZSBJRmVhdHVyZUZhY3RvcnkgY3JlYXRlRmFjdG9yeUZvcihTdHJpbmcgdHlwZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSUZlYXR1cmVGYWN0b3J5IHJlc3VsdCA9IG51bGw7DQotDQotCQlTdHJpbmcgcGx1Z2luSUQgPQ0KLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7DQotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOw0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPQ0KLQkJCXJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihwbHVnaW5JRCwgU0lNUExFX0VYVEVOU0lPTl9JRCwgdHlwZSk7DQotDQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCB8fCBlbGVtZW50cy5sZW5ndGggPT0gMCkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJUG9saWN5LmJpbmQoIkZlYXR1cmVUeXBlRmFjdG9yeS5VbmFibGVUb0ZpbmRGZWF0dXJlRmFjdG9yeSIsIHR5cGUpLCAvLyROT04tTkxTLTEkDQotCQkJCQludWxsKTsNCi0JCX0gDQotDQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzWzBdOw0KLQkJcmVzdWx0ID0gKElGZWF0dXJlRmFjdG9yeSkgZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwkvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBNYXAgZ2V0RmFjdG9yaWVzKCkgew0KLQkJaWYgKGZhY3RvcmllcyA9PSBudWxsKQ0KLQkJCWZhY3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7DQotCQlyZXR1cm4gZmFjdG9yaWVzOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZUZyYWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZpbGVGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgyNzA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRmlsZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLQotcHVibGljIGNsYXNzIEZpbGVGcmFnbWVudHsKLQlwcml2YXRlIEZpbGUgZmlsZTsKLQlwcml2YXRlIGxvbmcgYnl0ZXM7Ci0JcHVibGljIEZpbGVGcmFnbWVudChGaWxlIGZpbGUsIGxvbmcgc2l6ZSl7Ci0JCXRoaXMuZmlsZT1maWxlOwotCQl0aGlzLmJ5dGVzPXNpemU7Ci0JfQotCXB1YmxpYyBGaWxlIGdldEZpbGUoKXsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCXB1YmxpYyBsb25nIGdldFNpemUoKXsKLQkJcmV0dXJuIGJ5dGVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZpbGVSZXNwb25zZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9GaWxlUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFiZjAyMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZpbGVSZXNwb25zZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi1wdWJsaWMgY2xhc3MgRmlsZVJlc3BvbnNlIGltcGxlbWVudHMgUmVzcG9uc2UgewotCi0JcHJvdGVjdGVkIFVSTCB1cmw7Ci0JcHJvdGVjdGVkIGxvbmcgbGFzdE1vZGlmaWVkOwotCi0JcHVibGljIEZpbGVSZXNwb25zZShVUkwgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB1cmwub3BlblN0cmVhbSgpOwotCX0KLQotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRJbnB1dFN0cmVhbSgpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKLQkJcmV0dXJuIElTdGF0dXNDb2Rlcy5IVFRQX09LOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotCQlpZiAobGFzdE1vZGlmaWVkID09IDApIHsKLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQkJaWYgKGYuaXNEaXJlY3RvcnkoKSkKLQkJCQlmID0gbmV3IEZpbGUoZiwgInNpdGUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCWxhc3RNb2RpZmllZCA9IGYubGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGxhc3RNb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ZyYWdtZW50RW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRnJhZ21lbnRFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWZhYzc5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvRnJhZ21lbnRFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXRyaWV2ZSB0aGUgZnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIEZyYWdtZW50RW50cnkgewotCQotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpblZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsgCi0JcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0JCi0JcHVibGljIEZyYWdtZW50RW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLnBsdWdpbklkID0gaWQ7Ci0JCXRoaXMucGx1Z2luVmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBwbHVnaW4gdHJhbnNsYXRhYmxlIG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGx1Z2luCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnLWluIGlkZW50aWZpZXIgZm9yIHRoaXMgZW50cnkuCi0JICogCi0JICogQHJldHVybiB0aGUgcGx1Zy1pbiBpZGVudGlmaWVyLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHBsdWdpbklkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWctaW4gdmVyc2lvbiBmb3IgdGhpcyBlbnRyeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwbHVnLWluIHZlcnNpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5WZXJzaW9uKCkgewotCQlyZXR1cm4gcGx1Z2luVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIG1zZyA9IChnZXRQbHVnaW5JZGVudGlmaWVyKCkhPW51bGwpP2dldFBsdWdpbklkZW50aWZpZXIoKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkCi0JCW1zZyArPSBnZXRQbHVnaW5WZXJzaW9uKCkhPW51bGw/IiAiK2dldFBsdWdpblZlcnNpb24oKS50b1N0cmluZygpOiIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuIG1zZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9IdHRwUmVzcG9uc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSHR0cFJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YWMxMTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9IdHRwUmVzcG9uc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIEh0dHBSZXNwb25zZSBpbXBsZW1lbnRzIFJlc3BvbnNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBPTExJTkdfSU5URVJWQUwgPSAyMDA7Ci0JcHJvdGVjdGVkIFVSTCB1cmw7Ci0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0JcHJvdGVjdGVkIGxvbmcgbGFzdE1vZGlmaWVkOwotCXByb3RlY3RlZCBsb25nIG9mZnNldDsKLQotCXB1YmxpYyBIdHRwUmVzcG9uc2UoVVJMIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJaWYgKG9mZnNldCA+IDApCi0JCQkJY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIlJhbmdlIiwgImJ5dGVzPSIgKyBvZmZzZXQgKyAiLSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJaW4gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQljaGVja09mZnNldCgpOwotCQl9Ci0JCXJldHVybiBpbjsKLQl9Ci0JLyoqCi0JICogQHNlZSBSZXNwb25zZSNnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0JCQljb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQlpZiAob2Zmc2V0ID4gMCkKLQkJCQljb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiUmFuZ2UiLCAiYnl0ZXM9IiArIG9mZnNldCArICItIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0KLQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQl0aGlzLmluID0KLQkJCQkJb3BlblN0cmVhbVdpdGhDYW5jZWwoCi0JCQkJCQkoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb24sCi0JCQkJCQltb25pdG9yKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5pbiA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCX0KLQkJCS8vIHRoaXMgY2FuIGFsc28gYmUgcnVuIGluc2lkZSBhIG1vbml0b3JpbmcgdGhyZWFkLCBidXQgaXQgaXMgc2FmZQotCQkJLy8gdG8KLQkJCS8vIGp1c3QgY2FsbCBpdCBub3csIGlmIHRoZSBpbnB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBvYnRhaW5lZAotCQkJY2hlY2tPZmZzZXQoKTsKLQkJCWlmIChpbiAhPSBudWxsKSB7Ci0JCQkJdGhpcy5sYXN0TW9kaWZpZWQgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbjsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCkgewotCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7Ci0JCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuICgoSHR0cFVSTENvbm5lY3Rpb24pIGNvbm5lY3Rpb24pLmdldFJlc3BvbnNlQ29kZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gSVN0YXR1c0NvZGVzLkhUVFBfT0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGF0dXNNZXNzYWdlKCkgewotCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEh0dHBVUkxDb25uZWN0aW9uKSBjb25uZWN0aW9uKS5nZXRSZXNwb25zZU1lc3NhZ2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotCQlpZiAobGFzdE1vZGlmaWVkID09IDApIHsKLQkJCWlmIChjb25uZWN0aW9uID09IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQlpZiAoY29ubmVjdGlvbiAhPSBudWxsKQotCQkJCWxhc3RNb2RpZmllZCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGxhc3RNb2RpZmllZDsKLQl9Ci0KLQlwcml2YXRlIElucHV0U3RyZWFtIG9wZW5TdHJlYW1XaXRoQ2FuY2VsKAotCQlIdHRwVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uLAotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUNvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLlN0cmVhbVJ1bm5hYmxlIHJ1bm5hYmxlID0KLQkJCW5ldyBDb25uZWN0aW9uVGhyZWFkTWFuYWdlci5TdHJlYW1SdW5uYWJsZSh1cmxDb25uZWN0aW9uKTsKLQkJVGhyZWFkIHQgPQotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmNyZWF0ZVRocmVhZCgKLQkJCQlydW5uYWJsZSk7Ci0JCXQuc3RhcnQoKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJZm9yICg7OykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQlydW5uYWJsZS5kaXNjb25uZWN0KCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAocnVubmFibGUuZ2V0SW5wdXRTdHJlYW0oKSAhPSBudWxsKSB7Ci0JCQkJCWlzID0gcnVubmFibGUuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChydW5uYWJsZS5nZXRFeGNlcHRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChydW5uYWJsZS5nZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKQotCQkJCQkJdGhyb3cgKElPRXhjZXB0aW9uKSBydW5uYWJsZS5nZXRFeGNlcHRpb24oKTsKLQkJCQkJZWxzZQotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldEJ1bmRsZSgpCi0JCQkJCQkJCQkJLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLk9LLAotCQkJCQkJCQlydW5uYWJsZS5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCksIHJ1bm5hYmxlCi0JCQkJCQkJCQkJLmdldEV4Y2VwdGlvbigpKSk7Ci0JCQkJfQotCQkJCXQuam9pbihQT0xMSU5HX0lOVEVSVkFMKTsKLQkJCX0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBpczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGxvbmcgb2Zmc2V0KSB7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQlwcml2YXRlIHZvaWQgY2hlY2tPZmZzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob2Zmc2V0ID09IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyByYW5nZSA9IGNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoIkNvbnRlbnQtUmFuZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudC1SYW5nZT0iICsgcmFuZ2UpOwotCQlpZiAocmFuZ2UgPT0gbnVsbCkgewotCQkJLy9TeXN0ZW0uZXJyLnByaW50bG4oIlNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHJhbmdlcyIpOwotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJIdHRwUmVzcG9uc2UucmFuZ2VFeHBlY3RlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKCFyYW5nZS5zdGFydHNXaXRoKCJieXRlcyAiICsgb2Zmc2V0ICsgIi0iKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vU3lzdGVtLmVyci5wcmludGxuKCJTZXJ2ZXIgcmV0dXJuZWQgd3JvbmcgcmFuZ2UiKTsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihQb2xpY3kuYmluZCgiSHR0cFJlc3BvbnNlLndyb25nUmFuZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVNpdGVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVNpdGVDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE4YTE3ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lTaXRlQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0gCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLSAKLSAvKioKLSAgKiBBIHNpdGUgY29udGVudCBjb25zdW1lciBtYW5hZ2VzIHRoZSBzdG9yYWdlIG9yIGFyY2hpdmVzLCBwbHVnaW5zIGFuZAotICAqIGZlYXR1cmUgaW5zaWRlIGFuIDxjb2RlPiBJU2l0ZTwvY29kZT4KLSAgKi8KLSAKLXB1YmxpYyBpbnRlcmZhY2UgSVNpdGVDb250ZW50Q29uc3VtZXIgewotCi0JLyoqCi0JICogU3RvcmVzIGEgY29udGVudCByZWZlcmVuY2UgaW50byB0aGUgU2l0ZUNvbnRlbnRDb25zdW1lcgotCSAqIEBwYXJhbSBjb250ZW50UmVmZXJlbmNlIHRoZSBjb250ZW50IHJlZmVyZW5jZSB0byBzdG9yZQotCSAqIEBwYXJhbSBtb25pdG9yIHRoZSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyBzdG9yaW5nIHRoZSBjb250ZW50IHJlZmVyZW5jZQotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogb3BlbnMgYSBOb24gcGx1Z2luIEVudHJ5IGZvciBzdG9yYWdlCi0JICogQHJldHVybiB0aGUgbmV3IEZlYXR1cmVDb250ZW50Q29uc3VtZXIgZm9yIHRoaXMgPGNvZGU+SU5vblBsdWdpbkVudHJ5PC9jb2RlPgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbiBpZiB0aGUgb3BlbnMgaXMgZG9uZSBvbiBhIEZlYXR1cmVDb250ZW50Q29uc3VtZXIgcGFyZW50IG90aGVyIHRoYW4gYW4gSUZlYXR1cmUuCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRDb25zdW1lciBvcGVuKElOb25QbHVnaW5FbnRyeSBub25QbHVnaW5FbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBvcGVucyBhIE5vbiBwbHVnaW4gRW50cnkgZm9yIHN0b3JhZ2UKLQkgKiBAcmV0dXJuIHRoZSBuZXcgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBmb3IgdGhpcyA8Y29kZT5JUGx1Z2luRW50cnk8L2NvZGU+Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uIGlmIHRoZSBvcGVucyBpcyBkb25lIG9uIGEgRmVhdHVyZUNvbnRlbnRDb25zdW1lciBwYXJlbnQgb3RoZXIgdGhhbiBhbiBJRmVhdHVyZS4KLQkgKiBAc2luY2UgMi4wIAotCSAqLwotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQkKLQkvKioKLQkgKiBjbG9zZXMgdGhlIG9wZW5lZCBTaXRlQ29udGVudENvbnN1bWVyCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMCAKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiA7CQotCQotCi0JLyoqCi0JICogYWJvcnRzIHRoZSBvcGVuZWQgU2l0ZUNvbnRlbnRDb25zdW1lcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAgCi0JICovCi0JcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsJCQotCQotfQotCi0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVN0YXR1c0NvZGVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lTdGF0dXNDb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTgyZDdiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVN0YXR1c0NvZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi0vKioKLSAqIEhUVFAgc3RhdHVzIGNvZGVzLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIAotICogZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIAotICogSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyAKLSAqIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdGF0dXNDb2RlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9DT05USU5VRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1NXSVRDSElOR19QUk9UT0NPTFMgPSAxMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9PSyA9IDIwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0NSRUFURUQgPSAyMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9BQ0NFUFRFRCA9IDIwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX05PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OID0gMjAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTk9fQ09OVEVOVCA9IDIwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1JFU0VUX0NPTlRFTlQgPSAyMDU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QQVJUSUFMX0NPTlRFTlQgPSAyMDY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9NVUxUSVBMRV9DSE9JQ0VTID0gMzAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfTU9WRURfUEVSTUFORU5UTFkgPSAzMDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9NT1ZFRF9URU1QT1JBUklMWSA9IDMwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1NFRV9PVEhFUiA9IDMwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX05PVF9NT0RJRklFRCA9IDMwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1VTRV9QUk9YWSA9IDMwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1RFTVBPUkFSWV9SRURJUkVDVCA9IDMwNzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0JBRF9SRVFVRVNUID0gNDAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfVU5BVVRIT1JJWkVEID0gNDAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUEFZTUVOVF9SRVFVSVJFRCA9IDQwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0ZPUkJJRERFTiA9IDQwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX05PVF9GT1VORCA9IDQwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX01FVEhPRF9OT1RfQUxMT1dFRCA9IDQwNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX05PVF9BQ0NFUFRBQkxFID0gNDA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSA0MDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9SRVFVRVNUX1RJTUVPVVQgPSA0MDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9DT05GTElDVCA9IDQwOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX0dPTkUgPSA0MTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9MRU5HVEhfUkVRVUlSRUQgPSA0MTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9QUkVDT05ESVRJT05fRkFJTEVEID0gNDEyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfUkVRVUVTVF9UT09fTE9ORyA9IDQxMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1JFUVVFU1RfVVJJX1RPT19MT05HID0gNDE0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhUVFBfVU5TVVBQT1JURURfTUVESUFfVFlQRSA9IDQxNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1JFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgPSA0MTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9FWFBFQ1RBVElPTl9GQUlMRUQgPSA0MTc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IgPSA1MDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9OT1RfSU1QTEVNRU5URUQgPSA1MDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9CQURfR0FURVdBWSA9IDUwMjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIVFRQX1NFUlZJQ0VfVU5BVkFJTEFCTEUgPSA1MDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9HQVRFV0FZX1RJTUVPVVQgPSA1MDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSFRUUF9IVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCA9IDUwNTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVdyaXRhYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lXcml0YWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYzZDg0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVdyaXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLQ0KLS8qKg0KLSAqIENhbGxlZCB3aGVuIHdlIHdhbnQgdGhlIG1vZGVsIHRvIHBlcnNpc3QgYXMgWE1MDQotICovDQotDQotcHVibGljIGludGVyZmFjZSBJV3JpdGFibGUgew0KLQkNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5ERU5UID0gMzsNCi0NCi0Jdm9pZCB3cml0ZShpbnQgaW5kZW50LCBQcmludFdyaXRlciB3KTsNCi0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsQ29uZmlndXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmZlOTdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlZlcnNpb25lZElkZW50aWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOw0KLQ0KLS8qKg0KLSAqIE1hbmFnZXMgQ29uZmlndXJlZFNpdGVzDQotICoNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGltcGxlbWVudHMgSUluc3RhbGxDb25maWd1cmF0aW9uIHsNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5zdGFydHNXaXRoKCJXaW4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCXByaXZhdGUgTGlzdGVuZXJzTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJzTGlzdCgpOw0KLQ0KLQkvKg0KLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yLg0KLQkgKi8NCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uKCkgew0KLQl9DQotDQotCS8qDQotCSAqIENvcHkgY29uc3RydWN0b3IgDQotCSAqIEBzaW5jZSAzLjANCi0JICovDQotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbihJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCXRoaXMoY29uZmlnLCBudWxsLCBudWxsKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogY29weSBjb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIFVSTCBuZXdMb2NhdGlvbiwgU3RyaW5nIGxhYmVsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCS8vIHNldCBjdXJyZW50IGRhdGUgYW5kIHRpbWVsaW5lIGFzIGNhbGxlciBjYW4gY2FsbCBzZXREYXRlIGlmIHRoZQ0KLQkJLy8gZGF0ZSBvbiB0aGUgVVJMIHN0cmluZyBoYXMgdG8gYmUgdGhlIHNhbWUNCi0JCURhdGUgbm93ID0gbmV3IERhdGUoKTsNCi0JCXNldENyZWF0aW9uRGF0ZShub3cpOw0KLQkJc2V0Q3VycmVudChmYWxzZSk7DQotCQkNCi0JCWlmIChuZXdMb2NhdGlvbiA9PSBudWxsKSB7DQotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldExvY2FsUmFuZG9tSWRlbnRpZmllcihTaXRlTG9jYWwuQ09ORklHX0ZJTEUsIG5vdyk7DQotCQkJbmV3TG9jYXRpb24gPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLCBuZXdGaWxlTmFtZSwgbnVsbCk7DQotCQl9DQotCQlzZXRMb2NhdGlvblVSTFN0cmluZyhuZXdMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQ0KLQkJaWYgKGxhYmVsID09IG51bGwpDQotCQkJbGFiZWwgPSBVdGlsaXRpZXMuZm9ybWF0KG5vdyk7DQotCQlzZXRMYWJlbChsYWJlbCk7DQotDQotCQkvLyBkbyBub3QgY29weSBsaXN0IG9mIGxpc3RlbmVycyBub3IgYWN0aXZpdGllcw0KLQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIHNpdGVDb25maWd1cmF0aW9uIG9iamVjdA0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKSB7DQotCQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJCWlmIChjc2l0ZXMgIT0gbnVsbCkgew0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IG5ldyBDb25maWd1cmVkU2l0ZShjc2l0ZXNbaV0pOw0KLQkJCQkJYWRkQ29uZmlndXJhdGlvblNpdGVNb2RlbChjb25maWdTaXRlKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXJlc29sdmUobmV3TG9jYXRpb24sIG51bGwpOw0KLQkJLy8gbm8gbmVlZCB0byBwYXJzZSBmaWxlLCBhbGwgZGF0YSBhcmUgaW5pdGlhbGl6ZWQNCi0JCWluaXRpYWxpemVkID0gdHJ1ZTsNCi0JfQ0KLQkNCi0NCi0JLyoNCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBjb25maWd1cmVkIHNpdGVzIG9yIGFuIGVtcHR5IGFycmF5DQotCSAqLw0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlW10gZ2V0Q29uZmlndXJlZFNpdGVzKCkgew0KLQkJQ29uZmlndXJlZFNpdGVNb2RlbFtdIHJlc3VsdCA9IGdldENvbmZpZ3VyYXRpb25TaXRlc01vZGVsKCk7DQotCQlpZiAocmVzdWx0Lmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyZWRTaXRlWzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAoSUNvbmZpZ3VyZWRTaXRlW10pIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHNpdGUgcG9saWN5DQotCSAqLw0KLQlwcml2YXRlIGludCBnZXREZWZhdWx0UG9saWN5KCkgew0KLQkJcmV0dXJuIElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDcmVhdGVzIGEgQ29uZmlndXJhdGlvbiBTaXRlIGFuZCBhIG5ldyBTaXRlDQotCSAqIFRoZSBwb2xpY3kgaXMgZnJvbSA8Y29kZT4gb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybUNvbmZpZ3VyYXRpb248L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGNyZWF0ZUNvbmZpZ3VyZWRTaXRlKEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKCFmaWxlLmdldE5hbWUoKS5lcXVhbHMoImVjbGlwc2UiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJZmlsZSA9IG5ldyBGaWxlKGZpbGUsICJlY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQNCi0JCQlmaWxlLm1rZGlycygpOw0KLQkJfQ0KLQkJDQotCQlpZiAoaXNEdXBsaWNhdGVTaXRlKGZpbGUpKQ0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5sb2NhdGlvbi5leGlzdHMiLCBmaWxlLmdldFBhdGgoKSksbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCUlTaXRlIHNpdGUgPSBJbnRlcm5hbFNpdGVNYW5hZ2VyLmNyZWF0ZVNpdGUoZmlsZSk7DQotDQotCQkvL2NyZWF0ZSBhIGNvbmZpZyBzaXRlIGFyb3VuZCB0aGUgc2l0ZQ0KLQkJLy8gZXZlbiBpZiB0aGUgc2l0ZSA9PSBudWxsDQotCQlCYXNlU2l0ZUxvY2FsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCk7DQotCQlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBmYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoKFNpdGVNb2RlbCkgc2l0ZSwgZ2V0RGVmYXVsdFBvbGljeSgpKTsNCi0NCi0JCWlmIChjb25maWdTaXRlLmlzTmF0aXZlbHlMaW5rZWQoKSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5BbHJlYWR5TmF0aXZlbHlMaW5rZWQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCQ0KLQkJaWYgKGNvbmZpZ1NpdGUuaXNQcm9kdWN0U2l0ZSgpKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLkFscmVhZHlQcm9kdWN0U2l0ZSIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJDQotCQlpZiAoc2l0ZSAhPSBudWxsKSB7DQotCQkJY29uZmlnU2l0ZS5zZXRQbGF0Zm9ybVVSTFN0cmluZyhzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQ0KLQkJCS8vIG9idGFpbiB0aGUgbGlzdCBvZiBwbHVnaW5zDQotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsNCi0JCQlDb25maWd1cmF0aW9uUG9saWN5IGNvbmZpZ3VyYXRpb25Qb2xpY3kgPSBjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsNCi0JCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gbmV3IFN0cmluZ1swXTsNCi0JCQlpZiAoY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSA9PSBJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSkNCi0JCQkJcGx1Z2luUGF0aCA9IGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UGx1Z2luUGF0aChzaXRlKTsNCi0NCi0JCQkvLyBjcmVhdGUgbmV3IFNpdGUgaW4gY29uZmlndXJhdGlvbg0KLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc2l0ZVBvbGljeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVQb2xpY3koY29uZmlndXJhdGlvblBvbGljeS5nZXRQb2xpY3koKSwgcGx1Z2luUGF0aCk7DQotDQotCQkJLy8gY2hhbmdlIHJ1bnRpbWUNCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZUVudHJ5KHNpdGUuZ2V0VVJMKCksIHNpdGVQb2xpY3kpOw0KLQkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsNCi0NCi0JCQkvLyBpZiB0aGUgcHJpdmF0cmUgbWFya2VyIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBjcmVhdGUgaXQNCi0JCQljb25maWdTaXRlLmNyZWF0ZVByaXZhdGVTaXRlTWFya2VyKCk7DQotCQl9DQotCQkvLyBjb25maWd1cmUgYWxsIGZlYXR1cmVzIGFzIGVuYWJsZQ0KLQkJY29uZmlndXJlKGNvbmZpZ1NpdGUpOw0KLQkJDQotCQlyZXR1cm4gY29uZmlnU2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlcyBhIENvbmZpZ3VyYXRpb24gU2l0ZSBhbmQgYSBuZXcgU2l0ZSBhcyBhIHByaXZhdGUgbGluayBzaXRlDQotCSAqIFRoZSBwb2xpY3kgaXMgZnJvbSA8Y29kZT4gb3JnLmVjbGlwc2UuY29yZS5ib290LklQbGF0Zm9ybUNvbmZpZ3VyYXRpb248L2NvZGU+DQotCSAqLw0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGNyZWF0ZUxpbmtlZENvbmZpZ3VyZWRTaXRlKEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOw0KLS8vCQlpZiAoaXNEdXBsaWNhdGVTaXRlKGZpbGUpKQ0KLS8vCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oVXBkYXRlVXRpbHMuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbENvbmZpZ3VyYXRpb24ubG9jYXRpb24uZXhpc3RzIiwgZmlsZS5nZXRQYXRoKCkpLG51bGwpOw0KLS8vCQkNCi0vLwkJSVNpdGUgc2l0ZSA9IEludGVybmFsU2l0ZU1hbmFnZXIuY3JlYXRlU2l0ZShmaWxlKTsNCi0vLw0KLS8vCQkvL2NyZWF0ZSBhIGNvbmZpZyBzaXRlIGFyb3VuZCB0aGUgc2l0ZQ0KLS8vCQkvLyBldmVuIGlmIHRoZSBzaXRlID09IG51bGwNCi0vLwkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOw0KLS8vCQlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gKENvbmZpZ3VyZWRTaXRlKSBmYWN0b3J5LmNyZWF0ZUNvbmZpZ3VyYXRpb25TaXRlTW9kZWwoKFNpdGVNb2RlbCkgc2l0ZSwgZ2V0RGVmYXVsdFBvbGljeSgpKTsNCi0vLw0KLS8vCQlpZiAoIWNvbmZpZ1NpdGUuaXNFeHRlbnNpb25TaXRlKCkpIHsNCi0vLwkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uTm90QW5FeHRlbnNpb25TaXRlIik7DQotLy8JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG51bGwpOw0KLS8vCQl9DQotLy8NCi0vLwkJaWYgKGNvbmZpZ1NpdGUuaXNOYXRpdmVseUxpbmtlZCgpKSB7DQotLy8JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiSW5zdGFsbENvbmZpZ3VyYXRpb24uQWxyZWFkeU5hdGl2ZWx5TGlua2VkIiwgbnVsbCk7DQotLy8JCX0NCi0vLw0KLS8vCQlpZiAoc2l0ZSAhPSBudWxsKSB7DQotLy8JCQljb25maWdTaXRlLnNldFBsYXRmb3JtVVJMU3RyaW5nKHNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotLy8NCi0vLwkJCS8vIG9idGFpbiB0aGUgbGlzdCBvZiBwbHVnaW5zDQotLy8JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOw0KLS8vCQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWd1cmF0aW9uUG9saWN5ID0gY29uZmlnU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCk7DQotLy8JCQlTdHJpbmdbXSBwbHVnaW5QYXRoID0gbmV3IFN0cmluZ1swXTsNCi0vLwkJCWlmIChjb25maWd1cmF0aW9uUG9saWN5LmdldFBvbGljeSgpID09IElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKQ0KLS8vCQkJCXBsdWdpblBhdGggPSBjb25maWd1cmF0aW9uUG9saWN5LmdldFBsdWdpblBhdGgoc2l0ZSk7DQotLy8NCi0vLwkJCS8vIGNyZWF0ZSBuZXcgU2l0ZSBpbiBjb25maWd1cmF0aW9uDQotLy8JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5IHNpdGVQb2xpY3kgPSBydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVTaXRlUG9saWN5KGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UG9saWN5KCksIHBsdWdpblBhdGgpOw0KLS8vDQotLy8JCQkvLyBjaGFuZ2UgcnVudGltZQ0KLS8vCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNpdGVFbnRyeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZVNpdGVFbnRyeShzaXRlLmdldFVSTCgpLCBzaXRlUG9saWN5KTsNCi0vLwkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLmNvbmZpZ3VyZVNpdGUoc2l0ZUVudHJ5KTsNCi0vLw0KLS8vCQl9DQotLy8NCi0vLwkJLy8gY29uZmlndXJlIGFsbCBmZWF0dXJlcyBhcyBlbmFibGUNCi0vLwkJY29uZmlndXJlKGNvbmZpZ1NpdGUpOw0KLS8vDQotLy8JCXJldHVybiBjb25maWdTaXRlOw0KLQl9DQotDQotCS8qDQotCSAqQ29uZmlndXJlIGFsbCBmZWF0dXJlcyBhcyBFbmFibGUgQ2hlY2sgd2Ugb25seSBlbmFibGUgaGlnaGVzdCB2ZXJzaW9uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlKENvbmZpZ3VyZWRTaXRlIGxpbmtlZFNpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlTaXRlIHNpdGUgPSBsaW5rZWRTaXRlLmdldFNpdGUoKTsNCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIG5ld0ZlYXR1cmVzUmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdGZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgew0KLQkJCS8vIFRSQUNFDQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsNCi0JCQkJU3RyaW5nIHJlY29uY2lsaWF0aW9uVHlwZSA9ICJlbmFibGUgKG9wdGltaXN0aWMpIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJOZXcgTGlua2VkIFNpdGU6TmV3IEZlYXR1cmU6ICIgKyBuZXdGZWF0dXJlc1JlZltpXS5nZXRVUkwoKSArICIgYXMgIiArIHJlY29uY2lsaWF0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCX0NCi0JCQlDb25maWd1cmF0aW9uUG9saWN5IHBvbGljeSA9IGxpbmtlZFNpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOw0KLQkJCXBvbGljeS5jb25maWd1cmUobmV3RmVhdHVyZXNSZWZbaV0sIHRydWUsIGZhbHNlKTsNCi0JCX0NCi0JCVNpdGVSZWNvbmNpbGVyLmNoZWNrQ29uZmlndXJlZEZlYXR1cmVzKGxpbmtlZFNpdGUpOw0KLQl9DQotDQotCS8qDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRDb25maWd1cmVkU2l0ZShJQ29uZmlndXJlZFNpdGUgc2l0ZSkgew0KLQkJaWYgKCFpc0N1cnJlbnQoKSAmJiBpc1JlYWRPbmx5KCkpDQotCQkJcmV0dXJuOw0KLQ0KLQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5IGFjdGl2aXR5ID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eShJQWN0aXZpdHkuQUNUSU9OX1NJVEVfSU5TVEFMTCk7DQotCQlhY3Rpdml0eS5zZXRMYWJlbChzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7DQotCQlDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ1NpdGVNb2RlbCA9IChDb25maWd1cmVkU2l0ZU1vZGVsKSBzaXRlOw0KLQkJYWRkQ29uZmlndXJhdGlvblNpdGVNb2RlbChjb25maWdTaXRlTW9kZWwpOw0KLQkJY29uZmlnU2l0ZU1vZGVsLnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwodGhpcyk7DQotDQotCQkvLyBub3RpZnkgbGlzdGVuZXJzDQotCQlPYmplY3RbXSBjb25maWd1cmF0aW9uTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKChJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIpIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcnNbaV0pOw0KLQkJCWxpc3RlbmVyLmluc3RhbGxTaXRlQWRkZWQoc2l0ZSk7DQotCQl9DQotDQotCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sNCi0JCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsNCi0JCXRoaXMuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOw0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgYWRkQWN0aXZpdHkuDQotCSAqIEBwYXJhbSBhY3Rpdml0eQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQWN0aXZpdHkoSUFjdGl2aXR5IGFjdGl2aXR5KSB7DQotCQlhZGRBY3Rpdml0eU1vZGVsKChDb25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbClhY3Rpdml0eSk7DQotCX0NCi0NCi0JLyoNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbmZpZ3VyZWRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7DQotCQlpZiAoIWlzQ3VycmVudCgpICYmIGlzUmVhZE9ubHkoKSkNCi0JCQlyZXR1cm47DQotDQotCQlpZiAocmVtb3ZlQ29uZmlndXJhdGlvblNpdGVNb2RlbCgoQ29uZmlndXJlZFNpdGVNb2RlbCkgc2l0ZSkpIHsNCi0JCQkvLyBub3RpZnkgbGlzdGVuZXJzDQotCQkJT2JqZWN0W10gY29uZmlndXJhdGlvbkxpc3RlbmVycyA9IGxpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25MaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gKChJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIpIGNvbmZpZ3VyYXRpb25MaXN0ZW5lcnNbaV0pOw0KLQkJCQlsaXN0ZW5lci5pbnN0YWxsU2l0ZVJlbW92ZWQoc2l0ZSk7DQotCQkJfQ0KLQkJCQ0KLQkJCS8vYWN0aXZpdHkNCi0JCQlDb25maWd1cmF0aW9uQWN0aXZpdHkgYWN0aXZpdHkgPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUpOw0KLQkJCWFjdGl2aXR5LnNldExhYmVsKHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7DQotCQkJYWN0aXZpdHkuc2V0U3RhdHVzKElBY3Rpdml0eS5TVEFUVVNfT0spOw0KLQkJCXRoaXMuYWRkQWN0aXZpdHkoYWN0aXZpdHkpOw0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUluc3RhbGxDb25maWd1cmF0aW9uI2FkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcikNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJc3luY2hyb25pemVkIChsaXN0ZW5lcnMpIHsNCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElJbnN0YWxsQ29uZmlndXJhdGlvbiNyZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihJSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7DQotCQl9DQotCX0NCi0NCi0NCi0JLyoNCi0JICogRGVsZXRlcyB0aGUgY29uZmlndXJhdGlvbiBmcm9tIGl0cyBVUkwvbG9jYXRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsNCi0JCS8vIHNhdmUgdGhlIGNvbmZpZ3VyYXRpb24NCi0JCWlmICgiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShnZXRVUkwoKS5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJLy8gdGhlIGxvY2F0aW9uIHBvaW50cyB0byBhIGZpbGUNCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRVUkwoKS5nZXRGaWxlKCkpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2F2ZXMgdGhlIGNvbmZpZ3VyYXRpb24gaW50byBpdHMgVVJML2xvY2F0aW9uDQotCSAqIGFuZCBjaGFuZ2VzIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLg0KLQkgKiBUaGUgcnVudGltZSBzaXRlIGVudHJpZXMgZnJvbSBwbGF0Zm9ybS54bWwgYXJlIHVwZGF0ZWQgYXMgcmVxdWlyZWQNCi0JICogKGNhbm5vdCByZWNyZWF0ZSB0aGVzZSBiZWNhdXNlIG11c3QgcHJlc2VydmUgb3RoZXIgcnVudGltZSBzdGF0ZSkgWzE4NTIwXQ0KLQkgKiBAcmV0dXJuIHRydWUgaWYgcmVzdGFydCBpcyBuZWVkZWQNCi0JICovDQotCXB1YmxpYyBib29sZWFuIHNhdmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkNCi0JCS8vIFdyaXRlIGluZm8gIGludG8gcGxhdGZvcm0gZm9yIHRoZSBuZXh0IHJ1bnRpbWUNCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZ3VyYXRpb24gPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7DQotCQlDb25maWd1cmVkU2l0ZU1vZGVsW10gY29uZmlndXJhdGlvblNpdGVzID0gZ2V0Q29uZmlndXJhdGlvblNpdGVzTW9kZWwoKTsNCi0NCi0JCS8vIGNsZWFuIGNvbmZpZ3VyZWQgRW50cmllcyBmcm9tIHBsYXRmb3JtIHJ1bnRpbWUNCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSUZlYXR1cmVFbnRyeVtdIGNvbmZpZ3VyZWRGZWF0dXJlRW50cmllcyA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRGZWF0dXJlRW50cmllcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkRmVhdHVyZUVudHJpZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlydW50aW1lQ29uZmlndXJhdGlvbi51bmNvbmZpZ3VyZUZlYXR1cmVFbnRyeShjb25maWd1cmVkRmVhdHVyZUVudHJpZXNbaV0pOw0KLQkJfQ0KLQ0KLQkJLy8gWzE5OTU4XSByZW1lbWJlciBzaXRlcyBjdXJyZW50bHkgY29uZmlndXJlZCBieSBydW50aW1lICh1c2UNCi0JCS8vIHRlbXAgY29uZmlndXJhdGlvbiBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJhaWdodCBsaXN0IHRvIGVuc3VyZQ0KLQkJLy8gY29ycmVjdCBsb29rdXApDQotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIHRlbXBDb25maWcgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQl0ZW1wQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0UGxhdGZvcm1Db25maWd1cmF0aW9uKG51bGwpOw0KLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeVtdIHRtcFNpdGVzID0gcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0bXBTaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCQl0ZW1wQ29uZmlnLmNvbmZpZ3VyZVNpdGUodG1wU2l0ZXNbaV0pOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBhc3N1bWUgbm8gY3VycmVudGx5IGNvbmZpZ3VyZWQgc2l0ZXMNCi0JCX0NCi0NCi0JCS8vY2hlY2sgc2l0ZXMNCi0JCWNoZWNrU2l0ZXMoY29uZmlndXJhdGlvblNpdGVzLCBydW50aW1lQ29uZmlndXJhdGlvbik7DQotDQotCQkvLyBTYXZlIHRoZSBwbHVnaW4gcGF0aCwgcHJpbWFyeSBmZWF0dXJlIGFuZCBwbGF0Zm9ybQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uU2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9ICgoQ29uZmlndXJlZFNpdGUpIGNvbmZpZ3VyYXRpb25TaXRlc1tpXSk7DQotCQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWd1cmF0aW9uUG9saWN5ID0gY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOw0KLQ0KLQkJCXNhdmVQbHVnaW5QYXRoKGNTaXRlLCBydW50aW1lQ29uZmlndXJhdGlvbiwgdGVtcENvbmZpZyk7DQotDQotCQkJLy8gSUYgcHJpbWFyeSBmZWF0dXJlIFVSTCBvciBwbGF0Zm9ybSBmZWF0dXJlIFVSTCB0aGF0IHdlIG5lZWQgdG8gcGFzcyB0byBydW50aW1lIGNvbmZpZw0KLQkJCS8vIGlzIHBhcnQgb2YgcGxhdGZvcm06YmFzZTosIHdyaXRlIGl0IGFzIHBsYXRmb3JtOmJhc2U6IFVSTA0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzUmVmID0gY29uZmlndXJhdGlvblBvbGljeS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNvbmZpZ3VyZWRGZWF0dXJlc1JlZi5sZW5ndGg7IGorKykgew0KLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCi0JCQkJdHJ5IHsNCi0JCQkJCWZlYXR1cmUgPSBjb25maWd1cmVkRmVhdHVyZXNSZWZbal0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJCX0NCi0JCQkJc2F2ZUZlYXR1cmVFbnRyeShjU2l0ZSwgZmVhdHVyZSwgcnVudGltZUNvbmZpZ3VyYXRpb24pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIFsxOTk1OF0gcmVtb3ZlIGFueSBleHRyYSBzaXRlIGVudHJpZXMgZnJvbSBydW50aW1lIGNvbmZpZ3VyYXRpb24NCi0JCS8vIChzaXRlIGVudHJpZXMgdGhhdCBubyBsb25nZXIgZXhpc3QgaW4gdGhpcyBjb25maWd1cmF0aW9uKQ0KLQkJaWYgKHRlbXBDb25maWcgIT0gbnVsbCkgew0KLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVFbnRyeVtdIHRtcFNpdGVzID0gdGVtcENvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRtcFNpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJCXJ1bnRpbWVDb25maWd1cmF0aW9uLnVuY29uZmlndXJlU2l0ZSh0bXBTaXRlc1tpXSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJdHJ5IHsNCi0JCQlydW50aW1lQ29uZmlndXJhdGlvbi5zYXZlKCk7DQotCQkJLy8gbG9nIGNvbmZpZ3VyYXRpb24gYW5kIGFjdGl2aXRpZXMNCi0JCQl0aGlzLmRhdGUgPSBuZXcgRGF0ZShydW50aW1lQ29uZmlndXJhdGlvbi5nZXRDaGFuZ2VTdGFtcCgpKTsNCi0JCQlpZiAoImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UoZ2V0VVJMKCkuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQNCi0JCQkJVXBkYXRlQ29yZS5sb2codGhpcyk7DQotCQkJcmVzZXRBY3Rpdml0aWVzKCk7DQotCQkJcmV0dXJuIGlzUmVzdGFydE5lZWRlZChydW50aW1lQ29uZmlndXJhdGlvbik7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJQ29yZUV4Y2VwdGlvbiBleGMgPSBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9TYXZlUGxhdGZvcm1Db25maWd1cmF0aW9uIiwgcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJVXBkYXRlQ29yZS53YXJuKCIiLGV4Yyk7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCS8qDQotCSAqIFdyaXRlIHRoZSBwbHVnaW4gcGF0aCBmb3IgZWFjaCBzaXRlDQotCSAqIERvIG5vdCBjaGVjayBpZiB0aGUgc2l0ZSBhbHJlYWR5IGV4aXN0ZWQgYmVmb3JlIFsxNjY5Nl0uDQotCSAqIFJldXNlIGFueSBydW50aW1lIHNpdGUgb2JqZWN0cyBpbiBwbGF0Zm9ybS5jZmcgKHRvIHByZXNlcnZlIHN0YXRlKSBbMTg1MjBdLg0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHNhdmVQbHVnaW5QYXRoKENvbmZpZ3VyZWRTaXRlIGNTaXRlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHRlbXBDb25maWcpIC8vIFsxOTk1OF0NCi0JdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJQ29uZmlndXJhdGlvblBvbGljeSBjb25maWd1cmF0aW9uUG9saWN5ID0gY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOw0KLQ0KLQkJLy8gY3JlYXRlIGEgSVNpdGVQb2xpY3kgKHBvbGljeSwgcGx1Z2luUGF0aCkNCi0JCS8vIGZvciB0aGUgc2l0ZQ0KLQkJU3RyaW5nW10gcGx1Z2luUGF0aCA9IGNvbmZpZ3VyYXRpb25Qb2xpY3kuZ2V0UGx1Z2luUGF0aChjU2l0ZS5nZXRTaXRlKCkpOw0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeSBzaXRlUG9saWN5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uY3JlYXRlU2l0ZVBvbGljeShjb25maWd1cmF0aW9uUG9saWN5LmdldFBvbGljeSgpLCBwbHVnaW5QYXRoKTsNCi0NCi0JCS8vIGdldCB0aGUgVVJMIG9mIHRoZSBzaXRlIHRoYXQgbWF0Y2hlcyB0aGUgb25lIHBsYXRmb3JtLmNmZyBnYXZlIHVzDQotCQlVUkwgdXJsVG9DaGVjayA9IG51bGw7DQotCQl0cnkgew0KLQkJCXVybFRvQ2hlY2sgPSBuZXcgVVJMKGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCkpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9DcmVhdGVVUkwiLCBjU2l0ZS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvQ2FzdCIpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQ0KLQkJLy8gdXBkYXRlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBbMTg1MjBdDQotCQkvLyBOb3RlOiB3ZSBtdXN0IG5vdCBibGluZGx5IHJlcGxhY2UgdGhlIHNpdGUgZW50cmllcyBiZWNhdXNlIHRoZXkNCi0JCS8vICAgICAgIGNvbnRhaW4gYWRkaXRpb25hbCBydW50aW1lIHN0YXRlIHRoYXQgbmVlZHMgdG8gYmUgcHJlc2VydmVkLg0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNpdGVFbnRyeSA9IHJ1bnRpbWVDb25maWd1cmF0aW9uLmZpbmRDb25maWd1cmVkU2l0ZSh1cmxUb0NoZWNrKTsNCi0JCWlmIChzaXRlRW50cnkgPT0gbnVsbCkNCi0JCQlzaXRlRW50cnkgPSBydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVTaXRlRW50cnkodXJsVG9DaGVjaywgc2l0ZVBvbGljeSk7DQotCQllbHNlIHsNCi0JCQlzaXRlRW50cnkuc2V0U2l0ZVBvbGljeShzaXRlUG9saWN5KTsNCi0JCQkoKFNpdGVFbnRyeSlzaXRlRW50cnkpLnJlZnJlc2hQbHVnaW5zKCk7DQotCQkJaWYgKHRlbXBDb25maWcgIT0gbnVsbCkgLy8gWzE5OTU4XSByZW1vdmUgcmV1c2VkIGVudHJpZXMgZnJvbSBsaXN0DQotCQkJCXRlbXBDb25maWcudW5jb25maWd1cmVTaXRlKHNpdGVFbnRyeSk7DQotCQl9DQotCQkoKFNpdGVFbnRyeSlzaXRlRW50cnkpLnNldEVuYWJsZWQoY1NpdGUuaXNFbmFibGVkKCkpOw0KLQkJcnVudGltZUNvbmZpZ3VyYXRpb24uY29uZmlndXJlU2l0ZShzaXRlRW50cnksIHRydWUgLypyZXBsYWNlIGlmIGV4aXN0cyovKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBTYXZlIHRoZSBGZWF0dXJlIGVudHJ5DQotCSAqIFRoZSBmZWF0dXJlIGNhbiBiZSBhIHByaW1hcnkgZmVhdHVyZSBhbmQvb3IgYSBwbGF0Zm9ybSBmZWF0dXJlDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgc2F2ZUZlYXR1cmVFbnRyeShDb25maWd1cmVkU2l0ZSBjU2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSwgSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotDQotCQkvLyBnZXQgdGhlIFVSTCBvZiB0aGUgcGx1Z2luIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZlYXR1cmUgKHBsdWdpbmlkID0gZmVhdHVyZWlkKQ0KLQkJU3RyaW5nIGlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJVVJMIHVybCA9IG51bGw7DQotCQlJUGx1Z2luRW50cnkgZmVhdHVyZVBsdWdpbiA9IG51bGw7DQotCQlmb3IgKGludCBrID0gMDsgayA8IGVudHJpZXMubGVuZ3RoOyBrKyspIHsNCi0JCQlpZiAoaWQuZXF1YWxzSWdub3JlQ2FzZShlbnRyaWVzW2tdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKSB7DQotCQkJCXVybCA9IGdldFJ1bnRpbWVDb25maWd1cmF0aW9uVVJMKGVudHJpZXNba10sIGNTaXRlKTsNCi0JCQkJZmVhdHVyZVBsdWdpbiA9IGVudHJpZXNba107DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCVN0cmluZyBwbHVnaW5WZXJzaW9uID0gbnVsbDsNCi0JCWlmIChmZWF0dXJlUGx1Z2luICE9IG51bGwpDQotCQkJcGx1Z2luVmVyc2lvbiA9IGZlYXR1cmVQbHVnaW4uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOw0KLQ0KLQkJLy8gd3JpdGUgdGhlIHByaW1hcnkgZmVhdHVyZXMNCi0JCWlmIChmZWF0dXJlLmlzUHJpbWFyeSgpKSB7DQotCQkJLy8gZ2V0IGFueSBmcmFnbWVudHMgZm9yIHRoZSBmZWF0dXJlIHBsdWdpbg0KLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOw0KLQkJCWlmICh1cmwgIT0gbnVsbCkNCi0JCQkJbGlzdC5hZGQodXJsKTsNCi0JCQlpZiAoZmVhdHVyZVBsdWdpbiAhPSBudWxsKSB7DQotCQkJCVVSTFtdIGZyYWdtZW50cyA9IGdldFJ1bnRpbWVGcmFnbWVudFVSTHMoZmVhdHVyZVBsdWdpbik7DQotCQkJCWxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoZnJhZ21lbnRzKSk7DQotCQkJfQ0KLQkJCVVSTFtdIHJvb3RzID0gKFVSTFtdKSBsaXN0LnRvQXJyYXkobmV3IFVSTFswXSk7DQotCQkJU3RyaW5nIHBsdWdpbklkZW50aWZpZXIgPSBmZWF0dXJlLmdldFByaW1hcnlQbHVnaW5JRCgpOw0KLQ0KLQkJCS8vIHNhdmUgaW5mb3JtYXRpb24gaW4gcnVudGltZSBwbGF0Zm9ybSBzdGF0ZQ0KLQkJCVN0cmluZyB2ZXJzaW9uID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7DQotCQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpOw0KLQkJCUZlYXR1cmVFbnRyeSBmZWF0dXJlRW50cnkgPSAoRmVhdHVyZUVudHJ5KXJ1bnRpbWVDb25maWd1cmF0aW9uLmNyZWF0ZUZlYXR1cmVFbnRyeShpZCwgdmVyc2lvbiwgcGx1Z2luSWRlbnRpZmllciwgcGx1Z2luVmVyc2lvbiwgdHJ1ZSwgYXBwbGljYXRpb24sIHJvb3RzKTsNCi0JCQlmZWF0dXJlRW50cnkuc2V0VVJMKGdldEZlYXR1cmVSZWxhdGl2ZVVSTChmZWF0dXJlKSk7DQotCQkJU2l0ZUVudHJ5IHNpdGVFbnRyeSA9IChTaXRlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uZmluZENvbmZpZ3VyZWRTaXRlKGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSk7DQotCQkJc2l0ZUVudHJ5LmFkZEZlYXR1cmVFbnRyeShmZWF0dXJlRW50cnkpOw0KLQkJfSBlbHNlIHsNCi0JCQkvLyB3cml0ZSBub24tcHJpbWFyeSBmZWF0dXJlIGVudHJpZXMNCi0JCQlTdHJpbmcgdmVyc2lvbiA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOw0KLQkJCVN0cmluZyBwbHVnaW5JZGVudGlmaWVyID0gZmVhdHVyZS5nZXRQcmltYXJ5UGx1Z2luSUQoKTsNCi0JCQlGZWF0dXJlRW50cnkgZmVhdHVyZUVudHJ5ID0gKEZlYXR1cmVFbnRyeSlydW50aW1lQ29uZmlndXJhdGlvbi5jcmVhdGVGZWF0dXJlRW50cnkoaWQsIHZlcnNpb24sIHBsdWdpbklkZW50aWZpZXIsIHBsdWdpblZlcnNpb24sIGZhbHNlLCBudWxsLCBudWxsKTsNCi0JCQlmZWF0dXJlRW50cnkuc2V0VVJMKGdldEZlYXR1cmVSZWxhdGl2ZVVSTChmZWF0dXJlKSk7DQotCQkJU2l0ZUVudHJ5IHNpdGVFbnRyeSA9IChTaXRlRW50cnkpcnVudGltZUNvbmZpZ3VyYXRpb24uZmluZENvbmZpZ3VyZWRTaXRlKGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSk7DQotCQkJc2l0ZUVudHJ5LmFkZEZlYXR1cmVFbnRyeShmZWF0dXJlRW50cnkpOw0KLQkJfQ0KLQ0KLQkJLy8gd3JpdGUgdGhlIHBsYXRmb3JtIGZlYXR1cmVzIChmZWF0dXJlcyB0aGF0IGNvbnRhaW4gc3BlY2lhbCBwbGF0Zm9ybSBwbHVnaW5zKQ0KLQkJSVBsdWdpbkVudHJ5W10gcGxhdGZvcm1QbHVnaW5zID0gZ2V0UGxhdGZvcm1QbHVnaW5zKGZlYXR1cmUsIHJ1bnRpbWVDb25maWd1cmF0aW9uKTsNCi0JCWZvciAoaW50IGsgPSAwOyBrIDwgcGxhdGZvcm1QbHVnaW5zLmxlbmd0aDsgaysrKSB7DQotCQkJaWQgPSBwbGF0Zm9ybVBsdWdpbnNba10uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsNCi0JCQl1cmwgPSBnZXRSdW50aW1lQ29uZmlndXJhdGlvblVSTChwbGF0Zm9ybVBsdWdpbnNba10sIGNTaXRlKTsNCi0JCQlpZiAodXJsICE9IG51bGwpIHsNCi0JCQkJcnVudGltZUNvbmZpZ3VyYXRpb24uc2V0Qm9vdHN0cmFwUGx1Z2luTG9jYXRpb24oaWQsIHVybCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIExvZyBpZiB3ZSBhcmUgYWJvdXQgdG8gY3JlYXRlIGEgc2l0ZSB0aGF0IGRpZG4ndCBleGlzdCBiZWZvcmUNCi0JICogaW4gcGxhdGZvcm0uY2ZnIFsxNjY5Nl0uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgY2hlY2tTaXRlcyhDb25maWd1cmVkU2l0ZU1vZGVsW10gY29uZmlndXJhdGlvblNpdGVzLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBjaGVjayBhbGwgdGhlIHNpdGVzIHdlIGFyZSBhYm91dCB0byB3cml0ZSBhbHJlYWR5IGV4aXN0ZWQNCi0JCS8vIHRoZXkgc2hvdWxkIGhhdmUgZXhpc3RlZCBlaXRoZXIgYmVjYXVzZSB0aGV5IHdlcmUgY3JlYXRlZCBieQ0KLQkJLy8gdXBkYXRlTWFuYWdlciBvciBiZWNhdXNlIHdlIHJlYWQgdGhlbSBmcm9tIHBsYXRmb3JtLmNmZw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmF0aW9uU2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkvLyBnZXQgdGhlIFVSTCBvZiB0aGUgc2l0ZSB0aGF0IG1hdGNoZXMgdGhlIG9uZSBwbGF0Zm9ybS5jZmcgZ2F2ZSB1cw0KLQkJCVVSTCB1cmxUb0NoZWNrID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQl1cmxUb0NoZWNrID0gbmV3IFVSTChjb25maWd1cmF0aW9uU2l0ZXNbaV0uZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKSk7DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5VbmFibGVUb0NyZWF0ZVVSTCIsIGNvbmZpZ3VyYXRpb25TaXRlc1tpXS5nZXRQbGF0Zm9ybVVSTFN0cmluZygpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvQ2FzdCIpLCBlKTsvLyROT04tTkxTLTEkDQotCQkJfQ0KLQ0KLQkJCS8vIGlmIHRoZSBVUkwgZG9lc24ndCBleGl0cyBsb2cgaXQNCi0JCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgc2l0ZUVudHJ5ID0gcnVudGltZUNvbmZpZ3VyYXRpb24uZmluZENvbmZpZ3VyZWRTaXRlKHVybFRvQ2hlY2spOw0KLQkJCWlmIChzaXRlRW50cnkgPT0gbnVsbCkgew0KLQkJCQlVcGRhdGVDb3JlLndhcm4oUG9saWN5LmJpbmQoIlVuYWJsZSB0byBmaW5kIHNpdGUgezB9IGluIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gezF9LiIsIHVybFRvQ2hlY2sudG9FeHRlcm5hbEZvcm0oKSwgcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSkpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotDQotCS8qDQotCSAqIHJldmVydHMgdGhpcyBjb25maWd1cmF0aW9uIHRvIHRoZSBtYXRjaCB0aGUgbmV3IG9uZQ0KLQkgKg0KLQkgKiBDb21wYXJlIHRoZSBvbGRTaXRlcyB3aXRoIHRoZSBjdXJyZW50T25lLiB0aGUgb2xkIHN0YXRlIGlzIHRoZSBzdGF0ZSB3ZSB3YW50IHRvIHJldmVydCB0by4NCi0JICoNCi0JICogSWYgYSBzaXRlIHdhcyBpbiBvbGQgc3RhdGUsIGJ1dCBub3QgaW4gdGhlIGN1cnJlbnRPbmUsIGtlZXAgaXQgaW4gdGhlIGhhc2guDQotCSAqIElmIGEgc2l0ZSBpcyBpbiB0aGUgY3VycmVudE9uZSBidXQgd2FzIG5vdCBpbiB0aGUgb2xkIHN0YXRlLCB1bmNvbmZpZ3VyZSBhbGwgZmVhdHVyZXMgYW5kIGFkZCBpdCBpbiB0aGUgaGFzaA0KLQkgKiBJZiBhIHNpdGUgd2FzIGluIGJhb3RoIHN0YXRlLCBjYWxjdWxhdGUgdGhlICdkZWx0YScgYW5kIHJlLXNldCBpdCBpbiB0aGUgaGFzaCBtYXANCi0JICoNCi0JICogQXQgdGhlIGVuZCwgc2V0IHRoZSBjb25maWd1cmVkIHNpdGUgZnJvbSB0aGUgbmV3IHNpdGVzIGhhc2ggbWFwDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXZlcnRUbyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsNCi0NCi0JCUlDb25maWd1cmVkU2l0ZVtdIG9sZENvbmZpZ1NpdGVzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCUlDb25maWd1cmVkU2l0ZVtdIG5vd0NvbmZpZ1NpdGVzID0gdGhpcy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0NCi0JCS8vIGNyZWF0ZSBhIGhhc2h0YWJsZSBvZiB0aGUgKm9sZCogYW5kICpuZXcqIHNpdGVzDQotCQlNYXAgb2xkU2l0ZXNNYXAgPSBuZXcgSGFzaHRhYmxlKDApOw0KLQkJTWFwIG5ld1NpdGVzTWFwID0gbmV3IEhhc2h0YWJsZSgwKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkQ29uZmlnU2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlJQ29uZmlndXJlZFNpdGUgZWxlbWVudCA9IG9sZENvbmZpZ1NpdGVzW2ldOw0KLQkJCW9sZFNpdGVzTWFwLnB1dChlbGVtZW50LmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLCBlbGVtZW50KTsNCi0JCQluZXdTaXRlc01hcC5wdXQoZWxlbWVudC5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgZWxlbWVudCk7DQotCQl9DQotCQkvLyBjcmVhdGUgbGlzdCBvZiBhbGwgdGhlIHNpdGVzIHRoYXQgbWFwIHRoZSAqb2xkKiBzaXRlcw0KLQkJLy8gd2Ugd2FudCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIG9sZCBzaXRlcyBhbmQgdGhlIGN1cnJlbnQgc2l0ZXMNCi0JCWlmIChub3dDb25maWdTaXRlcyAhPSBudWxsKSB7DQotCQkJU3RyaW5nIGtleSA9IG51bGw7DQotDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3dDb25maWdTaXRlcy5sZW5ndGg7IGkrKykgew0KLQkJCQlrZXkgPSBub3dDb25maWdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCQkJSUNvbmZpZ3VyZWRTaXRlIG9sZFNpdGUgPSAoSUNvbmZpZ3VyZWRTaXRlKSBvbGRTaXRlc01hcC5nZXQoa2V5KTsNCi0JCQkJaWYgKG9sZFNpdGUgIT0gbnVsbCkgew0KLQkJCQkJLy8gdGhlIFNpdGUgZXhpc3RlZCBiZWZvcmUsIGNhbGN1bGF0ZSB0aGUgZGVsdGEgYmV0d2VlbiBpdHMgY3VycmVudCBzdGF0ZSBhbmQgdGhlDQotCQkJCQkvLyBzdGF0ZSB3ZSBhcmUgcmV2ZXJ0aW5nIHRvIGFuZCBwdXQgaXQgYmFjayBpbnRvIHRoZSBtYXANCi0JCQkJCSAoKENvbmZpZ3VyZWRTaXRlKSBub3dDb25maWdTaXRlc1tpXSkucmV2ZXJ0VG8ob2xkU2l0ZSwgbW9uaXRvciwgaGFuZGxlcik7DQotCQkJCX0gZWxzZSB7DQotCQkJCQkvLyB0aGUgc2l0ZSBkaWRuJ3QgZXhpc3QgaW4gdGhlIEluc3RhbGxDb25maWd1cmF0aW9uIHdlIGFyZSByZXZlcnRpbmcgdG8NCi0JCQkJCS8vIHVuY29uZmlndXJlIGV2ZXJ5dGhpbmcgZnJvbSB0aGlzIHNpdGUgc28gaXQgaXMgc3RpbGwgcHJlc2VudA0KLQkJCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNUb1VuY29uZmlndXJlID0gbm93Q29uZmlnU2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZlYXR1cmVzVG9VbmNvbmZpZ3VyZS5sZW5ndGg7IGorKykgew0KLQkJCQkJCUlGZWF0dXJlIGZlYXR1cmVUb1VuY29uZmlndXJlID0gbnVsbDsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQlmZWF0dXJlVG9VbmNvbmZpZ3VyZSA9IGZlYXR1cmVzVG9VbmNvbmZpZ3VyZVtqXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJCQkJfQ0KLQkJCQkJCWlmIChmZWF0dXJlVG9VbmNvbmZpZ3VyZSAhPSBudWxsKQ0KLQkJCQkJCQlub3dDb25maWdTaXRlc1tpXS51bmNvbmZpZ3VyZShmZWF0dXJlVG9VbmNvbmZpZ3VyZSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJbmV3U2l0ZXNNYXAucHV0KGtleSxub3dDb25maWdTaXRlc1tpXSk7DQotCQkJfQ0KLQ0KLQkJCS8vIHRoZSBuZXcgY29uZmlndXJhdGlvbiBoYXMgdGhlIGV4YWN0IHNhbWUgc2l0ZXMgYXMgdGhlIG9sZCBjb25maWd1cmF0aW9uDQotCQkJLy8gdGhlIG9sZCBjb25maWd1cmF0aW9uIGluIHRoZSBNYXAgYXJlIGVpdGhlciBhcy1pcyBiZWNhdXNlIHRoZXkgZG9uJ3QgZXhpc3QNCi0JCQkvLyBpbiB0aGUgY3VycmVudCBvbmUsIG9yIHRoZXkgYXJlIHRoZSBkZWx0YSBmcm9tIHRoZSBjdXJyZW50IG9uZSB0byB0aGUgb2xkIG9uZQ0KLQkJCUNvbGxlY3Rpb24gc2l0ZXMgPSBuZXdTaXRlc01hcC52YWx1ZXMoKTsNCi0JCQlpZiAoc2l0ZXMgIT0gbnVsbCAmJiAhc2l0ZXMuaXNFbXB0eSgpKSB7DQotCQkJCUNvbmZpZ3VyZWRTaXRlTW9kZWxbXSBzaXRlc01vZGVsID0gbmV3IENvbmZpZ3VyZWRTaXRlTW9kZWxbc2l0ZXMuc2l6ZSgpXTsNCi0JCQkJc2l0ZXMudG9BcnJheShzaXRlc01vZGVsKTsNCi0JCQkJc2V0Q29uZmlndXJhdGlvblNpdGVNb2RlbChzaXRlc01vZGVsKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24jZ2V0QWN0aXZpdGllcygpDQotCSAqLw0KLQlwdWJsaWMgSUFjdGl2aXR5W10gZ2V0QWN0aXZpdGllcygpIHsNCi0JCWlmIChnZXRBY3Rpdml0eU1vZGVsKCkubGVuZ3RoID09IDApDQotCQkJcmV0dXJuIG5ldyBJQWN0aXZpdHlbMF07DQotCQlyZXR1cm4gKElBY3Rpdml0eVtdKSBnZXRBY3Rpdml0eU1vZGVsKCk7DQotCX0NCi0NCi0JLyoNCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBwbGF0Zm9ybSBwbHVnaW5zIG9mIHRoZSBmZWF0dXJlIG9yIGFuIGVtcHR5IGxpc3QNCi0JICogaWYgdGhlIGZlYXR1cmUgZG9lc24ndCBjb250YWluIGFueSBwbGF0Zm9ybSBwbHVnaW5zDQotCSAqLw0KLQlwcml2YXRlIElQbHVnaW5FbnRyeVtdIGdldFBsYXRmb3JtUGx1Z2lucyhJRmVhdHVyZSBmZWF0dXJlLCBJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWd1cmF0aW9uKSB7DQotCQlNYXAgZmVhdHVyZVBsYXRmb3JtUGx1Z2lucyA9IG5ldyBIYXNoTWFwKCk7DQotCQlTdHJpbmdbXSBwbGF0Zm9ybVBsdWdpbklEID0gcnVudGltZUNvbmZpZ3VyYXRpb24uZ2V0Qm9vdHN0cmFwUGx1Z2luSWRlbnRpZmllcnMoKTsNCi0JCUlQbHVnaW5FbnRyeVtdIGZlYXR1cmVQbHVnaW5zID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsYXRmb3JtUGx1Z2luSUQubGVuZ3RoOyBpKyspIHsNCi0JCQlTdHJpbmcgZmVhdHVyZVBsdWdpbklkID0gbnVsbDsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IGZlYXR1cmVQbHVnaW5zLmxlbmd0aDsgaisrKSB7DQotCQkJCWZlYXR1cmVQbHVnaW5JZCA9IGZlYXR1cmVQbHVnaW5zW2pdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7DQotCQkJCWlmIChwbGF0Zm9ybVBsdWdpbklEW2ldLmVxdWFscyhmZWF0dXJlUGx1Z2luSWQpKSB7DQotCQkJCQlmZWF0dXJlUGxhdGZvcm1QbHVnaW5zLnB1dChwbGF0Zm9ybVBsdWdpbklEW2ldLCBmZWF0dXJlUGx1Z2luc1tqXSk7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlDb2xsZWN0aW9uIHZhbHVlcyA9IGZlYXR1cmVQbGF0Zm9ybVBsdWdpbnMudmFsdWVzKCk7DQotCQlpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLnNpemUoKSA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSVBsdWdpbkVudHJ5WzBdOw0KLQ0KLQkJSVBsdWdpbkVudHJ5W10gcmVzdWx0ID0gbmV3IElQbHVnaW5FbnRyeVt2YWx1ZXMuc2l6ZSgpXTsNCi0JCUl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsNCi0JCWludCBpbmRleCA9IDA7DQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCi0JCQlyZXN1bHRbaW5kZXhdID0gKChJUGx1Z2luRW50cnkpIGl0ZXIubmV4dCgpKTsNCi0JCQlpbmRleCsrOw0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiByZXR1cm5zIHRoZSBVUkwgb2YgdGhlIHBsdWdpbkVudHJ5IG9uIHRoZSBzaXRlDQotCSAqIFRyYW5zZm9ybSB0aGUgVVJMIHRvIHVzZSBwbGF0Zm9ybTogcHJvdG9jb2wgaWYgbmVlZGVkDQotCSAqIHJldHVybiBudWxsIGlmIHRoZSBVUkwgdG8gd3JpdGUgaXMgbm90IHZhbGlkDQotCSAqLw0KLQlwcml2YXRlIFVSTCBnZXRSdW50aW1lQ29uZmlndXJhdGlvblVSTChJUGx1Z2luRW50cnkgZW50cnksIENvbmZpZ3VyZWRTaXRlIGNTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlTdHJpbmcgcm9vdFN0cmluZyA9IGNTaXRlLmdldFBsYXRmb3JtVVJMU3RyaW5nKCk7DQotCQlTdHJpbmcgcGx1Z2luUGF0aElEID0gZ2V0UGF0aElEKGVudHJ5KTsNCi0JCXRyeSB7DQotCQkJSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlciA9IGNTaXRlLmdldFNpdGUoKS5nZXRTaXRlQ29udGVudFByb3ZpZGVyKCk7DQotCQkJVVJMIHBsdWdpbkVudHJ5ZnVsbFVSTCA9IHNpdGVDb250ZW50UHJvdmlkZXIuZ2V0QXJjaGl2ZVJlZmVyZW5jZShwbHVnaW5QYXRoSUQpOw0KLQ0KLQkJCS8vDQotCQkJaWYgKCFyb290U3RyaW5nLnN0YXJ0c1dpdGgoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQkvLyBERUJVRzoNCi0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pDQotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJnZXRSdW50aW1lQ29uZmlndXJhdGlvbiBQbHVnaW4gRW50cnkgRnVsbCBVUkw6IiArIHBsdWdpbkVudHJ5ZnVsbFVSTCArICIgUGxhdGZvcm0gU3RyaW5nOiIgKyByb290U3RyaW5nICsgIiBbTk9OIFBMQVRGT1JNIFVSTF0uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJCXJldHVybiBwbHVnaW5FbnRyeWZ1bGxVUkw7DQotCQkJfQ0KLQ0KLQkJCS8vVVJMIHBsdWdpbkVudHJ5Um9vdFVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChyb290U3RyaW5nKSk7DQotCQkJLy8gRG8gbm90IHJlc29sdmUgWzE2NTA3XSwganVzdCB1c2UgcGxhdGZvcm06YmFzZS8gYXMgYSByb290DQotCQkJLy8gcm9vdFN0cmluZyA9IHBsYXRmb3JtOmJhc2UNCi0JCQkvLyBwbHVnaW5Sb290ID0gL2hvbWUvYQ0KLQkJCS8vIHBsdWdpbkZ1bGwgPSAvaG9tZS9hL2MvYm9vdC5qYXINCi0JCQkvLyByZWxhdGl2ZSA9IHBsYXRmb3JtOi9iYXNlL2MvYm9vdC5qYXINCi0JCQlVUkwgcGx1Z2luRW50cnlSb290VVJMID0gY1NpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpOw0KLQkJCVN0cmluZyByZWxhdGl2ZVN0cmluZyA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkxBc1N0cmluZyhwbHVnaW5FbnRyeVJvb3RVUkwsIHBsdWdpbkVudHJ5ZnVsbFVSTCk7DQotCQkJVVJMIHJlc3VsdCA9IG5ldyBVUkwobmV3IFVSTChyb290U3RyaW5nKSwgcmVsYXRpdmVTdHJpbmcpOw0KLQ0KLQkJCS8vIERFQlVHOg0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQ0KLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJnZXRSdW50aW1lQ29uZmlndXJhdGlvbiBwbHVnaW4gRW50cnkgRnVsbCBVUkw6IiArIHBsdWdpbkVudHJ5ZnVsbFVSTCArICIgUGxhdGZvcm0gU3RyaW5nOiIgKyByb290U3RyaW5nICsgIiBTaXRlIFVSTDoiICsgcGx1Z2luRW50cnlSb290VVJMICsgIiBSZWxhdGl2ZToiICsgcmVsYXRpdmVTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkDQotDQotCQkJLy8gdmVyaWZ5IHdlIGFyZSBhYm91dCB0byB3cml0ZSBhIHZhbGlkIGZpbGUgVVJMDQotCQkJLy8gY2hlY2sgd2l0aCBmdWxsVVJMIGFzIGl0IGlzIG5vdCByZXNvbHZlZCB0byBwbGF0Zm9ybTpiYXNlLw0KLQkJCWlmIChwbHVnaW5FbnRyeWZ1bGxVUkwgIT0gbnVsbCkgew0KLQkJCQlpZiAoImZpbGUiLmVxdWFscyhwbHVnaW5FbnRyeWZ1bGxVUkwuZ2V0UHJvdG9jb2woKSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJU3RyaW5nIGZpbGVTdHJpbmcgPSBwbHVnaW5FbnRyeWZ1bGxVUkwuZ2V0RmlsZSgpOw0KLQkJCQkJaWYgKCFuZXcgRmlsZShmaWxlU3RyaW5nKS5leGlzdHMoKSkgew0KLQkJCQkJCVVwZGF0ZUNvcmUud2FybigiVGhlIFVSTDoiICsgcmVzdWx0ICsgIiBkb2Vzbid0IHBvaW50IHRvIGEgdmFsaWQgcGxhdGZvcm0gcGx1Z2luLlRoZSBVUkwgd2lsbCBub3QgYmUgd3JpdHRlbiBpbiB0aGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQkJCXJldHVybiBudWxsOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvQ3JlYXRlVVJMIiwgcm9vdFN0cmluZyksIGUpOwkvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogUmV0dXJuIFVSTHMgZm9yIGFueSBmcmFnbWVudHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcGx1Z2luIGVudHJ5DQotCSAqLw0KLQlwcml2YXRlIFVSTFtdIGdldFJ1bnRpbWVGcmFnbWVudFVSTHMoSVBsdWdpbkVudHJ5IGVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQkvLyBnZXQgdGhlIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRyeQ0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotDQotCQkvLyBnZXQgdGhlIHBsdWdpbiBkZXNjcmlwdG9yIGZyb20gdGhlIHJlZ2lzdHJ5DQotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHZpZC5nZXRJZGVudGlmaWVyKCkpOw0KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlpZiAoYnVuZGxlICE9IG51bGwgJiYgYnVuZGxlLmdldFN0YXRlKCkgIT0gQnVuZGxlLlVOSU5TVEFMTEVEICYmIGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5JTlNUQUxMRUQpIHsNCi0JCQlGcmFnbWVudEVudHJ5W10gZnJhZ21lbnRzID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldEZyYWdtZW50cyhidW5kbGUpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBmcmFnbWVudHMgIT0gbnVsbCAmJiBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJCVN0cmluZyBsb2NhdGlvbiA9IGZyYWdtZW50c1tpXS5nZXRMb2NhdGlvbigpOw0KLQkJCQl0cnkgew0KLQkJCQkJVVJMIGxvY2F0aW9uVVJMID0gbmV3IFVSTChsb2NhdGlvbik7DQotCQkJCQlsb2NhdGlvblVSTCA9IFBsYXRmb3JtLmFzTG9jYWxVUkwoUGxhdGZvcm0ucmVzb2x2ZShsb2NhdGlvblVSTCkpOw0KLQkJCQkJbGlzdC5hZGQoYXNJbnN0YWxsUmVsYXRpdmVVUkwobG9jYXRpb25VUkwpKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQkJLy8gc2tpcCBiYWQgZnJhZ21lbnRzDQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gKFVSTFtdKSBsaXN0LnRvQXJyYXkobmV3IFVSTFswXSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBhdGggaWRlbnRpZmllciBmb3IgYSBwbHVnaW4gZW50cnkuDQotCSAqIDxjb2RlPnBsdWdpbnMvJmx0O3BsdWdpbklkPl8mbHQ7cGx1Z2luVmVyc2lvbj4uamFyPC9jb2RlPg0KLQkgKiBAcmV0dXJuIHRoZSBwYXRoIGlkZW50aWZpZXINCi0JICovDQotCXByaXZhdGUgU3RyaW5nIGdldFBhdGhJRChJUGx1Z2luRW50cnkgZW50cnkpIHsNCi0JCXJldHVybiBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZlYXR1cmVDb250ZW50UHJvdmlkZXIuSkFSX0VYVEVOU0lPTjsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVHJ5IHRvIHJlY2FzdCBVUkwgYXMgcGxhdGZvcm06L2Jhc2UvDQotCSAqLw0KLQlwcml2YXRlIFVSTCBhc0luc3RhbGxSZWxhdGl2ZVVSTChVUkwgdXJsKSB7DQotCQkvLyBnZXQgbG9jYXRpb24gb2YgaW5zdGFsbA0KLQkJVVJMIGluc3RhbGwgPSBDb25maWd1cmF0b3JVdGlscy5nZXRJbnN0YWxsVVJMKCk7DQotDQotCQkvLyB0cnkgdG8gZGV0ZXJtaW5lIGlmIHN1cHBsaWVkIFVSTCBjYW4gYmUgcmVjYXN0IGFzIGluc3RhbGwtcmVsYXRpdmUNCi0JCWlmIChpbnN0YWxsLmdldFByb3RvY29sKCkuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgew0KLQkJCWlmIChpbnN0YWxsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlTdHJpbmcgaW5zdGFsbFMgPSBuZXcgRmlsZShpbnN0YWxsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQkJCWlmICghaW5zdGFsbFMuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJaW5zdGFsbFMgKz0gIi8iOyAvLyROT04tTkxTLTEkDQotCQkJCVN0cmluZyB1cmxTID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQkJCWlmICghdXJsUy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkDQotCQkJCQl1cmxTICs9ICIvIjsgLy8kTk9OLU5MUy0xJA0KLQkJCQlpbnQgaXggPSBpbnN0YWxsUy5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkDQotCQkJCWlmIChpeCAhPSAtMSkgew0KLQkJCQkJaW5zdGFsbFMgPSBpbnN0YWxsUy5zdWJzdHJpbmcoMCwgaXggKyAxKTsNCi0JCQkJCWlmICh1cmxTLnN0YXJ0c1dpdGgoaW5zdGFsbFMpKSB7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJcmV0dXJuIG5ldyBVUkwoInBsYXRmb3JtOi9iYXNlLyIgKyB1cmxTLnN1YnN0cmluZyhpbnN0YWxsUy5sZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkDQotCQkJCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotCQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVTaXRlKEZpbGUgc2l0ZURpcmVjdG9yeSkgew0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBnZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCVVSTCBmaWxlVVJMOw0KLQkJdHJ5IHsNCi0JCQlmaWxlVVJMID0gc2l0ZURpcmVjdG9yeS50b1VSTCgpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJVVJMIHVybCA9IHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKTsNCi0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwoZmlsZVVSTCwgdXJsKSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCS8qDQotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgdXJsIHJlbGF0aXZlIHRvIHRoZSBzaXRlLg0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZVJlbGF0aXZlVVJMKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCVN0cmluZyB1cmwgPSBmZWF0dXJlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQlTdHJpbmcgc2l0ZVVSTCA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkvLyBUT0RPIGZpeCB0aGlzLiB0b1VSTCgpIHJldHVybnMgZmlsZTovZDovZWNsaXBzZS9ldGMuLi4gd2hlYXJlYXMgdGhlIA0KLQkJLy8gcGxhdGZvcm0uYXNMb2NhbFVSTCgpIHJldHVybnMgZmlsZTpkOi9lY2xpcHNlL2V0Yy4uLiAobm8gbGVhZGluZyAvICkNCi0vLwkJaWYgKHVybC5zdGFydHNXaXRoKCJmaWxlOi8iKSAmJiBQbGF0Zm9ybS5nZXRPUygpLmVxdWFscygid2luMzIiKSkNCi0vLwkJCXVybCA9ICJmaWxlOiIgKyB1cmwuc3Vic3RyaW5nKDYpOw0KLQkJDQotCQlpZiAodXJsLnN0YXJ0c1dpdGgoc2l0ZVVSTCkpDQotCQkJcmV0dXJuIHVybC5zdWJzdHJpbmcoc2l0ZVVSTC5sZW5ndGgoKSk7DQotCQllbHNlDQotCQkJcmV0dXJuIHVybDsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEByZXR1cm4gdHJ1ZSBpZiByZXN0YXJ0IGlzIG5lZWRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzdGFydE5lZWRlZChJUGxhdGZvcm1Db25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpIHsNCi0NCi0JCS8vIEZpcnN0LCBjcmVhdGUgYSBtYXAgZm9yIGZhc3RlciBsb29rdXBzDQotCQlVUkxbXSBuZXdCdW5kbGVQYXRocyA9IHJ1bnRpbWVDb25maWcuZ2V0UGx1Z2luUGF0aCgpOw0KLQkJSGFzaFNldCBuZXdQbHVnaW5zU2V0ID0gbmV3IEhhc2hTZXQobmV3QnVuZGxlUGF0aHMubGVuZ3RoKTsNCi0JCWZvciAoaW50IGk9MDsgaTxuZXdCdW5kbGVQYXRocy5sZW5ndGg7IGkrKykgew0KLQkJCQ0KLQkJCVN0cmluZyBwbHVnaW5Mb2NhdGlvbiA9IG5ld0J1bmRsZVBhdGhzW2ldLmdldEZpbGUoKTsNCi0JCQluZXdQbHVnaW5zU2V0LmFkZChwbHVnaW5Mb2NhdGlvbik7DQotCQkJLy8gT24gd2luZG93cywgd2Ugd2lsbCBiZSBkb2luZyBjYXNlIGluc2Vuc2l0aXZlIHNlYXJjaCBhcyB3ZWxsLCBzbyBsb3dlciBpdCBub3cNCi0JCQlpZiAoaXNXaW5kb3dzKQ0KLQkJCQluZXdQbHVnaW5zU2V0LmFkZChwbHVnaW5Mb2NhdGlvbi50b0xvd2VyQ2FzZSgpKTsNCi0JCX0NCi0JCQ0KLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gUGxhdGZvcm0uZ2V0UGxhdGZvcm1BZG1pbigpOw0KLQkJU3RhdGUgc3RhdGUgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlKCk7DQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIG9sZEJ1bmRsZXMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7DQotDQotCQlpbnQgb2Zmc2V0ID0gQ29uZmlndXJhdGlvbkFjdGl2YXRvci5VUERBVEVfUFJFRklYLmxlbmd0aCgpOw0KLQkJZm9yIChpbnQgaT0wOyBpPG9sZEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAob2xkQnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpID09IDApDQotCQkJCWNvbnRpbnVlOyAvLyBza2lwIHRoZSBzeXN0ZW0gYnVuZGxlDQotCQkJU3RyaW5nIG9sZEJ1bmRsZUxvY2F0aW9uID0gb2xkQnVuZGxlc1tpXS5nZXRMb2NhdGlvbigpOw0KLQkJCS8vIERvbid0IHdvcnJ5IGFib3V0IGJ1bmRsZXMgd2UgZGlkIG5vdCBpbnN0YWxsDQotCQkJaWYgKCFvbGRCdW5kbGVMb2NhdGlvbi5zdGFydHNXaXRoKENvbmZpZ3VyYXRpb25BY3RpdmF0b3IuVVBEQVRFX1BSRUZJWCkpDQotCQkJCWNvbnRpbnVlOw0KLQkJCW9sZEJ1bmRsZUxvY2F0aW9uID0gb2xkQnVuZGxlTG9jYXRpb24uc3Vic3RyaW5nKG9mZnNldCk7DQotCQkJDQotCQkJaWYgKG5ld1BsdWdpbnNTZXQuY29udGFpbnMob2xkQnVuZGxlTG9jYXRpb24pKQ0KLQkJCQljb250aW51ZTsNCi0JCQlpZiAoaXNXaW5kb3dzICYmIG5ld1BsdWdpbnNTZXQuY29udGFpbnMob2xkQnVuZGxlTG9jYXRpb24udG9Mb3dlckNhc2UoKSkpDQotCQkJCWNvbnRpbnVlOw0KLQkJCQ0KLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQ0KLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJCdW5kbGUgIiArIG9sZEJ1bmRsZUxvY2F0aW9uICsgIiBoYXMgYmVlbiByZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogVG8gYmUgY2FsbGVkIHdoZW4gY29tbWl0dGluZyB0aGUgdXBkYXRlIGNoYW5nZXMgdG8gY3VycmVudCBjb25maWd1cmF0aW9uDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwbHlDaGFuZ2VzKCkgew0KLQkJQ29uZmlndXJhdGlvbkFjdGl2YXRvciBjb25maWd1cmF0b3IgPSBDb25maWd1cmF0aW9uQWN0aXZhdG9yLmdldENvbmZpZ3VyYXRvcigpOw0KLQkJY29uZmlndXJhdG9yLmluc3RhbGxCdW5kbGVzKCk7DQotCX0NCi0JDQotCQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7DQotCQlpZiAodGhpcyA9PSBvYmopDQotCQkJcmV0dXJuIHRydWU7DQotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJbnN0YWxsQ29uZmlndXJhdGlvbikpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJDQotCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24pb2JqOw0KLQkNCi0JCXJldHVybiBnZXRDcmVhdGlvbkRhdGUoKS5lcXVhbHMoY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpKSAmJiANCi0JCQkJZ2V0TGFiZWwoKS5lcXVhbHMoY29uZmlnLmdldExhYmVsKCkpICYmDQotCQkJCWdldExvY2F0aW9uVVJMU3RyaW5nKCkuZXF1YWxzKGNvbmZpZy5nZXRMb2NhdGlvblVSTFN0cmluZygpKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0luc3RhbGxIYW5kbGVyUHJveHkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbEhhbmRsZXJQcm94eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVhMTMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbEhhbmRsZXJQcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsSGFuZGxlclByb3h5IGltcGxlbWVudHMgSUluc3RhbGxIYW5kbGVyIHsKLQotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdHlwZTsKLQlwcml2YXRlIElJbnN0YWxsSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIElTdGF0dXMgc2F2ZWRTdGF0dXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9QTFVHSU4gPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVF9QT0lOVCA9ICJpbnN0YWxsSGFuZGxlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEluc3RhbGxIYW5kbGVyUHJveHkoKSB7Ci0JfQotCi0JcHVibGljIEluc3RhbGxIYW5kbGVyUHJveHkoCi0JCWludCB0eXBlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJSW5zdGFsbEhhbmRsZXJFbnRyeSBlbnRyeSwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWluaXRpYWxpemUodHlwZSwgZmVhdHVyZSwgZW50cnksIG1vbml0b3IpOwotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjaW5pdGlhbGl6ZQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoCi0JCWludCB0eXBlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJSW5zdGFsbEhhbmRsZXJFbnRyeSBlbnRyeSwKLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCURFQlVHID0gVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lIQU5ETEVSOwotCQkvLyB2YWxpZGF0ZSBhcmd1bWVudHMKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQotCQkvLyAgY2hlY2sgaWYgd2UgaGF2ZSBhIGhhbmRsZXIgZW50cnkgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLnhtbAotCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJaWYgKERFQlVHKQotCQkJCWRlYnVnKCJub3Qgc3BlY2lmaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsgLy8gbm8gaGFuZGxlciBlbnRyeQotCQl9Ci0KLQkJU3RyaW5nIGxpYnJhcnkgPSBlbnRyeS5nZXRMaWJyYXJ5KCk7Ci0JCVN0cmluZyBoYW5kbGVyTmFtZSA9IGVudHJ5LmdldEhhbmRsZXJOYW1lKCk7Ci0JCWlmIChoYW5kbGVyTmFtZSA9PSBudWxsIHx8IGhhbmRsZXJOYW1lLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChERUJVRykKLQkJCQlkZWJ1Zygibm90IHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47IC8vIG5vIGhhbmRsZXIgY2xhc3Mgc3BhY2lmaWVkIGluIGVudHJ5Ci0JCX0KLQkJaWYgKERFQlVHKSB7Ci0JCQlkZWJ1ZygiaGFuZGxlcj0iICsgaGFuZGxlck5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQlkZWJ1ZygicGF0aD0gICAiICsgbGlicmFyeSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGdldCBoYW5kbGVyIGluc3RhbmNlCi0JCXRyeSB7Ci0JCQlpZiAobGlicmFyeSA9PSBudWxsIHx8IGxpYnJhcnkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLmhhbmRsZXIgPSBnZXRHbG9iYWxIYW5kbGVyKGhhbmRsZXJOYW1lKTsKLQkJCWVsc2UKLQkJCQl0aGlzLmhhbmRsZXIgPSBnZXRMb2NhbEhhbmRsZXIobGlicmFyeSwgaGFuZGxlck5hbWUpOwotCQkJaWYgKHRoaXMuaGFuZGxlciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWhhbmRsZXIuaW5pdGlhbGl6ZSh0eXBlLCBmZWF0dXJlLCBlbnRyeSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uSW5Jbml0KAotCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5ub3RGb3VuZCIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQllKTsKLQotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJaGFuZGxlRXhjZXB0aW9uSW5Jbml0KAotCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5pbnZhbGlkSGFuZGxlciIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQllKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb25JbkluaXQobnVsbCwgZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb25JbkluaXQoCi0JCQkJUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLnVuYWJsZVRvQ3JlYXRlSGFuZGxlciIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQllKTsKLQkJfQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNpbnN0YWxsSW5pdGlhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbEluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgaW5zdGFsbEluaXRpYXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmluc3RhbGxJbml0aWF0ZWQoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNhbGxQbHVnaW5zRG93bmxvYWRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHBsdWdpbnNEb3dubG9hZGVkKElQbHVnaW5FbnRyeVtdIHBsdWdpbnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgcGx1Z2luc0Rvd25sb2FkZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5wbHVnaW5zRG93bmxvYWRlZChwbHVnaW5zKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNhbGxQbHVnaW5zSW5zdGFsbGVkCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVJbnN0YWxsKElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnN1bWVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGNvbXBsZXRlSW5zdGFsbCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbXBsZXRlSW5zdGFsbChjb25zdW1lcik7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjYWxsRGF0YURvd25sb2FkZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub25QbHVnaW5EYXRhRG93bmxvYWRlZCgKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luRGF0YSwKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIG5vblBsdWdpbkRhdGFEb3dubG9hZGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIubm9uUGx1Z2luRGF0YURvd25sb2FkZWQobm9uUGx1Z2luRGF0YSwgbGlzdGVuZXIpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2luc3RhbGxDb21wbGV0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQ29tcGxldGVkKGJvb2xlYW4gc3VjY2VzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyBpbnN0YWxsQ29tcGxldGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuaW5zdGFsbENvbXBsZXRlZChzdWNjZXNzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb25maWd1cmVJbml0aWF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVJbml0aWF0ZWQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGNvbmZpZ3VyZUluaXRpYXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbmZpZ3VyZUluaXRpYXRlZCgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI2NvbXBsZXRlQ29uZmlndXJlCi0JICovCi0JcHVibGljIHZvaWQgY29tcGxldGVDb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGNvbXBsZXRlQ29uZmlndXJlKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIuY29tcGxldGVDb25maWd1cmUoKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciNjb25maWd1cmVDb21wbGV0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVDb21wbGV0ZWQoYm9vbGVhbiBzdWNjZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGNvbmZpZ3VyZUNvbXBsZXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLmNvbmZpZ3VyZUNvbXBsZXRlZChzdWNjZXNzKTsKLQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJaGFuZGxlRXhjZXB0aW9uSW5DYWxsKGUsIGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElJbnN0YWxsSGFuZGxlciN1bmNvbmZpZ3VyZUluaXRpYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlSW5pdGlhdGVkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaGFuZGxlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQllbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyB1bmNvbmZpZ3VyZUluaXRpYXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLnVuY29uZmlndXJlSW5pdGlhdGVkKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29tcGxldGVVbmNvbmZpZ3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXBsZXRlVW5jb25maWd1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCWRlYnVnKCJjYWxsaW5nIGNvbXBsZXRlVW5jb25maWd1cmUoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5jb21wbGV0ZVVuY29uZmlndXJlKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjdW5jb25maWd1cmVDb21wbGV0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZUNvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJaWYgKHNhdmVkU3RhdHVzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZWxzZQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHNhdmVkU3RhdHVzKTsgLy8gZGVsYXllZCBleGNlcHRpb24KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyB1bmNvbmZpZ3VyZUNvbXBsZXRlZCgpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQloYW5kbGVyLnVuY29uZmlndXJlQ29tcGxldGVkKHN1Y2Nlc3MpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCQlpZiAoc2F2ZWRTdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzYXZlZFN0YXR1cyk7IC8vIGRlbGF5ZWQgZXhjZXB0aW9uCi0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuaW5zdGFsbEluaXRpYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEluaXRpYXRlZCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgdW5pbnN0YWxsSW5pdGlhdGVkKCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWhhbmRsZXIudW5pbnN0YWxsSW5pdGlhdGVkKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJSW5zdGFsbEhhbmRsZXIjY29tcGxldGVVbmluc3RhbGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wbGV0ZVVuaW5zdGFsbCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZWxzZSB7Ci0JCQl0cnkgewotCQkJCWlmIChERUJVRykKLQkJCQkJZGVidWcoImNhbGxpbmcgY29tcGxldGVVbmluc3RhbGwoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci5jb21wbGV0ZVVuaW5zdGFsbCgpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCQloYW5kbGVFeGNlcHRpb25JbkNhbGwoZSwgZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUluc3RhbGxIYW5kbGVyI3VuaW5zdGFsbENvbXBsZXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbENvbXBsZXRlZChib29sZWFuIHN1Y2Nlc3MpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJaWYgKHNhdmVkU3RhdHVzID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZWxzZQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHNhdmVkU3RhdHVzKTsgLy8gZGVsYXllZCBleGNlcHRpb24KLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1ZygiY2FsbGluZyB1bmluc3RhbGxDb21wbGV0ZWQoKSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaGFuZGxlci51bmluc3RhbGxDb21wbGV0ZWQoc3VjY2Vzcyk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCWhhbmRsZUV4Y2VwdGlvbkluQ2FsbChlLCBmZWF0dXJlKTsKLQkJCX0KLQkJCWlmIChzYXZlZFN0YXR1cyAhPSBudWxsKQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHNhdmVkU3RhdHVzKTsgLy8gZGVsYXllZCBleGNlcHRpb24KLQkJfQotCX0KLQotCS8qCi0JICogY29tbW9uIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgaW5pdGlhbGl6YXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uSW5Jbml0KFN0cmluZyBzLCBFeGNlcHRpb24gZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUNvcmVFeGNlcHRpb24gY2U7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCWNlID0gKENvcmVFeGNlcHRpb24pIGU7Ci0JCWVsc2UKLQkJCWNlID0gVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24ocywgZSk7Ci0KLQkJaWYgKGlzVW5kb0FjdGlvbigpKSB7Ci0JCQkvLyBmb3IgInVuZG8iIG9wZXJhdGlvbnMsIGRlYWN0aXZhdGUgaGFuZGxlciBhbmQgbG9nIGVycm9yCi0JCQlTdHJpbmcgaWQgPQotCQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgMCwgIkluc3RhbGxIYW5kbGVyLmRlYWN0aXZhdGVkIiwgY2UpOwkvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJaGFuZGxlciA9IG51bGw7IC8vIGRpc2FibGUgc3Vic2VxdWVudCBoYW5kbGVyIGNhbGxzCi0JCQlzYXZlZFN0YXR1cyA9IHN0YXR1czsKLQkJfSBlbHNlCi0JCQkvLyBmb3IgImRvIiBvcGVyYXRpb25zLCBodXJsIC4uLgotCQkJdGhyb3cgY2U7Ci0JfQotCi0JLyoKLQkgKiBjb21tb24gZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBjYWxscyB0byBpbnN0YWxsIGhhbmRsZXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uSW5DYWxsKFRocm93YWJsZSBlLCBJRmVhdHVyZSBmZWF0dXJlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ29yZUV4Y2VwdGlvbiBjZTsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKQotCQkJY2UgPSAoQ29yZUV4Y2VwdGlvbikgZTsKLQkJZWxzZQotCQkJY2UgPQotCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQlQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIuY2FsbEV4Y2VwdGlvbiIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZSk7Ci0JCQotCQlpZiAoaXNVbmRvQWN0aW9uKCkpIHsKLQkJCS8vIGZvciAidW5kbyIgb3BlcmF0aW9ucywgZGVhY3RpdmF0ZSBoYW5kbGVyIGFuZCBsb2cgZXJyb3IKLQkJCVN0cmluZyBpZCA9Ci0JCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGlkLCAwLCAiSW5zdGFsbEhhbmRsZXIuZGVhY3RpdmF0ZWQiLCBjZSk7CS8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQloYW5kbGVyID0gbnVsbDsgLy8gZGlzYWJsZSBzdWJzZXF1ZW50IGhhbmRsZXIgY2FsbHMKLQkJCXNhdmVkU3RhdHVzID0gc3RhdHVzOwotCQl9IGVsc2UKLQkJCS8vIGZvciAiZG8iIG9wZXJhdGlvbnMsIGh1cmwgLi4uCi0JCQl0aHJvdyBjZTsKLQl9Ci0KLQkvKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBkb2luZyAoaW5zdGFsbCwgY29uZmlndXJlKSBvciAKLQkgKiB1bmRvaW5nICh1bmluc3RhbGwsIHVuY29uZmlndXJlKQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1VuZG9BY3Rpb24oKSB7Ci0JCWlmICh0aGlzLnR5cGUgPT0gSUluc3RhbGxIYW5kbGVyLkhBTkRMRVJfQUNUSU9OX0lOU1RBTEwKLQkJCXx8IHRoaXMudHlwZSA9PSBJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fQ09ORklHVVJFKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBjYXVzZXMgZXhjZXB0aW9uIHRvIGJlIHRocm93biBhbmQgYWN0aW9uIGFib3J0ZWQKLQkJZWxzZQotCQkJcmV0dXJuIHRydWU7IC8vIGNhdXNlcyBleGNlcHRpb24gdG8gYmUgbG9nZ2VkIGFuZCBhY3Rpb24gY29udGludWVzCi0JfQotCi0JLyoKLQkgKiBnZXQgYW4gaW5zdGFuY2Ugb2YgaGFuZGxlciBkb3dubG9hZGVkIGFzIHBhcnQgb2YgdGhlIGZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIElJbnN0YWxsSGFuZGxlciBnZXRMb2NhbEhhbmRsZXIoU3RyaW5nIGxpYiwgU3RyaW5nIG5hbWUpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIEdldCBiYXNlbGluZSBVUkwgZm9yIGhhbmRsZXIgKHJlbGF0aXZlIHRvIGZlYXR1cmUueG1sKS4gRm9yCi0JCS8vIGZlYXR1cmVzIGJlaW5nIGluc3RhbGxlZCBmcm9tIGEgc2VydmVyIChlZy4gaHR0cCBwcm90b2NvbCkKLQkJLy8gdGhlIFVSTCB3aWxsIG1vc3QgbGlrZWx5IGJlIHRvIGEgbG9jYWwgZmlsZSBjb3B5IGNvbnRhaW5pbmcgdGhlCi0JCS8vIHVucGFja2VkIGZlYXR1cmUgamFyLgotCQlDb250ZW50UmVmZXJlbmNlIGJhc2VSZWYgPQotCQkJZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RmVhdHVyZU1hbmlmZXN0UmVmZXJlbmNlKG51bGwpOwotCQlVUkwgYmFzZSA9IG51bGw7Ci0JCWlmIChiYXNlUmVmICE9IG51bGwpCi0JCQliYXNlID0gYmFzZVJlZi5hc1VSTCgpOwotCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJUG9saWN5LmJpbmQoIkluc3RhbGxIYW5kbGVyLnVuYWJsZVRvQ3JlYXRlSGFuZGxlciIsIHRoaXMuZmVhdHVyZS5nZXRMYWJlbCgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCW51bGwpOwotCi0KLQkJLy8gZGV0ZXJtaW5lIGxvYWRlciBjbGFzcyBwYXRoCi0JCVVSTCBjcCA9IG5ldyBVUkwoYmFzZSwgbGliKTsKLQkJaWYgKHRoaXMudHlwZSA9PSBJSW5zdGFsbEhhbmRsZXIuSEFORExFUl9BQ1RJT05fVU5JTlNUQUxMKSB7Ci0JCQkvLyBjaGVjayBpZiB3ZSBhcmUgZG9pbmcgdW5pbnN0YWxsCi0JCQkvLyAuLi4gbmVlZCB0byBtYWtlIHRlbXAgY29weSBvZiBsaWJyYXJ5IChiZWluZyByZW1vdmVkKQotCQkJRmlsZSB0ZW1wTGliID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgidG1wIiwgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZW1wTGliLmRlbGV0ZU9uRXhpdCgpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wTGliKTsKLQkJCQlpcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KGNwKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCVV0aWxpdGllcy5jb3B5KGlzLCBmb3MsIG51bGwpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZm9zICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCWlmIChpcyAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJaXMuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJfQotCQkJY3AgPSB0ZW1wTGliLnRvVVJMKCk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgY2xhc3MgbG9hZGVyLCBsb2FkIGFuZCBpbnN0YW50aWF0ZSBoYW5kbGVyCi0JCVVSTENsYXNzTG9hZGVyIGxvYWRlciA9Ci0JCQluZXcgVVJMQ2xhc3NMb2FkZXIobmV3IFVSTFtdIHsgY3AgfSwgdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQlDbGFzcyBjbGF6eiA9IGxvYWRlci5sb2FkQ2xhc3MobmFtZSk7Ci0JCUlJbnN0YWxsSGFuZGxlciBoYW5kbGVyID0gKElJbnN0YWxsSGFuZGxlcikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoKLQkgKiBnZXQgaW5zdGFuY2Ugb2YgZ2xvYmFsIGhhbmRsZXIgcmVnaXN0ZXJlZCB2aWEgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHJpdmF0ZSBJSW5zdGFsbEhhbmRsZXIgZ2V0R2xvYmFsSGFuZGxlcihTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGhhbmRsZXJFeHRlbnNpb24gPQotCQkJcmVnLmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihFWFRfUExVR0lOLCBFWFRfUE9JTlQsIG5hbWUpOwotCQlpZiAoaGFuZGxlckV4dGVuc2lvbiA9PSBudWxsIHx8IGhhbmRsZXJFeHRlbnNpb24ubGVuZ3RoIDw9IDApCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIudW5hYmxlVG9DcmVhdGVIYW5kbGVyIiwgdGhpcy5mZWF0dXJlLmdldExhYmVsKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJbnVsbCk7Ci0KLQkJcmV0dXJuIChJSW5zdGFsbEhhbmRsZXIpIGhhbmRsZXJFeHRlbnNpb25bMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsKLQkJU3RyaW5nIHBmeCA9IChmZWF0dXJlPT1udWxsKSA/ICIiIDogZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkluc3RhbGxIYW5kbGVyWyIrcGZ4KyJdOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbExvZ1BhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsTG9nUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNGUwOTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsTG9nUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci0KLQotLyoqCi0gKiBQYXJzZXMgdGhlIGluc3RhbGxhdGlvbiBsb2cgYW5kIGNyZWF0ZXMgaW5zdGFsbGF0aW9uIGNvbmZpZ3VyYXRpb24gb2JqZWN0cwotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbExvZ1BhcnNlciB7Ci0JcHJpdmF0ZSBJUGF0aCBsb2dQYXRoOwotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYnVmZlJlYWQ7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlndXJhdGlvbjsKLQlwcml2YXRlIEhhc2hNYXAgaW5zdGFsbENvbmZpZ01hcDsKLQlwcml2YXRlIENvbXBhcmF0b3IgY29tcGFyYXRvcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9JTlNUQUxMID0gImZlYXR1cmUtaW5zdGFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9SRU1PVkUgPSAiZmVhdHVyZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfSU5TVEFMTCA9ICJzaXRlLWluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfUkVNT1ZFID0gInNpdGUtcmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVTkNPTkZJR1VSRSA9ICJmZWF0dXJlLWRpc2FibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR1VSRSA9ICJmZWF0dXJlLWVuYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVWRVJUID0gInJldmVydCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVDT05DSUxJQVRJT04gPSAicmVjb25jaWxpYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRVNFUlZFRCA9ICJwcmVzZXJ2ZS1jb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiIUFDVElWSVRZIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQ0NFU1MgPSAic3VjY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGQUlMVVJFID0gImZhaWx1cmUiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwdWJsaWMgSW5zdGFsbExvZ1BhcnNlcigpewotCQlTdHJpbmcgbG9jID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpLmdldEZpbGUoKTsKLQkJbG9nUGF0aCA9IG5ldyBQYXRoKGxvYykucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZCgiaW5zdGFsbC5sb2ciKTsgIC8vJE5PTi1OTFMtMSQKLQkJaW5zdGFsbENvbmZpZ01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRyeSB7Ci0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb25bXSlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpOwotCQkJZm9yIChpbnQgaT0wO2k8Y29uZmlncy5sZW5ndGg7IGkrKyl7Ci0JCQkJaWYgKCFjb25maWdzW2ldLmlzQ3VycmVudCgpKQotCQkJCQlpbnN0YWxsQ29uZmlnTWFwLnB1dChuZXcgTG9uZyhjb25maWdzW2ldLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKSksIGNvbmZpZ3NbaV0pOwotCQkJfQotCQkJLy8gTmVlZCB0byBtYWtlIGEgY29weSBvZiB0aGUgY3VycmVudCBjb25maWcgaW5zdGVhZAotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gZ2V0Q29uZmlnQ29weSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSk7Ci0JCQlpbnN0YWxsQ29uZmlnTWFwLnB1dChuZXcgTG9uZyhjb25maWcuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpKSwgY29uZmlnKTsKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJfQotCQljb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKXsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgZTEsIE9iamVjdCBlMikgewotCQkJCURhdGUgZGF0ZTEgPSAoKEluc3RhbGxDb25maWd1cmF0aW9uKWUxKS5nZXRDcmVhdGlvbkRhdGUoKTsKLQkJCQlEYXRlIGRhdGUyID0gKChJbnN0YWxsQ29uZmlndXJhdGlvbillMikuZ2V0Q3JlYXRpb25EYXRlKCk7Ci0JCQkJcmV0dXJuIGRhdGUxLmJlZm9yZShkYXRlMikgPyAxIDogLTE7Ci0JCQl9Ci0JCX07Ci0JfQotCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlnQ29weShJbnN0YWxsQ29uZmlndXJhdGlvbiBvcmlnQ29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uewotCQlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb24ob3JpZ0NvbmZpZywgb3JpZ0NvbmZpZy5nZXRVUkwoKSwgb3JpZ0NvbmZpZy5nZXRMYWJlbCgpICk7Ci0JCWNvbmZpZy5zZXRDcmVhdGlvbkRhdGUob3JpZ0NvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKSk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCXB1YmxpYyB2b2lkIHBhcnNlSW5zdGFsbGF0aW9uTG9nKCl7Ci0JCXRyeSB7Ci0JCQlvcGVuTG9nKCk7Ci0JCQlwYXJzZUxvZygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NlTG9nKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5Mb2coKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlidWZmUmVhZCA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihsb2dQYXRoLnRvT1NTdHJpbmcoKSkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oCi0JCQluZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJVXBkYXRlVXRpbHMuZ2V0UGx1Z2luSWQoKSwKLQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCVBvbGljeS5iaW5kKCJJbnN0YWxsTG9nUGFyc2VyLmVycm9ycyIpLCAvLyROT04tTkxTLTEkCi0JCQkJZSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcGFyc2VMb2coKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIAkJLmluc3RhbGwtbG9nIHRlbXBsYXRlCi0JCS8vCQkhQ09ORklHVVJBVElPTiA8Y29uZmlndXJhdGlvbi1kYXRlPgotCQkvLwkJIUFDVElWSVRZIDxkYXRlPiA8dGFyZ2V0PiA8YWN0aW9uPiA8c3RhdHVzPgotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdHlwZSwgc3RhdHVzLCBhY3Rpb247Ci0JCQlTdHJpbmdUb2tlbml6ZXIgaHRtbENvZGU7Ci0KLQkJCXdoaWxlIChidWZmUmVhZC5yZWFkeSgpKSB7Ci0KLQkJCQlodG1sQ29kZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZlJlYWQucmVhZExpbmUoKSk7Ci0JCQkJd2hpbGUgKCEoaHRtbENvZGUuaGFzTW9yZUVsZW1lbnRzKCkpKSB7Ci0JCQkJCWlmICghYnVmZlJlYWQucmVhZHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJaHRtbENvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZSZWFkLnJlYWRMaW5lKCkpOwotCQkJCX0KLQotCQkJCXR5cGUgPSBodG1sQ29kZS5uZXh0VG9rZW4oKS50cmltKCk7Ci0KLQkJCQlpZiAodHlwZS5lcXVhbHMoQUNUSVZJVFkpKSB7Ci0JCQkJCVN0cmluZyB0aW1lID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZyBkYXRlOwotCQkJCQlTdHJpbmdCdWZmZXIgdGFyZ2V0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlkYXRlID0gaHRtbENvZGUubmV4dFRva2VuKCIuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWh0bWxDb2RlLm5leHRUb2tlbigiICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQl3aGlsZSAoaHRtbENvZGUuY291bnRUb2tlbnMoKSA+IDIpewotCQkJCQkJdGFyZ2V0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl0YXJnZXQuYXBwZW5kKGh0bWxDb2RlLm5leHRUb2tlbigpKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJYWN0aW9uID0gaHRtbENvZGUubmV4dFRva2VuKCk7Ci0JCQkJCXN0YXR1cyA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCQkJCQljcmVhdGVBY3Rpdml0eShhY3Rpb24sIHRpbWUsIGRhdGUsIHN0YXR1cywgdGFyZ2V0LnRvU3RyaW5nKCksIGN1cnJlbnRDb25maWd1cmF0aW9uKTsKLQkJCQl9ICBlbHNlIHsKLQkJCQkJU3RyaW5nIHRpbWUgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQkJCQkJU3RyaW5nQnVmZmVyIGRhdGU7Ci0JCQkJCWRhdGUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJCXdoaWxlIChodG1sQ29kZS5jb3VudFRva2VucygpID4gMCl7Ci0JCQkJCQlpZiAoZGF0ZS5sZW5ndGgoKSAhPSAwKQotCQkJCQkJCWRhdGUuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRhdGUuYXBwZW5kKGh0bWxDb2RlLm5leHRUb2tlbigpKTsKLQkJCQkJfQotCQkJCQljdXJyZW50Q29uZmlndXJhdGlvbiA9IChJbnN0YWxsQ29uZmlndXJhdGlvbilpbnN0YWxsQ29uZmlnTWFwLmdldChuZXcgTG9uZyh0aW1lKSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjbG9zZUxvZygpIHsKLQkJdHJ5IHsKLQkJCWlmIChidWZmUmVhZCAhPSBudWxsKQotCQkJCWJ1ZmZSZWFkLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCWJ1ZmZSZWFkID0gbnVsbDsKLQkJfQotCX0KLQlwcml2YXRlIElBY3Rpdml0eSBjcmVhdGVBY3Rpdml0eShTdHJpbmcgYWN0aW9uLCBTdHJpbmcgdGltZSwgU3RyaW5nIGRhdGUsIFN0cmluZyBzdGF0dXMsIFN0cmluZyB0YXJnZXQsIEluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyl7Ci0JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhID0gbmV3IENvbmZpZ3VyYXRpb25BY3Rpdml0eSgpOwotCi0JCWludCBjb2RlID0gMDsKLQkJaWYgKEZFQVRVUkVfSU5TVEFMTC5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTDsKLQkJZWxzZSBpZiAoRkVBVFVSRV9SRU1PVkUuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX1JFTU9WRTsKLQkJZWxzZSBpZiAoU0lURV9JTlNUQUxMLmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fU0lURV9JTlNUQUxMOwotCQllbHNlIGlmIChTSVRFX1JFTU9WRS5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfUkVNT1ZFOwotCQllbHNlIGlmIChVTkNPTkZJR1VSRS5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX1VOQ09ORklHVVJFOwotCQllbHNlIGlmIChDT05GSUdVUkUuZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9DT05GSUdVUkU7Ci0JCWVsc2UgaWYgKFJFVkVSVC5lcXVhbHMoYWN0aW9uKSkKLQkJCWNvZGUgPSBJQWN0aXZpdHkuQUNUSU9OX1JFVkVSVDsKLQkJZWxzZSBpZiAoUkVDT05DSUxJQVRJT04uZXF1YWxzKGFjdGlvbikpCi0JCQljb2RlID0gSUFjdGl2aXR5LkFDVElPTl9SRUNPTkNJTElBVElPTjsKLQkJZWxzZSBpZiAoUFJFU0VSVkVELmVxdWFscyhhY3Rpb24pKQotCQkJY29kZSA9IElBY3Rpdml0eS5BQ1RJT05fQUREX1BSRVNFUlZFRDsKLQkJCi0JCWEuc2V0QWN0aW9uKGNvZGUpOwotCQl0cnkgewotCQkJbG9uZyBhY3Rpdml0eVRpbWUgPSBMb25nLnBhcnNlTG9uZyh0aW1lKTsKLQkJCWEuc2V0RGF0ZShuZXcgRGF0ZShhY3Rpdml0eVRpbWUpKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWEuc2V0RGF0ZShuZXcgRGF0ZShkYXRlKSk7Ci0JCX0KLQkJYS5zZXRTdGF0dXMoU1VDQ0VTUy5lcXVhbHMoc3RhdHVzKSA/IElBY3Rpdml0eS5TVEFUVVNfT0sgOiBJQWN0aXZpdHkuU1RBVFVTX05PSyk7Ci0JCWEuc2V0TGFiZWwodGFyZ2V0KTsKLQkJYS5zZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKGNvbmZpZyk7Ci0JCQotCQlpZiAoY29uZmlnICE9IG51bGwgJiYgIWNvbmZpZ0NvbnRhaW5zQWN0aXZpdHkoY29uZmlnLCBhKSl7Ci0JCQljb25maWcuYWRkQWN0aXZpdHkoYSk7Ci0JCX0KLQkJCi0JCXJldHVybiBhOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29uZmlnQ29udGFpbnNBY3Rpdml0eShJbnN0YWxsQ29uZmlndXJhdGlvbiBjLCBJQWN0aXZpdHkgYSl7Ci0JCUlBY3Rpdml0eVtdIGFjdGl2aXRpZXMgPSBjLmdldEFjdGl2aXRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDAgOyBpPGFjdGl2aXRpZXMubGVuZ3RoOyBpKyspewotCQkJaWYgKGEuZXF1YWxzKGFjdGl2aXRpZXNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25bXSBnZXRDb25maWd1cmF0aW9ucygpewotCQlDb2xsZWN0aW9uIGNvbmZpZ1NldCA9IGluc3RhbGxDb25maWdNYXAudmFsdWVzKCk7Ci0JCUluc3RhbGxDb25maWd1cmF0aW9uW10gY29uZmlncyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbltdKSBjb25maWdTZXQudG9BcnJheShuZXcgSW5zdGFsbENvbmZpZ3VyYXRpb25bY29uZmlnU2V0LnNpemUoKV0pOwotCQlBcnJheXMuc29ydChjb25maWdzLCBjb21wYXJhdG9yKTsKLQkJcmV0dXJuIGNvbmZpZ3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsUmVnaXN0cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW5zdGFsbFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3Mzg1M2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JbnN0YWxsUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogS2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBmZWF0dXJlcyBhbmQgcGx1Z2lucyBpbnN0YWxsZWQgYnkgVXBkYXRlIG1ncgotICogc28gdGhleSBjYW4gYmUgdW5pbnN0YWxsZWQgbGF0ZXIuCi0gKiBUaGUgaW5mbyBpcyBwZXJzaXN0ZWQgaW4gdGhlIC5jb25maWcvcmVnaXN0cnkgZmlsZSBhbmQgZWFjaCBlbnRyeSBoYXMgYSBrZXk9a2V5IHdoZXJlCi0gKiBmb3IgZmVhdHVyZSB0aGlzIGtleSBpcyBmZWF0dXJlXzxpZD5fPHZlcnNpb24+IGFuZCBmb3IgcGx1Z2lucwotICoga2V5IGlzIHBsdWdpbl88aWQ+Xzx2ZXJzaW9uPi4gTm9ybWFsbHksIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB3aWxsCi0gKiByZXR1cm4gPGlkPl88dmVyc2lvbj4uIEVnOiBmZWF0dXJlX29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMC4wCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxSZWdpc3RyeSBleHRlbmRzIFByb3BlcnRpZXMgewotCXByaXZhdGUgRmlsZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVHSVNUUlkgPSAicmVnaXN0cnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgSW5zdGFsbFJlZ2lzdHJ5IGluc3RhbmNlOwotCQotCS8vIHBsdWdpbnMgaW5zdGFsbGVkIGluIHRoaXMgZWNsaXBzZSBzZXNzaW9uCi0JcHJpdmF0ZSBIYXNoTWFwIGp1c3RJbnN0YWxsZWRQbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGVtcHR5IFByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBJbnN0YWxsUmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBjb25maWdGaWxlID0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzCi0JCQkJLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKQotCQkJCS5nZXRGaWxlKCk7Ci0JCWZpbGUgPSBuZXcgRmlsZShjb25maWdGaWxlKTsKLQkJZmlsZSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQlmaWxlID0gbmV3IEZpbGUoZmlsZSwgUkVHSVNUUlkpOwotCQlyZXN0b3JlKCk7Ci0JfQotCi0JLyoqCi0JICogU2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnN0YWxsUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSW5zdGFsbFJlZ2lzdHJ5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyBjb250ZW50cyBvZiB0aGUgUHJvcGVydGllcyBmcm9tIGEgZmlsZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgcGVyc2lzdGFudCBkYXRhIHdhcyByZWFkIGluCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVzdG9yZSgpIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCQljbGVhcigpOwotCQkvLyBUZXN0IGlmIHdlIGhhdmUgYSBjb250cmlidXRpb24gZmlsZSB0byBzdGFydCB3aXRoCi0JCS8vIElmIHRoaXMgaXMgYSBjbGVhbiBzdGFydCwgdGhlbiB3ZSB3aWxsIG5vdCBoYXZlIGEgCi0JCS8vIGNvbnRyaWJ1dGlvbiBmaWxlLiByZXR1cm4gZmFsc2UuCi0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBsb2FkZWQ7Ci0JCXRyeSB7Ci0JCQlpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQlzdXBlci5sb2FkKGluKTsKLQkJCWxvYWRlZCA9IHRydWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBsb2FkZWQ7Ci0JfQotCS8qKgotCSAqIFNhdmVzIGNvbnRlbnRzIG9mIHRoZSB0YWJsZSB0byBhIGZpbGUuCi0JICogQHJldHVybiB0cnVlIGlmIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBzYXZlKCkgewotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJc3VwZXIuc3RvcmUob3V0LCAiVGhpcyBpcyBhIGdlbmVyYXRlZCBmaWxlOyBkbyBub3QgZWRpdC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0ID0gdHJ1ZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChvdXQgIT0gbnVsbCkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JLyoqCi0JICogUmVnaXN0ZXJzIGFuIGluc3RhbGxlZCBmZWF0dXJlIHNvIGl0IGNhbiBiZSB1bmluc3RhbGxlZCBsYXRlci4KLQkgKiBAcGFyYW0gZmVhdHVyZSBmZWF0dXJlIHRvIHJlZ2lzdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXJGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJU3RyaW5nIG5hbWUgPSAiZmVhdHVyZV8iK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCi0JCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQobmFtZSkgPT0gbnVsbCkgewotCQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucHV0KG5hbWUsIG5hbWUpOwotCQkJLy8gd2Ugc2F2ZSBhZnRlciBlYWNoIHJlZ2lzdHJhdGlvbgotCQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbiBpbnN0YWxsZWQgZmVhdHVyZSBzbyBpdCBjYW4gYmUgdW5pbnN0YWxsZWQgbGF0ZXIuCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5IHBsdWdpbiB0byByZWdpc3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHJlZ2lzdGVyUGx1Z2luKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldChuYW1lKSA9PSBudWxsKSB7Ci0JCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5wdXQobmFtZSwgbmFtZSk7Ci0JCQkvLyB3ZSBzYXZlIGFmdGVyIGVhY2ggcmVnaXN0cmF0aW9uCi0JCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5zYXZlKCk7Ci0JCX0KLQkJCi0JCS8vIGFkZCBwbHVnaW4gdG8gdGhlIGxpc3Qgb2YganVzdCBpbnN0YWxsZWQgcGx1Z2lucyAuCi0JCUluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmp1c3RJbnN0YWxsZWRQbHVnaW5zLnB1dChuYW1lLG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHNwZWNpZmllZCBmZWF0dXJlIGZyb20gcmVnaXN0cnkKLQkgKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgdW5yZWdpc3RlckZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlTdHJpbmcgbmFtZSA9ICJmZWF0dXJlXyIrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVtb3ZlKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmVzIHNwZWNpZmllZCBwbHVnaW4gZnJvbSByZWdpc3RyeQotCSAqCi0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bnJlZ2lzdGVyUGx1Z2luKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgewotCQlTdHJpbmcgbmFtZSA9ICJwbHVnaW5fIitwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVtb3ZlKG5hbWUpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBwbHVnaW4gZnJvbSB0aGUgbGlzdCBvZiBqdXN0IGluc3RhbGxlZCBwbHVnaW5zIChpZiBuZWVkZWQpLgotCQlJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5yZW1vdmUobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGx1Z2luIHdhcyBpbnN0YWxsZWQgZHVyaW5nIHRoaXMgZWNsaXBzZSBzZXNzaW9uCi0JICogQHBhcmFtIHBsdWdpbkVudHJ5Ci0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luSnVzdEluc3RhbGxlZChJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKLQkJU3RyaW5nIG5hbWUgPSAicGx1Z2luXyIrcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5qdXN0SW5zdGFsbGVkUGx1Z2lucy5nZXQobmFtZSkgIT0gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBuZWVkZWQgZm9yIHRoZSB1cGRhdGUgSlVuaXQgdGVzdHMuCi0JICoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYW51cCgpIHsKLQkJSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuanVzdEluc3RhbGxlZFBsdWdpbnMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0ludGVybmFsU2l0ZU1hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW50ZXJuYWxTaXRlTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmMzYzkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSW50ZXJuYWxTaXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWxTaXRlTWFuYWdlciB7DQotDQotCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBsb2NhbFNpdGU7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0lURV9UWVBFID0gU2l0ZVVSTENvbnRlbnRQcm92aWRlci5TSVRFX1RZUEU7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYRUNVVEFCTEVfU0lURV9UWVBFID0gU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIuU0lURV9UWVBFOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZXN0aW1hdGVzOw0KLQ0KLQkvLyBjYWNoZSBmb3VuZCBzaXRlcw0KLQlwcml2YXRlIHN0YXRpYyBNYXAgc2l0ZXMgPSBuZXcgSGFzaE1hcCgpOw0KLQkvLyBjYWNoZSB0aW1lc3RhbXBzDQotCXByaXZhdGUgc3RhdGljIE1hcCBzaXRlVGltZXN0YW1wcyA9IG5ldyBIYXNoTWFwKCk7DQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnbG9iYWxVc2VDYWNoZSA9IHRydWU7DQotDQotCS8vIHRydWUgaWYgYW4gZXhjZXB0aW9uIG9jY3VyZWQgY3JlYXRpbmcgbG9jYWxTaXRlDQotCS8vIHNvIHdlIGNhY2hlIGl0IGFuZCBkb24ndCBhdHRlbXB0IHRvIGNyZWF0ZSBpdCBhZ2Fpbg0KLQlwcml2YXRlIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGV4Y2VwdGlvbk9jY3VyZWQgPSBudWxsOw0KLQ0KLQkvKg0KLQkgKiBAc2VlIFNpdGVNYW5hZ2VyI2dldExvY2FsU2l0ZSgpDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElMb2NhbFNpdGUgZ2V0TG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGludGVybmFsR2V0TG9jYWxTaXRlKCk7DQotCX0NCi0NCi0JLyoNCi0JICogSW50ZXJuYWwgY2FsbCBpZiBvcHRpbWlzdGljIHJlY29uY2lsaWF0aW9uIG5lZWRlZA0KLQkgKi8NCi0JcHJpdmF0ZSBzdGF0aWMgSUxvY2FsU2l0ZSBpbnRlcm5hbEdldExvY2FsU2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIHJldHJpZXZpbmcgdGhlIFNpdGUNCi0JCS8vIHJldGhyb3cgaXQNCi0JCWlmIChleGNlcHRpb25PY2N1cmVkICE9IG51bGwpDQotCQkJdGhyb3cgZXhjZXB0aW9uT2NjdXJlZDsNCi0NCi0JCWlmIChsb2NhbFNpdGUgPT0gbnVsbCkgew0KLQkJCXRyeSB7DQotCQkJCWxvY2FsU2l0ZSA9IFNpdGVMb2NhbC5pbnRlcm5hbEdldExvY2FsU2l0ZSgpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlleGNlcHRpb25PY2N1cmVkID0gZTsNCi0JCQkJdGhyb3cgZTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbG9jYWxTaXRlOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDYWNoZWRTaXRlKFVSTCBzaXRlVVJMKSB7DQotCQlpZiAoIXNpdGVzLmNvbnRhaW5zS2V5KHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKSkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQ0KLQkJTG9uZyB0aW1lc3RhbXAgPSAoTG9uZylzaXRlVGltZXN0YW1wcy5nZXQoc2l0ZVVSTCk7DQotCQlpZiAodGltZXN0YW1wID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJbG9uZyBsb2NhbExhc3RNb2RpZmllZCA9IHRpbWVzdGFtcC5sb25nVmFsdWUoKTsNCi0JCQ0KLQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5pc1NhbWVUaW1lc3RhbXAoc2l0ZVVSTCwgbG9jYWxMYXN0TW9kaWZpZWQpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRTaXRlKFVSTCkNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVNpdGUgZ2V0U2l0ZShVUkwgc2l0ZVVSTCwgYm9vbGVhbiB1c2VDYWNoZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCWlmIChtb25pdG9yPT1udWxsKSBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0NCi0JCWlmIChzaXRlVVJMID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQkvLyB1c2UgY2FjaGUgaWYgc2V0IHVwIGdsb2JhbGx5IChnbG9iYWxVc2VDYWNoZT10cnVlKQ0KLQkJLy8gYW5kIHBhc3NlZCBhcyBwYXJhbWV0ZXIgKHVzZUNhY2hlPXRydWUpDQotCQlTdHJpbmcgc2l0ZVVSTFN0cmluZyA9IHNpdGVVUkwudG9FeHRlcm5hbEZvcm0oKTsNCi0JCWlmICgodXNlQ2FjaGUgJiYgZ2xvYmFsVXNlQ2FjaGUpICYmIGlzVmFsaWRDYWNoZWRTaXRlKHNpdGVVUkwpKSB7DQotCQkJc2l0ZSA9IChJU2l0ZSkgc2l0ZXMuZ2V0KHNpdGVVUkxTdHJpbmcpOw0KLQkJCXJldHVybiBzaXRlOw0KLQkJfQ0KLQkJDQotCQkvLyB0cnkgYWRkaW5nICJlY2xpcHNlIiB0byB0aGUgc2l0ZSB1cmwsIGluIGNhc2UgdGhpcyBpcyBhbiBleHRlbnNpb24gc2l0ZQ0KLQkJaWYgKCJmaWxlIi5lcXVhbHMoc2l0ZVVSTC5nZXRQcm90b2NvbCgpKSApIHsgLy8kTk9OLU5MUy0xJA0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHNpdGVVUkwuZ2V0RmlsZSgpKTsNCi0JCQlpZiAoZi5pc0RpcmVjdG9yeSgpICYmICEiZWNsaXBzZSIuZXF1YWxzKGYuZ2V0TmFtZSgpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCWYgPSBuZXcgRmlsZShmLCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkDQotCQkJCXRyeSB7DQotCQkJCQlpZiAoKHVzZUNhY2hlICYmIGdsb2JhbFVzZUNhY2hlKSAmJiBpc1ZhbGlkQ2FjaGVkU2l0ZShmLnRvVVJMKCkpKSB7DQotCQkJCQkJc2l0ZSA9IChJU2l0ZSkgc2l0ZXMuZ2V0KGYudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQkJCQlyZXR1cm4gc2l0ZTsNCi0JCQkJCX0NCi0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJfQkNCi0JCQl9DQotCQl9DQotDQotCQkvLyBjb25zaWRlciBmaWxlIHByb3RvY29sIGFsc28gaWYgdGhlIFVSTCBwb2ludHMgdG8gYSBkaXJlY3RvcnkNCi0JCS8vIGFuZCBubyBzaXRlLnhtbCBleGlzdA0KLQkJLy8gaWYgdGhlIHVzZXIgcG9pbnRzIHRvIGEgZmlsZSwgY29uc2lkZXIgREVGQVVMVF9TSVRFX1RZUEUNCi0JCS8vIHNpdGUueG1sIHdpbGwgaGF2ZSB0byBzcGVjaWZ5IHRoZSB0eXBlDQotCQlib29sZWFuIGZpbGVQcm90b2NvbCA9ICJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHNpdGVVUkwuZ2V0UHJvdG9jb2woKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWJvb2xlYW4gZGlyZWN0b3J5RXhpc3RzID0gZmFsc2U7DQotCQlpZiAoZmlsZVByb3RvY29sKSB7DQotCQkJRmlsZSBkaXI7DQotCQkJZGlyID0gbmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpOw0KLQkJCWlmIChkaXIgIT0gbnVsbCAmJiBkaXIuaXNEaXJlY3RvcnkoKSkgew0KLQkJCQlpZiAoIShuZXcgRmlsZShkaXIsIFNpdGUuU0lURV9YTUwpLmV4aXN0cygpKSkNCi0JCQkJCWRpcmVjdG9yeUV4aXN0cyA9IHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy9QRVJGOiBpZiBmaWxlOiA8cGF0aD4vIGFuZCBkaXJlY3RvcnkgZXhpc3RzIHRoZW4gY29uc2lkZXIgZXhlY3V0YWJsZQ0KLQkJbW9uaXRvci5iZWdpblRhc2soUG9saWN5LmJpbmQoIkludGVybmFsU2l0ZU1hbmFnZXIuQ29ubmVjdGluZ1RvU2l0ZSIpLCA4KTsgLy8kTk9OLU5MUy0xJA0KLQkJaWYgKGZpbGVQcm90b2NvbCAmJiBkaXJlY3RvcnlFeGlzdHMpIHsNCi0JCQlzaXRlID0gYXR0ZW1wdENyZWF0ZVNpdGUoREVGQVVMVF9FWEVDVVRBQkxFX1NJVEVfVFlQRSwgc2l0ZVVSTCwgbW9uaXRvcik7DQotCQkJbW9uaXRvci53b3JrZWQoNCk7IC8vIG9ubHkgb25lIGF0dGVtcHQNCi0JCX0gZWxzZSB7DQotCQkJdHJ5IHsNCi0JCQkJbW9uaXRvci53b3JrZWQoMyk7DQotCQkJCXNpdGUgPSBhdHRlbXB0Q3JlYXRlU2l0ZShERUZBVUxUX1NJVEVfVFlQRSwgc2l0ZVVSTCwgbW9uaXRvcik7DQotCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gcHJlc2VydmVkRXhjZXB0aW9uKSB7DQotCQkJCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCS8vIGF0dGVtcHQgYSByZXRyeSBpcyB0aGUgcHJvdG9jb2wgaXMgZmlsZSwgd2l0aCBleGVjdXRiYWxlIHR5cGUNCi0JCQkJCWlmICghZmlsZVByb3RvY29sKQ0KLQkJCQkJCXRocm93IHByZXNlcnZlZEV4Y2VwdGlvbjsNCi0NCi0JCQkJCXRyeSB7DQotCQkJCQkJc2l0ZSA9IGF0dGVtcHRDcmVhdGVTaXRlKERFRkFVTFRfRVhFQ1VUQUJMRV9TSVRFX1RZUEUsIHNpdGVVUkwsIG1vbml0b3IpOw0KLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiByZXRyeUV4Y2VwdGlvbikgew0KLQkJCQkJCUlTdGF0dXMgZmlyc3RTdGF0dXMgPSBwcmVzZXJ2ZWRFeGNlcHRpb24uZ2V0U3RhdHVzKCk7DQotCQkJCQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmlyc3RTdGF0dXMuZ2V0UGx1Z2luKCksIElTdGF0dXMuT0ssIFBvbGljeS5iaW5kKCJJbnRlcm5hbFNpdGVNYW5hZ2VyLkZhaWxlZFJldHJ5QWNjZXNzaW5nU2l0ZSIpLCByZXRyeUV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCQltdWx0aS5hZGRBbGwoZmlyc3RTdGF0dXMpOw0KLQkJCQkJCXRocm93IHByZXNlcnZlZEV4Y2VwdGlvbjsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChzaXRlICE9IG51bGwpIHsNCi0JCQlzaXRlcy5wdXQoc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpLCBzaXRlKTsNCi0JCQl0cnkgew0KLQkJCQlSZXNwb25zZSByZXNwb25zZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KFVSTEVuY29kZXIuZW5jb2RlKHNpdGVVUkwpKTsNCi0JCQkJc2l0ZVRpbWVzdGFtcHMucHV0KHNpdGVVUkwsIG5ldyBMb25nKHJlc3BvbnNlLmdldExhc3RNb2RpZmllZCgpKSk7DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy9mbHVzaCB0aGUgSmFyRmlsZSB3ZSBtYXkgaG9sZCBvbiB0bw0KLQkJLy8gd2Uga2VlcCB0aGUgdGVtcCBub3QgdG8gY3JlYXRlIHRoZW0gYWdhaW4NCi0JCUphckNvbnRlbnRSZWZlcmVuY2Uuc2h1dGRvd24oKTsgLy8gbWFrZSBzdXJlIHdlIGFyZSBub3QgbGVhdmluZyBqYXJzIG9wZW4gZm9yIHRoaXMgc2l0ZQ0KLQ0KLQkJLy9mbHVzaCBtYXBwaW5nIG9mIGRvd25sb2FkZWQgSkFSIGZpbGVzDQotCQkvLyBGSVhNRSA6IHByb3ZpZGUgYmV0dGVyIGNhY2hlIGZsdXNoaW5nIGFmdGVyIDIuMQ0KLQkJLy8gRklYRUQ6IGV2ZXJ5dGhpbmcgZG93bmxvYWRlZCBpcyBjYWNoZWQgYW5kIHRpbWVzdGFtcGVkLg0KLQkJLy8gICAgICAgIFRpbWVzdGFtcHMgYXJlIGNvbXBhcmVkIHRvIGxhc3RNb2RpZmVkIG9uIHRoZSBzZXJ2ZXINCi0JCS8vICAgICAgICBhbmQgd2UgZG93bmxvYWQgb25seSB3aGVuIHRoZXJlIGlzIGEgZGlmZmVyZW5jDQotCQkvLyBVdGlsaXRpZXMuZmx1c2hMb2NhbEZpbGUoKTsNCi0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEF0dGVtcHQgdG8gY3JlYXRlIGEgc2l0ZQ0KLQkgKiBpZiB0aGUgc2l0ZSBndWVzc2VkIGlzIG5vdCB0aGUgdHlwZSBmb3VuZCwNCi0JICogYXR0ZW1wdCB0byBjcmVhdGUgYSB0eXBlIHdpdGggdGhlIHR5cGUgZm91bmQgaW4gdGhlIHNpdGUueG1sDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBJU2l0ZSBhdHRlbXB0Q3JlYXRlU2l0ZShTdHJpbmcgZ3Vlc3NlZFR5cGVTaXRlLCBVUkwgc2l0ZVVSTCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAobW9uaXRvciA9PSBudWxsKSBtb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsNCi0JCUlTaXRlIHNpdGUgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQlzaXRlID0gY3JlYXRlU2l0ZShndWVzc2VkVHlwZVNpdGUsIHNpdGVVUkwsIG1vbml0b3IpOw0KLQkJCW1vbml0b3Iud29ya2VkKDEpOyAvLyBpZiBubyBlcnJvciwgb2NjdXJzIHRoZSByZXRyeSBicmFuY2ggZG9lc24ndCBuZWVkIHRvIGJlIGV4ZWN1dGVkDQotCQl9IGNhdGNoIChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gZSkgew0KLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgcmV0dXJuIG51bGw7DQotDQotCQkJLy8gdGhlIHR5cGUgaW4gdGhlIHNpdGUueG1sIGlzIG5vdCB0aGUgb25lIGV4cGVjdGVkCQ0KLQkJCS8vIGF0dGVtcHQgdG8gdXNlIHRoaXMgdHlwZSBpbnN0ZWFkCQ0KLQkJCS8vREVCVUc6DQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1RZUEUpIHsNCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVGhlIFNpdGUgOiIgKyBzaXRlVVJMLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIGlzIGEgZGlmZmVyZW50IHR5cGUgdGhhbiB0aGUgZ3Vlc3NlZCB0eXBlIGJhc2VkIG9uIHRoZSBwcm90b2NvbC4gbmV3IFR5cGU6IiArIGUuZ2V0TmV3VHlwZSgpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIA0KLQkJCX0NCi0NCi0JCQl0cnkgew0KLQkJCQlpZiAoZS5nZXROZXdUeXBlKCkgPT0gbnVsbCkNCi0JCQkJCXRocm93IGU7DQotCQkJCXNpdGUgPSBjcmVhdGVTaXRlKGUuZ2V0TmV3VHlwZSgpLCBzaXRlVVJMLCBtb25pdG9yKTsNCi0JCQl9IGNhdGNoIChJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gZTEpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9DcmVhdGVTaXRlV2l0aFR5cGUiLCBlLmdldE5ld1R5cGUoKSwgc2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpKSwgZTEpOwkvLyROT04tTkxTLTEkIA0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBJU2l0ZQ0KLQkgKiANCi0JICogdGhlIFVSTCBjYW4gYmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtDQotCSAqIDEgcHJvdG9jb2w6Ly8uLi4uLi8NCi0JICogMiBwcm90b2NvbDovLy4uLi4uDQotCSAqIDMgcHJvdG9jb2w6Ly8uLi4uL3NpdGUueG1sDQotCSAqIDQgcHJvdG9jb2w6Ly8uLi4jLi4uDQotCSAqIA0KLQkgKiAxIElmIHRoZSBmaWxlIG9mIHRoZSBmaWxlIG9mIHRlaCB1cmwgZW5kcyB3aXRoICcvJywgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0uDQotCSAqIGlmIGl0IGZhaWxzLCBhZGQgc2l0ZS54bWwgYW5kIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtDQotCSAqIA0KLQkgKiAyIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtDQotCSAqIAlmYWlsDQotCSAqIAkJYWRkICcvc2l0ZS54bWwnIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQ0KLQkgKiAJc3VjZXNzDQotCSAqIAkJYXR0ZW1wdCB0byBwYXJzZSwgaWYgaXQgZmFpbHMsIGFkZCAnL3NpdGUueG1sJyBhbmQgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0NCi0JICogDQotCSAqIDMgb3BlbiB0aGUgc3RyZWFtDQotCSAqIA0KLQkgKiA0IG9wZW4gdGhlIHN0cmVhbQkNCi0JICovDQotCXByaXZhdGUgc3RhdGljIElTaXRlIGNyZWF0ZVNpdGUoU3RyaW5nIHNpdGVUeXBlLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQlJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCUlTaXRlRmFjdG9yeSBmYWN0b3J5ID0gU2l0ZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yeShzaXRlVHlwZSk7DQotDQotCQl0cnkgew0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCXNpdGUgPSBjcmVhdGVTaXRlKGZhY3RvcnksIHVybCwgbW9uaXRvcik7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHJldHVybiBudWxsOw0KLQ0KLQkJCS8vIGlmIHRoZSBVUkwgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGEgZmlsZSANCi0JCQkvLyBvciBhIGRpcmVjdG9yeSwgd2l0aG91dCByZWZlcmVuY2UJCQkNCi0JCQlpZiAodXJsLmdldFJlZigpICE9IG51bGwpIHsNCi0JCQkJLy8gNCBub3RoaW5nIHdlIGNhbiBkbw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0FjY2Vzc1VSTCIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCS8vIDEgdHJ5IHRvIGFkZCBzaXRlLnhtbA0KLQkJCQlVUkwgdXJsUmV0cnk7DQotCQkJCXRyeSB7DQotCQkJCQl1cmxSZXRyeSA9IG5ldyBVUkwodXJsLCBTaXRlLlNJVEVfWE1MKTsNCi0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7DQotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0NyZWF0ZVVSTCIsIHVybC50b0V4dGVybmFsRm9ybSgpICsgIisiICsgU2l0ZS5TSVRFX1hNTCksIGUxKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCX0NCi0JCQkJdHJ5IHsNCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZmFjdG9yeSwgdXJsUmV0cnksIG1vbml0b3IpOw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7DQotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0FjY2Vzc1VSTCIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgdXJsLnRvRXh0ZXJuYWxGb3JtKCksIHVybFJldHJ5LnRvRXh0ZXJuYWxGb3JtKCksIGUsIGUxKTsvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQl9IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpIHsNCi0JCQkJLy8gMyBub3RoaW5nIHdlIGNhbiBkbw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW50ZXJuYWxTaXRlTWFuYWdlci5VbmFibGVUb0FjY2Vzc1VSTCIsIHVybC50b0V4dGVybmFsRm9ybSgpKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIDIgdHJ5IHRvIGFkZCAvc2l0ZS54bWwgDQotCQkJCVVSTCB1cmxSZXRyeTsNCi0JCQkJdHJ5IHsNCi0JCQkJCXVybFJldHJ5ID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgdXJsLmdldEZpbGUoKSArICIvIiArIFNpdGUuU0lURV9YTUwpOwkvLyROT04tTkxTLTEkDQotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgew0KLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9DcmVhdGVVUkwiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSArICIrIiArIFNpdGUuU0lURV9YTUwpLCBlMSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJCQl9DQotDQotCQkJCXRyeSB7DQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCXNpdGUgPSBjcmVhdGVTaXRlKGZhY3RvcnksIHVybFJldHJ5LCBtb25pdG9yKTsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgew0KLQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9BY2Nlc3NVUkwiLCB1cmwudG9FeHRlcm5hbEZvcm0oKSksIHVybC50b0V4dGVybmFsRm9ybSgpLCB1cmxSZXRyeS50b0V4dGVybmFsRm9ybSgpLCBlLCBlMSk7Ly8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHNpdGU7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIElTaXRlIGNyZWF0ZVNpdGUoSVNpdGVGYWN0b3J5IGZhY3RvcnksIFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQlpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIElTaXRlRmFjdG9yeUV4dGVuc2lvbikNCi0JCQlyZXR1cm4gKChJU2l0ZUZhY3RvcnlFeHRlbnNpb24pZmFjdG9yeSkuY3JlYXRlU2l0ZSh1cmwsIG1vbml0b3IpOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBDcmVhdGVzIGEgbmV3IHNpdGUgb24gdGhlIGZpbGUgc3lzdGVtDQotCSAqIFRoaXMgaXMgdGhlIG9ubHkgU2l0ZSB3ZSBjYW4gY3JlYXRlLg0KLQkgKiANCi0JICogQHBhcmFtIHNpdGVMb2NhdGlvbg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSVNpdGUgY3JlYXRlU2l0ZShGaWxlIHNpdGVMb2NhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSVNpdGUgc2l0ZSA9IG51bGw7DQotCQlpZiAoc2l0ZUxvY2F0aW9uICE9IG51bGwpIHsNCi0JCQl0cnkgew0KLQkJCQlVUkwgc2l0ZVVSTCA9IHNpdGVMb2NhdGlvbi50b1VSTCgpOw0KLQkJCQlzaXRlID0gZ2V0U2l0ZShzaXRlVVJMLCBmYWxzZSwgbnVsbCk7DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9DcmVhdGVVUkwiLCBzaXRlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBNZXRob2QgZG93bmxvYWRlZC4NCi0JICogQHBhcmFtIGRvd25sb2FkU2l6ZSBzaXplIGRvd25sb2FkZWQgaW4gYnl0ZXMNCi0JICogQHBhcmFtIHRpbWUgdGltZSBpbiBzZWNvbmRzDQotCSAqIEBwYXJhbSB1cmwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkb3dubG9hZGVkKGxvbmcgZG93bmxvYWRTaXplLCBsb25nIHRpbWUsIFVSTCB1cmwpIHsNCi0JCWlmIChkb3dubG9hZFNpemUgPD0gMCB8fCB0aW1lIDwgMCkNCi0JCQlyZXR1cm47DQotCQlTdHJpbmcgaG9zdCA9IHVybC5nZXRIb3N0KCk7DQotCQlsb25nIHNpemVCeVRpbWUgPSAodGltZSA9PSAwKSA/IDAgOiBkb3dubG9hZFNpemUgLyB0aW1lOw0KLQkJTG9uZyB2YWx1ZSA9IG5ldyBMb25nKHNpemVCeVRpbWUpOw0KLQkJaWYgKGVzdGltYXRlcyA9PSBudWxsKSB7DQotCQkJZXN0aW1hdGVzID0gbmV3IEhhc2hNYXAoKTsNCi0JCX0gZWxzZSB7DQotCQkJTG9uZyBwcmV2aW91cyA9IChMb25nKSBlc3RpbWF0ZXMuZ2V0KGhvc3QpOw0KLQkJCWlmIChwcmV2aW91cyAhPSBudWxsKSB7DQotCQkJCXZhbHVlID0gbmV3IExvbmcoKHByZXZpb3VzLmxvbmdWYWx1ZSgpICsgc2l6ZUJ5VGltZSkgLyAyKTsNCi0JCQl9DQotCQl9DQotCQllc3RpbWF0ZXMucHV0KGhvc3QsIHZhbHVlKTsNCi0JfQ0KLQkvKioNCi0JICogTWV0aG9kIGdldEVzdGltYXRlZFRyYW5zZmVyUmF0ZSByYXRlIGJ5dGVzL3NlY29uZHMuDQotCSAqIEBwYXJhbSBob3N0DQotCSAqIEByZXR1cm4gbG9uZw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBsb25nIGdldEVzdGltYXRlZFRyYW5zZmVyUmF0ZShTdHJpbmcgaG9zdCkgew0KLQkJaWYgKGVzdGltYXRlcyA9PSBudWxsKQ0KLQkJCXJldHVybiAwOw0KLQkJTG9uZyB2YWx1ZSA9IChMb25nKSBlc3RpbWF0ZXMuZ2V0KGhvc3QpOw0KLQkJaWYgKHZhbHVlID09IG51bGwpDQotCQkJcmV0dXJuIDA7DQotCQlyZXR1cm4gdmFsdWUubG9uZ1ZhbHVlKCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9MaXN0ZW5lcnNMaXN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xpc3RlbmVyc0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2YWJiMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0xpc3RlbmVyc0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0NCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gbWFpbnRhaW4gYSBsaXN0IG9mIGxpc3RlbmVycywgYW5kDQotICogaXMgdXNlZCBpbiB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHNldmVyYWwgY2xhc3NlcyB3aXRoaW4gSkZhY2UNCi0gKiB3aGljaCBhbGxvdyB5b3UgdG8gcmVnaXN0ZXIgbGlzdGVuZXJzIG9mIHZhcmlvdXMga2luZHMuDQotICogSXQgaXMgYSBmYWlybHkgbGlnaHR3ZWlnaHQgb2JqZWN0LCBvY2N1cHlpbmcgbWluaW1hbCBzcGFjZSB3aGVuDQotICogbm8gbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkLg0KLSAqIDxwPg0KLSAqIE5vdGUgdGhhdCB0aGUgPGNvZGU+YWRkPC9jb2RlPiBtZXRob2QgY2hlY2tzIGZvciBhbmQgZWxpbWluYXRlcyANCi0gKiBkdXBsaWNhdGVzIGJhc2VkIG9uIGlkZW50aXR5IChub3QgZXF1YWxpdHkpLiAgTGlrZXdpc2UsIHRoZQ0KLSAqIDxjb2RlPnJlbW92ZTwvY29kZT4gbWV0aG9kIGNvbXBhcmVzIGJhc2VkIG9uIGlkZW50aXR5Lg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBVc2UgdGhlIDxjb2RlPmdldExpc3RlbmVyczwvY29kZT4gbWV0aG9kIHdoZW4gbm90aWZ5aW5nIGxpc3RlbmVycy4NCi0gKiBOb3RlIHRoYXQgbm8gZ2FyYmFnZSBpcyBjcmVhdGVkIGlmIG5vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4NCi0gKiBUaGUgcmVjb21tZW5kZWQgY29kZSBzZXF1ZW5jZSBmb3Igbm90aWZ5aW5nIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycw0KLSAqIG9mIHNheSwgPGNvZGU+Rm9vTGlzdGVuZXIuZXZlbnRIYXBwZW5lZDwvY29kZT4sIGlzOg0KLSAqIDxwcmU+DQotICogT2JqZWN0W10gbGlzdGVuZXJzID0gbXlMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7DQotICogZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyArK2kpIHsNCi0gKiAgICAoKEZvb0xpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pLmV2ZW50SGFwcGVuZWQoZXZlbnQpOw0KLSAqIH0NCi0gKiA8L3ByZT4NCi0gKiA8L3A+DQotICovDQotDQotcHVibGljIGNsYXNzIExpc3RlbmVyc0xpc3Qgew0KLQkvKioNCi0JICogVGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhlIGxpc3QuIEFsd2F5cyA+PSAxLg0KLQkgKi8NCi0JcHJpdmF0ZSBpbnQgY2FwYWNpdHk7DQotDQotCS8qKg0KLQkgKiBUaGUgY3VycmVudCBudW1iZXIgb2YgbGlzdGVuZXJzLg0KLQkgKiBNYWludGFpbnMgaW52YXJpYW50OiAwIDw9IHNpemUgPD0gbGlzdGVuZXJzLmxlbmd0aC4NCi0JICovDQotCXByaXZhdGUgaW50IHNpemU7DQotDQotCS8qKg0KLQkgKiBUaGUgbGlzdCBvZiBsaXN0ZW5lcnMuICBJbml0aWFsbHkgPGNvZGU+bnVsbDwvY29kZT4gYnV0IGluaXRpYWxpemVkDQotCSAqIHRvIGFuIGFycmF5IG9mIHNpemUgY2FwYWNpdHkgdGhlIGZpcnN0IHRpbWUgYSBsaXN0ZW5lciBpcyBhZGRlZC4NCi0JICogTWFpbnRhaW5zIGludmFyaWFudDogbGlzdGVuZXJzICE9IG51bGwgSUZGIHNpemUgIT0gMA0KLQkgKi8NCi0JcHJpdmF0ZSBPYmplY3RbXSBsaXN0ZW5lcnMgPSBudWxsOw0KLQ0KLQkvKioNCi0JICogVGhlIGVtcHR5IGFycmF5IHNpbmdsZXRvbiBpbnN0YW5jZSwgcmV0dXJuZWQgYnkgZ2V0TGlzdGVuZXJzKCkNCi0JICogd2hlbiBzaXplID09IDAuDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFbXB0eUFycmF5ID0gbmV3IE9iamVjdFswXTsNCi0vKioNCi0gKiBDcmVhdGVzIGEgbGlzdGVuZXIgbGlzdCB3aXRoIGFuIGluaXRpYWwgY2FwYWNpdHkgb2YgMy4NCi0gKi8NCi1wdWJsaWMgTGlzdGVuZXJzTGlzdCgpIHsNCi0JdGhpcygzKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhIGxpc3RlbmVyIGxpc3Qgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBjYXBhY2l0eS4NCi0gKg0KLSAqIEBwYXJhbSBjYXBhY2l0eSB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyB3aGljaCB0aGlzIGxpc3QgY2FuIGluaXRpYWxseSBhY2NlcHQgDQotICogICAgd2l0aG91dCBncm93aW5nIGl0cyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbjsgbXVzdCBiZSBhdCBsZWFzdCAxDQotICovDQotcHVibGljIExpc3RlbmVyc0xpc3QoaW50IGNhcGFjaXR5KSB7DQotCUFzc2VydC5pc1RydWUoY2FwYWNpdHkgPj0gMSk7DQotCXRoaXMuY2FwYWNpdHkgPSBjYXBhY2l0eTsNCi19DQotLyoqDQotICogQWRkcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgdG8gdGhpcyBsaXN0LiBIYXMgbm8gZWZmZWN0IGlmIGFuIGlkZW50aWNhbCBsaXN0ZW5lcg0KLSAqIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4NCi0gKg0KLSAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXINCi0gKi8NCi1wdWJsaWMgdm9pZCBhZGQoT2JqZWN0IGxpc3RlbmVyKSB7DQotCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOw0KLQlpZiAoc2l6ZSA9PSAwKSB7DQotCQlsaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W2NhcGFjaXR5XTsNCi0JfSBlbHNlIHsNCi0JICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVzIHVzaW5nIGlkZW50aXR5DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgew0KLQkJCWlmIChsaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsNCi0JCQkJcmV0dXJuOw0KLQkJCX0NCi0JCX0NCi0JCS8vIGdyb3cgYXJyYXkgaWYgbmVjZXNzYXJ5DQotCQlpZiAoc2l6ZSA9PSBsaXN0ZW5lcnMubGVuZ3RoKSB7DQotCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIGxpc3RlbmVycyA9IG5ldyBPYmplY3Rbc2l6ZSAqIDIgKyAxXSwgMCwgc2l6ZSk7DQotCQl9DQotCX0NCi0JbGlzdGVuZXJzW3NpemUrK10gPSBsaXN0ZW5lcjsNCi19DQotLyoqDQotICogUmV0dXJucyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuDQotICogVGhlIHJlc3VsdGluZyBhcnJheSBpcyB1bmFmZmVjdGVkIGJ5IHN1YnNlcXVlbnQgYWRkcyBvciByZW1vdmVzLg0KLSAqIElmIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCwgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBhcnJheQ0KLSAqIHNpbmdsZXRvbiBpbnN0YW5jZSAobm8gZ2FyYmFnZSBpcyBjcmVhdGVkKS4NCi0gKiBVc2UgdGhpcyBtZXRob2Qgd2hlbiBub3RpZnlpbmcgbGlzdGVuZXJzLCBzbyB0aGF0IGFueSBtb2RpZmljYXRpb25zDQotICogdG8gdGhlIGxpc3RlbmVyIGxpc3QgZHVyaW5nIHRoZSBub3RpZmljYXRpb24gd2lsbCBoYXZlIG5vIGVmZmVjdCBvbiB0aGUNCi0gKiBub3RpZmljYXRpb24gaXRzZWxmLg0KLSAqDQotICogQHJldHVybiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGxpc3RlbmVycw0KLSAqLw0KLXB1YmxpYyBPYmplY3RbXSBnZXRMaXN0ZW5lcnMoKSB7DQotCWlmIChzaXplID09IDApDQotCQlyZXR1cm4gRW1wdHlBcnJheTsNCi0JT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXplXTsNCi0JU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIDAsIHJlc3VsdCwgMCwgc2l6ZSk7DQotCXJldHVybiByZXN1bHQ7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgd2hldGhlciB0aGlzIGxpc3RlbmVyIGxpc3QgaXMgZW1wdHkuDQotICoNCi0gKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyByZWdpc3RlcmVkIGxpc3RlbmVycywgYW5kDQotICogICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlDQotICovDQotcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsNCi0JcmV0dXJuIHNpemUgPT0gMDsNCi19DQotLyoqDQotICogUmVtb3ZlcyB0aGUgZ2l2ZW4gbGlzdGVuZXIgZnJvbSB0aGlzIGxpc3QuIEhhcyBubyBlZmZlY3QgaWYgYW4gaWRlbnRpY2FsDQotICogbGlzdGVuZXIgd2FzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuDQotICoNCi0gKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyDQotICovDQotcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBsaXN0ZW5lcikgew0KLQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsNCi0JCWlmIChsaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsNCi0JCQlpZiAoc2l6ZSA9PSAxKSB7DQotCQkJCWxpc3RlbmVycyA9IG51bGw7DQotCQkJCXNpemUgPSAwOw0KLQkJCX0NCi0JCQllbHNlIHsNCi0JCQkJU3lzdGVtLmFycmF5Y29weShsaXN0ZW5lcnMsIGkgKyAxLCBsaXN0ZW5lcnMsIGksIC0tc2l6ZSAtIGkpOw0KLQkJCQlsaXN0ZW5lcnNbc2l6ZV0gPSBudWxsOw0KLQkJCX0NCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLg0KLSAqDQotICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXJzDQotICovDQotcHVibGljIGludCBzaXplKCkgew0KLQlyZXR1cm4gc2l6ZTsNCi19DQotfQ0KLQkNCi0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL05vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL05vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDE2OGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Ob25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIENvbnRlbnRDb25zdW1lciBmb3IgYSBub24gcGx1Z2luIGVudHJ5IG9mIGEgZmVhdHVyZQ0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciBleHRlbmRzIENvbnRlbnRDb25zdW1lciB7DQotDQotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsNCi0NCi0JcHJpdmF0ZSBJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsNCi0JCQ0KLQkvKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyKElDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyKXsNCi0JCXRoaXMuY29udGVudENvbnN1bWVyID0gY29udGVudENvbnN1bWVyOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKCFjbG9zZWQpew0KLQkJCWNvbnRlbnRDb25zdW1lci5zdG9yZSggY29udGVudFJlZmVyZW5jZSxtb25pdG9yKTsNCi0JCX0gZWxzZSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIE5vblBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIixuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBDb250ZW50Q29uc3VtZXIjY2xvc2UoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAgew0KLQkJaWYgKCFjbG9zZWQpew0KLQkJCWNsb3NlZCA9IHRydWU7DQotCQkJY29udGVudENvbnN1bWVyLmNsb3NlKCk7DQotCQl9IGVsc2Ugew0KLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBjbG9zZSBhIGNsb3NlZCBOb25QbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lciIsbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvT3RoZXJSZXNwb25zZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9PdGhlclJlc3BvbnNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyM2JlYzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9PdGhlclJlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotcHVibGljIGNsYXNzIE90aGVyUmVzcG9uc2UgaW1wbGVtZW50cyBSZXNwb25zZSB7Ci0JcHJvdGVjdGVkIFVSTCB1cmw7Ci0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGluOwotCXByb3RlY3RlZCBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb247Ci0JcHJvdGVjdGVkIGxvbmcgbGFzdE1vZGlmaWVkOwotCi0JcHVibGljIE90aGVyUmVzcG9uc2UoVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JCWNvbm5lY3Rpb24gPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW4gPT0gbnVsbCAmJiB1cmwgIT0gbnVsbCkgewotCQkJaW4gPSBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7Ci0JCQl0aGlzLmxhc3RNb2RpZmllZCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGluOwotCX0KLQkvKioKLQkgKiBAc2VlIFJlc3BvbnNlI2dldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldElucHV0U3RyZWFtKCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKLQkJcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKLQkJcmV0dXJuIElTdGF0dXNDb2Rlcy5IVFRQX09LOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhdHVzTWVzc2FnZSgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgewotCQlpZiAobGFzdE1vZGlmaWVkID09IDApIHsKLQkJCWxhc3RNb2RpZmllZCA9IGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJcmV0dXJuIGxhc3RNb2RpZmllZDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BhdGNoZWRGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BhdGNoZWRGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZDZlZGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9QYXRjaGVkRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLS8qKgotICogRmVhdHVyZSBhbmQgY29ycmVzcG9uZGluZyBwYXRjaCBmZWF0dXJlcwotICovCi1wdWJsaWMgY2xhc3MgUGF0Y2hlZEZlYXR1cmUgewotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZTsKLQlwcml2YXRlIENvbGxlY3Rpb24gcGF0Y2hlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBQYXRjaGVkRmVhdHVyZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZFBhdGNoKElGZWF0dXJlUmVmZXJlbmNlIHBhdGNoKSB7Ci0JCXBhdGNoZXMuYWRkKHBhdGNoKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRjaGVzLgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldFBhdGNoZXMoKSB7Ci0JCXJldHVybiAoSUZlYXR1cmVSZWZlcmVuY2VbXSkgcGF0Y2hlcy50b0FycmF5KG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtwYXRjaGVzLnNpemUoKV0pOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZlYXR1cmUgYW5kIHRoZSBwYXRjaGVzLgotCSAqLwotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZVtdIGdldEZlYXR1cmVBbmRQYXRjaGVzKCkgewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW3BhdGNoZXMuc2l6ZSgpICsgMV07Ci0JCWZlYXR1cmVzWzBdID0gZmVhdHVyZTsKLQkJU3lzdGVtLmFycmF5Y29weShnZXRQYXRjaGVzKCksIDAsIGZlYXR1cmVzLCAxLCBwYXRjaGVzLnNpemUoKSk7Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0JLyoqCi0JICogT2J0YWlucyBhbGwgcGx1Z2lucyBmcm9tIHRoZSBmZWF0dXJlIGFuZCBpdHMgcGF0Y2hlcy4gRWFjaCBwbHVnaW4gd2lsbAotCSAqIGhhdmUgdW5pcXVlIElELgotCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSB2ZXJzaW9uIG9mIHBsdWdpbiB3aXRoIHNhbWUgSUQgYW1vbmcgdGhlIGZlYXR1cmUKLQkgKiBhbmQgaXRzIHBhdGNoZXMsIGhpZ2hlc3QgdmVyc2lvbiBwbHVnaW5zIGFyZSBjaG9zZW4uCi0JICogCi0JICogQHJldHVybiBGZWF0dXJlUGx1Z2luW10KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVBsdWdpbltdIGdldFBsdWdpbnMoKSB7Ci0JCS8vIFVzZSBhIG1hcCBvZiBQYXRjaGVkUGx1aWducyBieSBwbHVnaW4gSUQKLQkJLy8gdG8gY29sbGVjdCBvbmUgdmVyc2lvbiBvZiBlYWNoIHBsdWdpbgotCQlNYXAgcGx1Z2lucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZnMgPSBnZXRGZWF0dXJlQW5kUGF0Y2hlcygpOwotCQkvLyBmb3IgZWFjaCAoZmVhdHVyZSBvciBhbnkgcGF0Y2gpCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVSZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlVcGRhdGVDb3JlLndhcm4oIk51bGwgRmVhdHVyZSIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGdldCBwbHVnaW4gZW50cmllcwotCQkJCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCQlmb3IgKGludCBlbnRyID0gMDsgZW50ciA8IGVudHJpZXMubGVuZ3RoOyBlbnRyKyspIHsKLQkJCQkJU3RyaW5nIHBsdWdpbklkID0gZW50cmllc1tlbnRyXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBwbHVnaW5WZXJzaW9uID0gZW50cmllc1tlbnRyXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJCQkvLyBjaGVjayBpZiBtYXAgY29udGFpbnMgPj0gdmVyc2lvbiBvZiBzYW1lIHBsdWdpbgotCQkJCQlGZWF0dXJlUGx1Z2luIGV4aXN0aW5nUGx1Z2luID0gKEZlYXR1cmVQbHVnaW4pIHBsdWdpbnMuZ2V0KHBsdWdpbklkKTsKLQkJCQkJaWYgKGV4aXN0aW5nUGx1Z2luICE9IG51bGwgJiYgZXhpc3RpbmdQbHVnaW4uZ2V0RW50cnkoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLmlzR3JlYXRlck9yRXF1YWxUbyhwbHVnaW5WZXJzaW9uKSkgewotCQkJCQkJLy8gc2FtZSBvciBuZXdlciBwbHVnaW4gYWxyZWFkeSBjb2xsZWN0ZWQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcGx1Z2lucy5wdXQocGx1Z2luSWQsIG5ldyBGZWF0dXJlUGx1Z2luKGVudHJpZXNbZW50cl0sIGZlYXR1cmUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKEZlYXR1cmVQbHVnaW5bXSkgcGx1Z2lucy52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlUGx1Z2luW3BsdWdpbnMuc2l6ZSgpXSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKGZlYXR1cmUudG9TdHJpbmcoKSk7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcGF0Y2hlcyA9IGdldEZlYXR1cmVBbmRQYXRjaGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJc3RyLmFwcGVuZCgiICtwYXRjaD0iICsgcGF0Y2hlc1tpXS50b1N0cmluZygpICsgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5YzI2NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1BsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogQ29udGVudENvbnN1bWVyIGZvciBhIHBsdWdpbiBlbnRyeSBvZiBhIGZlYXR1cmUNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgUGx1Z2luRW50cnlDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBDb250ZW50Q29uc3VtZXIgew0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7DQotDQotCXByaXZhdGUgSUNvbnRlbnRDb25zdW1lciBjb250ZW50Q29uc3VtZXI7DQotCQkNCi0JLyoNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBQbHVnaW5FbnRyeUNvbnRlbnRDb25zdW1lcihJQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcil7DQotCQl0aGlzLmNvbnRlbnRDb25zdW1lciA9IGNvbnRlbnRDb25zdW1lcjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIENvbnRlbnRDb25zdW1lciNzdG9yZShDb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmICghY2xvc2VkKXsNCi0JCQljb250ZW50Q29uc3VtZXIuc3RvcmUoY29udGVudFJlZmVyZW5jZSxtb25pdG9yKTsNCi0JCX0gZWxzZSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIixuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBDb250ZW50Q29uc3VtZXIjY2xvc2UoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoIWNsb3NlZCl7DQotCQkJY2xvc2VkID0gdHJ1ZTsNCi0JCQljb250ZW50Q29uc3VtZXIuY2xvc2UoKTsNCi0JCX0gZWxzZSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGNsb3NlIGEgY2xvc2VkIFBsdWdpbkVudHJ5Q29udGVudENvbnN1bWVyIixuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Qb2xpY3kuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUG9saWN5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjM2UzMTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Qb2xpY3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLQotaW1wb3J0IGphdmEudGV4dC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBjbGFzcyBQb2xpY3kgewotCXByb3RlY3RlZCBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBOTFMgY2F0YWxvZyBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9jYWxpemUoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBMb29rdXAgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gSUQgaW4gdGhpcyBjYXRhbG9nIGFuZCBiaW5kIGl0cwotCSAqIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGlkLCBTdHJpbmcgYmluZGluZykgewotCQlyZXR1cm4gYmluZChpZCwgbmV3IFN0cmluZ1tdIHsgYmluZGluZyB9KTsKLQl9Ci0JCi0JLyoqCi0JICogTG9va3VwIHRoZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIElEIGluIHRoaXMgY2F0YWxvZyBhbmQgYmluZCBpdHMKLQkgKiBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgaWQsIFN0cmluZyBiaW5kaW5nMSwgU3RyaW5nIGJpbmRpbmcyKSB7Ci0JCXJldHVybiBiaW5kKGlkLCBuZXcgU3RyaW5nW10geyBiaW5kaW5nMSwgYmluZGluZzIgfSk7Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlLiBXZSBkb24ndCB3YW50IHRvIGNyYXNoIGJlY2F1c2Ugb2YgYSBtaXNzaW5nIFN0cmluZy4KLQkgKiBSZXR1cm5zIHRoZSBrZXkgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSkgewotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAiISIgKyBrZXkgKyAiISI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldHMgYSBzdHJpbmcgZnJvbSB0aGUgcmVzb3VyY2UgYnVuZGxlIGFuZCBiaW5kcyBpdCB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuIElmIHRoZSBrZXkgaXMgCi0JICogbm90IGZvdW5kLCByZXR1cm4gdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3MpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChiaW5kKGtleSksIGFyZ3MpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICIhIiArIGtleSArICIhIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUHJvZ3Jlc3MgbW9uaXRvciBoZWxwZXJzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCX0KLQlwdWJsaWMgc3RhdGljIElQcm9ncmVzc01vbml0b3IgbW9uaXRvckZvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gbW9uaXRvcjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3JGb3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgdGlja3MpIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlpZiAobW9uaXRvciBpbnN0YW5jZW9mIE51bGxQcm9ncmVzc01vbml0b3IpCi0JCQlyZXR1cm4gbW9uaXRvcjsKLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUmVzcG9uc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvUmVzcG9uc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5ZjRlMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1Jlc3BvbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUmVzcG9uc2UgewotCi0JLyoqCi0JICogTWV0aG9kIGdldElucHV0U3RyZWFtLgotCSAqIAotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBIHNwZWNpYWwgdmVyc2lvbiBvZiAnZ2V0SW5wdXRTdHJlYW0nIHRoYXQgY2FuIGJlIGNhbmNlbGVkLgotCSAqIEEgbW9uaXRvciB0aHJlYWQgY2hlY2tzIHRoZSBzdGF0ZSBvZiB0aGUgbW9uaXRvcgotCSAqIGFuZCBkaXNjb25uZWN0cyB0aGUgY29ubmVjdGlvbiBpZiAnaXNDYW5jZWxlZCgpJyBpcyBkZXRlY3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqICAgICAgICAgICAgdGhlIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIElucHV0U3RyZWFtIGFuIG9wZW5lZCBzdHJlYW0gb3IgbnVsbCBpZiBmYWlsZWQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHRoZXJlIGFyZSBwcm9ibGVtcwotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIG5vIG1vcmUgY29ubmVjdGlvbiB0aHJlYWRzIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0Q29udGVudExlbmd0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIGxvbmcKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0U3RhdHVzQ29kZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpOwotCi0JLyoqCi0JICogTWV0aG9kIGdldFN0YXR1c01lc3NhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXR1c01lc3NhZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCBvZiBsYXN0IG1vZGlmaWNhdGlvbiB0byB0aGUgcmVzb3VyY2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWRlNjkyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIElGZWF0dXJlQ29udGVudENvbnN1bWVyCi0gKiA8L3A+Ci0gKiBAc2luY2UgMi4wCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpdGVDb250ZW50Q29uc3VtZXIgaW1wbGVtZW50cyBJU2l0ZUNvbnRlbnRDb25zdW1lciB7Ci0JCi0JcHJpdmF0ZSBJU2l0ZSBzaXRlOwotCQotCS8qCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNzZXRTaXRlKElTaXRlKQotCSAqLwotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUuCi0JICogQHBhcmFtIHNpdGUgVGhlIHNpdGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKSB7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgc2l0ZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBJU2l0ZQotCSAqLwotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCkgewotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxZmNkOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIEBhdXRob3IgYmlyc2FuDQotICoNCi0gKiBUT0RPIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bw0KLSAqIFdpbmRvdyAtIFByZWZlcmVuY2VzIC0gSmF2YSAtIENvZGUgR2VuZXJhdGlvbiAtIENvZGUgYW5kIENvbW1lbnRzDQotICovDQotLyoqDQotICogU2l0ZSBvbiB0aGUgRmlsZSBTeXN0ZW0NCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGUgZXh0ZW5kcyBTaXRlIHsNCi0NCi0JLyoqDQotCSAqIHBsdWdpbiBlbnRyaWVzIA0KLQkgKi8NCi0JcHJpdmF0ZSBMaXN0IHBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KDApOw0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVDb250ZW50Q29uc3VtZXIgY3JlYXRlU2l0ZUNvbnRlbnRDb25zdW1lcihJRmVhdHVyZSB0YXJnZXRGZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlTaXRlRmlsZUNvbnRlbnRDb25zdW1lciBjb25zdW1lciA9IG5ldyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lcih0YXJnZXRGZWF0dXJlKTsNCi0JCWNvbnN1bWVyLnNldFNpdGUodGhpcyk7DQotCQlyZXR1cm4gY29uc3VtZXI7DQotCX0NCi0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlZEZlYXR1cmVUeXBlKCkgew0KLQkJcmV0dXJuIERFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfVFlQRTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmllciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciB2ZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGluc3RhbGwoc291cmNlRmVhdHVyZSxudWxsLHZlcmlmaWNhdGlvbkxpc3RlbmVyLHByb2dyZXNzKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmllciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIHNvdXJjZUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoc291cmNlRmVhdHVyZSA9PSBudWxsKQ0KLQkJCXJldHVybiBudWxsOw0KLQ0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gSW5zdGFsbE1vbml0b3IJCQ0KLQkJSW5zdGFsbE1vbml0b3IgbW9uaXRvcjsNCi0JCWlmIChwcm9ncmVzcyA9PSBudWxsKQ0KLQkJCW1vbml0b3IgPSBudWxsOw0KLQkJZWxzZSBpZiAocHJvZ3Jlc3MgaW5zdGFuY2VvZiBJbnN0YWxsTW9uaXRvcikNCi0JCQltb25pdG9yID0gKEluc3RhbGxNb25pdG9yKSBwcm9ncmVzczsNCi0JCWVsc2UNCi0JCQltb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHByb2dyZXNzKTsNCi0NCi0JCS8vIGNyZWF0ZSBuZXcgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBpbnN0YWxsIHNvdXJjZSBjb250ZW50IGludG8gaXQNCi0JCUlGZWF0dXJlIGxvY2FsRmVhdHVyZSA9IGNyZWF0ZUV4ZWN1dGFibGVGZWF0dXJlKHNvdXJjZUZlYXR1cmUpOw0KLQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgbG9jYWxGZWF0dXJlUmVmZXJlbmNlID0gbnVsbDsNCi0JCWxvY2FsRmVhdHVyZVJlZmVyZW5jZSA9IHNvdXJjZUZlYXR1cmUuaW5zdGFsbChsb2NhbEZlYXR1cmUsIG9wdGlvbmFsZmVhdHVyZXMsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsNCi0NCi0JCXJldHVybiBsb2NhbEZlYXR1cmVSZWZlcmVuY2U7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNpbnN0YWxsKElGZWF0dXJlLElGZWF0dXJlQ29udGVudENvbnN1bWVyLCBJVmVyaWZpZXIsSVZlcmlmaWNhdGlvbkxJc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLCBJRmVhdHVyZUNvbnRlbnRDb25zdW1lciBwYXJlbnRDb250ZW50Q29uc3VtZXIsIElWZXJpZmllciBwYXJlbnRWZXJpZmllciwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQ0KLQkJdGhyb3dzIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChzb3VyY2VGZWF0dXJlID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotDQotCQkvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbiBJbnN0YWxsTW9uaXRvcgkJDQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yOw0KLQkJaWYgKHByb2dyZXNzID09IG51bGwpDQotCQkJbW9uaXRvciA9IG51bGw7DQotCQllbHNlIGlmIChwcm9ncmVzcyBpbnN0YW5jZW9mIEluc3RhbGxNb25pdG9yKQ0KLQkJCW1vbml0b3IgPSAoSW5zdGFsbE1vbml0b3IpIHByb2dyZXNzOw0KLQkJZWxzZQ0KLQkJCW1vbml0b3IgPSBuZXcgSW5zdGFsbE1vbml0b3IocHJvZ3Jlc3MpOw0KLQ0KLQkJLy8gY3JlYXRlIG5ldyBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIGluc3RhbGwgc291cmNlIGNvbnRlbnQgaW50byBpdA0KLQkJSUZlYXR1cmUgbG9jYWxGZWF0dXJlID0gY3JlYXRlRXhlY3V0YWJsZUZlYXR1cmUoc291cmNlRmVhdHVyZSk7DQotCQlwYXJlbnRDb250ZW50Q29uc3VtZXIuYWRkQ2hpbGQobG9jYWxGZWF0dXJlKTsNCi0NCi0JCS8vIHNldCB0aGUgdmVyaWZpZXINCi0JCUlWZXJpZmllciB2ciA9IHNvdXJjZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldFZlcmlmaWVyKCk7DQotCQlpZiAodnIgIT0gbnVsbCkNCi0JCQl2ci5zZXRQYXJlbnQocGFyZW50VmVyaWZpZXIpOw0KLQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgbG9jYWxGZWF0dXJlUmVmZXJlbmNlID0gbnVsbDsNCi0JCWxvY2FsRmVhdHVyZVJlZmVyZW5jZSA9IHNvdXJjZUZlYXR1cmUuaW5zdGFsbChsb2NhbEZlYXR1cmUsIG9wdGlvbmFsZmVhdHVyZXMsIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBtb25pdG9yKTsNCi0NCi0JCXJldHVybiBsb2NhbEZlYXR1cmVSZWZlcmVuY2U7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzcykgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSB0byByZW1vdmUgaXMgbnVsbCIpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkJDQotCQlFcnJvclJlY292ZXJ5TG9nIHJlY292ZXJ5TG9nID0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKTsNCi0NCi0JCS8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEluc3RhbGxNb25pdG9yCQkNCi0JCUluc3RhbGxNb25pdG9yIG1vbml0b3I7DQotCQlpZiAocHJvZ3Jlc3MgPT0gbnVsbCkNCi0JCQltb25pdG9yID0gbnVsbDsNCi0JCWVsc2UgaWYgKHByb2dyZXNzIGluc3RhbmNlb2YgSW5zdGFsbE1vbml0b3IpDQotCQkJbW9uaXRvciA9IChJbnN0YWxsTW9uaXRvcikgcHJvZ3Jlc3M7DQotCQllbHNlDQotCQkJbW9uaXRvciA9IG5ldyBJbnN0YWxsTW9uaXRvcihwcm9ncmVzcyk7DQotDQotCQkvLyBTZXR1cCBvcHRpb25hbCBpbnN0YWxsIGhhbmRsZXINCi0JCUluc3RhbGxIYW5kbGVyUHJveHkgaGFuZGxlciA9IG5ldyBJbnN0YWxsSGFuZGxlclByb3h5KElJbnN0YWxsSGFuZGxlci5IQU5ETEVSX0FDVElPTl9VTklOU1RBTEwsIGZlYXR1cmUsIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJFbnRyeSgpLCBtb25pdG9yKTsNCi0JCWJvb2xlYW4gc3VjY2VzcyA9IGZhbHNlOw0KLQkJVGhyb3dhYmxlIG9yaWdpbmFsRXhjZXB0aW9uID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotDQotCQkJLy8gc3RhcnQgbG9nDQotCQkJcmVjb3ZlcnlMb2cub3BlbihFcnJvclJlY292ZXJ5TG9nLlNUQVJUX1JFTU9WRV9MT0cpOw0KLQ0KLQkJCWFib3V0VG9SZW1vdmUoZmVhdHVyZSk7DQotDQotCQkJLy8gbG9nIGZpbGVzIGhhdmUgYmVlbiBkb3dubG9hZGVkDQotCQkJcmVjb3ZlcnlMb2cuYXBwZW5kKEVycm9yUmVjb3ZlcnlMb2cuRU5EX0FCT1VUX1JFTU9WRSk7DQotDQotCQkJaGFuZGxlci51bmluc3RhbGxJbml0aWF0ZWQoKTsNCi0NCi0JCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgYW5kIHRoZSBwbHVnaW5zIGlmIHRoZXkgYXJlIG5vdCB1c2VkIGFuZCBub3QgYWN0aXZhdGVkDQotCQkJLy8gZ2V0IHRoZSBwbHVnaW5zIGZyb20gdGhlIGZlYXR1cmUNCi0JCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9SZW1vdmUgPSBnZXRQbHVnaW5FbnRyaWVzT25seVJlZmVyZW5jZWRCeShmZWF0dXJlKTsNCi0NCi0JCQlpZiAobW9uaXRvciAhPSBudWxsKSB7DQotCQkJCW1vbml0b3IuYmVnaW5UYXNrKFBvbGljeS5iaW5kKCJTaXRlRmlsZS5SZW1vdmluZyIpICsgZmVhdHVyZS5nZXRMYWJlbCgpLCBwbHVnaW5zVG9SZW1vdmUubGVuZ3RoICsgMSk7CS8vJE5PTi1OTFMtMSQNCi0JCQl9DQotDQotCQkJLy8gcmVtb3ZlIGZlYXR1cmUgcmVmZXJlbmNlIGZyb20gdGhlIHNpdGUNCi0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlUmVmZXJlbmNlcyA9IGdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJaWYgKGZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpIHsNCi0JCQkJZm9yIChpbnQgaW5kZXhSZWYgPSAwOyBpbmRleFJlZiA8IGZlYXR1cmVSZWZlcmVuY2VzLmxlbmd0aDsgaW5kZXhSZWYrKykgew0KLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgZWxlbWVudCA9IGZlYXR1cmVSZWZlcmVuY2VzW2luZGV4UmVmXTsNCi0JCQkJCWlmIChlbGVtZW50LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7DQotCQkJCQkJcmVtb3ZlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpIGVsZW1lbnQpOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoImZlYXR1cmVfIitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQotCQkJCVVwZGF0ZUNvcmUubG9nKFBvbGljeS5iaW5kKCJTaXRlRmlsZS5mZWF0dXJlTm90UmVtb3ZlZCIsIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gcmVtb3ZlIHRoZSBmZWF0dXJlIGNvbnRlbnQNCi0JCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhtb25pdG9yKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQl0cnkgew0KLQkJCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShyZWZlcmVuY2VzW2ldLmFzRmlsZSgpKTsNCi0JCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKQ0KLQkJCQkJCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGUuQ2Fubm90UmVtb3ZlRmVhdHVyZSIsIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJCQl9DQotCQkJCX0NCi0JCQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJGZWF0dXJlKGZlYXR1cmUpOw0KLQkJCX0NCi0NCi0JCQkvL2ZpbmRzIHRoZSBjb250ZW50UmVmZXJlbmNlcyBmb3IgYW4gSVBsdWdpbkVudHJ5DQotCQkJLy8gYW5kIHJlbW92ZSBpdA0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQotCQkJCXJlbW92ZShmZWF0dXJlLCBwbHVnaW5zVG9SZW1vdmVbaV0sIG1vbml0b3IpOw0KLQkJCX0NCi0NCi0JCQkvLyByZW1vdmUgYW55IGNoaWxkcmVuIGZlYXR1cmUNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuUmVmID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlblJlZi5sZW5ndGg7IGkrKykgew0KLQkJCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOw0KLQkJCQl0cnkgew0KLQkJCQkJY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byByZXRyaWV2ZSBmZWF0dXJlIHRvIHJlbW92ZSBmb3I6IiArIGNoaWxkcmVuUmVmW2ldKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCWlmIChjaGlsZEZlYXR1cmUgIT0gbnVsbCkNCi0JCQkJCXJlbW92ZShjaGlsZHJlblJlZltpXS5nZXRGZWF0dXJlKG51bGwpLCBtb25pdG9yKTsNCi0JCQl9DQotDQotCQkJLy8gcmVtb3ZlIHRoZSBmZWF0dXJlIGZyb20gdGhlIHNpdGUgY2FjaGUNCi0JCQlyZW1vdmVGZWF0dXJlRnJvbUNhY2hlKGZlYXR1cmUuZ2V0VVJMKCkpOw0KLQkJCQ0KLQkJCWhhbmRsZXIuY29tcGxldGVVbmluc3RhbGwoKTsNCi0NCi0JCQlzdWNjZXNzID0gdHJ1ZTsNCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotCQkJb3JpZ2luYWxFeGNlcHRpb24gPSB0Ow0KLQkJfSBmaW5hbGx5IHsNCi0JCQlUaHJvd2FibGUgbmV3RXhjZXB0aW9uID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQlpZiAoc3VjY2Vzcykgew0KLQkJCQkJLy8gY2xvc2UgdGhlIGxvZw0KLQkJCQkJcmVjb3ZlcnlMb2cuY2xvc2UoRXJyb3JSZWNvdmVyeUxvZy5FTkRfUkVNT1ZFX0xPRyk7DQotCQkJCQlyZWNvdmVyeUxvZy5kZWxldGUoKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCXJlY292ZXJ5TG9nLmNsb3NlKEVycm9yUmVjb3ZlcnlMb2cuRU5EX1JFTU9WRV9MT0cpOw0KLQkJCQl9DQotCQkJCWhhbmRsZXIudW5pbnN0YWxsQ29tcGxldGVkKHN1Y2Nlc3MpOw0KLQkJCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7DQotCQkJCW5ld0V4Y2VwdGlvbiA9IHQ7DQotCQkJfQ0KLQkJCWlmIChvcmlnaW5hbEV4Y2VwdGlvbiAhPSBudWxsKSAvLyBvcmlnaW5hbCBleGNlcHRpb24gd2lucw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSW5zdGFsbEhhbmRsZXIuZXJyb3IiLCBmZWF0dXJlLmdldExhYmVsKCkpLCBvcmlnaW5hbEV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQNCi0JCQlpZiAobmV3RXhjZXB0aW9uICE9IG51bGwpDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsSGFuZGxlci5lcnJvciIsIGZlYXR1cmUuZ2V0TGFiZWwoKSksIG5ld0V4Y2VwdGlvbik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiByZXR1cm5zIHRoZSBkb3dubG9hZCBzaXplDQotCSAqIG9mIHRoZSBmZWF0dXJlIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgc2l0ZS4NCi0JICogSWYgdGhlIHNpdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJucyB0aGUgbWF4aW11bSBzaXplDQotCSAqIA0KLQkgKiBJZiBvbmUgcGx1Zy1pbiBlbnRyeSBoYXMgYW4gdW5rbm93biBzaXplLg0KLQkgKiB0aGVuIHRoZSBkb3dubG9hZCBzaXplIGlzIHVua25vd24uDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCWxvbmcgcmVzdWx0ID0gMDsNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCUlQbHVnaW5FbnRyeVtdIHNpdGVFbnRyaWVzID0gdGhpcy5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQllbnRyaWVzVG9JbnN0YWxsID0gVXBkYXRlTWFuYWdlclV0aWxzLmRpZmYoZW50cmllc1RvSW5zdGFsbCwgc2l0ZUVudHJpZXMpOw0KLQkJLy9bMTgzNTVdDQotCQlJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7DQotDQotCQl0cnkgew0KLQkJCXJlc3VsdCA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldERvd25sb2FkU2l6ZUZvcihlbnRyaWVzVG9JbnN0YWxsLCBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQlyZXN1bHQgPSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiByZXR1cm5zIHRoZSBkb3dubG9hZCBzaXplDQotCSAqIG9mIHRoZSBmZWF0dXJlIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgc2l0ZS4NCi0JICogSWYgdGhlIHNpdGUgaXMgPGNvZGU+bnVsbDwvY29kZT4gcmV0dXJucyB0aGUgbWF4aW11bSBzaXplDQotCSAqIA0KLQkgKiBJZiBvbmUgcGx1Zy1pbiBlbnRyeSBoYXMgYW4gdW5rbm93biBzaXplLg0KLQkgKiB0aGVuIHRoZSBkb3dubG9hZCBzaXplIGlzIHVua25vd24uDQotCSAqIA0KLQkgKiBAc2VlIElTaXRlI2dldERvd25sb2FkU2l6ZUZvcihJRmVhdHVyZSkNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQlsb25nIHJlc3VsdCA9IDA7DQotDQotCQl0cnkgew0KLQkJCUxpc3QgcGx1Z2luc1RvSW5zdGFsbCA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JCQkvLyBnZXQgYWxsIHRoZSBwbHVnaW5zIFsxNzMwNF0NCi0JCQlwbHVnaW5zVG9JbnN0YWxsLmFkZEFsbChBcnJheXMuYXNMaXN0KGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpKSk7DQotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJCUlGZWF0dXJlIGN1cnJlbnRGZWF0dXJlID0gbnVsbDsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCWN1cnJlbnRGZWF0dXJlID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJaWYgKGN1cnJlbnRGZWF0dXJlICE9IG51bGwpIHsNCi0JCQkJCXBsdWdpbnNUb0luc3RhbGwuYWRkQWxsKEFycmF5cy5hc0xpc3QoY3VycmVudEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpKSk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllc1RvSW5zdGFsbCA9IG5ldyBJUGx1Z2luRW50cnlbMF07DQotCQkJaWYgKHBsdWdpbnNUb0luc3RhbGwuc2l6ZSgpID4gMCkgew0KLQkJCQllbnRyaWVzVG9JbnN0YWxsID0gbmV3IElQbHVnaW5FbnRyeVtwbHVnaW5zVG9JbnN0YWxsLnNpemUoKV07DQotCQkJCXBsdWdpbnNUb0luc3RhbGwudG9BcnJheShlbnRyaWVzVG9JbnN0YWxsKTsNCi0JCQl9DQotDQotCQkJSVBsdWdpbkVudHJ5W10gc2l0ZUVudHJpZXMgPSB0aGlzLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCQllbnRyaWVzVG9JbnN0YWxsID0gVXBkYXRlTWFuYWdlclV0aWxzLmRpZmYoZW50cmllc1RvSW5zdGFsbCwgc2l0ZUVudHJpZXMpOw0KLQ0KLQkJCS8vWzE4MzU1XQ0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIG5vblBsdWdpbkVudHJpZXNUb0luc3RhbGwgPSBmZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0NCi0JCQlyZXN1bHQgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRJbnN0YWxsU2l6ZUZvcihlbnRyaWVzVG9JbnN0YWxsLCBub25QbHVnaW5FbnRyaWVzVG9JbnN0YWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCQlyZXN1bHQgPSBDb250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkU7DQotCQl9DQotDQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBBZGRzIGEgcGx1Z2luIGVudHJ5IA0KLQkgKiBFaXRoZXIgZnJvbSBwYXJzaW5nIHRoZSBmaWxlIHN5c3RlbSBvciANCi0JICogaW5zdGFsbGluZyBhIGZlYXR1cmUNCi0JICogDQotCSAqIFdlIGNhbm5vdCBmaWd1cmUgb3V0IHRoZSBsaXN0IG9mIHBsdWdpbnMgYnkgcmVhZGluZyB0aGUgU2l0ZS54bWwgYXMNCi0JICogdGhlIGFyY2hpdmVzIHRhZyBhcmUgb3B0aW9uYWxzDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsNCi0JCXBsdWdpbkVudHJpZXMuYWRkKHBsdWdpbkVudHJ5KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsNCi0JCUlQbHVnaW5FbnRyeVtdIHJlc3VsdCA9IG5ldyBJUGx1Z2luRW50cnlbMF07DQotCQlpZiAoIShwbHVnaW5FbnRyaWVzID09IG51bGwgfHwgcGx1Z2luRW50cmllcy5pc0VtcHR5KCkpKSB7DQotCQkJcmVzdWx0ID0gbmV3IElQbHVnaW5FbnRyeVtwbHVnaW5FbnRyaWVzLnNpemUoKV07DQotCQkJcGx1Z2luRW50cmllcy50b0FycmF5KHJlc3VsdCk7DQotCQl9DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotDQotDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsNCi0JCXJldHVybiBnZXRQbHVnaW5FbnRyaWVzKCkubGVuZ3RoOw0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgSUZlYXR1cmUgY3JlYXRlRXhlY3V0YWJsZUZlYXR1cmUoSUZlYXR1cmUgc291cmNlRmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSUZlYXR1cmUgcmVzdWx0ID0gbnVsbDsNCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yeShERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1RZUEUpOw0KLQkJcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKC8qVVJMKi9udWxsLCB0aGlzLCBudWxsKTsNCi0NCi0JCS8vIGF0IGxlYXN0IHNldCB0aGUgdmVyc2lvbiBpZGVudGlmaWVyIHRvIGJlIHRoZSBzYW1lDQotCQkgKChGZWF0dXJlTW9kZWwpIHJlc3VsdCkuc2V0RmVhdHVyZUlkZW50aWZpZXIoc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsNCi0JCSgoRmVhdHVyZU1vZGVsKSByZXN1bHQpLnNldEZlYXR1cmVWZXJzaW9uKHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZShJRmVhdHVyZSBmZWF0dXJlLCBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChwbHVnaW5FbnRyeSA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCQkNCi0JCWlmIChJbnN0YWxsUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXQoInBsdWdpbl8iK3BsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkgPT0gbnVsbCkgeyAvLyROT04tTkxTLTEkDQotCQkJVXBkYXRlQ29yZS5sb2coUG9saWN5LmJpbmQoIlNpdGVGaWxlLnBsdWdpbk5vdFJlbW92ZWQiLCBwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSksIG51bGwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlyZXR1cm47IA0KLQkJfQ0KLQ0KLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbkVudHJ5LCBtb25pdG9yKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgew0KLQkJCXRyeSB7DQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShyZWZlcmVuY2VzW2ldLmFzRmlsZSgpKTsNCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkNCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlLkNhbm5vdFJlbW92ZVBsdWdpbiIsIHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCBnZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXBsdWdpbkVudHJpZXMucmVtb3ZlKHBsdWdpbkVudHJ5KTsNCi0JCUluc3RhbGxSZWdpc3RyeS51bnJlZ2lzdGVyUGx1Z2luKHBsdWdpbkVudHJ5KTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgdm9pZCBhYm91dFRvUmVtb3ZlKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUVycm9yUmVjb3ZlcnlMb2cgcmVjb3ZlcnlMb2cgPSBFcnJvclJlY292ZXJ5TG9nLmdldExvZygpOw0KLQkJLy8gaWYgdGhlIHJlY292ZXJ5IGlzIG5vdCB0dXJuZWQgb24NCi0JCWlmICghRXJyb3JSZWNvdmVyeUxvZy5SRUNPVkVSWV9PTikNCi0JCQlyZXR1cm47DQotDQotCQkvL2xvZ0ZlYXR1cmUNCi0JCWlmIChmZWF0dXJlICE9IG51bGwpIHsNCi0JCQkJCQ0KLQkJCS8vIGxvZyBmZWF0dXJlIFVSTA0KLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobnVsbCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7DQotCQkJCXRyeSB7DQotCQkJCQlyZWNvdmVyeUxvZy5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuRkVBVFVSRV9FTlRSWSwgcmVmZXJlbmNlc1tpXS5hc0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7DQotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGUuQ2Fubm90UmVtb3ZlRmVhdHVyZSIsIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQl9DQotCQkJLy8gbG9nIHBsdWdpbkVudHJ5IFVSTA0KLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbnNUb1JlbW92ZSA9IGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KGZlYXR1cmUpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7DQotCQkJCXJlZmVyZW5jZXMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbnNUb1JlbW92ZVtpXSwgbnVsbCk7DQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGorKykgew0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlyZWNvdmVyeUxvZy5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuQlVORExFX0pBUl9FTlRSWSwgcmVmZXJlbmNlc1tqXS5hc0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7DQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlLkNhbm5vdFJlbW92ZVBsdWdpbiIsIHBsdWdpbnNUb1JlbW92ZVtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQkvLyBjYWxsIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIGNoaWxkcmVuCSANCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW5SZWYgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJdHJ5IHsNCi0JCQkJY2hpbGRGZWF0dXJlID0gY2hpbGRyZW5SZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gcmV0cmlldmUgZmVhdHVyZSB0byByZW1vdmUgZm9yOiIgKyBjaGlsZHJlblJlZltpXSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQkJYWJvdXRUb1JlbW92ZShjaGlsZEZlYXR1cmUpOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZkYmUxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudENvbnN1bWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLS8qKg0KLSAqIENvbnRlbnRDb25zdW1tZXIgZm9yIGEgU2l0ZUZpbGUNCi0gKi8NCi1wdWJsaWMgY2xhc3MgU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIgZXh0ZW5kcyBTaXRlQ29udGVudENvbnN1bWVyIHsNCi0NCi0JcHJpdmF0ZSBJRmVhdHVyZSBmZWF0dXJlOw0KLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7DQotDQotCS8vIHJlY292ZXJ5DQotCXByaXZhdGUgU3RyaW5nIG9sZFBhdGg7DQotCXByaXZhdGUgU3RyaW5nIG5ld1BhdGg7DQotDQotCS8vICBmb3IgYWJvcnQNCi0JcHJpdmF0ZSBMaXN0IC8qIG9mIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyICovDQotCWNvbnRlbnRDb25zdW1lcnM7DQotCXByaXZhdGUgTGlzdCAvKm9mIHBhdGggYXMgU3RyaW5nICovDQotCWluc3RhbGxlZEZpbGVzOw0KLQkNCi0JLy8gUEVSRjogbmV3IGluc3RhbmNlIHZhcmlhYmxlDQotCXByaXZhdGUgU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOw0KLQ0KLQkvKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICovDQotCXB1YmxpYyBTaXRlRmlsZUNvbnRlbnRDb25zdW1lcihJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOw0KLQkJaW5zdGFsbGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCX0NCi0NCi0JLyoNCi0JICogUmV0dXJucyB0aGUgcGF0aCBpbiB3aGljaCB0aGUgRmVhdHVyZSB3aWxsIGJlIGluc3RhbGxlZA0KLQkgKi8NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZVBhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZlYXR1cmVJZGVudGlmaWVyID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJU3RyaW5nIHBhdGggPSBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIGZlYXR1cmVJZGVudGlmaWVyLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcjsNCi0JCQlVUkwgbmV3VVJMID0gbmV3IFVSTChnZXRTaXRlKCkuZ2V0VVJMKCksIHBhdGgpOw0KLQkJCWZlYXR1cmVQYXRoID0gbmV3VVJMLmdldEZpbGUoKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlQ29udGVudENvbnN1bWVyLlVuYWJsZVRvQ3JlYXRlVVJMIikgKyBlLmdldE1lc3NhZ2UoKSwgZSk7CS8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBmZWF0dXJlUGF0aDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI29wZW4oSU5vblBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIElDb250ZW50Q29uc3VtZXIgb3BlbihJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBuZXcgU2l0ZUZpbGVOb25QbHVnaW5Db250ZW50Q29uc3VtZXIoZ2V0RmVhdHVyZVBhdGgoKSk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUNvbnRlbnRDb25zdW1lciNvcGVuKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBJQ29udGVudENvbnN1bWVyIG9wZW4oSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlDb250ZW50Q29uc3VtZXIgY29uczsNCi0JCWlmKHBsdWdpbkVudHJ5IGluc3RhbmNlb2YgUGx1Z2luRW50cnlNb2RlbCAmJiAhKChQbHVnaW5FbnRyeU1vZGVsKXBsdWdpbkVudHJ5KS5pc1VucGFjaygpKXsNCi0JCQkvLyBwbHVnaW4gY2FuIHJ1biBmcm9tIGEgamFyDQotCQkJIGNvbnMgPSBuZXcgU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIocGx1Z2luRW50cnksIGdldFNpdGUoKSk7DQotCQl9IGVsc2V7DQotCQkJLy8gcGx1Z2luIG11c3QgYmUgdW5wYWNrZWQNCi0JCQljb25zID0gbmV3IFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyKHBsdWdpbkVudHJ5LCBnZXRTaXRlKCkpOw0KLQkJfQ0KLQkJYWRkQ29udGVudENvbnN1bWVycyhjb25zKTsNCi0JCXJldHVybiBjb25zOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoY2xvc2VkKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFNpdGVGaWxlQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsNCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGdldEZlYXR1cmVQYXRoKCk7DQotCQlTdHJpbmcgY29udGVudEtleSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpOw0KLQkJZmVhdHVyZVBhdGggKz0gY29udGVudEtleTsNCi0NCi0JCS8vIGVycm9yIHJlY292ZXJ5DQotCQlpZiAoZmVhdHVyZVBhdGguZW5kc1dpdGgoIlxcIitGZWF0dXJlLkZFQVRVUkVfWE1MKSB8fCBmZWF0dXJlUGF0aC5lbmRzV2l0aCgiLyIrRmVhdHVyZS5GRUFUVVJFX1hNTCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJb2xkUGF0aCA9IGZlYXR1cmVQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUob2xkUGF0aCk7DQotCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkgew0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiVXBkYXRlTWFuYWdlclV0aWxzLkZpbGVBbHJlYWR5RXhpc3RzIiwgbmV3IE9iamVjdFtdIHsgbG9jYWxGaWxlIH0pLCBudWxsKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlmZWF0dXJlUGF0aCA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKGZlYXR1cmVQYXRoKTsNCi0JCQluZXdQYXRoID0gZmVhdHVyZVBhdGg7DQotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuRkVBVFVSRV9FTlRSWSwgZmVhdHVyZVBhdGgpOw0KLQkJfQ0KLQ0KLQkJdHJ5IHsNCi0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsNCi0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tQZXJtaXNzaW9ucyhjb250ZW50UmVmZXJlbmNlLCBmZWF0dXJlUGF0aCk7IC8vIDIwMzA1DQotCQkJaW5zdGFsbGVkRmlsZXMuYWRkKGZlYXR1cmVQYXRoKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiR2xvYmFsQ29uc3VtZXIuRXJyb3JDcmVhdGluZ0ZpbGUiLCBmZWF0dXJlUGF0aCksIGUpOyAvLyROT04tTkxTLTEkDQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7DQotCQkJCXRyeSB7DQotCQkJCQkvLyBjbG9zZSBzdHJlYW0NCi0JCQkJCWluU3RyZWFtLmNsb3NlKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI2Nsb3NlKCkNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjbG9zZWQpDQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGNsb3NlIGEgY2xvc2VkIFNpdGVGaWxlQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJLy8gY3JlYXRlIGEgbmV3IEZlYXR1cmUgcmVmZXJlbmNlIHRvIGJlIGFkZGVkIHRvIHRoZSBzaXRlDQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKGdldFNpdGUoKSk7DQotCQlGaWxlIGZpbGUgPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQlmaWxlID0gbmV3IEZpbGUoZ2V0RmVhdHVyZVBhdGgoKSk7DQotCQkJcmVmLnNldFVSTChmaWxlLnRvVVJMKCkpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVDb250ZW50Q29uc3VtZXIuVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlIiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIGUpOyAvLyROT04tTkxTLTEkDQotCQl9DQotDQotCQkvL3JlbmFtZSBmaWxlIGJhY2sgDQotCQlpZiAobmV3UGF0aCAhPSBudWxsKSB7DQotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuUkVOQU1FX0VOVFJZLCBuZXdQYXRoKTsNCi0JCQlib29sZWFuIHN1Y2VzcyA9IGZhbHNlOw0KLQkJCUZpbGUgZmlsZVRvUmVuYW1lID0gbmV3IEZpbGUobmV3UGF0aCk7DQotCQkJaWYgKGZpbGVUb1JlbmFtZS5leGlzdHMoKSkgew0KLQkJCQlGaWxlIHJlbmFtZWRGaWxlID0gbmV3IEZpbGUob2xkUGF0aCk7DQotCQkJCWlmIChyZW5hbWVkRmlsZS5leGlzdHMoKSkgew0KLQkJCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHJlbmFtZWRGaWxlKTsNCi0JCQkJCVVwZGF0ZUNvcmUud2FybigiUmVtb3ZpbmcgYWxyZWFkeSBleGlzdGluZyBmaWxlOiIgKyBvbGRQYXRoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXN1Y2VzcyA9IGZpbGVUb1JlbmFtZS5yZW5hbWVUbyhyZW5hbWVkRmlsZSk7DQotCQkJfQ0KLQkJCWlmICghc3VjZXNzKSB7DQotCQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiQ29udGVudENvbnN1bWVyLlVuYWJsZVRvUmVuYW1lIiwgbmV3UGF0aCwgb2xkUGF0aCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBuZXcgRXhjZXB0aW9uKG1zZykpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIGNsb3NlIHBsdWdpbiBhbmQgbm9uIHBsdWdpbiBjb250ZW50IGNvbnN1bWVyDQotCQlpZiAoY29udGVudENvbnN1bWVycyAhPSBudWxsKSB7DQotCQkJSXRlcmF0b3IgaXRlciA9IGNvbnRlbnRDb25zdW1lcnMuaXRlcmF0b3IoKTsNCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsNCi0JCQkJQ29udGVudENvbnN1bWVyIGVsZW1lbnQgPSAoQ29udGVudENvbnN1bWVyKSBpdGVyLm5leHQoKTsNCi0JCQkJZWxlbWVudC5jbG9zZSgpOw0KLQkJCX0NCi0JCX0NCi0JCWNvbnRlbnRDb25zdW1lcnMgPSBudWxsOw0KLQ0KLQkJaWYgKHJlZiAhPSBudWxsKSB7DQotCQkJLy8gdGhlIGZlYXR1cmUgTVVTVCBoYXZlIHJlbmFtZWQgdGhlIHBsdWdpbnMgYXQgdGhhdCBwb2ludA0KLQkJCS8vIChieSBjbG9zaW5nIHRoZSBQbHVnaW5Db250ZW50Q29uc3VtZXIpDQotCQkJY29tbWl0UGx1Z2lucyhyZWYpOw0KLQkJCXJlZi5tYXJrUmVhZE9ubHkoKTsNCi0JCX0NCi0NCi0JCWNsb3NlZCA9IHRydWU7DQotCQlyZXR1cm4gcmVmOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjYWJvcnQoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWJvcnQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoY2xvc2VkKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGFib3J0IGEgY2xvc2VkIFNpdGVGaWxlQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCS8vYWJvcnQgYWxsIHBsdWdpbnMgY29udGVudCBjb25zdW1lciBvcGVuZWQNCi0JCWlmIChjb250ZW50Q29uc3VtZXJzICE9IG51bGwpIHsNCi0JCQlJdGVyYXRvciBpdGVyID0gY29udGVudENvbnN1bWVycy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLQkJCQlTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciBlbGVtZW50ID0gKFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyKSBpdGVyLm5leHQoKTsNCi0JCQkJZWxlbWVudC5hYm9ydCgpOw0KLQkJCX0NCi0JCX0NCi0JCWNvbnRlbnRDb25zdW1lcnMgPSBudWxsOw0KLQkJYm9vbGVhbiBzdWNlc3MgPSB0cnVlOw0KLQ0KLQkJLy9SZW1vdmUgZmVhdHVyZS54bWwgZmlyc3QgaWYgaXQgZXhpc3RzDQotCQlpZiAob2xkUGF0aCAhPSBudWxsKSB7DQotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuREVMRVRFX0VOVFJZLCBvbGRQYXRoKTsNCi0JCQlGaWxlIGZpbGVUb0RlbGV0ZSA9IG5ldyBGaWxlKG9sZFBhdGgpOw0KLQkJCWlmIChmaWxlVG9EZWxldGUuZXhpc3RzKCkpIHsNCi0JCQkJc3VjZXNzID0gZmlsZVRvRGVsZXRlLmRlbGV0ZSgpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmICghc3VjZXNzKSB7DQotCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJVbmFibGUgdG8gZGVsZXRlIiwgb2xkUGF0aCk7IC8vJE5PTi1OTFMtMSQNCi0JCQlVcGRhdGVDb3JlLmxvZyhtc2csIG51bGwpOw0KLQkJfSBlbHNlIHsNCi0JCQkvLyByZW1vdmUgdGhlIGZlYXR1cmUgZmlsZXM7DQotCQkJSXRlcmF0b3IgaXRlciA9IGluc3RhbGxlZEZpbGVzLml0ZXJhdG9yKCk7DQotCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG51bGw7DQotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7DQotCQkJCVN0cmluZyBwYXRoID0gKFN0cmluZykgaXRlci5uZXh0KCk7DQotCQkJCWZlYXR1cmVGaWxlID0gbmV3IEZpbGUocGF0aCk7DQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmZWF0dXJlRmlsZSk7DQotCQkJfQ0KLQ0KLQkJCS8vIHJlbW92ZSB0aGUgZmVhdHVyZSBkaXJlY3RvcnkgaWYgZW1wdHkNCi0JCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBnZXRGZWF0dXJlUGF0aCgpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVFbXB0eURpcmVjdG9yaWVzRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUoZmVhdHVyZVBhdGgpKTsNCi0JCX0NCi0JCWNsb3NlZCA9IHRydWU7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JLyoNCi0JICogY29tbWl0IHRoZSBwbHVnaW5zIGluc3RhbGxlZCBhcyBhcmNoaXZlIG9uIHRoZSBzaXRlDQotCSAqIChjcmVhdGVzIHRoZSBtYXAgYmV0d2VlbiB0aGUgcGx1Z2luIGlkIGFuZCB0aGUgbG9jYXRpb24gb2YgdGhlIHBsdWdpbikNCi0JICovDQotCXByaXZhdGUgdm9pZCBjb21taXRQbHVnaW5zKElGZWF0dXJlUmVmZXJlbmNlIGxvY2FsRmVhdHVyZVJlZmVyZW5jZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkNCi0JCS8vIGdldCB0aGUgZmVhdHVyZQ0KLQkJICgoU2l0ZUZpbGUpIGdldFNpdGUoKSkuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKChTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBsb2NhbEZlYXR1cmVSZWZlcmVuY2UpOw0KLQkJSUZlYXR1cmUgbG9jYWxGZWF0dXJlID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJbG9jYWxGZWF0dXJlID0gbG9jYWxGZWF0dXJlUmVmZXJlbmNlLmdldEZlYXR1cmUobnVsbCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4obnVsbCwgZSk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQkNCi0JCWlmIChsb2NhbEZlYXR1cmUgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQ0KLQkJLy8gYWRkIHRoZSBpbnN0YWxsZWQgcGx1Z2lucyBkaXJlY3RvcmllcyBhcyBhcmNoaXZlcyBlbnRyeQ0KLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsIGFyY2hpdmUgPSBudWxsOw0KLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcyA9IGxvY2FsRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlTdHJpbmcgdmVyc2lvbklkID0gcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCQlTdHJpbmcgcGx1Z2luSUQgPSBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyB2ZXJzaW9uSWQgKyBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuSkFSX0VYVEVOU0lPTjsNCi0JCQlhcmNoaXZlID0gYXJjaGl2ZUZhY3RvcnkuY3JlYXRlQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKCk7DQotCQkJYXJjaGl2ZS5zZXRQYXRoKHBsdWdpbklEKTsNCi0JCQl0cnkgew0KLQkJCQlVUkwgdXJsID0gbmV3IFVSTChnZXRTaXRlKCkuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHZlcnNpb25JZCArIEZpbGUuc2VwYXJhdG9yKTsNCi0JCQkJYXJjaGl2ZS5zZXRVUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCQlhcmNoaXZlLnJlc29sdmUodXJsLCBudWxsKTsNCi0JCQkJKChTaXRlRmlsZSkgZ2V0U2l0ZSgpKS5hZGRBcmNoaXZlUmVmZXJlbmNlTW9kZWwoYXJjaGl2ZSk7DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JDQotCQkJCVN0cmluZyB1cmxTdHJpbmcgPSAoZ2V0U2l0ZSgpLmdldFVSTCgpICE9IG51bGwpID8gZ2V0U2l0ZSgpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgOiAiIjsJLy8kTk9OLU5MUy0xJA0KLQkJCQl1cmxTdHJpbmcgKz0gU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luRW50cmllc1tpXS50b1N0cmluZygpOw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGUuVW5hYmxlVG9DcmVhdGVVUkwiLCB1cmxTdHJpbmcpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBBZGRzIGEgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIgdG8gdGhlIGxpc3QNCi0JICovDQotCXByaXZhdGUgdm9pZCBhZGRDb250ZW50Q29uc3VtZXJzKENvbnRlbnRDb25zdW1lciBjb25zKSB7DQotCQlpZiAoY29udGVudENvbnN1bWVycyA9PSBudWxsKQ0KLQkJCWNvbnRlbnRDb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQljb250ZW50Q29uc3VtZXJzLmFkZChjb25zKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNGVlMjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIFNpdGUgb24gdGhlIEZpbGUgU3lzdGVtDQotICovDQotcHVibGljIGNsYXNzIFNpdGVGaWxlQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgU2l0ZUNvbnRlbnRQcm92aWRlciB7DQotCQ0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX1RZUEUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI7CSAvLyROT04tTkxTLTEkDQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgRmlsZVNpdGUNCi0JICovDQotCXB1YmxpYyBTaXRlRmlsZUNvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7DQotCQlzdXBlcih1cmwpOw0KLQl9DQotDQotCQkJDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGFyY2hpdmVJZCkgIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCVVSTCBjb250ZW50VVJMID0gbnVsbDsNCi0JCQ0KLQkJY29udGVudFVSTCA9IGdldEFyY2hpdmVVUkxmb3IoYXJjaGl2ZUlkKTsNCi0JCS8vIGlmIHRoZXJlIGlzIG5vIG1hcHBpbmcgaW4gdGhlIHNpdGUueG1sDQotCQkvLyBmb3IgdGhpcyBhcmNoaXZlSWQsIHVzZSB0aGUgZGVmYXVsdCBvbmUNCi0JCWlmIChjb250ZW50VVJMPT1udWxsKSB7DQotCQkJcmV0dXJuIHN1cGVyLmdldEFyY2hpdmVSZWZlcmVuY2UoYXJjaGl2ZUlkKTsNCi0JCX0NCi0JCQ0KLQkJcmV0dXJuIGNvbnRlbnRVUkw7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybiB0aGUgVVJMIGFzc29jaWF0ZWQgd2l0aCB0aGUgaWQgb2YgdGhlIGFyY2hpdmUgZm9yIHRoaXMgc2l0ZQ0KLQkgKiByZXR1cm4gbnVsbCBpZiB0aGUgYXJjaGl2ZUlkIGlzIG51bGwsIGVtcHR5IG9yIA0KLQkgKiBpZiB0ZWggbGlzdCBvZiBhcmNoaXZlcyBvbiB0aGUgc2l0ZSBpcyBudWxsIG9yIGVtcHR5DQotCSAqIG9mIGlmIHRoZXJlIGlzIG5vIFVSTCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyY2hpdmVJRCBmb3IgdGhpcyBzaXRlDQotCSAqLw0KLQlwcml2YXRlIFVSTCBnZXRBcmNoaXZlVVJMZm9yKFN0cmluZyBhcmNoaXZlSWQpIHsNCi0JCVVSTCByZXN1bHQgPSBudWxsOw0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQ0KLQkJSUFyY2hpdmVSZWZlcmVuY2VbXSBzaXRlQXJjaGl2ZXMgPSBnZXRTaXRlKCkuZ2V0QXJjaGl2ZXMoKTsNCi0JCWlmIChzaXRlQXJjaGl2ZXMubGVuZ3RoID4gMCkgew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUFyY2hpdmVzLmxlbmd0aCAmJiAhZm91bmQ7IGkrKykgew0KLQkJCQlpZiAoYXJjaGl2ZUlkLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKHNpdGVBcmNoaXZlc1tpXS5nZXRQYXRoKCkpKSB7DQotCQkJCQlyZXN1bHQgPSBzaXRlQXJjaGl2ZXNbaV0uZ2V0VVJMKCk7DQotCQkJCQlmb3VuZCA9IHRydWU7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi19DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTFiOWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7DQotaW1wb3J0IG9yZy54bWwuc2F4Lio7DQotDQotcHVibGljIGNsYXNzIFNpdGVGaWxlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7DQotDQotCS8vIHByaXZhdGUgd2hlbiBwYXJzaW5nIGZpbGUgc3lzdGVtDQotCXByaXZhdGUgU2l0ZUZpbGUgc2l0ZTsNCi0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwsYm9vbGVhbikNCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQkNCi0JCVNpdGUgc2l0ZSA9IG51bGw7DQotCQlJbnB1dFN0cmVhbSBzaXRlU3RyZWFtID0gbnVsbDsNCi0JCVNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IHRoaXM7DQotCQ0KLQkJdHJ5IHsNCi0JCQkvLyBpZiB1cmwgcG9pbnRzIHRvIGEgZGlyZWN0b3J5DQotCQkJLy8gYXR0ZW1wdCB0byBwYXJzZSBzaXRlLnhtbA0KLQkJCVN0cmluZyBwYXRoID0gdXJsLmdldEZpbGUoKTsNCi0JCQlGaWxlIHNpdGVMb2NhdGlvbiA9IG5ldyBGaWxlKHBhdGgpOw0KLQkJCWlmIChzaXRlTG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgew0KLQkJCQl1cmwgPSBzaXRlTG9jYXRpb24udG9VUkwoKTsNCi0JCQkJRmlsZSBzaXRlWE1MRmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgU2l0ZS5TSVRFX1hNTCk7DQotCQkJCWlmIChzaXRlWE1MRmlsZS5leGlzdHMoKSkgew0KLQkJCQkJc2l0ZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc2l0ZVhNTEZpbGUpOw0KLQkJCQkJc2l0ZSA9IChTaXRlKSBmYWN0b3J5LnBhcnNlU2l0ZShzaXRlU3RyZWFtKTsNCi0JCQkJfSBlbHNlIHsNCi0JCQkJCS8vIHBhcnNlIHNpdGVMb2NhdGlvbg0KLQkJCQkJc2l0ZSA9IHBhcnNlU2l0ZShzaXRlTG9jYXRpb24pOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gd2UgYXJlIG5vdCBwb2ludGluZyB0byBhIGRpcmVjdG9yeQ0KLQkJCQkvLyBhdHRlbXB0IHRvIHBhcnNlIHRoZSBmaWxlDQotCQkJCXRyeSB7DQotCQkJCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOw0KLQkJCQkJc2l0ZVN0cmVhbSA9IG9wZW5TdHJlYW0ocmVzb2x2ZWRVUkwpOw0KLQkJCQkJc2l0ZSA9IChTaXRlKSBmYWN0b3J5LnBhcnNlU2l0ZShzaXRlU3RyZWFtKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkNCi0JCQkJCS8vIGF0dGVtcHQgdG8gcGFyc2UgcGFyZW50IGRpcmVjdG9yeQ0KLQkJCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7DQotCQkJCQlGaWxlIHBhcmVudERpcmVjdG9yeSA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOw0KLQkNCi0JCQkJCS8vIGRvIG5vdCBjcmVhdGUgZGlyZWN0b3J5IGlmIGl0IGRvZXNuJ3QgZXhpc3QJWzE4MzE4XQ0KLQkJCQkJLy8gaW5zdGVhZCBocm93IGVycm9yCQkJCQkNCi0JCQkJCWlmIChwYXJlbnREaXJlY3RvcnkgIT0gbnVsbCAmJiAhcGFyZW50RGlyZWN0b3J5LmV4aXN0cygpKQ0KLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZUZhY3RvcnkuRGlyZWN0b3J5RG9lc05vdEV4aXN0IiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpOwkvLyROT04tTkxTLTEkDQotCQ0KLQkJCQkJaWYgKHBhcmVudERpcmVjdG9yeSA9PSBudWxsIHx8ICFwYXJlbnREaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvT2J0YWluUGFyZW50RGlyZWN0b3J5IiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpOwkvLyROT04tTkxTLTEkDQotCQ0KLQkJCQkJc2l0ZSA9IHBhcnNlU2l0ZShwYXJlbnREaXJlY3RvcnkpOw0KLQkNCi0JCQkJfQ0KLQkJCX0NCi0JDQotCQkJU2l0ZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgU2l0ZUZpbGVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQljb250ZW50UHJvdmlkZXIuc2V0U2l0ZShzaXRlKTsNCi0JCQlzaXRlLnJlc29sdmUodXJsLCB1cmwpOw0KLQkNCi0JCQkvLyBEbyBub3Qgc2V0IHJlYWQgb25seSBhcyBtYXkgaW5zdGFsbCBpbiBpdA0KLQkJCS8vc2l0ZS5tYXJrUmVhZE9ubHkoKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTCIsIHVybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQWNjZXNzU2l0ZSIpLElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJfSBmaW5hbGx5IHsNCi0JCQl0cnkgew0KLQkJCQlpZiAoc2l0ZVN0cmVhbSAhPSBudWxsKQ0KLQkJCQkJc2l0ZVN0cmVhbS5jbG9zZSgpOw0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQkvKioNCi0JICogTWV0aG9kIHBhcnNlU2l0ZS4NCi0JICovDQotCXByaXZhdGUgU2l0ZSBwYXJzZVNpdGUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCXRoaXMuc2l0ZSA9IChTaXRlRmlsZSkgY3JlYXRlU2l0ZU1hcE1vZGVsKCk7DQotDQotCQlpZiAoIWRpcmVjdG9yeS5leGlzdHMoKSkNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUZpbGVGYWN0b3J5LkZpbGVEb2VzTm90RXhpc3QiLCBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpLCBudWxsKTsvLyROT04tTkxTLTEkDQotDQotCQlGaWxlIHBsdWdpblBhdGggPSBuZXcgRmlsZShkaXJlY3RvcnksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCk7DQotDQotCQkvL1BBQ0tBR0VEDQotCQlwYXJzZVBhY2thZ2VkRmVhdHVyZShkaXJlY3RvcnkpOyAvLyBpbiBjYXNlIGl0IGNvbnRhaW5zIEpBUiBmaWxlcw0KLQ0KLQkJcGFyc2VQYWNrYWdlZFBsdWdpbnMocGx1Z2luUGF0aCk7DQotDQotCQkvLyBJTlNUQUxMRUQJDQotCQlwYXJzZUluc3RhbGxlZEZlYXR1cmUoZGlyZWN0b3J5KTsNCi0NCi0JCXBhcnNlSW5zdGFsbGVkUGx1Z2lucyhwbHVnaW5QYXRoKTsNCi0NCi0JCXJldHVybiBzaXRlOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkgKiBNZXRob2QgcGFyc2VGZWF0dXJlLg0KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24NCi0JICovDQotCXByaXZhdGUgdm9pZCBwYXJzZUluc3RhbGxlZEZlYXR1cmUoRmlsZSBkaXJlY3RvcnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCUZpbGUgZmVhdHVyZURpciA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgpOw0KLQkJaWYgKGZlYXR1cmVEaXIuZXhpc3RzKCkpIHsNCi0JCQlTdHJpbmdbXSBkaXI7DQotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmOw0KLQkJCVVSTCBmZWF0dXJlVVJMOw0KLQkJCUZpbGUgY3VycmVudEZlYXR1cmVEaXI7DQotCQkJU3RyaW5nIG5ld0ZpbGVQYXRoID0gbnVsbDsNCi0NCi0JCQl0cnkgew0KLQkJCQkvLyBoYW5kbGUgdGhlIGluc3RhbGxlZCBmZWF0dXJlc0NvbmZpZ3VyZWQgdW5kZXIgZmVhdHVyZXNDb25maWd1cmVkIHN1YmRpcmVjdG9yeQ0KLQkJCQlkaXIgPSBmZWF0dXJlRGlyLmxpc3QoKTsNCi0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpci5sZW5ndGg7IGluZGV4KyspIHsNCi0NCi0JCQkJCS8vIHRoZSBVUkwgbXVzdCBlbmRzIHdpdGggJy8nIGZvciB0aGUgYnVuZGxlIHRvIGJlIHJlc29sdmVkDQotCQkJCQluZXdGaWxlUGF0aCA9IGRpcltpbmRleF0gKyAoZGlyW2luZGV4XS5lbmRzV2l0aCgiLyIpID8gIi8iIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJA0KLQkJCQkJY3VycmVudEZlYXR1cmVEaXIgPSBuZXcgRmlsZShmZWF0dXJlRGlyLCBuZXdGaWxlUGF0aCk7DQotCQkJCQkvLyBjaGVjayBpZiBmZWF0dXJlLnhtbCBleGlzdHMNCi0JCQkJCUZpbGUgZmVhdHVyZVhNTEZpbGUgPSBuZXcgRmlsZShjdXJyZW50RmVhdHVyZURpciwgRmVhdHVyZS5GRUFUVVJFX1hNTCk7DQotCQkJCQlpZiAoIWZlYXR1cmVYTUxGaWxlLmV4aXN0cygpKSB7DQotCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gZmluZCBmZWF0dXJlLnhtbCBpbiBkaXJlY3Rvcnk6IiArIGN1cnJlbnRGZWF0dXJlRGlyKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkvLyBQRVJGOiByZW1vdmUgY29kZQ0KLQkJCQkJCS8vU2l0ZUZpbGVGYWN0b3J5IGFyY2hpdmVGYWN0b3J5ID0gbmV3IFNpdGVGaWxlRmFjdG9yeSgpOw0KLQkJCQkJCWZlYXR1cmVVUkwgPSBjdXJyZW50RmVhdHVyZURpci50b1VSTCgpOw0KLQkJCQkJCWZlYXR1cmVSZWYgPSBjcmVhdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoKTsNCi0JCQkJCQlmZWF0dXJlUmVmLnNldFNpdGVNb2RlbChzaXRlKTsNCi0JCQkJCQlmZWF0dXJlUmVmLnNldFVSTFN0cmluZyhmZWF0dXJlVVJMLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJCQkJCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1RZUEUpOw0KLQkJCQkJCSgoU2l0ZSkgc2l0ZSkuYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGUiLCBuZXdGaWxlUGF0aCksIGUpOwkvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkqIE1ldGhvZCBwYXJzZUZlYXR1cmUuDQotCSogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSovDQotCXByaXZhdGUgdm9pZCBwYXJzZVBhY2thZ2VkRmVhdHVyZShGaWxlIGRpcmVjdG9yeSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gRkVBVFVSRVMNCi0JCUZpbGUgZmVhdHVyZURpciA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCk7DQotCQlpZiAoZmVhdHVyZURpci5leGlzdHMoKSkgew0KLQkJCVN0cmluZ1tdIGRpcjsNCi0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWY7DQotCQkJVVJMIGZlYXR1cmVVUkw7DQotCQkJRmlsZSBjdXJyZW50RmVhdHVyZUZpbGU7DQotCQkJU3RyaW5nIG5ld0ZpbGVQYXRoID0gbnVsbDsNCi0NCi0JCQl0cnkgew0KLQkJCQkvLyBvbmx5IGxpc3QgSkFSIGZpbGVzDQotCQkJCWRpciA9IGZlYXR1cmVEaXIubGlzdChGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuZmlsdGVyKTsNCi0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGRpci5sZW5ndGg7IGluZGV4KyspIHsNCi0NCi0JCQkJCS8vIGNoZWNrIGlmIHRoZSBKQVIgZmlsZSBjb250YWlucyBhIGZlYXR1cmUueG1sDQotCQkJCQljdXJyZW50RmVhdHVyZUZpbGUgPSBuZXcgRmlsZShmZWF0dXJlRGlyLCBkaXJbaW5kZXhdKTsNCi0JCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgcmVmID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoIiIsIGN1cnJlbnRGZWF0dXJlRmlsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCUNvbnRlbnRSZWZlcmVuY2UgcmVzdWx0ID0gbnVsbDsNCi0JCQkJCXRyeSB7DQotCQkJCQkJcmVzdWx0ID0gcmVmLnBlZWsoRmVhdHVyZS5GRUFUVVJFX1hNTCwgbnVsbCwgbnVsbCk7DQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJFeGNlcHRpb24gcmV0cmlldmluZyBmZWF0dXJlLnhtbCBpbiBmaWxlOiIgKyBjdXJyZW50RmVhdHVyZUZpbGUsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQl9DQotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsNCi0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIlVuYWJsZSB0byBmaW5kIGZlYXR1cmUueG1sIGluIGZpbGU6IiArIGN1cnJlbnRGZWF0dXJlRmlsZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0gZWxzZSB7DQotCQkJCQkJZmVhdHVyZVVSTCA9IGN1cnJlbnRGZWF0dXJlRmlsZS50b1VSTCgpOw0KLQkJCQkJCS8vIFBFUkY6IHJlbW92ZSBjb2RlDQotCQkJCQkJLy9TaXRlRmlsZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSBuZXcgU2l0ZUZpbGVGYWN0b3J5KCk7DQotCQkJCQkJZmVhdHVyZVJlZiA9IGNyZWF0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCgpOw0KLQkJCQkJCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOw0KLQkJCQkJCWZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkJCQkJZmVhdHVyZVJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsNCi0JCQkJCQlzaXRlLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTaXRlRmlsZUZhY3RvcnkuVW5hYmxlVG9DcmVhdGVVUkxGb3JGaWxlIiwgbmV3RmlsZVBhdGgpLCBlKTsJLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogTWV0aG9kIHBhcnNlUGx1Z2lucy4NCi0JICogDQotCSAqIGxvb2sgaW50byBlYWNoIHBsdWdpbi9mcmFnbWVudCBkaXJlY3RvcnksIGNyYWNrIHRoZSBwbHVnaW4ueG1sIG9wZW4gKG9yDQotCSAqIGZyYWdtZW50LnhtbCA/Pz8pIGdldCBpZCBhbmQgdmVyc2lvbiwgY2FsY3VsYXRlIFVSTC4uLg0KLQkgKiANCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgcGFyc2VJbnN0YWxsZWRQbHVnaW5zKEZpbGUgcGx1Z2luc0RpcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKCFwbHVnaW5zRGlyLmV4aXN0cygpIHx8ICFwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlGaWxlW10gZGlycyA9IHBsdWdpbnNEaXIubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgew0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGYpIHsNCi0JCQkJcmV0dXJuIGYuaXNEaXJlY3RvcnkoKTsNCi0JCQl9DQotCQl9KTsNCi0JCURlZmF1bHRQbHVnaW5QYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRQbHVnaW5QYXJzZXIoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlycy5sZW5ndGg7IGkrKykgew0KLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKGRpcnNbaV0sICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOyAvLyROT04tTkxTLTEkDQotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOw0KLQkJCXRyeSB7DQotCQkJCUJ1bmRsZU1hbmlmZXN0IGJ1bmRsZU1hbmlmZXN0ID0gbmV3IEJ1bmRsZU1hbmlmZXN0KHBsdWdpbkZpbGUpOw0KLQkJCQlpZiAoYnVuZGxlTWFuaWZlc3QuZXhpc3RzKCkpIHsNCi0JCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gYnVuZGxlTWFuaWZlc3QuZ2V0UGx1Z2luRW50cnkoKTsNCi0JCQkJCWFkZFBhcnNlZFBsdWdpbihlbnRyeSwgZGlyc1tpXSk7DQotCQkJCX0gZWxzZSB7DQotCQkJCQlpZiAoIShwbHVnaW5GaWxlID0gbmV3IEZpbGUoZGlyc1tpXSwgInBsdWdpbi54bWwiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCQkuZXhpc3RzKCkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShkaXJzW2ldLCAiZnJhZ21lbnQueG1sIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJCX0NCi0JCQkJCWlmIChwbHVnaW5GaWxlICE9IG51bGwgJiYgcGx1Z2luRmlsZS5leGlzdHMoKQ0KLQkJCQkJCQkmJiAhcGx1Z2luRmlsZS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJCQkJaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBsdWdpbkZpbGUpOw0KLQkJCQkJCVBsdWdpbkVudHJ5IGVudHJ5ID0gcGFyc2VyLnBhcnNlKGluKTsNCi0JCQkJCQlhZGRQYXJzZWRQbHVnaW4oZW50cnksIGRpcnNbaV0pOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQlTdHJpbmcgcGx1Z2luRmlsZVN0cmluZyA9IChwbHVnaW5GaWxlID09IG51bGwpDQotCQkJCQkJPyBudWxsDQotCQkJCQkJOiBwbHVnaW5GaWxlLmdldEFic29sdXRlUGF0aCgpOw0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgNCi0JCQkJCQkiU2l0ZUZpbGVGYWN0b3J5LkVycm9yQWNjZXNzaW5nIiwgcGx1Z2luRmlsZVN0cmluZyksIGUpOyAvLyROT04tTkxTLTEkDQotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQkJU3RyaW5nIHBsdWdpbkZpbGVTdHJpbmcgPSAocGx1Z2luRmlsZSA9PSBudWxsKQ0KLQkJCQkJCT8gbnVsbA0KLQkJCQkJCTogcGx1Z2luRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoDQotCQkJCQkJIlNpdGVGaWxlRmFjdG9yeS5FcnJvclBhcnNpbmdGaWxlIiwgcGx1Z2luRmlsZVN0cmluZyksIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQllKTsNCi0JCQl9IGZpbmFsbHkgew0KLQkJCQlpZiAoaW4gIT0gbnVsbCl7DQotCQkJCQl0cnl7DQotCQkJCQkJaW4uY2xvc2UoKTsNCi0JCQkJCX0gY2F0Y2goSU9FeGNlcHRpb24gZSl7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIHRyYW5mb3JtIGVhY2ggUGx1Z2luIGFuZCBGcmFnbWVudCBpbnRvIGFuIEFyY2hpdmVSZWZlcmVuY2VNb2RlbA0KLQkgKiBhbmQgYSBQbHVnaW5FbnRyeSBmb3IgdGhlIFNpdGUJIA0KLQkgKi8NCi0JLy8gUEVSRjogcmVtb3ZlZCBpbnRlcm1lZGlhdGUgUGx1Z2luIG9iamVjdA0KLQlwcml2YXRlIHZvaWQgYWRkUGFyc2VkUGx1Z2luKFBsdWdpbkVudHJ5IGVudHJ5LEZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsNCi0NCi0JCQkJLy8gY3JlYXRlIHRoZSBwbHVnaW4gRW50cnkNCi0JCQkJKChTaXRlKSBzaXRlKS5hZGRQbHVnaW5FbnRyeShlbnRyeSk7DQotDQotCQkJCS8vIENyZWF0ZSB0aGUgU2l0ZSBtYXBwaW5nIEFyY2hpdmVSZWYtPlBsdWdpbkVudHJ5DQotCQkJCS8vIHRoZSBpZCBvZiB0aGUgYXJjaGl2ZVJlZiBpcyBwbHVnaW5zXDxwbHVnaW5pZD5fPHZlcj4uamFyIGFzIHBlciB0aGUgc3BlY3MNCi0JCQkJLy8gUEVSRjogcmVtb3ZlIGNvZGUNCi0JCQkJLy9TaXRlRmlsZUZhY3RvcnkgYXJjaGl2ZUZhY3RvcnkgPSBuZXcgU2l0ZUZpbGVGYWN0b3J5KCk7CQkJCQ0KLQkJCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWwgYXJjaGl2ZSA9IGNyZWF0ZUFyY2hpdmVSZWZlcmVuY2VNb2RlbCgpOw0KLQkJCQlTdHJpbmcgaWQgPSAoZW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCQlTdHJpbmcgcGx1Z2luSUQgPSBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBpZCArIEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5KQVJfRVhURU5TSU9OOw0KLQkJCQlhcmNoaXZlLnNldFBhdGgocGx1Z2luSUQpOw0KLQkJCQlsb2NhdGlvbiA9IGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCQlhcmNoaXZlLnNldFVSTFN0cmluZyhsb2NhdGlvbik7DQotCQkJCSgoU2l0ZSkgc2l0ZSkuYWRkQXJjaGl2ZVJlZmVyZW5jZU1vZGVsKGFyY2hpdmUpOw0KLQ0KLQkJCQkvLyBUUkFDRQkJCQkNCi0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsNCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkFkZGVkIGFyY2hpdmUgdG8gc2l0ZToiICsgcGx1Z2luSUQgKyAiIHBvaW50aW5nIHRvOiAiICsgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJfQ0KLQkJCX0NCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGUiLCBsb2NhdGlvbiksIGUpOwkvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqICANCi0JICovDQotCXByaXZhdGUgdm9pZCBwYXJzZVBhY2thZ2VkUGx1Z2lucyhGaWxlIHBsdWdpbkRpcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKCFwbHVnaW5EaXIuZXhpc3RzKCkpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlTdHJpbmdbXSBkaXIgPSBwbHVnaW5EaXIubGlzdChGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuZmlsdGVyKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyLmxlbmd0aDsgaSsrKSB7DQotCQkJQ29udGVudFJlZmVyZW5jZSByZWYgPSBudWxsOw0KLQkJCVN0cmluZyByZWZTdHJpbmcgPSBudWxsOw0KLQkJCUlucHV0U3RyZWFtIGluID0gbnVsbDsNCi0JCQl0cnkgew0KLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwbHVnaW5EaXIsIGRpcltpXSk7DQotCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyUmVmZXJlbmNlID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoDQotCQkJCQkJbnVsbCwgZmlsZSk7DQotCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJNRVRBLUlORi9NQU5JRkVTVC5NRiIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkDQotCQkJCWlmIChyZWYgIT0gbnVsbCkgew0KLQkJCQkJaW4gPSByZWYuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQkJCUJ1bmRsZU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IEJ1bmRsZU1hbmlmZXN0KGluKTsNCi0JCQkJCWlmIChtYW5pZmVzdC5leGlzdHMoKSkgew0KLQkJCQkJCWFkZFBhcnNlZFBsdWdpbihtYW5pZmVzdC5nZXRQbHVnaW5FbnRyeSgpLCBmaWxlKTsNCi0JCQkJCQljb250aW51ZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlyZWYgPSBqYXJSZWZlcmVuY2UucGVlaygicGx1Z2luLnhtbCIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkDQotCQkJCWlmIChyZWYgPT0gbnVsbCkgew0KLQkJCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoImZyYWdtZW50LnhtbCIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJaWYgKHJlZiAhPSBudWxsKSB7DQotCQkJCQlpbiA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOw0KLQkJCQkJUGx1Z2luRW50cnkgZW50cnkgPSBuZXcgRGVmYXVsdFBsdWdpblBhcnNlcigpLnBhcnNlKGluKTsNCi0JCQkJCWFkZFBhcnNlZFBsdWdpbihlbnRyeSwgZmlsZSk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCXRyeSB7DQotCQkJCQlyZWZTdHJpbmcgPSAocmVmID09IG51bGwpID8gbnVsbCA6IHJlZi5hc1VSTCgpDQotCQkJCQkJCS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0JCQkJfQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgNCi0JCQkJCQkiU2l0ZUZpbGVGYWN0b3J5LkVycm9yQWNjZXNzaW5nIiwgcmVmU3RyaW5nKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7DQotCQkJCXRyeSB7DQotCQkJCQlyZWZTdHJpbmcgPSAocmVmID09IG51bGwpID8gbnVsbCA6IHJlZi5hc1VSTCgpDQotCQkJCQkJCS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsNCi0JCQkJfQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgNCi0JCQkJCQkiU2l0ZUZpbGVGYWN0b3J5LkVycm9yUGFyc2luZ0ZpbGUiLCByZWZTdHJpbmcpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0gZmluYWxseSB7DQotCQkJCWlmKGluICE9IG51bGwpew0KLQkJCQkJdHJ5ew0KLQkJCQkJCWluLmNsb3NlKCk7DQotCQkJCQl9Y2F0Y2goSU9FeGNlcHRpb24gY2Upew0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjcmVhdGVTaXRlTWFwTW9kZWwoKQ0KLQkgKi8NCi0JcHVibGljIFNpdGVNb2RlbCBjcmVhdGVTaXRlTWFwTW9kZWwoKSB7DQotCQlyZXR1cm4gbmV3IFNpdGVGaWxlKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBTaXRlTW9kZWxGYWN0b3J5I2NhblBhcnNlU2l0ZVR5cGUoU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcgdHlwZSkgew0KLQkJcmV0dXJuIChzdXBlci5jYW5QYXJzZVNpdGVUeXBlKHR5cGUpIHx8IFNpdGVGaWxlQ29udGVudFByb3ZpZGVyLlNJVEVfVFlQRS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMTY1ZmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogUGx1Z2luIENvbnRlbnQgQ29uc3VtZXIgb24gYSBTaXRlDQotICovDQotcHVibGljIGNsYXNzIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsNCi0NCi0JcHJpdmF0ZSBTdHJpbmcgcGF0aDsNCi0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOw0KLQ0KLQkvKg0KLQkgKiBDb25zdHJ1Y3RvciANCi0JICovDQotCXB1YmxpYyBTaXRlRmlsZU5vblBsdWdpbkNvbnRlbnRDb25zdW1lcihTdHJpbmcgZmVhdHVyZVBhdGgpIHsNCi0JCXRoaXMucGF0aCA9IGZlYXR1cmVQYXRoOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3JlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoY2xvc2VkKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsNCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IHBhdGg7DQotCQlTdHJpbmcgY29udGVudEtleSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpOw0KLQkJZmVhdHVyZVBhdGggKz0gY29udGVudEtleTsNCi0JCXRyeSB7DQotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNvcHlUb0xvY2FsKGluU3RyZWFtLCBmZWF0dXJlUGF0aCwgbnVsbCk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrUGVybWlzc2lvbnMoY29udGVudFJlZmVyZW5jZSwgZmVhdHVyZVBhdGgpOyAvLyAyMDMwNQ0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJHbG9iYWxDb25zdW1lci5FcnJvckNyZWF0aW5nRmlsZSIsIGZlYXR1cmVQYXRoKSwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGluU3RyZWFtICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCS8vIGNsb3NlIHN0cmVhbQ0KLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsNCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY2xvc2UoKSB7DQotCQlpZiAoY2xvc2VkKSB7DQotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIGNsb3NlIGEgY2xvc2VkIFNpdGVGaWxlTm9uUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWNsb3NlZCA9IHRydWU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBhY2tlZFBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjNkZTNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBQbHVnaW4gQ29udGVudCBDb25zdW1lciBvbiBhIFNpdGUKLSAqIGZvciBhIHBsdWdpbiB0aGF0IHdpbGwgcnVuIGZyb20gYSBqYXIKLSAqLwotcHVibGljIGNsYXNzIFNpdGVGaWxlUGFja2VkUGx1Z2luQ29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsKLQotCXByaXZhdGUgSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OwotCXByaXZhdGUgSVNpdGUgc2l0ZTsKLQlwcml2YXRlIGJvb2xlYW4gY2xvc2VkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgamFyUGF0aDsKLQlwcml2YXRlIFN0cmluZyB0ZW1wUGF0aDsKLQotCS8qCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgU2l0ZUZpbGVQYWNrZWRQbHVnaW5Db250ZW50Q29uc3VtZXIoSVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5LCBJU2l0ZSBzaXRlKSB7Ci0JCXRoaXMucGx1Z2luRW50cnkgPSBwbHVnaW5FbnRyeTsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjc3RvcmUoQ29udGVudFJlZmVyZW5jZSwgSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG51bGw7Ci0KLQkJaWYgKGNsb3NlZCkgewotCQkJVXBkYXRlQ29yZS53YXJuKCJBdHRlbXB0IHRvIHN0b3JlIGluIGEgY2xvc2VkIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIiwgbmV3IEV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpICsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlqYXJQYXRoID0gbmV3VVJMLmdldEZpbGUoKS5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsKLQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGphclBhdGgpOwotCQkJaWYgKGphckZpbGUuZXhpc3RzKCkpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiVXBkYXRlTWFuYWdlclV0aWxzLkZpbGVBbHJlYWR5RXhpc3RzIiwgbmV3IE9iamVjdFtdIHsgamFyRmlsZSB9KSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGVycm9yIHJlY292ZXJ5Ci0JCQl0ZW1wUGF0aD0gRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2NhbFJhbmRvbUlkZW50aWZpZXIoamFyUGF0aCsiLnRtcCIpOyAvLyROT04tTkxTLTEkCi0JCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuQlVORExFX0pBUl9FTlRSWSwgdGVtcFBhdGgpOwotCQkJLy8KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgdGVtcFBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiR2xvYmFsQ29uc3VtZXIuRXJyb3JDcmVhdGluZ0ZpbGUiLCB0ZW1wUGF0aCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNsb3NlIHN0cmVhbQotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVNpdGVDb250ZW50Q29uc3VtZXIjY2xvc2UoKSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZiAoY2xvc2VkKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGVtcFBhdGggIT0gbnVsbCkgewotCQkJLy8gcmVuYW1lIGZpbGUgCi0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5SRU5BTUVfRU5UUlksIHRlbXBQYXRoKTsKLQkJCUZpbGUgZmlsZVRvUmVuYW1lID0gbmV3IEZpbGUodGVtcFBhdGgpOwotCQkJYm9vbGVhbiBzdWNlc3MgPSBmYWxzZTsKLQkJCWlmIChmaWxlVG9SZW5hbWUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlIHJlbmFtZWRGaWxlID0gbmV3IEZpbGUoamFyUGF0aCk7Ci0JCQkJc3VjZXNzID0gZmlsZVRvUmVuYW1lLnJlbmFtZVRvKHJlbmFtZWRGaWxlKTsKLQkJCX0KLQkJCWlmICghc3VjZXNzKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJDb250ZW50Q29uc3VtZXIuVW5hYmxlVG9SZW5hbWUiLCB0ZW1wUGF0aCwgamFyUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihtc2csIG5ldyBFeGNlcHRpb24obXNnKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2l0ZSBpbnN0YW5jZW9mIFNpdGVGaWxlKQotCQkJICgoU2l0ZUZpbGUpIHNpdGUpLmFkZFBsdWdpbkVudHJ5KHBsdWdpbkVudHJ5KTsKLQkJY2xvc2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFib3J0KCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChjbG9zZWQpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBhYm9ydCBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gc3VjZXNzID0gdHJ1ZTsKLQotCQkvLyBkZWxldGUgcGx1Z2luLmphcgotCQlpZiAoamFyUGF0aCAhPSBudWxsKSB7Ci0JCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgoRXJyb3JSZWNvdmVyeUxvZy5ERUxFVEVfRU5UUlksIGphclBhdGgpOwotCQkJRmlsZSBmaWxlVG9SZW1vdmUgPSBuZXcgRmlsZShqYXJQYXRoKTsKLQotCQkJaWYgKGZpbGVUb1JlbW92ZS5leGlzdHMoKSkgewotCQkJCXN1Y2VzcyA9IGZpbGVUb1JlbW92ZS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCi0JCWlmICghc3VjZXNzKSB7Ci0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlVuYWJsZSB0byBkZWxldGUiLCBqYXJQYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlQ29yZS5sb2cobXNnLCBudWxsKTsKLQkJfQotCQljbG9zZWQgPSB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODJmNTNiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogUGx1Z2luIENvbnRlbnQgQ29uc3VtZXIgb24gYSBTaXRlDQotICovDQotcHVibGljIGNsYXNzIFNpdGVGaWxlUGx1Z2luQ29udGVudENvbnN1bWVyIGV4dGVuZHMgQ29udGVudENvbnN1bWVyIHsNCi0NCi0JcHJpdmF0ZSBJUGx1Z2luRW50cnkgcGx1Z2luRW50cnk7DQotCXByaXZhdGUgSVNpdGUgc2l0ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOw0KLQ0KLQkvLyByZWNvdmVyeQ0KLQkvLyB0ZW1wb3JhcnkgbmFtZSB0byBvcmlnaW5hbCBuYW1lIG1hcA0KLQlwcml2YXRlIE1hcCByZW5hbWVzID0gbmV3IEhhc2hNYXAoMik7DQotDQotCS8vIGZvciBhYm9ydA0KLQlwcml2YXRlIExpc3QgLypvZiBwYXRoIGFzIFN0cmluZyAqLw0KLQlpbnN0YWxsZWRGaWxlczsNCi0NCi0JLyoNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lcihJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIElTaXRlIHNpdGUpIHsNCi0JCXRoaXMucGx1Z2luRW50cnkgPSBwbHVnaW5FbnRyeTsNCi0JCXRoaXMuc2l0ZSA9IHNpdGU7DQotCQlpbnN0YWxsZWRGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOw0KLQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOw0KLQ0KLQkJaWYgKGNsb3NlZCkgew0KLQkJCVVwZGF0ZUNvcmUud2FybigiQXR0ZW1wdCB0byBzdG9yZSBpbiBhIGNsb3NlZCBTaXRlRmlsZVBsdWdpbkNvbnRlbnRDb25zdW1lciIsIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQl0cnkgew0KLQkJCVVSTCBuZXdVUkwgPSBuZXcgVVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbkVudHJ5LmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCQlwbHVnaW5QYXRoID0gbmV3VVJMLmdldEZpbGUoKTsgDQotCQkJU3RyaW5nIGNvbnRlbnRLZXkgPSBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKTsNCi0JCQlpblN0cmVhbSA9IGNvbnRlbnRSZWZlcmVuY2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQlwbHVnaW5QYXRoICs9IHBsdWdpblBhdGguZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpID8gY29udGVudEtleSA6IEZpbGUuc2VwYXJhdG9yICsgY29udGVudEtleTsNCi0NCi0JCQkvLyBlcnJvciByZWNvdmVyeQ0KLQkJCVN0cmluZyBsb2dFbnRyeT1udWxsOw0KLQkJCWlmICgicGx1Z2luLnhtbCIuZXF1YWxzKGNvbnRlbnRLZXkpKSB7IC8vJE5PTi1OTFMtMSQNCi0JCQkJbG9nRW50cnk9RXJyb3JSZWNvdmVyeUxvZy5QTFVHSU5fRU5UUlk7DQotCQkJfSBlbHNlIGlmICgiZnJhZ21lbnQueG1sIi5lcXVhbHMoY29udGVudEtleSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlsb2dFbnRyeT1FcnJvclJlY292ZXJ5TG9nLkZSQUdNRU5UX0VOVFJZOw0KLQkJCX0gZWxzZSBpZiAoIk1FVEEtSU5GL01BTklGRVNULk1GIi5lcXVhbHMoY29udGVudEtleSkpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlsb2dFbnRyeT1FcnJvclJlY292ZXJ5TG9nLkJVTkRMRV9NQU5JRkVTVF9FTlRSWTsNCi0JCQl9DQotCQkJaWYgKGxvZ0VudHJ5IT1udWxsKSB7DQotCQkJCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBwbHVnaW5QYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOw0KLQkJCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKG9yaWdpbmFsTmFtZSk7DQotCQkJCWlmIChsb2NhbEZpbGUuZXhpc3RzKCkpIHsNCi0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJVcGRhdGVNYW5hZ2VyVXRpbHMuRmlsZUFscmVhZHlFeGlzdHMiLCBuZXcgT2JqZWN0W10geyBsb2NhbEZpbGUgfSksIG51bGwpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJcGx1Z2luUGF0aCA9IEVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9jYWxSYW5kb21JZGVudGlmaWVyKHBsdWdpblBhdGgpOw0KLQkJCQlyZW5hbWVzLnB1dChwbHVnaW5QYXRoLCBvcmlnaW5hbE5hbWUpOw0KLQkJCQlFcnJvclJlY292ZXJ5TG9nLmdldExvZygpLmFwcGVuZFBhdGgobG9nRW50cnksIHBsdWdpblBhdGgpOw0KLQkJCX0NCi0JCQkvLw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jb3B5VG9Mb2NhbChpblN0cmVhbSwgcGx1Z2luUGF0aCwgbnVsbCk7DQotCQkJVXBkYXRlTWFuYWdlclV0aWxzLmNoZWNrUGVybWlzc2lvbnMoY29udGVudFJlZmVyZW5jZSwgcGx1Z2luUGF0aCk7IC8vIDIwMzA1DQotCQkJaW5zdGFsbGVkRmlsZXMuYWRkKHBsdWdpblBhdGgpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJHbG9iYWxDb25zdW1lci5FcnJvckNyZWF0aW5nRmlsZSIsIHBsdWdpblBhdGgpLCBlKTsvLyROT04tTkxTLTEkDQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7DQotCQkJCXRyeSB7DQotCQkJCQkvLyBjbG9zZSBzdHJlYW0NCi0JCQkJCWluU3RyZWFtLmNsb3NlKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI2Nsb3NlKCkgDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjbG9zZWQpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gY2xvc2UgYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJZm9yKEl0ZXJhdG9yIGl0ID0gcmVuYW1lcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspew0KLQkJCS8vIHJlbmFtZSBmaWxlIA0KLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpaXQubmV4dCgpOw0KLQkJCVN0cmluZyB0ZW1wb3JhcnkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsNCi0JCQlTdHJpbmcgb3JpZ2luYWwgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOw0KLQkJCUVycm9yUmVjb3ZlcnlMb2cuZ2V0TG9nKCkuYXBwZW5kUGF0aChFcnJvclJlY292ZXJ5TG9nLlJFTkFNRV9FTlRSWSwgdGVtcG9yYXJ5KTsNCi0JCQlGaWxlIGZpbGVUb1JlbmFtZSA9IG5ldyBGaWxlKHRlbXBvcmFyeSk7DQotCQkJYm9vbGVhbiBzdWNlc3MgPSBmYWxzZTsNCi0JCQlpZiAoZmlsZVRvUmVuYW1lLmV4aXN0cygpKSB7DQotCQkJCUZpbGUgcmVuYW1lZEZpbGUgPSBuZXcgRmlsZShvcmlnaW5hbCk7DQotCQkJCXN1Y2VzcyA9IGZpbGVUb1JlbmFtZS5yZW5hbWVUbyhyZW5hbWVkRmlsZSk7DQotCQkJfQ0KLQkJCWlmICghc3VjZXNzKSB7DQotCQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiQ29udGVudENvbnN1bWVyLlVuYWJsZVRvUmVuYW1lIiwgdGVtcG9yYXJ5LCBvcmlnaW5hbCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24obXNnLCBuZXcgRXhjZXB0aW9uKG1zZykpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChzaXRlIGluc3RhbmNlb2YgU2l0ZUZpbGUpDQotCQkJICgoU2l0ZUZpbGUpIHNpdGUpLmFkZFBsdWdpbkVudHJ5KHBsdWdpbkVudHJ5KTsNCi0JCWNsb3NlZCA9IHRydWU7DQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhYm9ydCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCWlmIChjbG9zZWQpIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkF0dGVtcHQgdG8gYWJvcnQgYSBjbG9zZWQgU2l0ZUZpbGVQbHVnaW5Db250ZW50Q29uc3VtZXIiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuOw0KLQkJfQ0KLQ0KLQkJYm9vbGVhbiBzdWNjZXNzID0gdHJ1ZTsNCi0JCS8vIGRlbGV0ZSBwbHVnaW4gbWFuaWZlc3RzIGZpcnN0DQotCQlmb3IoSXRlcmF0b3IgaXQgPSByZW5hbWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspew0KLQkJCVN0cmluZyBvcmlnaW5hbE5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7DQotDQotCQkJRXJyb3JSZWNvdmVyeUxvZy5nZXRMb2coKS5hcHBlbmRQYXRoKEVycm9yUmVjb3ZlcnlMb2cuREVMRVRFX0VOVFJZLCBvcmlnaW5hbE5hbWUpOw0KLQkJCUZpbGUgZmlsZVRvUmVtb3ZlID0gbmV3IEZpbGUob3JpZ2luYWxOYW1lKTsNCi0JCQlpZiAoZmlsZVRvUmVtb3ZlLmV4aXN0cygpKSB7DQotCQkJCWlmKCFmaWxlVG9SZW1vdmUuZGVsZXRlKCkpew0KLQkJCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJVbmFibGUgdG8gZGVsZXRlIiwgb3JpZ2luYWxOYW1lKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQkJVXBkYXRlQ29yZS5sb2cobXNnLCBudWxsKTsJDQotCQkJCQlzdWNjZXNzID0gZmFsc2U7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlpZiAoc3VjY2Vzcykgew0KLQkJCS8vIHJlbW92ZSB0aGUgcGx1Z2luIGZpbGVzOw0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBpbnN0YWxsZWRGaWxlcy5pdGVyYXRvcigpOw0KLQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBudWxsOw0KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgew0KLQkJCQlTdHJpbmcgcGF0aCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOw0KLQkJCQlmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHBhdGgpOw0KLQkJCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOw0KLQkJCX0NCi0NCi0JCQkvLyByZW1vdmUgdGhlIHBsdWdpbiBkaXJlY3RvcnkgaWYgZW1wdHkNCi0JCQl0cnkgew0KLQkJCQlVUkwgbmV3VVJMID0gbmV3IFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5FbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkJCVN0cmluZyBwbHVnaW5QYXRoID0gbmV3VVJMLmdldEZpbGUoKTsNCi0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUVtcHR5RGlyZWN0b3JpZXNGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShwbHVnaW5QYXRoKSk7DQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOw0KLQkJCX0NCi0JCX0NCi0JCWNsb3NlZCA9IHRydWU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlTG9jYWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZUxvY2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MzQ1NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlTG9jYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsLio7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBjb25maWd1cmF0aW9ucy4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZUxvY2FsIGV4dGVuZHMgU2l0ZUxvY2FsTW9kZWwgaW1wbGVtZW50cyBJTG9jYWxTaXRlew0KLQ0KLQlwcml2YXRlIExpc3RlbmVyc0xpc3QgbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyc0xpc3QoKTsNCi0JcHJpdmF0ZSBTaXRlU3RhdHVzQW5hbHl6ZXIgc2l0ZVN0YXR1c0FuYWx5emVyOw0KLQlwcml2YXRlIGJvb2xlYW4gaXNUcmFuc2llbnQgPSBmYWxzZTsNCi0NCi0JLyoNCi0JICogSGF2ZSBuZXcgZmVhdHVyZXMgYmVlbiBmb3VuZCBkdXJpbmcgcmVjb25jaWxpYXRpb24NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBuZXdGZWF0dXJlc0ZvdW5kID0gZmFsc2U7DQotDQotCS8qDQotCSAqIGluaXRpYWxpemUgdGhlIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIHBlcnNpc3RlbnQgbW9kZWwuDQotCSAqIFNldCB0aGUgcmVjb25jaWxpYXRpb24gYXMgbm9uIG9wdGltaXN0aWMNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUxvY2FsU2l0ZSBnZXRMb2NhbFNpdGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gaW50ZXJuYWxHZXRMb2NhbFNpdGUoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKkludGVybmFsIGNhbGwgaXMgcmVjb25jaWxpYXRpb24gbmVlZHMgdG8gYmUgb3B0aW1pc3RpYw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJTG9jYWxTaXRlIGludGVybmFsR2V0TG9jYWxTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkNCi0JCVNpdGVMb2NhbCBsb2NhbFNpdGUgPSBuZXcgU2l0ZUxvY2FsKCk7DQotCQ0KLQkJLy8gb2J0YWluIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24NCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsNCi0JCWxvY2FsU2l0ZS5pc1RyYW5zaWVudChjdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uLmlzVHJhbnNpZW50KCkpOw0KLQkNCi0JCXRyeSB7DQotCQkJVVJMIGNvbmZpZ1hNTCA9IGN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7DQotCQkJbG9jYWxTaXRlLnNldExvY2F0aW9uVVJMU3RyaW5nKGNvbmZpZ1hNTC50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQlsb2NhbFNpdGUucmVzb2x2ZShjb25maWdYTUwsIG51bGwpOw0KLQkNCi0JCQkvLyBBdHRlbXB0IHRvIHJlYWQgcHJldmlvdXMgc3RhdGUNCi0JCQlwYXJzZUxvY2FsU2l0ZUZpbGUoY3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbiwgbG9jYWxTaXRlKTsNCi0NCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleGNlcHRpb24pIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLlVuYWJsZVRvQ3JlYXRlVVJMRm9yIiwgbG9jYWxTaXRlLmdldExvY2F0aW9uVVJMU3RyaW5nKCkgKyAiICYgIiArIENPTkZJR19GSUxFKSwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9DQotCQ0KLQkJcmV0dXJuIGxvY2FsU2l0ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQ3JlYXRlIHRoZSBsb2NhbFNpdGUgb2JqZWN0DQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHBhcnNlTG9jYWxTaXRlRmlsZShJUGxhdGZvcm1Db25maWd1cmF0aW9uIHBsYXRmb3JtQ29uZmlnLCBTaXRlTG9jYWwgbG9jYWxTaXRlICkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotDQotCQkvL2F0dGVtcHQgdG8gcGFyc2UgdGhlIExvY2FsU2l0ZS54bWwJDQotLy8JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKGNvbmZpZ1hNTCk7DQotCQl0cnkgew0KLS8vCQkJSW5wdXRTdHJlYW0gaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldChyZXNvbHZlZFVSTCkuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCQluZXcgU2l0ZUxvY2FsUGFyc2VyKHBsYXRmb3JtQ29uZmlnLCBsb2NhbFNpdGUpOw0KLQkJCXJldHVybiB0cnVlOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIFNpdGVMb2NhbCgpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogYWRkcyBhIG5ldyBjb25maWd1cmF0aW9uIHRvIHRoZSBMb2NhbFNpdGUNCi0JICogIHRoZSBuZXdseSBhZGRlZCBjb25maWd1cmF0aW9uIGlzIHRlaCBjdXJyZW50IG9uZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvbihJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7DQotCQlpZiAoY29uZmlnICE9IG51bGwpIHsNCi0JCQlhZGRDb25maWd1cmF0aW9uTW9kZWwoKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwpIGNvbmZpZyk7DQotDQotCQkJdHJpbUhpc3RvcnlUb0NhcGFjaXR5KCk7DQotDQotCQkJLy8gc2V0IGNvbmZpZ3VyYXRpb24gYXMgY3VycmVudAkJDQotCQkJaWYgKGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSAhPSBudWxsKQ0KLQkJCQlnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkuc2V0Q3VycmVudChmYWxzZSk7DQotCQkJaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEluc3RhbGxDb25maWd1cmF0aW9uKQ0KLQkJCQkgKChJbnN0YWxsQ29uZmlndXJhdGlvbikgY29uZmlnKS5zZXRDdXJyZW50KHRydWUpOw0KLQ0KLQkJCXNldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwpIGNvbmZpZyk7DQotCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKSBjb25maWcpLm1hcmtSZWFkT25seSgpOw0KLQ0KLQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMNCi0JCQlPYmplY3RbXSBzaXRlTG9jYWxMaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuZ2V0TGlzdGVuZXJzKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlTG9jYWxMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJKChJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTG9jYWxMaXN0ZW5lcnNbaV0pLmN1cnJlbnRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWQoY29uZmlnKTsNCi0JCQl9DQotCQl9DQotDQotCX0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHZvaWQgdHJpbUhpc3RvcnlUb0NhcGFjaXR5KCkgew0KLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSB0byByZW1vdmUgYSBjb25maWd1cmF0aW9uDQotCQkvLyB0aGUgZmlyc3QgYWRkZWQgaXMgIzANCi0JCXdoaWxlIChnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCA+IGdldE1heGltdW1IaXN0b3J5Q291bnQoKSAmJg0KLQkJCQlnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCA+IDEpIHsNCi0JCQkvLyBkbyBub3QgcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IGluIGhpc3RvcnksIHRoaXMgaXMgdGhlIG9yaWdpbmFsIGNvbmZpZw0KLQkJCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgcmVtb3ZlZENvbmZpZyA9IGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKVsxXTsNCi0JCQlpZiAocmVtb3ZlQ29uZmlndXJhdGlvbk1vZGVsKHJlbW92ZWRDb25maWcpKSB7DQotDQotCQkJCS8vIERFQlVHOg0KLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTikgew0KLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiUmVtb3ZlZCBjb25maWd1cmF0aW9uIDoiICsgcmVtb3ZlZENvbmZpZy5nZXRMYWJlbCgpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotDQotCQkJCS8vIG5vdGlmeSBsaXN0ZW5lcnMNCi0JCQkJT2JqZWN0W10gc2l0ZUxvY2FsTGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldExpc3RlbmVycygpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVMb2NhbExpc3RlbmVycy5sZW5ndGg7IGkrKykgew0KLQkJCQkJKChJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKSBzaXRlTG9jYWxMaXN0ZW5lcnNbaV0pLmluc3RhbGxDb25maWd1cmF0aW9uUmVtb3ZlZCgoSUluc3RhbGxDb25maWd1cmF0aW9uKSByZW1vdmVkQ29uZmlnKTsNCi0JCQkJfQ0KLQ0KLQkJCQkvL3JlbW92ZSBmaWxlcw0KLQkJCQlVUkwgdXJsID0gcmVtb3ZlZENvbmZpZy5nZXRVUkwoKTsNCi0JCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyoNCi0JICogQHNlZSBJTG9jYWxTaXRlI2FkZExvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcihJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJTG9jYWxTaXRlI3JlbW92ZUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcihJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyKElMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJzKSB7DQotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFNhdmVzIHRoZSBzaXRlIGludG8gdGhlIGNvbmZpZyBmaWxlLg0KLQkgKiBAcmV0dXJuIHRydWUgaWYgY2hhbmdlcyByZXN0YXJ0IGlzIG5lZWRlZA0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0NCi0JCS8vIFNhdmUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhcw0KLQkJLy8gdGhlIG90aGVyIGFyZSBhbHJlYWR5IHNhdmVkDQotCQkvLyBhbmQgc2V0IHJ1bnRpbSBpbmZvIGZvciBuZXh0IHN0YXJ0dXANCi0JCXJldHVybiAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5zYXZlKCk7DQotCX0NCi0JDQotLy8JLyoqDQotLy8JICogTWV0aG9kIGNyZWF0ZU5ld0luc3RhbGxDb25maWd1cmF0aW9uLg0KLS8vCSAqIEByZXR1cm4gSUluc3RhbGxDb25maWd1cmF0aW9uDQotLy8JICovDQotLy8JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3JlYXRlTmV3SW5zdGFsbENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotLy8JCUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0luc3RhbGxDb25maWcgPSBjcmVhdGVDb25maWd1cmF0aW9uU2l0ZShudWxsKTsNCi0vLwkJbmV3SW5zdGFsbENvbmZpZy5zZXRUaW1lbGluZShuZXdJbnN0YWxsQ29uZmlnLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKSk7DQotLy8JCXJldHVybiBuZXdJbnN0YWxsQ29uZmlnOw0KLS8vCX0NCi0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLiBUaGUgY3VycmVudCBpbnN0YWxsIGNvbmZpZ3VyYXRpb24gaXMgdG8gYmUgdXNlZC4NCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJcmV0dXJuIG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbihnZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5jbG9uZUNvbmZpZyIpLCBlKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXZlcnRUbyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvYmxlbUhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJLy8gY3JlYXRlIHRoZSBhY3Rpdml0eSANCi0JCS8vU3RhcnQgVU9XID8NCi0JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eSBhY3Rpdml0eSA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHkoSUFjdGl2aXR5LkFDVElPTl9SRVZFUlQpOw0KLQkJYWN0aXZpdHkuc2V0TGFiZWwoY29uZmlndXJhdGlvbi5nZXRMYWJlbCgpKTsNCi0JCWFjdGl2aXR5LnNldERhdGUobmV3IERhdGUoKSk7DQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlndXJhdGlvbiA9IG51bGw7DQotDQotCQl0cnkgew0KLQkJCS8vIGNyZWF0ZSBhIGNvbmZpZ3VyYXRpb24NCi0JCQluZXdDb25maWd1cmF0aW9uID0gY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJCW5ld0NvbmZpZ3VyYXRpb24uc2V0TGFiZWwoY29uZmlndXJhdGlvbi5nZXRMYWJlbCgpKTsNCi0NCi0JCQkvLyBhZGQgdG8gdGhlIHN0YWNrIHdoaWNoIHdpbGwgc2V0IHVwIGFzIGN1cnJlbnQNCi0JCQlhZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZ3VyYXRpb24pOw0KLQ0KLQkJCS8vIHByb2Nlc3MgZGVsdGENCi0JCQkvLyB0aGUgQ29uZmlndXJlZCBmZWF0dXJlc0NvbmZpZ3VyZWQgYXJlIHRoZSBzYW1lIGFzIHRoZSBvbGQgY29uZmlndXJhdGlvbg0KLQkJCS8vIHRoZSB1bmNvbmZpZ3VyZWQgZmVhdHVyZXNDb25maWd1cmVkIGFyZSB0aGUgcmVzdC4uLg0KLQkJCSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBuZXdDb25maWd1cmF0aW9uKS5yZXZlcnRUbyhjb25maWd1cmF0aW9uLCBtb25pdG9yLCBoYW5kbGVyKTsNCi0NCi0JCQkvLyBldmVyeXRoaW5nIGRvbmUgb2sNCi0JCQlhY3Rpdml0eS5zZXRTdGF0dXMoSUFjdGl2aXR5LlNUQVRVU19PSyk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBlcnJvcg0KLQkJCWFjdGl2aXR5LnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX05PSyk7DQotCQkJdGhyb3cgZTsNCi0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCQkvL3VzZXIgZGVjaWRlZCBub3QgdG8gcmV2ZXJ0LCBkbyBub3RoaW5nDQotCQkJLy8gYmVjYXVzZSB3ZSBkaWRuJ3QgYWRkIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBoaXN0b3J5DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChuZXdDb25maWd1cmF0aW9uICE9IG51bGwpDQotCQkJCSAoKEluc3RhbGxDb25maWd1cmF0aW9uKSBuZXdDb25maWd1cmF0aW9uKS5hZGRBY3Rpdml0eShhY3Rpdml0eSk7DQotCQl9DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICogQGRlcHJlY2F0ZWQNCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gYWRkVG9QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJTG9jYWxTaXRlI2dldFByZXNlcnZlZENvbmZpZ3VyYXRpb25Gb3IoSUluc3RhbGxDb25maWd1cmF0aW9uKQ0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBmaW5kUHJlc2VydmVkQ29uZmlndXJhdGlvbkZvcihJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgew0KLQ0KLQkJLy8gYmFzZWQgb24gdGltZSBzdGFtcCBmb3Igbm93DQotCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIHByZXNlcnZlZENvbmZpZyA9IG51bGw7DQotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7DQotCQkJSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdIHByZXNlcnZlZENvbmZpZ3VyYXRpb25zID0gZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnNNb2RlbCgpOw0KLQkJCWlmIChwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IGluZGV4UHJlc2VydmVkID0gMDsgaW5kZXhQcmVzZXJ2ZWQgPCBwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy5sZW5ndGg7IGluZGV4UHJlc2VydmVkKyspIHsNCi0JCQkJCWlmIChjb25maWd1cmF0aW9uLmdldENyZWF0aW9uRGF0ZSgpLmVxdWFscyhwcmVzZXJ2ZWRDb25maWd1cmF0aW9uc1tpbmRleFByZXNlcnZlZF0uZ2V0Q3JlYXRpb25EYXRlKCkpKSB7DQotCQkJCQkJcHJlc2VydmVkQ29uZmlnID0gcHJlc2VydmVkQ29uZmlndXJhdGlvbnNbaW5kZXhQcmVzZXJ2ZWRdOw0KLQkJCQkJCWJyZWFrOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIHByZXNlcnZlZENvbmZpZzsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElMb2NhbFNpdGUjZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKQ0KLQkgKiBMb2NhbFNpdGVNb2RlbCNnZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKCkgbWF5IHJldHVybiBudWxsIGlmDQotCSAqIHdlIGp1c3QgcGFyc2VkIExvY2FsU2l0ZS54bWwNCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbENvbmZpZ3VyYXRpb24gZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSB7DQotCQlpZiAoZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpID09IG51bGwpIHsNCi0JCQlpbnQgaW5kZXggPSAwOw0KLQkJCWlmICgoaW5kZXggPSBnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKCkubGVuZ3RoKSA9PSAwKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0gZWxzZSB7DQotCQkJCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnID0gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpW2luZGV4IC0gMV07DQotCQkJCWNvbmZpZy5zZXRDdXJyZW50KHRydWUpOw0KLQkJCQlzZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKGNvbmZpZyk7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb24pIGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElMb2NhbFNpdGUjZ2V0UHJlc2VydmVkQ29uZmlndXJhdGlvbnMoKQ0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbltdIGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCkgew0KLQkJaWYgKGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKS5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsQ29uZmlndXJhdGlvblswXTsNCi0JCXJldHVybiAoSUluc3RhbGxDb25maWd1cmF0aW9uW10pIGdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zTW9kZWwoKTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElMb2NhbFNpdGUjcmVtb3ZlRnJvbVByZXNlcnZlZENvbmZpZ3VyYXRpb25zKElJbnN0YWxsQ29uZmlndXJhdGlvbikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgew0KLQkJaWYgKHJlbW92ZVByZXNlcnZlZENvbmZpZ3VyYXRpb25Nb2RlbCgoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCkgY29uZmlndXJhdGlvbikpDQotCQkJICgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGNvbmZpZ3VyYXRpb24pLnJlbW92ZSgpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUxvY2FsU2l0ZSNnZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpDQotCSAqLw0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uW10gZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKSB7DQotCQlpZiAoZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpLmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybiBuZXcgSUluc3RhbGxDb25maWd1cmF0aW9uWzBdOw0KLQkJcmV0dXJuIChJSW5zdGFsbENvbmZpZ3VyYXRpb25bXSkgZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnlNb2RlbCgpOw0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBHZXRzIHRoZSBpc1RyYW5zaWVudC4NCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbg0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7DQotCQlyZXR1cm4gaXNUcmFuc2llbnQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGlzVHJhbnNpZW50Lg0KLQkgKiBAcGFyYW0gaXNUcmFuc2llbnQgVGhlIGlzVHJhbnNpZW50IHRvIHNldA0KLQkgKi8NCi0JcHJpdmF0ZSB2b2lkIGlzVHJhbnNpZW50KGJvb2xlYW4gaXNUcmFuc2llbnQpIHsNCi0JCXRoaXMuaXNUcmFuc2llbnQgPSBpc1RyYW5zaWVudDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXByaXZhdGUgU2l0ZVN0YXR1c0FuYWx5emVyIGdldFNpdGVTdGF0dXNBbmFseXplcigpIHsNCi0JCWlmIChzaXRlU3RhdHVzQW5hbHl6ZXIgPT0gbnVsbCkNCi0JCQlzaXRlU3RhdHVzQW5hbHl6ZXIgPSBuZXcgU2l0ZVN0YXR1c0FuYWx5emVyKHRoaXMpOw0KLQkJcmV0dXJuIHNpdGVTdGF0dXNBbmFseXplcjsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiAgY2hlY2sgaWYgdGhlIFBsdWdpbnMgb2YgdGhlIGZlYXR1cmUgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aA0KLQkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgdmVyc2lvbiAtPiBIQVBQWQ0KLQkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgb3RoZXIgdmVyc2lvbiAtPiBBTUJJR1VPVVMNCi0JICogIElmIHNvbWUgb2YgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYnV0IG5vdCBhbGwgLT4gVU5IQVBQWQ0KLQkgKiAJQ2hlY2sgb24gYWxsIENvbmZpZ3VyZWRTaXRlcw0KLQkgKi8NCi0JcHVibGljIElTdGF0dXMgZ2V0RmVhdHVyZVN0YXR1cyhJRmVhdHVyZSBmZWF0dXJlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gZ2V0U2l0ZVN0YXR1c0FuYWx5emVyKCkuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsNCi0JfQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuU2l0ZUxvY2FsTW9kZWwjc2V0TWF4aW11bUhpc3RvcnlDb3VudChpbnQpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXhpbXVtSGlzdG9yeUNvdW50KGludCBoaXN0b3J5KSB7DQotCQlzdXBlci5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KGhpc3RvcnkpOw0KLQkJdHJpbUhpc3RvcnlUb0NhcGFjaXR5KCk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlUmVjb25jaWxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlUmVjb25jaWxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVkZWIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVJlY29uY2lsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgcmVjb25jaWxpYXRpb24uCi0gKi8KLQotcHVibGljIGNsYXNzIFNpdGVSZWNvbmNpbGVyIGV4dGVuZHMgTW9kZWxPYmplY3QgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNpdGVSZWNvbmNpbGVyKFNpdGVMb2NhbCBzaXRlTG9jYWwpIHsKLS8vCQl0aGlzLnNpdGVMb2NhbCA9IHNpdGVMb2NhbDsKLQl9Ci0KLQotCS8qKgotCSogCi0JKi8KLQkvKnBhY2thZ2UgKi8KLQlVUkwgcmVzb2x2ZVNpdGVFbnRyeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlRW50cnkgbmV3U2l0ZUVudHJ5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVVSTCByZXNvbHZlZFVSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3U2l0ZUVudHJ5LmdldFVSTCgpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5VbmFibGVUb1Jlc29sdmUiLCBuZXdTaXRlRW50cnkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc29sdmVkVVJMOwotCX0KLQotCi0JLyoqCi0JICogVmFsaWRhdGUgd2UgaGF2ZSBvbmx5IG9uZSBjb25maWd1cmVkIGZlYXR1cmUgb2YgYSBzcGVjaWZpYyBpZAotCSAqIHBlciBjb25maWd1cmVkIHNpdGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tDb25maWd1cmVkRmVhdHVyZXNPbGQoSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gTk9UIFVTRUQKLQotCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgY29uZmlndXJlZFNpdGU7Ci0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlndXJlZEZlYXR1cmVzID0gY1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCUNvbmZpZ3VyYXRpb25Qb2xpY3kgY1BvbGljeSA9IGNTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKTsKLQotCQkvLyBUUkFDRQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQ29tcGFyZSBmZWF0dXJlcyB3aXRoaW4gOiIgKyBjb25maWd1cmVkU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlmb3IgKGludCBpbmRleENvbmZpZ3VyZWRGZWF0dXJlcyA9IDA7IGluZGV4Q29uZmlndXJlZEZlYXR1cmVzIDwgY29uZmlndXJlZEZlYXR1cmVzLmxlbmd0aCAtIDE7IGluZGV4Q29uZmlndXJlZEZlYXR1cmVzKyspIHsKLQotCQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVRvQ29tcGFyZSA9IGNvbmZpZ3VyZWRGZWF0dXJlc1tpbmRleENvbmZpZ3VyZWRGZWF0dXJlc107Ci0KLQkJCS8vIHdpdGhpbiB0aGUgY29uZmlndXJlZCBzaXRlCi0JCQkvLyBjb21wYXJlIHdpdGggdGhlIG90aGVyIGNvbmZpZ3VyZWQgZmVhdHVyZXMgb2YgdGhpcyBzaXRlCi0JCQlmb3IgKGludCByZXN0T2ZDb25maWd1cmVkRmVhdHVyZXMgPSBpbmRleENvbmZpZ3VyZWRGZWF0dXJlcyArIDE7IHJlc3RPZkNvbmZpZ3VyZWRGZWF0dXJlcyA8IGNvbmZpZ3VyZWRGZWF0dXJlcy5sZW5ndGg7IHJlc3RPZkNvbmZpZ3VyZWRGZWF0dXJlcysrKSB7Ci0JCQkJaW50IHJlc3VsdCA9IGNvbXBhcmUoZmVhdHVyZVRvQ29tcGFyZSwgY29uZmlndXJlZEZlYXR1cmVzW3Jlc3RPZkNvbmZpZ3VyZWRGZWF0dXJlc10pOwotCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQlpZiAocmVzdWx0ID09IDEpIHsKLQkJCQkJCWNQb2xpY3kudW5jb25maWd1cmUoY29uZmlndXJlZEZlYXR1cmVzW3Jlc3RPZkNvbmZpZ3VyZWRGZWF0dXJlc10sIHRydWUsIGZhbHNlKTsKLQkJCQkJfQotCQkJCQlpZiAocmVzdWx0ID09IDIpIHsKLQkJCQkJCWNQb2xpY3kudW5jb25maWd1cmUoZmVhdHVyZVRvQ29tcGFyZSwgdHJ1ZSwgZmFsc2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY29tcGFyZSB0d28gZmVhdHVyZSByZWZlcmVuY2VzCi0JICogcmV0dXJucyAwIGlmIHRoZSBmZWF0dXJlIGFyZSBkaWZmZXJlbnQKLQkgKiByZXR1cm5zIDEgaWYgdGhlIHZlcnNpb24gb2YgZmVhdHVyZSAxIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmVyc2lvbiBvZiBmZWF0dXJlIDIKLQkgKiByZXR1cm5zIDIgaWYgb3Bwb3NpdGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZShJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmMSwgSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZjIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBUUkFDRQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQ29tcGFyZTogIiArIGZlYXR1cmVSZWYxICsgIiAmJiAiICsgZmVhdHVyZVJlZjIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChmZWF0dXJlUmVmMSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJSUZlYXR1cmUgZmVhdHVyZTEgPSBudWxsOwotCQlJRmVhdHVyZSBmZWF0dXJlMiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmZWF0dXJlMSA9IGZlYXR1cmVSZWYxLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlmZWF0dXJlMiA9IGZlYXR1cmVSZWYyLmdldEZlYXR1cmUobnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoZmVhdHVyZTEgPT0gbnVsbCB8fCBmZWF0dXJlMiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCVZlcnNpb25lZElkZW50aWZpZXIgaWQxID0gZmVhdHVyZTEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkMiA9IGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQlpZiAoaWQxID09IG51bGwgfHwgaWQyID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKGlkMS5nZXRJZGVudGlmaWVyKCkgIT0gbnVsbCAmJiBpZDEuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhpZDIuZ2V0SWRlbnRpZmllcigpKSkgewotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbjEgPSBpZDEuZ2V0VmVyc2lvbigpOwotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbjIgPSBpZDIuZ2V0VmVyc2lvbigpOwotCQkJaWYgKHZlcnNpb24xICE9IG51bGwpIHsKLQkJCQlpZiAodmVyc2lvbjEuaXNHcmVhdGVyVGhhbih2ZXJzaW9uMikpIHsKLQkJCQkJcmV0dXJuIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIDI7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gMjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgbGlzdCBvZiBjb25maWd1cmVkIGZlYXR1cmVzIGVsaW1pbmF0aW5nIGV4dHJhCi0JICogZW50cmllcyAoaWYgcG9zc2libGUpLiBNYWtlIHN1cmUgd2UgZG8gbm90IGxlYXZlIGNvbmZpZ3VyZWQKLQkgKiBuZXN0ZWQgZmVhdHVyZXMgd2l0aCAiaG9sZXMiIChpZS4gdW5jb25maWd1cmVkIGNoaWxkcmVuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0NvbmZpZ3VyZWRGZWF0dXJlcyhJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHsKLQotCQkvLyBOb3RlOiBpZiB3ZSBoaXQgZXJyb3JzIGluIHRoZSB2YXJpb3VzIGNvbXB1dGF0aW9uCi0JCS8vIG1ldGhvZHMgYW5kIHRocm93IGEgQ29yZUV4Y2VwdGlvbiwgd2Ugd2lsbCBub3QgY2F0Y2ggaXQKLQkJLy8gaW4gdGhpcyBtZXRob2QuIENvbnNlcXVlbnRseSB3ZSB3aWxsIG5vdCBhdHRlbXB0IHRvCi0JCS8vIHVuY29uZmlndXJlIGFueSAiZXh0cmEiIGZlYXR1cmVzIGJlY2F1c2Ugd2Ugd291bGQgCi0JCS8vIGxpa2VseSBnZXQgaXQgd3JvbmcuIFRoZSBwbGF0Zm9ybSB3aWxsIHJ1biB3aXRoIGV4dHJhIGZlYXR1cmVzCi0JCS8vIGNvbmZpZ3VyZWQuIFRoZSBydW50aW1lIHdpbGwgZWxpbWluYXRlIGV4dHJhIHBsdWdpbnMgYmFzZWQKLQkJLy8gb24gcnVudGltZSBiaW5kaW5nIHJ1bGVzLgotCi0JCS8vIGRldGVybWluZSAicHJvcG9zZWQiIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcwotCQlDb25maWd1cmVkU2l0ZSBjU2l0ZSA9IChDb25maWd1cmVkU2l0ZSkgY29uZmlndXJlZFNpdGU7Ci0JCS8vIGRlYnVnCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19SRUNPTkNJTEVSKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJWYWxpZGF0ZSBjb25maWd1cmF0aW9uIG9mIHNpdGUgIiArIGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNvbmZpZ3VyZWRSZWZzID0gY1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCUFycmF5TGlzdCBhbGxQb3NzaWJsZUNvbmZpZ3VyZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWd1cmVkUmVmcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY29uZmlndXJlZFJlZnNbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlhbGxQb3NzaWJsZUNvbmZpZ3VyZWRGZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkJLy8gZGVidWcKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCIgICBjb25maWd1cmVkIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKCIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gZmluZCB0b3AgbGV2ZWwgZmVhdHVyZXMKLQkJQXJyYXlMaXN0IHRvcEZlYXR1cmVzID0gY29tcHV0ZVRvcEZlYXR1cmVzKGFsbFBvc3NpYmxlQ29uZmlndXJlZEZlYXR1cmVzKTsKLQotCQkvLyBmaW5kIG5vbiBlZml4IHRvcCBsZXZlbCBmZWF0dXJlcwotCQlBcnJheUxpc3QgdG9wTm9uRWZpeEZlYXR1cmVzID0gZ2V0Tm9uRWZpeEZlYXR1cmVzKHRvcEZlYXR1cmVzKTsKLQotCQkvLyBleHBhbmQgbm9uIGVmaXggdG9wIGxldmVsIGZlYXR1cmVzIChjb21wdXRlIGZ1bGwgbmVzdGluZyBzdHJ1Y3R1cmVzKS4KLQkJQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcyA9IGV4cGFuZEZlYXR1cmVzKHRvcE5vbkVmaXhGZWF0dXJlcywgY29uZmlndXJlZFNpdGUpOwotCi0JCS8vIHJldHJpZXZlIGVmaXhlcyB0aGF0IHBhdGNoIGVuYWJsZSBmZWF0dXJlCi0JCS8vIHRoZXkgbXVzdCBiZSBrZXB0IGVuYWJsZWQKLQkJaWYgKHRvcEZlYXR1cmVzLnNpemUoKSAhPSB0b3BOb25FZml4RmVhdHVyZXMuc2l6ZSgpKSB7Ci0JCQlNYXAgcGF0Y2hlcyA9IGdldFBhdGNoZXNBc0ZlYXR1cmUoYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMpOwotCQkJaWYgKCFwYXRjaGVzLmlzRW1wdHkoKSkgewotCQkJCS8vIGNhbGN1bGF0ZSBlZml4ZXMgdG8gZW5hYmxlCi0JCQkJTGlzdCBlZml4ZXNUb0VuYWJsZSA9IGdldFBhdGNoZXNUb0VuYWJsZShwYXRjaGVzLCBjb25maWd1cmVkRmVhdHVyZXMpOwotCQkJCS8vIGFkZCBlZmllcyB0byBrZWVwIGVuYWJsZQotCQkJCS8vYWRkIHRoZW0gdG8gdGhlIGVuYWJsZSBsaXN0Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZWZpeGVzVG9FbmFibGUuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlGZWF0dXJlIGVsZW1lbnQgPSAoSUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJCQlBcnJheUxpc3QgZXhwYW5kZWRFZml4ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlleHBhbmRFZml4RmVhdHVyZShlbGVtZW50LCBleHBhbmRlZEVmaXgsIGNvbmZpZ3VyZWRTaXRlKTsKLQkJCQkJY29uZmlndXJlZEZlYXR1cmVzLmFkZEFsbChleHBhbmRlZEVmaXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNvbXB1dGUgZXh0cmEgZmVhdHVyZXMKLQkJQXJyYXlMaXN0IGV4dHJhcyA9IGRpZmYoYWxsUG9zc2libGVDb25maWd1cmVkRmVhdHVyZXMsIGNvbmZpZ3VyZWRGZWF0dXJlcyk7Ci0KLQkJLy8gdW5jb25maWd1cmUgZXh0cmEgZmVhdHVyZXMKLQkJQ29uZmlndXJhdGlvblBvbGljeSBjUG9saWN5ID0gY1NpdGUuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZXh0cmFzLmdldChpKTsKLQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNTaXRlLmdldFNpdGUoKS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOwotCQkJdHJ5IHsKLQkJCQljUG9saWN5LnVuY29uZmlndXJlKHJlZiwgdHJ1ZSwgZmFsc2UpOwotCQkJCS8vIGRlYnVnCi0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVW5jb25maWd1cmluZyBcImV4dHJhXCIgZmVhdHVyZSAiICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZVRvcEZlYXR1cmVzKEFycmF5TGlzdCBmZWF0dXJlcykgewotCQkvKiBtYXAgb2YgRmVhdHVyZSBieSBWZXJzaW9uZWRJZGVudGlmaWVyICovCi0JCU1hcCB0b3BGZWF0dXJlcyA9IG5ldyBIYXNoTWFwKGZlYXR1cmVzLnNpemUoKSk7Ci0JCS8vIHN0YXJ0IHdpdGggdGhlIGZlYXR1cmVzIHBhc3NlZCBpbgotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUZlYXR1cmUgZiA9ICgoSUZlYXR1cmUpIGl0Lm5leHQoKSk7Ci0JCQl0b3BGZWF0dXJlcy5wdXQoZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIGYpOwotCQl9Ci0JCS8vIHJlbW92ZSBhbGwgZmVhdHVyZXMgdGhhdCBuZXN0IGluIHNvbWUgb3RoZXIgZmVhdHVyZQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSAoKElGZWF0dXJlKSBpdC5uZXh0KCkpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0b3BGZWF0dXJlcy5yZW1vdmUoY2hpbGRyZW5bal0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1dBUk5JTkdTKQotCQkJCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZTEpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkQWxsKHRvcEZlYXR1cmVzLnZhbHVlcygpKTsKLQkJLy8gZGVidWcKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoIkNvbXB1dGVkIHRvcC1sZXZlbCBmZWF0dXJlcyIpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvcEZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiICAgIiArICgoSUZlYXR1cmUpIGxpc3QuZ2V0KGkpKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBleHBhbmRGZWF0dXJlcyhBcnJheUxpc3QgZmVhdHVyZXMsIElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGV4cGFuZCBhbGwgdG9wIGxldmVsIGZlYXR1cmVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWV4cGFuZEZlYXR1cmUoKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSksIHJlc3VsdCwgY29uZmlndXJlZFNpdGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZXhwYW5kRmVhdHVyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3QgZmVhdHVyZXMsIElDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSkgewotCi0JCS8vIGFkZCBmZWF0dXJlCi0JCWlmICghZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKLQkJCWZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCS8vIGRlYnVnCi0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikgewotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlJldGFpbmluZyBjb25maWd1cmVkIGZlYXR1cmUgIiArIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBhZGQgbmVzdGVkIGNoaWxkcmVuIHRvIHRoZSBsaXN0Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljaGlsZHJlbiA9IGZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaW50IGogPSAwOyBqIDwgY2hpbGRyZW4ubGVuZ3RoOyBqKyspIHsKLQkJCUlGZWF0dXJlIGNoaWxkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY2hpbGQgPSBjaGlsZHJlbltqXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltqXSkpCi0JCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyAyNTIwMiBkbyBub3QgcmV0dXJuIHJpZ2h0IG5vdywgdGhlIHBlZXIgY2hpbGRyZW4gbWF5IGJlIG9rCi0JCQl9Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQlleHBhbmRGZWF0dXJlKGNoaWxkLCBmZWF0dXJlcywgY29uZmlndXJlZFNpdGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZGlmZihBcnJheUxpc3QgbGVmdCwgQXJyYXlMaXN0IHJpZ2h0KSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gZGV0ZXJtaW5lIGRpZmZlcmVuY2UgKGxlZnQgIm1pbnVzIiByaWdodCkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZWZ0LnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBsZWZ0LmdldChpKTsKLQkJCWlmICghcmlnaHQuY29udGFpbnMoZmVhdHVyZSkpCi0JCQkJcmVzdWx0LmFkZChmZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogZ2V0IHRoZSBsaXN0IG9mIGVuYWJsZWQgcGF0Y2hlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIE1hcCBnZXRQYXRjaGVzQXNGZWF0dXJlKEFycmF5TGlzdCBhbGxDb25maWd1cmVkRmVhdHVyZXMpIHsKLQkJLy8gZ2V0IGFsbCBlZml4ZXMgYW5kIHRoZSBhc3NvY2lhdGVkIHBhdGNoZWQgZmVhdHVyZXMKLQkJTWFwIHBhdGNoZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoYWxsQ29uZmlndXJlZEZlYXR1cmVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBhbGxDb25maWd1cmVkRmVhdHVyZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUxpc3QgcGF0Y2hlZEZlYXR1cmVzSUQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJSUZlYXR1cmUgZWxlbWVudCA9IChJRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQkJLy8gYWRkIHRoZSBwYXRjaGVkIGZlYXR1cmUgaWRlbnRpZmllcnMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnQuZ2V0SW1wb3J0cygpLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChlbGVtZW50LmdldEltcG9ydHMoKVtpXS5pc1BhdGNoKCkpIHsKLQkJCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaWQgPSBlbGVtZW50LmdldEltcG9ydHMoKVtpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikKLQkJCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJGb3VuZCBwYXRjaCAiICsgZWxlbWVudCArICIgZm9yIGZlYXR1cmUgaWRlbnRpZmllciAiICsgaWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCXBhdGNoZWRGZWF0dXJlc0lELmFkZChpZCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIXBhdGNoZWRGZWF0dXJlc0lELmlzRW1wdHkoKSkgewotCQkJCQlwYXRjaGVzLnB1dChlbGVtZW50LCBwYXRjaGVkRmVhdHVyZXNJRCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHBhdGNoZXM7Ci0JfQotCi0JLyoKLQkgKiByZXRydW5zIHRoZSBsaXN0IG9mIHBhdGhlcy1mZWF0dXJlIHdobyBwYXRjaCBlbmFibGVkIGZlYXR1cmVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdCBnZXRQYXRjaGVzVG9FbmFibGUoTWFwIGVmaXhlcywgQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcykgewotCi0JCUFycmF5TGlzdCBlbmFibGVkVmVyc2lvbmVkSWRlbnRpZmllciA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGNvbmZpZ3VyZWRGZWF0dXJlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlGZWF0dXJlIGVsZW1lbnQgPSAoSUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJZW5hYmxlZFZlcnNpb25lZElkZW50aWZpZXIuYWRkKGVsZW1lbnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsKLQkJfQotCi0JCS8vIGxvb3AgdGhyb3VnaCB0aGUgcGF0Y2hlcwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaXRlciA9IGVmaXhlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCWJvb2xlYW4gdG9FbmFibGUgPSBmYWxzZTsKLQkJCUlGZWF0dXJlIGVmaXhGZWF0dXJlID0gKElGZWF0dXJlKSBpdGVyLm5leHQoKTsKLQkJCUxpc3QgcGF0Y2hlZEZlYXR1cmVzID0gKExpc3QpIGVmaXhlcy5nZXQoZWZpeEZlYXR1cmUpOwotCQkJLy8gbG9vcCB0aHJvdWdoIHRoZSAncGF0Y2hlZCBmZWF0dXJlcyBpZGVudGlmaWVyJyB0aGUgZm9yIHRoaXMgcGF0Y2gKLQkJCS8vIHNlZSBpZiBpdCB0aGUgcGF0Y2ggcGF0Y2hlcyBhdCBsZWFzdCBvbmUgZW5hYmxlIGZlYXR1cmUKLQkJCUl0ZXJhdG9yIHBhdGNoZWRGZWF0dXJlc0l0ZXIgPSBwYXRjaGVkRmVhdHVyZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChwYXRjaGVkRmVhdHVyZXNJdGVyLmhhc05leHQoKSAmJiAhdG9FbmFibGUpIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHBhdGNoZWRGZWF0dXJlSUQgPSAoVmVyc2lvbmVkSWRlbnRpZmllcikgcGF0Y2hlZEZlYXR1cmVzSXRlci5uZXh0KCk7Ci0JCQkJaWYgKGVuYWJsZWRWZXJzaW9uZWRJZGVudGlmaWVyLmNvbnRhaW5zKHBhdGNoZWRGZWF0dXJlSUQpKSB7Ci0JCQkJCXRvRW5hYmxlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghdG9FbmFibGUpIHsKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUkVDT05DSUxFUikKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJUaGUgUGF0Y2ggIiArIGVmaXhGZWF0dXJlICsgIiBkb2VzIG5vdCBwYXRjaCBhbnkgZW5hYmxlZCBmZWF0dXJlczogaXQgd2lsbCBiZSBkaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpCi0JCQkJCVVwZGF0ZUNvcmUuZGVidWcoIlRoZSBwYXRjaCAiICsgZWZpeEZlYXR1cmUgKyAiIHdpbGwgYmUgZW5hYmxlZC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmVzdWx0LmFkZChlZml4RmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgdGhlIGZlYXR1cmUgdGhhdCBhcmUgbm90IHBhdGNoZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgZ2V0Tm9uRWZpeEZlYXR1cmVzKEFycmF5TGlzdCB0b3BGZWF0dXJlcykgewotCQlNYXAgZWZpeEZlYXR1cmVzID0gZ2V0UGF0Y2hlc0FzRmVhdHVyZSh0b3BGZWF0dXJlcyk7Ci0JCVNldCBrZXlTZXQgPSBlZml4RmVhdHVyZXMua2V5U2V0KCk7Ci0JCWlmIChrZXlTZXQgPT0gbnVsbCB8fCBrZXlTZXQuaXNFbXB0eSgpKQotCQkJcmV0dXJuIHRvcEZlYXR1cmVzOwotCi0JCUl0ZXJhdG9yIGl0ZXIgPSB0b3BGZWF0dXJlcy5pdGVyYXRvcigpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlGZWF0dXJlIGVsZW1lbnQgPSAoSUZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKCFrZXlTZXQuY29udGFpbnMoZWxlbWVudCkpIHsKLQkJCQlyZXN1bHQuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQotCi0JLyoKLQkgKiBvbmx5IGVuYWJsZSBub24tZWZpeCBjaGlsZHJlbiByZWN1cnNpdmVseQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZXhwYW5kRWZpeEZlYXR1cmUoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGZlYXR1cmVzLCBJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUpIHsKLQotCQkvLyBhZGQgZmVhdHVyZQotCQlpZiAoIWZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCQkvLyBkZWJ1ZwotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1JFQ09OQ0lMRVIpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJSZXRhaW5pbmcgY29uZmlndXJlZCBmZWF0dXJlICIgKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIG5lc3RlZCBjaGlsZHJlbiB0byB0aGUgbGlzdAotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBudWxsOwotCQl0cnkgewotCQkJY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQlJRmVhdHVyZSBjaGlsZCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNoaWxkID0gY2hpbGRyZW5bal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmICghY2hpbGRyZW5bal0uaXNPcHRpb25hbCgpKQotCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gMjUyMDIgZG8gbm90IHJldHVybiByaWdodCBub3csIHRoZSBwZWVyIGNoaWxkcmVuIG1heSBiZSBvawotCQkJfQotCQkJaWYgKGNoaWxkICE9IG51bGwpewotCQkJCWlmICghVXBkYXRlQ29yZS5pc1BhdGNoKGNoaWxkKSkKLQkJCQkJZXhwYW5kRWZpeEZlYXR1cmUoY2hpbGQsIGZlYXR1cmVzLCBjb25maWd1cmVkU2l0ZSk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlU3RhdHVzQW5hbHl6ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVN0YXR1c0FuYWx5emVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OTEwMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlU3RhdHVzQW5hbHl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBjb25maWd1cmF0aW9ucy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2l0ZVN0YXR1c0FuYWx5emVyIHsKLQotCXByaXZhdGUgc3RhdGljIExpc3QgYWxsQ29uZmlndXJlZEZlYXR1cmVzOyAvKlZlcnNpb25lZElkZW50aWZpZXIgKi8KLQlwcml2YXRlIFNpdGVMb2NhbCBzaXRlTG9jYWw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU2l0ZVN0YXR1c0FuYWx5emVyKFNpdGVMb2NhbCBzaXRlTG9jYWwpIHsKLQkJdGhpcy5zaXRlTG9jYWwgPSBzaXRlTG9jYWw7Ci0JfQotCi0JLyoqCi0JICogbWFuYWdlcyB0aGUgdmVyc2lvbmVkSWRlbnRpZmllciBhbmQgbG9jYXRpb24gb2YgcGFyc2VkIHBsdWdpbnMKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUGx1Z2luSWRlbnRpZmllciB7Ci0JCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciBpZDsKLQkJcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0KLQkJcHVibGljIFBsdWdpbklkZW50aWZpZXIoVmVyc2lvbmVkSWRlbnRpZmllciBpZCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGZyYWdtZW50KSB7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCQl0aGlzLmlzRnJhZ21lbnQgPSBmcmFnbWVudDsKLQkJfQotCi0JCXB1YmxpYyBWZXJzaW9uZWRJZGVudGlmaWVyIGdldFZlcnNpb25lZElkZW50aWZpZXIoKSB7Ci0JCQlyZXR1cm4gaWQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGxhYmVsOwotCQl9Ci0JfQotCS8qCi0JICogIGNoZWNrIGlmIHRoZSBQbHVnaW5zIG9mIHRoZSBmZWF0dXJlIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgKLQkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgbm8gb3RoZXIgdmVyc2lvbiAtPiBIQVBQWQotCSAqICBJZiBhbGwgdGhlIHBsdWdpbnMgYXJlIG9uIHRoZSBwbHVnaW4gcGF0aCwgYW5kIHRoZSB2ZXJzaW9uIG1hdGNoIGFuZCB0aGVyZSBpcyBvdGhlciB2ZXJzaW9uIC0+IEFNQklHVU9VUwotCSAqICBJZiBzb21lIG9mIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGJ1dCBub3QgYWxsIC0+IFVOSEFQUFkKLQkgKiAJQ2hlY2sgb24gYWxsIENvbmZpZ3VyZWRTaXRlcwotCSAqLwotCXByaXZhdGUgSVN0YXR1cyBnZXRTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgewotCi0JCS8vIHZhbGlkYXRlIHNpdGUKLQkJSVNpdGUgZmVhdHVyZVNpdGUgPSBmZWF0dXJlLmdldFNpdGUoKTsKLQkJaWYgKGZlYXR1cmVTaXRlID09IG51bGwpIHsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19DT05GSUdVUkFUSU9OKQotCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkNhbm5vdCBkZXRlcm1pbmUgc3RhdHVzIG9mIGZlYXR1cmU6IiArIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIuIFNpdGUgaXMgTlVMTC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5VbmFibGVUb0RldGVybWluZUZlYXR1cmVTdGF0dXNTaXRlTnVsbCIsIG5ldyBPYmplY3RbXSB7IGZlYXR1cmUuZ2V0VVJMKCl9KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBtc2csIG51bGwpOwotCQl9Ci0KLQkJLy8gdmFsaWRhdGUgY29uZmlndXJlZCBzaXRlCQkKLQkJQ29uZmlndXJlZFNpdGUgY1NpdGUgPSAoQ29uZmlndXJlZFNpdGUpIGZlYXR1cmVTaXRlLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQlpZiAoY1NpdGUgPT0gbnVsbCkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJDYW5ub3QgZGV0ZXJtaW5lIHN0YXR1cyBvZiBmZWF0dXJlOiAiICsgZmVhdHVyZS5nZXRMYWJlbCgpICsgIi4gQ29uZmlndXJlZCBTaXRlIGlzIE5VTEwuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzQ29uZmlndXJlZFNpdGVOdWxsIiwgbmV3IE9iamVjdFtdIHsgZmVhdHVyZS5nZXRVUkwoKX0pOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuRVJST1IsIElGZWF0dXJlLlNUQVRVU19BTUJJR1VPVVMsIG1zZywgbnVsbCk7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBkaXNhYmxlLCBpZiBzbyByZXR1cm4KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gY1NpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2UoZmVhdHVyZSk7Ci0JCWlmIChyZWYgIT0gbnVsbCkgewotCQkJaWYgKCFjU2l0ZS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuaXNDb25maWd1cmVkKHJlZikpCi0JCQkJcmV0dXJuIGNyZWF0ZVN0YXR1cyhJU3RhdHVzLk9LLCBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQsICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJVbmFibGUgdG8gZmluZCByZWZlcmVuY2UgZm9yIGZlYXR1cmUgIiArIGZlYXR1cmUgKyAiIGluIHNpdGUgIiArIGNTaXRlLmdldFNpdGUoKS5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgYnJva2VuCi0JCUlTdGF0dXMgc3RhdHVzID0gY1NpdGUuZ2V0QnJva2VuU3RhdHVzKGZlYXR1cmUpOwotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5PSykgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0NPTkZJR1VSQVRJT04pCi0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRmVhdHVyZSBicm9rZW46IiArIGZlYXR1cmUuZ2V0TGFiZWwoKSArICIuU2l0ZToiICsgY1NpdGUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCS8vIGNoZWNrIGFtYmlndW91cyBhZ2FpbnN0IHJlZ2lzdHJ5IFsxNzAxNV0KLQkJSVBsdWdpbkVudHJ5W10gZmVhdHVyZXNFbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCXJldHVybiBzdGF0dXMoZmVhdHVyZXNFbnRyaWVzKTsKLQl9Ci0KLQkvKgotCSAqICBjaGVjayBpZiB0aGUgUGx1Z2lucyBvZiB0aGUgZmVhdHVyZSBhcmUgb24gdGhlIHBsdWdpbiBwYXRoCi0JICogIElmIGFsbCB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBhbmQgdGhlIHZlcnNpb24gbWF0Y2ggYW5kIHRoZXJlIGlzIG5vIG90aGVyIHZlcnNpb24gLT4gSEFQUFkKLQkgKiAgSWYgYWxsIHRoZSBwbHVnaW5zIGFyZSBvbiB0aGUgcGx1Z2luIHBhdGgsIGFuZCB0aGUgdmVyc2lvbiBtYXRjaCBhbmQgdGhlcmUgaXMgb3RoZXIgdmVyc2lvbiAtPiBBTUJJR1VPVVMKLQkgKiAgSWYgc29tZSBvZiB0aGUgcGx1Z2lucyBhcmUgb24gdGhlIHBsdWdpbiBwYXRoLCBidXQgbm90IGFsbCAtPiBVTkhBUFBZCi0JICogCUNoZWNrIG9uIGFsbCBDb25maWd1cmVkU2l0ZXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRGZWF0dXJlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOwotCQlJU3RhdHVzIGNoaWxkU3RhdHVzOwotCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQotCQkvLyBjb25zaWRlciBkaXNhYmxlCi0JCS8vIGNoZWNrIHRoZSBjdXJyZW50IGZlYXR1cmUKLQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZURpc2FibGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY29kZSA9IElGZWF0dXJlLlNUQVRVU19ESVNBQkxFRDsKLQkJSVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gZ2V0U3RhdHVzKGZlYXR1cmUpOwotCQlNdWx0aVN0YXR1cyBtdWx0aVRlbXAgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgY29kZSwgbXNnLCBudWxsKTsKLQkJaWYgKGZlYXR1cmVTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQlpZiAoZmVhdHVyZVN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCQltdWx0aVRlbXAuYWRkQWxsKGZlYXR1cmVTdGF0dXMpOwotCQkJfSBlbHNlIHsKLQkJCQltdWx0aVRlbXAuYWRkKGZlYXR1cmVTdGF0dXMpOwotCQkJfQotCQl9Ci0JCS8vIHByZXNlcnZlIHRoZSB3b3JzZSBjb2RlIHRocm91Z2ggdGhlIG1ldGhvZCAoc2VsZiBhc3Nlc21lbnQgKyBjaGlsZHJlbiBhc3Nlc3NtZW50KQotCQlpZiAoZmVhdHVyZVN0YXR1cy5nZXRDb2RlKCkgPiBjb2RlKQotCQkJY29kZSA9IGZlYXR1cmVTdGF0dXMuZ2V0Q29kZSgpOwotCi0JCS8vIGRvIG5vdCBjaGVjayBjaGlsZHJlbiBpZiBmZWF0dXJlIGlzIGRpc2FibGUKLQkJaWYgKCEoY29kZSA9PSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltpXSkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNoaWxkRmVhdHVyZSA9IGNoaWxkcmVuW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuaXNPcHRpb25hbChjaGlsZHJlbltpXSkpCi0JCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJFcnJvciByZXRyaWV2aW5nIGZlYXR1cmU6IiArIGNoaWxkcmVuW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKGNoaWxkRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oImdldEZlYXR1cmVTdGF0dXM6IEZlYXR1cmUgaXMgbnVsbCBmb3I6IiArIGNoaWxkcmVuW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gVW5hYmxlIHRvIGZpbmQgY2hpbGRyZW4gZmVhdHVyZSwgYnJva2VuCi0JCQkJCQlPYmplY3QgZmVhdHVyZUFzUHJpbnRhYmxlT2JqZWN0ID0gY2hpbGRyZW5baV0uZ2V0VVJMKCk7Ci0JCQkJCQlmZWF0dXJlQXNQcmludGFibGVPYmplY3QgPSBjaGlsZHJlbltpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCQlTdHJpbmcgbXNnMSA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuTmVzdGVkRmVhdHVyZVVuYXZhaWxhYmxlIiwgbmV3IE9iamVjdFtdIHsgZmVhdHVyZUFzUHJpbnRhYmxlT2JqZWN0IH0pOyAvLyROT04tTkxTLTEkCi0JCQkJCQltdWx0aVRlbXAuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSwgbXNnMSwgbnVsbCkpOwotCQkJCQkJaWYgKElGZWF0dXJlLlNUQVRVU19VTkhBUFBZID4gY29kZSkKLQkJCQkJCQljb2RlID0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQljaGlsZFN0YXR1cyA9IGdldEZlYXR1cmVTdGF0dXMoY2hpbGRGZWF0dXJlKTsKLQkJCQkJCS8vIGRvIG5vdCBhZGQgdGhlIHN0YXR1cywgYWRkIHRoZSBjaGlsZHJlbiBzdGF0dXMgYXMgZ2V0RmVhdHVyZVN0YXR1cwotCQkJCQkJLy8gcmV0dXJucyBhIG11bHRpU3RhdHVzIAotCQkJCQkJaWYgKGNoaWxkU3RhdHVzLmdldENvZGUoKSA9PSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpIHsKLQkJCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZlcnNpb25JRCA9IGNoaWxkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCQkJU3RyaW5nIGZlYXR1cmVWZXIgPSAodmVyc2lvbklEID09IG51bGwpID8gIiIgOiB2ZXJzaW9uSUQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTdHJpbmcgbXNnMSA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuTmVzdGVkRmVhdHVyZURpc2FibGUiLCBjaGlsZEZlYXR1cmUuZ2V0TGFiZWwoKSwgZmVhdHVyZVZlcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQltdWx0aVRlbXAuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBjaGlsZFN0YXR1cy5nZXRDb2RlKCksIG1zZzEsIG51bGwpKTsKLQkJCQkJCQlpZiAoSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkgPiBjb2RlKQotCQkJCQkJCQljb2RlID0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoY2hpbGRTdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLk9LKSB7Ci0JCQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2ZXJzaW9uSUQgPSBjaGlsZEZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQkJCVN0cmluZyBmZWF0dXJlVmVyID0gKHZlcnNpb25JRCA9PSBudWxsKSA/ICIiIDogdmVyc2lvbklELmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG1zZzEgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLk5lc3RlZEZlYXR1cmVVbkhhcHB5IiwgY2hpbGRGZWF0dXJlLmdldExhYmVsKCksIGZlYXR1cmVWZXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbXVsdGlUZW1wLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgY2hpbGRTdGF0dXMuZ2V0Q29kZSgpLCBtc2cxLCBudWxsKSk7Ci0JCQkJCQkJaWYgKGNoaWxkU3RhdHVzLmdldENvZGUoKSA+IGNvZGUpCi0JCQkJCQkJCWNvZGUgPSBjaGlsZFN0YXR1cy5nZXRDb2RlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXQgbWVzc2FnZQotCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX0hBUFBZIDoKLQkJCQltc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVIYXBweSIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElGZWF0dXJlLlNUQVRVU19VTkhBUFBZIDoKLQkJCQltc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVVbkhhcHB5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUyA6Ci0JCQkJbXNnID0gUG9saWN5LmJpbmQoIlNpdGVMb2NhbC5GZWF0dXJlQW1iaWd1b3VzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSUZlYXR1cmUuU1RBVFVTX0RJU0FCTEVEIDoKLQkJCQltc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVEaXNhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZVN0YXR1c1Vua25vd24iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JCU11bHRpU3RhdHVzIG11bHRpID0gbmV3IE11bHRpU3RhdHVzKGZlYXR1cmVTdGF0dXMuZ2V0UGx1Z2luKCksIGNvZGUsIG1zZywgbnVsbCk7Ci0JCW11bHRpLmFkZEFsbChtdWx0aVRlbXApOwotCQlyZXR1cm4gbXVsdGk7Ci0JfQotCi0JLyoKLQkgKiBjb21wdXRlIHRoZSBzdGF0dXMgYmFzZWQgb24gZ2V0U3RhdHVzKCkgcnVsZXMgCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyhJUGx1Z2luRW50cnlbXSBmZWF0dXJlUGx1Z2lucykgewotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZlYXR1cmVQbHVnaW5JRDsKLQotCQlTdHJpbmcgaGFwcHlNU0cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVIYXBweSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBhbWJpZ3VvdXNNU0cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLkZlYXR1cmVBbWJpZ3VvdXMiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RhdHVzIGZlYXR1cmVTdGF0dXMgPSBjcmVhdGVTdGF0dXMoSVN0YXR1cy5PSywgSUZlYXR1cmUuU1RBVFVTX0hBUFBZLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJTXVsdGlTdGF0dXMgbXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUywgYW1iaWd1b3VzTVNHLCBudWxsKTsKLQkJUGFja2FnZUFkbWluIHBrZ0FkbWluID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQYWNrYWdlQWRtaW4oKTsKLQkJCi0JCS8vIGlzIEFtYmlnb3VzIGlmIHdlIGZpbmQgYSBwbHVnaW4gZnJvbSB0aGUgZmVhdHVyZQotCQkvLyB3aXRoIGEgZGlmZmVyZW50IHZlcnNpb24gYW5kIG5vdCB0aGUgb25lIHdlIGFyZSBsb29raW5nCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZVBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCU11bHRpU3RhdHVzIHRlbXBtdWx0aSA9IG5ldyBNdWx0aVN0YXR1cyhmZWF0dXJlU3RhdHVzLmdldFBsdWdpbigpLCBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTLCBhbWJpZ3VvdXNNU0csIG51bGwpOwotCQkJZmVhdHVyZVBsdWdpbklEID0gZmVhdHVyZVBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCi0JCQlTdHJpbmcgc2luZ2xlVmVyc2lvblJhbmdlID0gJ1snICsgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKS50b1N0cmluZygpICsgJywnICsgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKS50b1N0cmluZygpICsgJ10nOwotCQkJQnVuZGxlW10gYnVuZGxlcyA9IHBrZ0FkbWluLmdldEJ1bmRsZXMoZmVhdHVyZVBsdWdpbklELmdldElkZW50aWZpZXIoKSwgc2luZ2xlVmVyc2lvblJhbmdlKTsKLQkJCWlmIChidW5kbGVzICE9IG51bGwgJiYgYnVuZGxlcy5sZW5ndGggPT0gMSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCQotCQkJLy8gQ2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBmZWF0dXJlIHdpdGggdGhpcyBwbHVnaW4gKGJ1dCBkaWZmZXJlbnQgdmVyc2lvbikKLQkJCS8vIGxvZyBpdAotCQkJYnVuZGxlcyA9IHBrZ0FkbWluLmdldEJ1bmRsZXMoZmVhdHVyZVBsdWdpbklELmdldElkZW50aWZpZXIoKSwgbnVsbCk7Ci0JCQlmb3IgKGludCBqPTA7IGJ1bmRsZXMgIT0gbnVsbCAmJiBqPGJ1bmRsZXMubGVuZ3RoOyBqKysgKSB7Ci0JCQkJU3RyaW5nIGJ1bmRsZVZlcnNpb24gPSAoU3RyaW5nKWJ1bmRsZXNbal0uZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlRm9ySWQobmV3IFZlcnNpb25lZElkZW50aWZpZXIoYnVuZGxlc1tqXS5nZXRTeW1ib2xpY05hbWUoKSwgYnVuZGxlVmVyc2lvbiApKTsKLQkJCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXSB7YnVuZGxlc1tqXS5nZXRTeW1ib2xpY05hbWUoKSwgZmVhdHVyZVBsdWdpbklELmdldFZlcnNpb24oKSwgYnVuZGxlVmVyc2lvbn07Ci0JCQkJCW1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuVHdvVmVyc2lvblNhbWVQbHVnaW4xIiwgdmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCVN0cmluZyBsYWJlbCA9IGZlYXR1cmUuZ2V0TGFiZWwoKTsKLQkJCQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCU9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbXSB7IGJ1bmRsZXNbal0uZ2V0U3ltYm9saWNOYW1lKCksIGZlYXR1cmVQbHVnaW5JRC5nZXRWZXJzaW9uKCksIGJ1bmRsZVZlcnNpb24sIGxhYmVsLCBmZWF0dXJlVmVyc2lvbiB9OwotCQkJCQltc2cgPSBQb2xpY3kuYmluZCgiU2l0ZUxvY2FsLlR3b1ZlcnNpb25TYW1lUGx1Z2luMiIsIHZhbHVlcyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0KLQkJCQlVcGRhdGVDb3JlLndhcm4oIkZvdW5kIGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgc2FtZSBwbHVnaW4gb24gdGhlIHBhdGg6IiArIGJ1bmRsZXNbal0uZ2V0U3ltYm9saWNOYW1lKCkgKyAiICIgKyBidW5kbGVWZXJzaW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGVtcG11bHRpLmFkZChjcmVhdGVTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSUZlYXR1cmUuU1RBVFVTX0FNQklHVU9VUywgbXNnLCBudWxsKSk7Ci0JCQl9Ci0JCi0KLQkJCS8vIGlmIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGV4YWN0IHBsdWdpbiwgYWRkIHRoZSBjaGlsZHJlbgotCQkJLy8gb2YgdGVtcE11bHRpIChpLGUgdGhlIG90aGVyIHdlIGZvdW5kKSAKLQkJCS8vIGlmIHdlIGhhdmUgbm8gY2hpbGRyZW4sIHdlIGhhdmUgYSBwcm9ibGVtIGFzIGEgcmVxdWlyZWQgcGx1Z2luIGlzIG5vdCB0aGVyZSBhdCBhbGwKLQkJCWlmICghZm91bmQpIHsKLQkJCQlpZiAodGVtcG11bHRpLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCQltdWx0aS5hZGRBbGwodGVtcG11bHRpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobXVsdGkuZ2V0Q29kZSgpICE9IElGZWF0dXJlLlNUQVRVU19VTkhBUFBZKSB7Ci0JCQkJCQlTdHJpbmcgdW5oYXBweU1TRyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuRmVhdHVyZVVuSGFwcHkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJTXVsdGlTdGF0dXMgbmV3TXVsdGkgPSBuZXcgTXVsdGlTdGF0dXMoZmVhdHVyZVN0YXR1cy5nZXRQbHVnaW4oKSwgSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFksIHVuaGFwcHlNU0csIG51bGwpOwotCQkJCQkJbmV3TXVsdGkuYWRkQWxsKG11bHRpKTsKLQkJCQkJCW11bHRpID0gbmV3TXVsdGk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKCJTaXRlTG9jYWwuTm9QbHVnaW5WZXJzaW9uIiwgZmVhdHVyZVBsdWdpbklELmdldElkZW50aWZpZXIoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbXVsdGkuYWRkKGNyZWF0ZVN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSwgbXNnLCBudWxsKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFtdWx0aS5pc09LKCkpCi0JCQlyZXR1cm4gbXVsdGk7Ci0KLQkJLy8gd2UgcmV0dXJuIGhhcHB5IGFzIHdlIGNvbnNpZGVyIHRoZSBpc0Jyb2tlbiB2ZXJpZmljYXRpb24gaGFzIGJlZW4gZG9uZQotCQlyZXR1cm4gY3JlYXRlU3RhdHVzKElTdGF0dXMuT0ssIElGZWF0dXJlLlNUQVRVU19IQVBQWSwgaGFwcHlNU0csIG51bGwpOwotCX0KLQkvKgotCSAqIGNyZWF0ZXMgYSBTdGF0dXMKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNTZXZlcml0eSwgaW50IHN0YXR1c0NvZGUsIFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7Ci0JCVN0cmluZyBpZCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1zZyAhPSBudWxsKQotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKG1zZyk7Ci0JCWlmIChlICE9IG51bGwpIHsKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZCgiXHJcblsiKTsgLy8kTk9OLU5MUy0xJAotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKGUudG9TdHJpbmcoKSk7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIl1cclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhzdGF0dXNTZXZlcml0eSwgaWQsIHN0YXR1c0NvZGUsIGNvbXBsZXRlU3RyaW5nLnRvU3RyaW5nKCksIGUpOwotCX0KLQotCi0JLyoKLQkgKiByZXR1cm5zIGFsbCB0aGUgY29uZmlndXJlZCBmZXRhdXJlcwotCSAqLwotCXByaXZhdGUgSUZlYXR1cmVbXSBnZXRBbGxDb25maWd1cmVkRmVhdHVyZXMoKSB7Ci0JCWlmIChhbGxDb25maWd1cmVkRmVhdHVyZXMgPT0gbnVsbCkgewotCi0JCQlhbGxDb25maWd1cmVkRmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBhbGxDb25maWd1cmVkU2l0ZXMgPSBzaXRlTG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxDb25maWd1cmVkU2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBhbGxDb25maWd1cmVkU2l0ZXNbaV0uZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWZlYXR1cmUgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJZmVhdHVyZSA9IHJlZnNbal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkgewotCQkJCQkJYWxsQ29uZmlndXJlZEZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlGZWF0dXJlW10gZmVhdHVyZXMgPSBuZXcgSUZlYXR1cmVbYWxsQ29uZmlndXJlZEZlYXR1cmVzLnNpemUoKV07Ci0JCWlmIChhbGxDb25maWd1cmVkRmVhdHVyZXMuc2l6ZSgpID4gMCkgewotCQkJYWxsQ29uZmlndXJlZEZlYXR1cmVzLnRvQXJyYXkoZmVhdHVyZXMpOwotCQl9Ci0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQkvKgotCSAqIHJldHVybnMgdGhlIEZlYXR1cmUgdGhhdCBkZWNsYXJlcyB0aGlzIHZlcnNpb25lZElkZW50aWZpZXIgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlRm9ySWQoVmVyc2lvbmVkSWRlbnRpZmllciBpZCkgewotCi0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSUZlYXR1cmVbXSBhbGxGZWF0dXJlcyA9IGdldEFsbENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSA9IG51bGw7Ci0JCUlQbHVnaW5FbnRyeVtdIGFsbFBsdWdpbnMgPSBudWxsOwotCQlJUGx1Z2luRW50cnkgY3VycmVudFBsdWdpbiA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCWN1cnJlbnRGZWF0dXJlID0gYWxsRmVhdHVyZXNbaV07Ci0JCQlhbGxQbHVnaW5zID0gY3VycmVudEZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBhbGxQbHVnaW5zLmxlbmd0aDsgaisrKSB7Ci0JCQkJY3VycmVudFBsdWdpbiA9IGFsbFBsdWdpbnNbal07Ci0JCQkJaWYgKGlkLmVxdWFscyhjdXJyZW50UGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQkJCXJldHVybiBjdXJyZW50RmVhdHVyZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVUeXBlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVHlwZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwNjEyOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1NpdGVUeXBlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotDQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgZmluYWwgY2xhc3MgU2l0ZVR5cGVGYWN0b3J5IHsNCi0JDQotDQotCS8qKg0KLQkgKiBleHRlbnNpb24gcG9pbnQgSUQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTVBMRV9FWFRFTlNJT05fSUQgPSAic2l0ZVR5cGVzIjsJIC8vJE5PTi1OTFMtMSQNCi0JDQotDQotCXByaXZhdGUgc3RhdGljIFNpdGVUeXBlRmFjdG9yeSBpbnN0Ow0KLQkNCi0JcHJpdmF0ZSBNYXAgZmFjdG9yaWVzOw0KLQ0KLQkvKioNCi0JICogaGlkZSBjdHIgDQotCSAqLw0KLQlwcml2YXRlIFNpdGVUeXBlRmFjdG9yeSgpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIFNpdGVUeXBlRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsNCi0JCWlmIChpbnN0ID09IG51bGwpDQotCQkJaW5zdCA9IG5ldyBTaXRlVHlwZUZhY3RvcnkoKTsNCi0JCXJldHVybiBpbnN0Ow0KLQl9DQotDQotDQotCS8qKg0KLQkgKiByZXR1cm4gdGhlIGZhY3RvcnkgZm9yIHRoZSB0eXBlDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVGYWN0b3J5IGdldEZhY3RvcnkoU3RyaW5nIHR5cGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCQkvLw0KLQkJCU9iamVjdCBpbnN0YW5jZSA9IGdldEZhY3RvcmllcygpLmdldCh0eXBlKTsNCi0JCQlpZiAoaW5zdGFuY2U9PW51bGwpIHsNCi0JCQkJaW5zdGFuY2UgPSBjcmVhdGVGYWN0b3J5Rm9yKHR5cGUpOw0KLQkJCQlnZXRGYWN0b3JpZXMoKS5wdXQodHlwZSxpbnN0YW5jZSk7DQotCQkJfQ0KLQkJCXJldHVybiAoSVNpdGVGYWN0b3J5KSBpbnN0YW5jZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIElTaXRlRmFjdG9yeSBjcmVhdGVGYWN0b3J5Rm9yKFN0cmluZyB0eXBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlJU2l0ZUZhY3RvcnkgcmVzdWx0ID0gbnVsbDsNCi0JCQ0KLQkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsNCi0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7DQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlZ2lzdHJ5LmdldENvbmZpZ3VyYXRpb25FbGVtZW50c0ZvcihwbHVnaW5JRCxTSU1QTEVfRVhURU5TSU9OX0lELHR5cGUpOw0KLQkJaWYgKGVsZW1lbnRzPT1udWxsIHx8IGVsZW1lbnRzLmxlbmd0aD09MCl7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVUeXBlRmFjdG9yeS5VbmFibGVUb0ZpbmRTaXRlRmFjdG9yeSIsdHlwZSksbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCX0gZWxzZSB7DQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1swXTsNCi0JCQlyZXN1bHQgPSAoSVNpdGVGYWN0b3J5KWVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgYWN0b3JpZXMuDQotCSAqIEByZXR1cm4gUmV0dXJucyBhIE1hcA0KLQkgKi8NCi0JcHJpdmF0ZSBNYXAgZ2V0RmFjdG9yaWVzKCkgew0KLQkJaWYgKGZhY3Rvcmllcz09bnVsbCkgZmFjdG9yaWVzID0gbmV3IEhhc2hNYXAoKTsNCi0JCQlyZXR1cm4gZmFjdG9yaWVzOw0KLQl9DQotDQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTENvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ODVlZTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGNsYXNzIFNpdGVVUkxDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBTaXRlQ29udGVudFByb3ZpZGVyIHsNCi0JDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfVFlQRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5odHRwIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIEhUVFBTaXRlDQotCSAqLw0KLQlwdWJsaWMgU2l0ZVVSTENvbnRlbnRQcm92aWRlcihVUkwgdXJsKSB7DQotCQlzdXBlcih1cmwpOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlQ29udGVudFByb3ZpZGVyI2dldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRBcmNoaXZlUmVmZXJlbmNlKFN0cmluZyBhcmNoaXZlSWQpICB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlVUkwgY29udGVudFVSTCA9IG51bGw7DQotCQkNCi0JCWNvbnRlbnRVUkwgPSBnZXRBcmNoaXZlVVJMZm9yKGFyY2hpdmVJZCk7DQotCQkvLyBpZiB0aGVyZSBpcyBubyBtYXBwaW5nIGluIHRoZSBzaXRlLnhtbA0KLQkJLy8gZm9yIHRoaXMgYXJjaGl2ZUlkLCB1c2UgdGhlIGRlZmF1bHQgb25lDQotCQlpZiAoY29udGVudFVSTD09bnVsbCkgew0KLQkJCXJldHVybiBzdXBlci5nZXRBcmNoaXZlUmVmZXJlbmNlKGFyY2hpdmVJZCk7DQotCQl9DQotCQkNCi0JCXJldHVybiBjb250ZW50VVJMOw0KLQl9DQotDQotCS8qKg0KLQkgKiByZXR1cm4gdGhlIFVSTCBhc3NvY2lhdGVkIHdpdGggdGhlIGlkIG9mIHRlaCBhcmNoaXZlIGZvciB0aGlzIHNpdGUNCi0JICogcmV0dXJuIG51bGwgaWYgdGhlIGFyY2hpdmVJZCBpcyBudWxsLCBlbXB0eSBvciANCi0JICogaWYgdGVoIGxpc3Qgb2YgYXJjaGl2ZXMgb24gdGhlIHNpdGUgaXMgbnVsbCBvciBlbXB0eQ0KLQkgKiBvZiBpZiB0aGVyZSBpcyBubyBVUkwgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmNoaXZlSUQgZm9yIHRoaXMgc2l0ZQ0KLQkgKi8NCi0JcHJpdmF0ZSBVUkwgZ2V0QXJjaGl2ZVVSTGZvcihTdHJpbmcgYXJjaGl2ZUlkKSB7DQotCQlVUkwgcmVzdWx0ID0gbnVsbDsNCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0NCi0JCUlBcmNoaXZlUmVmZXJlbmNlW10gc2l0ZUFyY2hpdmVzID0gZ2V0U2l0ZSgpLmdldEFyY2hpdmVzKCk7DQotCQlpZiAoc2l0ZUFyY2hpdmVzLmxlbmd0aCA+IDApIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVBcmNoaXZlcy5sZW5ndGggJiYgIWZvdW5kOyBpKyspIHsNCi0JCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpDQotCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJHZXRBcmNoaXZlVVJMIGZvcjoiK2FyY2hpdmVJZCsiIGNvbXBhcmUgdG8gIitzaXRlQXJjaGl2ZXNbaV0uZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCWlmIChhcmNoaXZlSWQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2Uoc2l0ZUFyY2hpdmVzW2ldLmdldFBhdGgoKSkpIHsNCi0JCQkJCXJlc3VsdCA9IHNpdGVBcmNoaXZlc1tpXS5nZXRVUkwoKTsNCi0JCQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQ0KLQ0KLQl9DQotDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9TaXRlVVJMRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWVjYmZkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvU2l0ZVVSTEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBTaXRlVVJMRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSBpbXBsZW1lbnRzIElTaXRlRmFjdG9yeUV4dGVuc2lvbiB7DQotCQ0KLQkvKg0KLQkgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4NCi0JICovDQotCXB1YmxpYyBJU2l0ZSBjcmVhdGVTaXRlKFVSTCB1cmwpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGNyZWF0ZVNpdGUodXJsLCBudWxsKTsNCi0JfQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCwgYm9vbGVhbikNCi0JICogDQotCSAqIHRoZSBVUkwgY2FuIGJlIG9mIHRoZSBmb2xsb3dpbmcgZm9ybQ0KLQkgKiAxIHByb3RvY29sOi8vLi4uLi4vDQotCSAqIDIgcHJvdG9jb2w6Ly8uLi4uLg0KLQkgKiAzIHByb3RvY29sOi8vLi4uLi9zaXRlLnhtbA0KLQkgKiANCi0JICogMSBJZiB0aGUgZmlsZSBvZiB0aGUgZmlsZSBvZiB0ZWggdXJsIGVuZHMgd2l0aCAnLycsIGF0dGVtcHQgdG8gb3BlbiB0aGUgc3RyZWFtLg0KLQkgKiBpZiBpdCBmYWlscywgYWRkIHNpdGUueG1sIGFuZCBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQ0KLQkgKiANCi0JICogMiBhdHRlbXB0IHRvIG9wZW4gdGhlIHN0cmVhbQ0KLQkgKiAJZmFpbA0KLQkgKiAJCWFkZCAnL3NpdGUueG1sJyBhbmQgYXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0NCi0JICogCXN1Y2Vzcw0KLQkgKiAJCWF0dGVtcHQgdG8gcGFyc2UsIGlmIGl0IGZhaWxzLCBhZGQgJy9zaXRlLnhtbCcgYW5kIGF0dGVtcHQgdG8gb3BlbiB0ZWggc3RyZWFtDQotCSAqIA0KLQkgKiAzIG9wZW4gdGhlIHN0cmVhbQkgDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQkJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOw0KLQkNCi0JCXRyeSB7DQotCQkJU2l0ZVVSTENvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgU2l0ZVVSTENvbnRlbnRQcm92aWRlcih1cmwpOw0KLQkNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOw0KLQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQocmVzb2x2ZWRVUkwpOw0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5jaGVja0Nvbm5lY3Rpb25SZXN1bHQocmVzcG9uc2UsIHJlc29sdmVkVVJMKTsNCi0JCQlzaXRlU3RyZWFtID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0obW9uaXRvcik7DQotCQkJLy8gdGhlIHN0cmVhbSBjYW4gYmUgbnVsbCBpZiB0aGUgdXNlciBjYW5jZWxzIHRoZSBjb25uZWN0aW9uDQotCQkJaWYgKHNpdGVTdHJlYW09PW51bGwpIHJldHVybiBudWxsOw0KLQ0KLQkJCVNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSA9IHRoaXM7DQotCQkJc2l0ZSA9IChTaXRlKSBmYWN0b3J5LnBhcnNlU2l0ZShzaXRlU3RyZWFtKTsNCi0JDQotCQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7DQotCQkJY29udGVudFByb3ZpZGVyLnNldFNpdGUoc2l0ZSk7DQotCQkJc2l0ZS5yZXNvbHZlKHVybCwgdXJsKTsNCi0JCQlzaXRlLm1hcmtSZWFkT25seSgpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU2l0ZVVSTEZhY3RvcnkuVW5hYmxlVG9DcmVhdGVVUkwiLCB1cmwgPT0gbnVsbCA/ICIiIDogdXJsLnRvRXh0ZXJuYWxGb3JtKCkpLCBlKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlNpdGVVUkxGYWN0b3J5LlVuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbSIsIHVybCA9PSBudWxsID8gIiIgOiB1cmwudG9FeHRlcm5hbEZvcm0oKSksIElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAoc2l0ZVN0cmVhbSAhPSBudWxsKSB7DQotCQkJCXRyeSB7DQotCQkJCQlzaXRlU3RyZWFtLmNsb3NlKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNhblBhcnNlU2l0ZVR5cGUoU3RyaW5nIHR5cGUpIHsNCi0JCXJldHVybiAoc3VwZXIuY2FuUGFyc2VTaXRlVHlwZSh0eXBlKSB8fCBTaXRlVVJMQ29udGVudFByb3ZpZGVyLlNJVEVfVFlQRS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1RhcmdldEZlYXR1cmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVGFyZ2V0RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk3MjUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVGFyZ2V0RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFyZ2V0RmVhdHVyZSBleHRlbmRzIEZlYXR1cmUgewotCi0KLQkvKioKLQkgKiBUaGUgY29udGVudCBjb25zdW1lciBvZiB0aGUgRGVmYXVsdEZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcjsKLQkKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBUYXJnZXRGZWF0dXJlLgotCSAqLwotCXB1YmxpYyBUYXJnZXRGZWF0dXJlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbnRlbnQgQ29uc3VtZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50Q29uc3VtZXIoSUZlYXR1cmVDb250ZW50Q29uc3VtZXIgY29udGVudENvbnN1bWVyKSB7Ci0JCXRoaXMuY29udGVudENvbnN1bWVyID0gY29udGVudENvbnN1bWVyOwotCQljb250ZW50Q29uc3VtZXIuc2V0RmVhdHVyZSh0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRDb25zdW1lcigpCi0JICovCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmNvbnRlbnRDb25zdW1lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbiggUG9saWN5LmJpbmQoIkZlYXR1cmUuTm9GZWF0dXJlQ29udGVudENvbnN1bWVyIiwgZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNvbnRlbnRDb25zdW1lcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMRW5jb2Rlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxFbmNvZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YWU2NzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VUkxFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotDQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotLyoqDQotICogRW5jb2RlcyBhIDxjb2RlPlVSTDwvY29kZT4gaW50byBhbiA8Y29kZT5BU0NJSTwvY29kZT4gcmVhZGFibGUNCi0gKiA8Y29kZT5VUkw8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0LiBFbmNvZGVkDQotICogPGNvZGU+VVJMPC9jb2RlPnMgY2FuIGJlIGRlY29kZWQgdXNpbmcgdGhlIDxjb2RlPlVSTERlY29kZXI8L2NvZGU+Lg0KLSAqDQotICogQHNlZSBVUkxEZWNvZGVyDQotICovDQotcHVibGljIGZpbmFsIGNsYXNzIFVSTEVuY29kZXIgew0KLQkvKioNCi0JICogUHJldmVudHMgaW5zdGFuY2VzIGZyb20gYmVpbmcgY3JlYXRlZC4NCi0JICovDQotCXByaXZhdGUgVVJMRW5jb2RlcigpIHsNCi0JfQ0KLQkvKioNCi0JICogRW5jb2RlcyB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmVmZXJlbmNlIHBhcnRzIG9mIGEgPGNvZGU+VVJMPC9jb2RlPiBpbnRvDQotCSAqIGFuIDxjb2RlPkFTQ0lJPC9jb2RlPiByZWFkYWJsZSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3INCi0JICogdHJhbnNwb3J0LiBSZXR1cm5zIHRoZSByZXN1bHQuDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBlbmNvZGluZyB0aGUgZ2l2ZW4gZmlsZSBhbmQgcmVmZXJlbmNlIHBhcnRzIG9mDQotCSAqICAgICAgICAgYSA8Y29kZT5VUkw8L2NvZGU+IGludG8gYW4gPGNvZGU+QVNDSUk8L2NvZGU+IHJlYWRhYmxlDQotCSAqICAgICAgICAgPGNvZGU+U3RyaW5nPC9jb2RlPiB0aGF0IGlzIHNhZmUgZm9yIHRyYW5zcG9ydA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlKFN0cmluZyBmaWxlLCBTdHJpbmcgcXVlcnksIFN0cmluZyByZWYpIHsNCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihmaWxlLCAiLyIsIHRydWUpOyAvLyROT04tTkxTLTEkDQotDQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgew0KLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsNCi0JCQlpZiAodG9rZW4uZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlidWYuYXBwZW5kKHRva2VuKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlidWYuYXBwZW5kKGVuY29kZVNlZ21lbnQodG9rZW4pKTsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAocXVlcnkgIT0gbnVsbCl7DQotCQkJYnVmLmFwcGVuZCgnPycpOw0KLQkJCWJ1Zi5hcHBlbmQocXVlcnkpOw0KLQkJfQ0KLQ0KLQkJaWYgKHJlZiAhPSBudWxsKSB7DQotCQkJYnVmLmFwcGVuZCgnIycpOw0KLQkJCWJ1Zi5hcHBlbmQoZW5jb2RlU2VnbWVudChyZWYpKTsNCi0JCX0NCi0NCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsNCi0JfQ0KLQkvKioNCi0JICogRW5jb2RlcyB0aGUgZ2l2ZW4gPGNvZGU+VVJMPC9jb2RlPiBpbnRvIGFuIDxjb2RlPkFTQ0lJPC9jb2RlPg0KLQkgKiByZWFkYWJsZSA8Y29kZT5VUkw8L2NvZGU+IHRoYXQgaXMgc2FmZSBmb3IgdHJhbnNwb3J0LiBSZXR1cm5zIHRoZQ0KLQkgKiByZXN1bHQuDQotCSAqDQotCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBlbmNvZGluZyB0aGUgZ2l2ZW4gPGNvZGU+VVJMPC9jb2RlPiBpbnRvIGFuDQotCSAqICAgICAgICAgPGNvZGU+QVNDSUk8L2NvZGU+IHJlYWRhYmxlIDxjb2RlPlVSTDwvY29kZT4gdGhhdCBpcyBzYWZlIGZvcg0KLQkgKiAgICAgICAgIHRyYW5zcG9ydA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBVUkwgZW5jb2RlKFVSTCB1cmwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJLy8gZW5jb2RlIHRoZSBwYXRoIG5vdCB0aGUgZmlsZSBhcyB0aGUgVVJMIG1heSBjb250YWluIGEgcXVlcnkNCi0JCVN0cmluZyBmaWxlID0gdXJsLmdldFBhdGgoKTsNCi0JCVN0cmluZyBxdWVyeSA9IHVybC5nZXRRdWVyeSgpOw0KLQkJU3RyaW5nIHJlZiA9IHVybC5nZXRSZWYoKTsNCi0NCi0JCVVSTCByZXN1bHQgPSAgbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgZW5jb2RlKGZpbGUsIHF1ZXJ5LCByZWYpKTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVuY29kZVNlZ21lbnQoU3RyaW5nIHNlZ21lbnQpIHsNCi0JCQ0KLQkJLy8gaWYgd2UgZmluZCBhICclJyBpbiB0aGUgc3RyaW5nLCBjb25zaWRlciB0aGUgVVJMIHRvIGJlIGFscmVhZHkgZW5jb2RlZA0KLQkJaWYgKHNlZ21lbnQuaW5kZXhPZignJScpIT0tMSkgcmV0dXJuIHNlZ21lbnQ7DQotCQkNCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHNlZ21lbnQubGVuZ3RoKCkpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50Lmxlbmd0aCgpOyArK2kpIHsNCi0JCQljaGFyIGMgPSBzZWdtZW50LmNoYXJBdChpKTsNCi0JCQlpZiAobXVzdEVuY29kZShjKSkgew0KLQkJCQlieXRlW10gYnl0ZXMgPSBudWxsOw0KLQkJCQl0cnkgew0KLQkJCQkJYnl0ZXMgPSBuZXcgQ2hhcmFjdGVyKGMpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURjgiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsNCi0JCQkJCUFzc2VydC5pc1RydWUoZmFsc2UsIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCQkJfQ0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgKytqKSB7DQotCQkJCQlyZXN1bHQuYXBwZW5kKCclJyk7DQotCQkJCQlyZXN1bHQuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoKGJ5dGVzW2pdID4+IDQpICYgMHgwRikpOw0KLQkJCQkJcmVzdWx0LmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGJ5dGVzW2pdICYgMHgwRikpOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJcmVzdWx0LmFwcGVuZChjKTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7DQotCX0NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtdXN0RW5jb2RlKGNoYXIgYykgew0KLQkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQ0KLQkJaWYgKGMgPj0gJ1wnJyAmJiBjIDw9ICcuJykgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCWlmIChjID09ICchJyB8fCBjID09ICckJyB8fCBjID09ICdfJykgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCS8vIG5lZWRlZCBvdGhlcndpc2UgZmlsZTovLy9jOi9maWxlLyBiZWNvbWVzIGZpbGU6Ly8vQyUzYS9maWxlLw0KLQkJaWYgKGMgPT0nOicpew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMS2V5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEtleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjFkOWI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOwotIAotaW1wb3J0IGphdmEubmV0Lio7Ci0KLQotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxLZXkgewotCi0JcHJpdmF0ZSBVUkwgdXJsOwotCQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBVUkxLZXkuCi0JICovCi0JcHVibGljIFVSTEtleShVUkwgdXJsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzID09IG9iaikgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgVVJMS2V5KSB7Ci0JCQkJcmV0dXJuIGVxdWFscygoKFVSTEtleSkgb2JqKS5nZXRVUkwoKSk7Ci0JCQl9Ci0KLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFVSTCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCVVSTCB1cmwyID0gKFVSTClvYmo7Ci0JCQlpZiAodXJsID09IHVybDIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKHVybCx1cmwyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB1cmwuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1cmwuCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlQ29yZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMWM1ODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVDb3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUNvcmUgZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gZGVidWcgb3B0aW9ucwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRzsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19JTlNUQUxMOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1BBUlNJTkc7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfV0FSTklOR1M7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX1NIT1dfQ09ORklHVVJBVElPTjsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19UWVBFOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19TSE9XX1dFQjsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19JSEFORExFUjsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfU0hPV19SRUNPTkNJTEVSOwotCi0JLy8gcHJlZmVyZW5jZSBrZXlzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hJU1RPUllfU0laRSA9IFBSRUZJWCArICIuaGlzdG9yeVNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9DSEVDS19TSUdOQVRVUkUgPSBQUkVGSVggKyAiLmNoZWNrU2lnbmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVVBEQVRFX1ZFUlNJT05TID0gUFJFRklYICsgIi51cGRhdGVWZXJzaW9ucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUVVJVkFMRU5UX1ZBTFVFID0gImVxdWl2YWxlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUEFUSUJMRV9WQUxVRSA9ICJjb21wYXRpYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfSElTVE9SWSA9IDEwMDsvL0ludGVnZXIuTUFYX1ZBTFVFOwotCQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVDb3JlIHBsdWdpbjsKLQotCS8vbG9nCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlTWFuYWdlckxvZ1dyaXRlciBsb2c7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19GSUxFPSJpbnN0YWxsLmxvZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvL0Nvbm5lY3Rpb24gbWFuYWdlcgotCXByaXZhdGUgQ29ubmVjdGlvblRocmVhZE1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX1BST1hZX0hPU1QgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucHJveHkuaG9zdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX1BST1hZX1BPUlQgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucHJveHkucG9ydCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVFRQX1BST1hZX0VOQUJMRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wcm94eS5lbmFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBidW5kbGUgZGF0YQotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgcGtnQWRtaW5UcmFja2VyOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVXBkYXRlQ29yZSgpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0JCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGRhdGVDb3JlIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFuYWdlciB0aGF0IG1hbmFnZXMgVVJMIGNvbm5lY3Rpb24gdGhyZWFkcy4KLQkgKi8KLQlwdWJsaWMgQ29ubmVjdGlvblRocmVhZE1hbmFnZXIgZ2V0Q29ubmVjdGlvbk1hbmFnZXIoKSB7Ci0JCWlmIChjb25uZWN0aW9uTWFuYWdlcj09bnVsbCkKLQkJCWNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IENvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyKCk7Ci0JCXJldHVybiBjb25uZWN0aW9uTWFuYWdlcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBmbGFnLCBib29sZWFuIGRmbHQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKGZsYWcpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gZGZsdDsKLQkJZWxzZQotCQkJcmV0dXJuIHJlc3VsdC50cmltKCkuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogZHVtcHMgYSBTdHJpbmcgaW4gdGhlIHRyYWNlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1ZmZlciBtc2cgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCW1zZy5hcHBlbmQoZ2V0UGx1Z2luKCkudG9TdHJpbmcoKSk7Ci0JCW1zZy5hcHBlbmQoIl4iKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpKSk7Ci0JCW1zZy5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQltc2cuYXBwZW5kKHMpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkvKioKLQkgKiBEdW1wcyBhIFN0cmluZyBpbiB0aGUgbG9nIGlmIFdBUk5JTkcgaXMgc2V0IHRvIHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgcykgewotCQlpZiAoREVCVUcgJiYgREVCVUdfU0hPV19XQVJOSU5HUykgewotCQkJaWYgKHMhPW51bGwpewotCQkJCXM9IldBUk5JTkc6ICIrczsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbG9nKHMsIG51bGwpOyAKLQkJfQotCX0KLQotCS8qKgotCSAqIER1bXBzIGFuIGV4Y2VwdGlvbiBpbiB0aGUgbG9nIGlmIFdBUk5JTkcgaXMgc2V0IHRvIHRydWUKLQkgKiAKLQkgKiBAcGFyYW0gcyBsb2cgc3RyaW5nCi0JICogQHBhcmFtIGUgZXhjZXB0aW9uIHRvIGJlIGxvZ2dlZAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgd2FybihTdHJpbmcgcywgVGhyb3dhYmxlIGUpIHsKLQkJaWYgKERFQlVHICYmIERFQlVHX1NIT1dfV0FSTklOR1MpewotCQkJaWYgKHMhPW51bGwpewotCQkJCXM9IlVQREFURSBNQU5BR0VSIElORk86ICIrczsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJbG9nKHMsZSk7Ci0JCX0KLQl9Ci0JCQkKLQkvKioKLQkgKiBMb2dzIGEgc3RhdHVzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cyl7Ci0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7CQkKLQl9Ci0JCi0JLyoqCi0JICogTG9ncyBhbiBlcnJvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGUpewkJCi0JCWxvZygiIixlKTsgLy8kTk9OLU5MUy0xJAotCX0JCi0JCi0JLyoqCi0JICogTG9ncyBhIHN0cmluZyBhbmQgYW4gIGVycm9yCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgZSl7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSAKLQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbillKS5nZXRTdGF0dXMoKTsKLQkJZWxzZSAKLQkJCXN0YXR1cyA9IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKG1zZyxlKS5nZXRTdGF0dXMoKTsJCQotCQlpZiAoc3RhdHVzIT1udWxsKQotCQkJbG9nKHN0YXR1cyk7Ci0JfQkJCi0JLyoKLQkgKiBNZXRob2QgbG9nLgotCSAqIEBwYXJhbSBuZXdDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlndXJhdGlvbikgewotCQlpZiAobG9nIT1udWxsKQotCQkJbG9nLmxvZyhuZXdDb25maWd1cmF0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIEdldCB1cGRhdGUgbG9nIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldEluc3RhbGxMb2dGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwkJCi0JCVVSTCBjb25maWd1cmF0aW9uTG9jYXRpb24gPSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCk7Ci0JCWlmIChjb25maWd1cmF0aW9uTG9jYXRpb249PW51bGwpewotCQkJd2FybigiVW5hYmxlIHRvIHJldHJpZXZlIGxvY2F0aW9uIGZvciB1cGRhdGUgbWFuYWdlciBsb2cgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotLy8JCVVSTCBjb25maWdMb2NhdGlvbiA9IFBsYXRmb3JtLnJlc29sdmUoY29uZmlndXJhdGlvbkxvY2F0aW9uKTsKLQkJRmlsZSB1cGRhdGVTdGF0ZUxvY2F0aW9uID0gbnVsbDsKLQotCQlpZiAoImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UoY29uZmlndXJhdGlvbkxvY2F0aW9uLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbi5nZXRGaWxlKCkpOwotCQkJdXBkYXRlU3RhdGVMb2NhdGlvbiA9IG5ldyBGaWxlKHBhdGguZ2V0UGFyZW50RmlsZSgpLCBMT0dfRklMRSk7Ci0JCX0KLQkJcmV0dXJuIHVwZGF0ZVN0YXRlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgdGhlIEdFVCByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgYW5kIHJldHVybnMgdGhlIHNlcnZlcidzCi0JICogcmVzcG9uc2UuCi0JICoKLQkgKiBAcGFyYW0gdXJsIHRoZSBVUkwgdG8gb3BlbiBvbiB0aGUgc2VydmVyCi0JICogQHJldHVybiB0aGUgc2VydmVyJ3MgcmVzcG9uc2UKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSBjbGllbnQgaXMgY2xvc2VkLgotCSAqIDxsaT5UaGUgY2xpZW50IGNvdWxkIG5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2ZXIKLQkgKiA8bGk+QW4gSS9PIGVycm9yIG9jY3VycyB3aGlsZSBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlcgotCSAqIDx1bD4KLQkgKi8KLQlwdWJsaWMgUmVzcG9uc2UgZ2V0KFVSTCB1cmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vUmVxdWVzdCByZXF1ZXN0ID0gbnVsbDsKLQkJUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOwotCQkKLQkJaWYgKCJmaWxlIi5lcXVhbHModXJsLmdldFByb3RvY29sKCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3BvbnNlID0gbmV3IEZpbGVSZXNwb25zZSh1cmwpOwotCQl9IGVsc2UgaWYgKHVybCAhPSBudWxsICYmIHVybC5nZXRQcm90b2NvbCgpLnN0YXJ0c1dpdGgoImh0dHAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXNwb25zZSA9IG5ldyBIdHRwUmVzcG9uc2UodXJsKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3BvbnNlID0gbmV3IE90aGVyUmVzcG9uc2UodXJsKTsKLQkJfQotCQkKLQkJLyplbHNlIHsKLQkJCXRyeSB7Ci0JCQkJcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCJHRVQiLCB1cmwsIG51bGwpOwotCQkJCXJlc3BvbnNlID0gY2xpZW50Lmludm9rZShyZXF1ZXN0KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVxdWVzdC5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ki8KLQkJcmV0dXJuIHJlc3BvbnNlOwotCX0KLQkKLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmVhdHVyZSBpcyBhIHBhdGNoCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGF0Y2goSUZlYXR1cmUgY2FuZGlkYXRlKSB7Ci0JCUlJbXBvcnRbXSBpbXBvcnRzID0gY2FuZGlkYXRlLmdldEltcG9ydHMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbaV07Ci0JCQlpZiAoaWltcG9ydC5pc1BhdGNoKCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCi0JCVBvbGljeS5sb2NhbGl6ZSgib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUubWVzc2FnZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoREVCVUcpIHsKLQkJCURFQlVHX1NIT1dfV0FSTklOR1MgPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dhcm5pbmciLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCURFQlVHX1NIT1dfUEFSU0lORyA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcGFyc2luZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19JTlNUQUxMID0gZ2V0Qm9vbGVhbkRlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS9kZWJ1Zy9pbnN0YWxsIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQlERUJVR19TSE9XX0NPTkZJR1VSQVRJT04gPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL2NvbmZpZ3VyYXRpb24iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCURFQlVHX1NIT1dfVFlQRSA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvdHlwZSIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19XRUIgPSBnZXRCb29sZWFuRGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL2RlYnVnL3dlYiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJREVCVUdfU0hPV19JSEFORExFUiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvaW5zdGFsbGhhbmRsZXIiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCURFQlVHX1NIT1dfUkVDT05DSUxFUiA9IGdldEJvb2xlYW5EZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvZGVidWcvcmVjb25jaWxlciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQkvLwotCQl0cnkgewotCQkJRmlsZSBsb2dGaWxlID0gZ2V0SW5zdGFsbExvZ0ZpbGUoKTsKLQkJCWlmIChsb2dGaWxlIT1udWxsKQotCQkJCWxvZyA9IG5ldyBVcGRhdGVNYW5hZ2VyTG9nV3JpdGVyKGxvZ0ZpbGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXsKLQkJCXdhcm4oIiIsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJU2l0ZU1hbmFnZXIuc2V0SHR0cFByb3h5SW5mbygKLQkJCWdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihIVFRQX1BST1hZX0VOQUJMRSksCi0JCQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhIVFRQX1BST1hZX0hPU1QpLAotCQkJZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSFRUUF9QUk9YWV9QT1JUKSk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCQotCQlKYXJDb250ZW50UmVmZXJlbmNlLnNodXRkb3duKCk7IC8vIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGxlYXZpbmcgamFycyBvcGVuCi0JCVV0aWxpdGllcy5zaHV0ZG93bigpOyAvLyBjbGVhbnVwIHRlbXAgYXJlYQotCQlpZiAobG9nIT1udWxsKQotCQkJbG9nLnNodXRkb3duKCk7Ci0JCWlmIChjb25uZWN0aW9uTWFuYWdlciE9bnVsbCkKLQkJCWNvbm5lY3Rpb25NYW5hZ2VyLnNodXRkb3duKCk7Ci0JCQotCQl0aGlzLmNvbnRleHQgPSBudWxsOwotCQlpZiAocGtnQWRtaW5UcmFja2VyICE9IG51bGwpIHsKLQkJCXBrZ0FkbWluVHJhY2tlci5jbG9zZSgpOwotCQkJcGtnQWRtaW5UcmFja2VyID0gbnVsbDsKLQkJfQotCX0KLQkKLQlCdW5kbGVDb250ZXh0IGdldEJ1bmRsZUNvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQkKLQlQYWNrYWdlQWRtaW4gZ2V0UGFja2FnZUFkbWluKCkgewotCQlpZiAocGtnQWRtaW5UcmFja2VyID09IG51bGwpIHsKLQkJCXBrZ0FkbWluVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihjb250ZXh0LCBQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCXBrZ0FkbWluVHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJcmV0dXJuIChQYWNrYWdlQWRtaW4pcGtnQWRtaW5UcmFja2VyLmdldFNlcnZpY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJMb2dXcml0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckxvZ1dyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRiNjYyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckxvZ1dyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLQotCi0vKioKLSAqIEEgbG9nIHdyaXRlciB0aGF0IHdyaXRlcyB1cGRhdGUgbWFuYWdlciBsb2cgZW50cmllcy4gIAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlckxvZ1dyaXRlciB7Ci0JcHJpdmF0ZSBGaWxlIGxvZ0ZpbGUgPSBudWxsOwotCXByaXZhdGUgV3JpdGVyIGxvZyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVElPTiA9ICIhQ09ORklHVVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSVZJVFkgPSAiIUFDVElWSVRZIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQ0NFU1MgPSAic3VjY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFJTFVSRSA9ICJmYWlsdXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfSU5TVEFMTCA9ICJmZWF0dXJlLWluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfUkVNT1ZFID0gImZlYXR1cmUtcmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX0lOU1RBTEwgPSAic2l0ZS1pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFX1JFTU9WRSA9ICJzaXRlLXJlbW92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5DT05GSUdVUkUgPSAiZmVhdHVyZS1kaXNhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkUgPSAiZmVhdHVyZS1lbmFibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFVkVSVCA9ICJyZXZlcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09OQ0lMSUFUSU9OID0gInJlY29uY2lsaWF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVTRVJWRUQgPSAicHJlc2VydmUtY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV04gPSAidW5rbm93biI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9TRVBBUkFUT1I7Ci0KLQlzdGF0aWMgewotCQlTdHJpbmcgcyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlMSU5FX1NFUEFSQVRPUiA9IHMgPT0gbnVsbCA/ICJcbiIgOiBzOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgVXBkYXRlTWFuYWdlckxvZ1dyaXRlcihGaWxlIGZpbGUpIHsKLQkJdGhpcy5sb2dGaWxlID0gZmlsZTsKLQkJVXBkYXRlQ29yZS53YXJuKCJVUERBVEUgTUFOQUdFUiBMT0cgTG9jYXRpb246ICIrZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgcHJpbWUgaXQgd2l0aCB0aGUgc2l0ZXMgaW4gdGhlIGV4aXNpdGluZyBjb25maWcKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJaW5pdExvZygpOwotCX0KLQkKLQkvKgotCSAqIEluaXRpYWxpemVzIHRoZSBsb2cgd2l0aCB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0TG9nKCkgewotCQl0cnkgewotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5W10gc2l0ZXMgPSBydW50aW1lQ29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJQ29uZmlndXJhdGlvbkFjdGl2aXR5W10gYWN0aXZpdGllcyA9IG5ldyBDb25maWd1cmF0aW9uQWN0aXZpdHlbc2l0ZXMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWFjdGl2aXRpZXNbaV0gPSBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5KElBY3Rpdml0eS5BQ1RJT05fU0lURV9JTlNUQUxMKTsKLQkJCQlhY3Rpdml0aWVzW2ldLnNldExhYmVsKFBsYXRmb3JtLmFzTG9jYWxVUkwoc2l0ZXNbaV0uZ2V0VVJMKCkpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCWFjdGl2aXRpZXNbaV0uc2V0RGF0ZShuZXcgRGF0ZSgpKTsKLQkJCQlhY3Rpdml0aWVzW2ldLnNldFN0YXR1cyhJQWN0aXZpdHkuU1RBVFVTX09LKTsKLQkJCX0KLQkJCURhdGUgZGF0ZSA9IG5ldyBEYXRlKHJ1bnRpbWVDb25maWcuZ2V0Q2hhbmdlU3RhbXAoKSk7Ci0JCQlzYWZlV3JpdGVDb25maWd1cmF0aW9uKGRhdGUsIGFjdGl2aXRpZXMpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gc2lsZW50bHkgaWdub3JlIGVycm9ycwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VMb2dGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChsb2cgIT0gbnVsbCkgewotCQkJCWxvZy5mbHVzaCgpOwotCQkJCWxvZy5jbG9zZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbG9nID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGxvZyhJSW5zdGFsbENvbmZpZ3VyYXRpb24gaW5zdGFsbENvbmZpZykgewotCQlzYWZlV3JpdGVDb25maWd1cmF0aW9uKGluc3RhbGxDb25maWcuZ2V0Q3JlYXRpb25EYXRlKCksIGluc3RhbGxDb25maWcuZ2V0QWN0aXZpdGllcygpKTsKLQl9Ci0JCi0JCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3BlbkxvZ0ZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQlsb2cgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShsb2dGaWxlLmdldEFic29sdXRlUGF0aCgpLCB0cnVlKSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoZXJlIHdhcyBhIHByb2JsZW0gb3BlbmluZyB0aGUgbG9nIGZpbGUgc28gbG9nIHRvIHRoZSBjb25zb2xlCi0JCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7Ci0JCX0KLQl9Ci0JCi0gICAgLyoKLSAgICAgKiAKLSAgICAgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGb3JtYXR0ZWREYXRlKERhdGUgZGF0ZSkgewotCQl0cnkgewotCQkJRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiTU1NIGRkLCB5eXl5IGtrOm1tOnNzLlNTIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmb3JtYXR0ZXIuZm9ybWF0KGRhdGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gSWYgdGhlcmUgd2VyZSBwcm9ibGVtcyB3cml0aW5nIG91dCB0aGUgZGF0ZSwgaWdub3JlIGFuZAotCQkJLy8gY29udGludWUgc2luY2UgdGhhdCBzaG91bGRuJ3Qgc3RvcCB1cyBmcm9tIGxvc2luZyB0aGUgcmVzdAotCQkJLy8gb2YgdGhlIGluZm9ybWF0aW9uCi0JCX0KLQkJcmV0dXJuIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgV3JpdGVyIGxvZ0ZvclN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0KSk7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoKLQkgKiBTaHV0cyBkb3duIHRoZSB1cGRhdGUgbWFuYWdlciBsb2cuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNodXRkb3duKCkgewotCQl0cnkgewotCQkJaWYgKGxvZ0ZpbGUgIT0gbnVsbCkgewotCQkJCWNsb3NlTG9nRmlsZSgpOwotCQkJCWxvZ0ZpbGUgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobG9nICE9IG51bGwpIHsKLQkJCQkJV3JpdGVyIG9sZCA9IGxvZzsKLQkJCQkJbG9nID0gbnVsbDsKLQkJCQkJb2xkLmZsdXNoKCk7Ci0JCQkJCW9sZC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy93ZSd2ZSBzaHV0ZG93biB0aGUgbG9nLCBzbyBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyEKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2FmZVdyaXRlQ29uZmlndXJhdGlvbihEYXRlIGRhdGUsIElBY3Rpdml0eVtdIGFjdGl2aXRpZXMpIHsKLQkJLy8gdGhyZWFkIHNhZmV0eTogKENvbmN1cnJlbmN5MDAzKQotCQlpZiAobG9nRmlsZSAhPSBudWxsKQotCQkJb3BlbkxvZ0ZpbGUoKTsKLQkJaWYgKGxvZyA9PSBudWxsKQotCQkJbG9nID0gbG9nRm9yU3RyZWFtKFN5c3RlbS5lcnIpOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQl3cml0ZShkYXRlLCBhY3Rpdml0aWVzKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGxvZ0ZpbGUgIT0gbnVsbCkKLQkJCQkJY2xvc2VMb2dGaWxlKCk7Ci0JCQkJZWxzZQotCQkJCQlsb2cuZmx1c2goKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgdG8gdGhlIHVwZGF0ZSBtYW5hZ2VyIGxvZzoiKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkxvZ2dpbmcgdG8gdGhlIGNvbnNvbGUgaW5zdGVhZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJLy93ZSBmYWlsZWQgdG8gd3JpdGUsIHNvIGR1bXAgbG9nIGVudHJ5IHRvIGNvbnNvbGUgaW5zdGVhZAotCQkJdHJ5IHsKLQkJCQlsb2cgPSBsb2dGb3JTdHJlYW0oU3lzdGVtLmVycik7Ci0JCQkJd3JpdGUoZGF0ZSwgYWN0aXZpdGllcyk7Ci0JCQkJbG9nLmZsdXNoKCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZTIpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkFuIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBsb2dnaW5nIHRvIHRoZSBjb25zb2xlOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZTIucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJbG9nID0gbnVsbDsKLQkJfQotCX0KLQkKLQotCS8qCi0JICogIUNPTkZJR1VSQVRJT04gPGxhYmVsPgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZShEYXRlIGRhdGUsIElBY3Rpdml0eVtdIGFjdGl2aXRpZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdyaXRlbG4oKTsKLQkJd3JpdGUoQ09ORklHVVJBVElPTik7Ci0JCXdyaXRlU3BhY2UoKTsJCi0JCXdyaXRlKFN0cmluZy52YWx1ZU9mKGRhdGUuZ2V0VGltZSgpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoZGF0ZS50b1N0cmluZygpKTsKLQkJd3JpdGVsbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGl2aXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlKGFjdGl2aXRpZXNbaV0pOwotCQl9CQkJCQotCX0KLQotCS8qCi0JICogIUFDVElWSVRZIDxkYXRlPiA8dGFyZ2V0PiA8YWN0aW9uPiA8c3RhdHVzPgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZShJQWN0aXZpdHkgYWN0aXZpdHkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXdyaXRlKEFDVElWSVRZKTsKLQkJd3JpdGVTcGFjZSgpOwkKLQkJd3JpdGUoU3RyaW5nLnZhbHVlT2YoYWN0aXZpdHkuZ2V0RGF0ZSgpLmdldFRpbWUoKSkpOwotCQl3cml0ZVNwYWNlKCk7Ci0JCXdyaXRlKGdldEZvcm1hdHRlZERhdGUoYWN0aXZpdHkuZ2V0RGF0ZSgpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoYWN0aXZpdHkuZ2V0TGFiZWwoKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoZ2V0QWN0aW9uKGFjdGl2aXR5LmdldEFjdGlvbigpKSk7Ci0JCXdyaXRlU3BhY2UoKTsKLQkJd3JpdGUoKGFjdGl2aXR5LmdldFN0YXR1cygpPT1JQWN0aXZpdHkuU1RBVFVTX09LKT9TVUNDRVNTOkZBSUxVUkUpOwotCQl3cml0ZWxuKCk7CQkKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFjdGlvbihpbnQgaSkgewotCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9GRUFUVVJFX0lOU1RBTEwgOgotCQkJCXJldHVybiBGRUFUVVJFX0lOU1RBTEw7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9SRU1PVkUgOgotCQkJCXJldHVybiBGRUFUVVJFX1JFTU9WRTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEwgOgotCQkJCXJldHVybiBTSVRFX0lOU1RBTEw7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fU0lURV9SRU1PVkUgOgotCQkJCXJldHVybiBTSVRFX1JFTU9WRTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9VTkNPTkZJR1VSRSA6Ci0JCQkJcmV0dXJuIFVOQ09ORklHVVJFOwotCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0NPTkZJR1VSRSA6Ci0JCQkJcmV0dXJuIENPTkZJR1VSRTsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRVZFUlQgOgotCQkJCXJldHVybiBSRVZFUlQ7Ci0JCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fUkVDT05DSUxJQVRJT04gOgotCQkJCXJldHVybiBSRUNPTkNJTElBVElPTjsKLQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9BRERfUFJFU0VSVkVEIDoKLQkJCQlyZXR1cm4gUFJFU0VSVkVEOwotCQkJCQkJCQotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIFVOS05PV04rIiBbIitpKyJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlbG4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3cml0ZShMSU5FX1NFUEFSQVRPUik7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlKFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobWVzc2FnZSAhPSBudWxsKQotCQkJbG9nLndyaXRlKG1lc3NhZ2UpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZVNwYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGUoIiAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk2OTVhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsNCi1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uKjsNCi0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlclV0aWxzIHsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBPU19VTklYID0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19IUFVYDQotCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKQ0KLQkJCXx8IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfQUlYDQotCQkJCQkuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpDQotCQkJfHwgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19MSU5VWA0KLQkJCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKQ0KLQkJCXx8IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfU09MQVJJUw0KLQkJCQkJLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKTsNCi0JcHJpdmF0ZSBzdGF0aWMgRnJhZ21lbnRFbnRyeVtdIG5vRnJhZ21lbnRzID0gbmV3IEZyYWdtZW50RW50cnlbMF07DQotCXByaXZhdGUgc3RhdGljIE1hcCB0YWJsZTsNCi0NCi0Jc3RhdGljIHsNCi0JCXRhYmxlID0gbmV3IEhhc2hNYXAoKTsNCi0JCXRhYmxlLnB1dCgiY29tcGF0aWJsZSIsIG5ldyBJbnRlZ2VyKElJbXBvcnQuUlVMRV9DT01QQVRJQkxFKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXRhYmxlLnB1dCgicGVyZmVjdCIsIG5ldyBJbnRlZ2VyKElJbXBvcnQuUlVMRV9QRVJGRUNUKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXRhYmxlLnB1dCgiZXF1aXZhbGVudCIsIG5ldyBJbnRlZ2VyKElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXRhYmxlLnB1dCgiZ3JlYXRlck9yRXF1YWwiLCBuZXcgSW50ZWdlcihJSW1wb3J0LlJVTEVfR1JFQVRFUl9PUl9FUVVBTCkpOyAvLyROT04tTkxTLTEkDQotCX0NCi0NCi0JcHJpdmF0ZSBzdGF0aWMgV3JpdGVyIHdyaXRlcjsNCi0JLy8gbWFuYWdlIFVSTCB0byBGaWxlDQotCXByaXZhdGUgc3RhdGljIE1hcCB1cmxGaWxlTWFwOw0KLQ0KLQlwcml2YXRlIHN0YXRpYyBNYXAgbG9jYWxGaWxlRnJhZ21lbnRNYXA7DQotCXByaXZhdGUgc3RhdGljIFN0YWNrIGJ1ZmZlclBvb2w7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7IC8vIDRrYnl0ZXMNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOQ1JFTUVOVF9TSVpFID0gMTAyNDA7IC8vIDEwa2J5dGVzDQotCS8qKg0KLQkgKiByZXR1cm4gdGhlIHVybFN0cmluZyBpZiBpdCBpcyBhIGFic29sdXRlIFVSTA0KLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgZGVmYXVsdCBVUkwgaWYgdGhlIHVybFN0cmluZyBpcyBudWxsDQotCSAqIFRoZSBkZWZhdWx0VVJMIG1heSBwb2ludCBvdCBhIGZpbGUsIGNyZWF0ZSBhIGZpbGUgVVJMIHRoZW4NCi0JICogaWYgdGhlIHVybFN0cmluZyBvciB0aGUgZGVmYXVsdCBVUkwgYXJlIHJlbGF0aXZlcywgcHJlcGVuZCB0aGUgcm9vdFVSTCB0byBpdA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0VVJMKFVSTCByb290VVJMLCBTdHJpbmcgdXJsU3RyaW5nLCBTdHJpbmcgZGVmYXVsdFVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0NCi0JCS8vIGlmIG5vIFVSTCAsIHByb3ZpZGUgRGVmYXVsdA0KLQkJaWYgKHVybFN0cmluZyA9PSBudWxsIHx8IHVybFN0cmluZy50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkDQotDQotCQkJLy8gbm8gVVJMLCBubyBkZWZhdWx0LCByZXR1cm4gcmlnaHQgbm93Li4uDQotCQkJaWYgKGRlZmF1bHRVUkwgPT0gbnVsbCB8fCBkZWZhdWx0VVJMLnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkDQotCQkJCXJldHVybiBudWxsOw0KLQkJCWVsc2UNCi0JCQkJdXJsU3RyaW5nID0gZGVmYXVsdFVSTDsNCi0JCX0NCi0NCi0JCS8vIFVSTCBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUJDQotCQlpZiAodXJsU3RyaW5nLnN0YXJ0c1dpdGgoIi8iKSAmJiB1cmxTdHJpbmcubGVuZ3RoKCkgPiAxKSAvLyROT04tTkxTLTEkDQotCQkJdXJsU3RyaW5nID0gdXJsU3RyaW5nLnN1YnN0cmluZygxKTsNCi0JCXRyeSB7DQotCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyB0aGUgdXJsIGlzIG5vdCBhbiBhYnNvbHV0ZSBVUkwNCi0JCQkvLyB0cnkgcmVsYXRpdmUNCi0JCQl1cmwgPSBuZXcgVVJMKHJvb3RVUkwsIHVybFN0cmluZyk7DQotCQl9DQotDQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qKg0KLQkgKiByZXR1cm4gYSByZWxhdGl2ZSBTdHJpbmcgdG8gcm9vdFVSTCANCi0JICogaWYgdXJsIGNvbnRhaW5zIHJvb3RVUkwgc28NCi0JICogbmV3IFVSTChyb290VVJMLCByZXN1bHRTdHJpbmcpID09IHVybA0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVSTEFzU3RyaW5nKFVSTCByb290VVJMLCBVUkwgdXJsKSB7DQotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsNCi0NCi0JCWlmIChyb290VVJMID09IG51bGwpIHsNCi0JCQlyZXR1cm4gKHVybCA9PSBudWxsKSA/IG51bGwgOiB1cmwudG9TdHJpbmcoKTsNCi0JCX0NCi0NCi0JCS8vIGlmIG5vIFVSTCAsIHJldHVybiBudWxsDQotCQlpZiAodXJsICE9IG51bGwpIHsNCi0NCi0JCQlyZXN1bHQgPSB1cmwudG9FeHRlcm5hbEZvcm0oKTsNCi0NCi0JCQlpZiAocm9vdFVSTC5nZXRIb3N0KCkgIT0gbnVsbCAmJiAhcm9vdFVSTC5nZXRIb3N0KCkuZXF1YWxzKHVybC5nZXRIb3N0KCkpKQ0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQ0KLQkJCWlmIChyb290VVJMLmdldFByb3RvY29sKCkgIT0gbnVsbCAmJiAhcm9vdFVSTC5nZXRQcm90b2NvbCgpLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSkpDQotCQkJCXJldHVybiByZXN1bHQ7DQotDQotCQkJaWYgKHJvb3RVUkwuZ2V0UG9ydCgpICE9IHVybC5nZXRQb3J0KCkpDQotCQkJCXJldHVybiByZXN1bHQ7DQotDQotCQkJU3RyaW5nIHJvb3RVUkxGaWxlU3RyaW5nID0gcm9vdFVSTC5nZXRGaWxlKCk7DQotCQkJcm9vdFVSTEZpbGVTdHJpbmcgPSByb290VVJMRmlsZVN0cmluZy5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCQlpZiAoIXJvb3RVUkxGaWxlU3RyaW5nLmVuZHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJA0KLQkJCQlpbnQgaW5kZXggPSByb290VVJMRmlsZVN0cmluZy5sYXN0SW5kZXhPZignLycpOw0KLQkJCQlpZiAoaW5kZXggIT0gLTEpIHsNCi0JCQkJCXJvb3RVUkxGaWxlU3RyaW5nID0gcm9vdFVSTEZpbGVTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlTdHJpbmcgdXJsRmlsZVN0cmluZyA9IHVybC5nZXRGaWxlKCk7DQotDQotCQkJaWYgKHVybEZpbGVTdHJpbmcuc3RhcnRzV2l0aChyb290VVJMRmlsZVN0cmluZykpIHsNCi0JCQkJcmVzdWx0ID0gdXJsRmlsZVN0cmluZy5zdWJzdHJpbmcocm9vdFVSTEZpbGVTdHJpbmcubGVuZ3RoKCkpOw0KLQkJCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQkJfSBlbHNlIHsNCi0JCQkJLy8gd2UgbmVlZCB0byBjaGVjayB0aGUgZm9sbG93aW5nDQotCQkJCS8vIGZpbGU6L0M6LyBhbmQgZmlsZTpDOi8NCi0JCQkJaWYgKCJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkDQotCQkJCQlGaWxlIHJvb3RGaWxlID0gbmV3IEZpbGUocm9vdFVSTEZpbGVTdHJpbmcpOw0KLQkJCQkJRmlsZSB1cmxGaWxlID0gbmV3IEZpbGUodXJsRmlsZVN0cmluZyk7DQotDQotCQkJCQlGaWxlIHJlbGF0aXZlUGF0aCA9IHVybEZpbGU7DQotCQkJCQl3aGlsZSAocmVsYXRpdmVQYXRoICE9IG51bGwgJiYgIXJvb3RGaWxlLmVxdWFscyhyZWxhdGl2ZVBhdGguZ2V0UGFyZW50RmlsZSgpKSkgew0KLQkJCQkJCXJlbGF0aXZlUGF0aCA9IHJlbGF0aXZlUGF0aC5nZXRQYXJlbnRGaWxlKCk7DQotCQkJCQl9DQotDQotCQkJCQlpZiAocmVsYXRpdmVQYXRoID09IG51bGwpIHsNCi0JCQkJCQlVcGRhdGVDb3JlLndhcm4oIkNhbm5vdCBjYWxjdWxhdGUgcmVsYXRpdmUgcGF0aCIpOyAvLyROT04tTkxTLTEkDQotCQkJCQkJcmV0dXJuIHVybC50b1N0cmluZygpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQlTdHJpbmcgcmVsYXRpdmVSb290U3RyaW5nID0gcmVsYXRpdmVQYXRoLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JCQkJCQlTdHJpbmcgZnVsbFN0cmluZyA9IHVybEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7DQotCQkJCQkJaWYgKCFmdWxsU3RyaW5nLnN0YXJ0c1dpdGgocmVsYXRpdmVSb290U3RyaW5nKSkgew0KLQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIkZ1bGwgcGF0aDoiICsgZnVsbFN0cmluZyArICIgZG9lcyBub3Qgc3RhcnQgd2l0aCAiICsgcmVsYXRpdmVSb290U3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCQkJCXJldHVybiB1cmwudG9TdHJpbmcoKTsNCi0JCQkJCQl9IGVsc2Ugew0KLQkJCQkJCQlTdHJpbmcgcmV0dXJuU3RyaW5nID0gZnVsbFN0cmluZy5zdWJzdHJpbmcocmVsYXRpdmVSb290U3RyaW5nLmxlbmd0aCgpICsgMSk7DQotCQkJCQkJCWlmICh1cmxGaWxlLmlzRGlyZWN0b3J5KCkpDQotCQkJCQkJCQlyZXR1cm5TdHJpbmcgKz0gRmlsZS5zZXBhcmF0b3I7DQotCQkJCQkJCS8vIHdlIGxvc3QgdGhlIGxhc3Qgc2xhc2ggd2hlbiB0cmFuZm9ybWluZyBpbiBGaWxlDQotCQkJCQkJCXJldHVyblN0cmluZyA9IHJldHVyblN0cmluZy5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nKTsNCi0JCQkJCQkJcmV0dXJuIHJldHVyblN0cmluZzsNCi0JCQkJCQl9DQotDQotCQkJCQl9DQotDQotCQkJCX0gZWxzZSB7DQotCQkJCQlyZXN1bHQgPSB1cmwudG9TdHJpbmcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybnMgYSB0cmFuc2xhdGVkIFN0cmluZw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGluZm9VUkwsIFJlc291cmNlQnVuZGxlIGJ1bmRsZSkgew0KLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7DQotCQlpZiAoaW5mb1VSTCAhPSBudWxsKSB7DQotCQkJcmVzdWx0ID0gUGxhdGZvcm0uZ2V0UmVzb3VyY2VTdHJpbmcoVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKSwgaW5mb1VSTCwgYnVuZGxlKTsNCi0JCX0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBVUkwgY29weVRvTG9jYWwoSW5wdXRTdHJlYW0gc291cmNlQ29udGVudFJlZmVyZW5jZVN0cmVhbSwgU3RyaW5nIGxvY2FsTmFtZSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uIHsNCi0JCVVSTCByZXN1bHQgPSBudWxsOw0KLQkJLy8gY3JlYXRlIHRoZSBEaXIgaWYgdGhleSBkbyBub3QgZXhpc3QNCi0JCS8vIGdldCB0aGUgcGF0aCBmcm9tIHRoZSBGaWxlIHRvIHJlc29sdmUgRmlsZS5zZXBhcmF0b3IuLg0KLQkJLy8gZG8gbm90IHVzZSB0aGUgU3RyaW5nIGFzIGl0IG1heSBjb250YWluIFVSTCBsaWtlIHNlcGFyYXRvcg0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShsb2NhbE5hbWUpOw0KLQkJaW50IGluZGV4ID0gbG9jYWxGaWxlLmdldFBhdGgoKS5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcik7DQotCQlpZiAoaW5kZXggIT0gLTEpIHsNCi0JCQlGaWxlIGRpciA9IG5ldyBGaWxlKGxvY2FsRmlsZS5nZXRQYXRoKCkuc3Vic3RyaW5nKDAsIGluZGV4KSk7DQotCQkJaWYgKCFkaXIuZXhpc3RzKCkpDQotCQkJCWRpci5ta2RpcnMoKTsNCi0JCX0NCi0NCi0JCS8vIHRyYW5zZmVyIHRoZSBjb250ZW50IG9mIHRoZSBGaWxlDQotCQlpZiAoIWxvY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJT3V0cHV0U3RyZWFtIGxvY2FsQ29udGVudFJlZmVyZW5jZVN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvY2FsRmlsZSk7DQotCQkJdHJ5IHsNCi0JCQkJVXRpbGl0aWVzLmNvcHkoc291cmNlQ29udGVudFJlZmVyZW5jZVN0cmVhbSwgbG9jYWxDb250ZW50UmVmZXJlbmNlU3RyZWFtLCBtb25pdG9yKTsNCi0JCQl9IGZpbmFsbHkgew0KLQkJCQl0cnkgew0KLQkJCQkJbG9jYWxDb250ZW50UmVmZXJlbmNlU3RyZWFtLmNsb3NlKCk7DQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpe30NCi0JCQl9DQotCQl9DQotCQlyZXN1bHQgPSBsb2NhbEZpbGUudG9VUkwoKTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoNCi0JICogWzIwMzA1XSBuZWVkIHRvIHNsYW0gcGVybWlzc2lvbnMgZm9yIGV4ZWN1dGFibGUgbGlicyBvbiBzb21lDQotCSAqIHBsYXRmb3Jtcy4gVGhpcyBpcyBhIHRlbXBvcmFyeSBmaXgNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1Blcm1pc3Npb25zKENvbnRlbnRSZWZlcmVuY2UgcmVmLCBTdHJpbmcgZmlsZVBhdGgpIHsNCi0NCi0JCWlmIChyZWYuZ2V0UGVybWlzc2lvbigpICE9IDApIHsNCi0JCQlVcGRhdGVDb3JlLndhcm4oIkNoYW5nZSBwZXJtaXNzaW9uIGZvciAiICsgZmlsZVBhdGggKyAiIHRvICIgKyByZWYuZ2V0UGVybWlzc2lvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJLy8gRklYTUU6IGNoYW5nZSB0aGUgY29kZSB0byB1c2UgSk5JDQotCQl9DQotDQotCQlpZiAoZmlsZVBhdGggIT0gbnVsbCAmJiBPU19VTklYICYmIHJlZi5nZXRQZXJtaXNzaW9uKCkgIT0gMCkgew0KLQkJCS8vIGFkZCBleGVjdXRlIHBlcm1pc3Npb24gb24gc2hhcmVkIGxpYnJhcmllcyAyMDMwNQ0KLQkJCS8vIGRvIG5vdCByZW1vdmUgd3JpdGUgcGVybWlzc2lvbiAyMDg5Ng0KLQkJCS8vIGNobW9kIGEreCAqLnNsDQotCQkJdHJ5IHsNCi0JCQkJUHJvY2VzcyBwciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsgImNobW9kIiwgImEreCIsIGZpbGVQYXRoIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQkJVGhyZWFkIGNobW9kT3V0cHV0ID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByLmdldElucHV0U3RyZWFtKCkpOw0KLQkJCQljaG1vZE91dHB1dC5zZXROYW1lKCJjaG1vZCBvdXRwdXQgcmVhZGVyIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJY2htb2RPdXRwdXQuc3RhcnQoKTsNCi0JCQkJVGhyZWFkIGNobW9kRXJyb3IgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHIuZ2V0RXJyb3JTdHJlYW0oKSk7DQotCQkJCWNobW9kRXJyb3Iuc2V0TmFtZSgiY2htb2QgZXJyb3IgcmVhZGVyIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJY2htb2RFcnJvci5zdGFydCgpOw0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgew0KLQkJCX0NCi0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyBhIHJhbmRvbSBmaWxlIG5hbWUgZm9yIHRoZSBsb2NhbCBzeXN0ZW0NCi0JICogYXR0ZW1wdCB0byBjb25zZXJ2ZSB0aGUgZXh0ZW5zaW9uIGlmIHRoZXJlIGlzIGEgJy4nIGluIHRoZSBwYXRoDQotCSAqIGFuZCBubyBGaWxlLlNlcGVyYXRvciBhZnRlciB0aGUgJy4nDQotCSAqIA0KLQkgKiBcYVxiXGMudHh0IC0+IGM5ODc2NTkzODUudHh0DQotCSAqIGMudHh0IC0+IGMzODU0NzYzLnR4dA0KLQkgKiBjCS0+IGM5NTM4Njc1NDkNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldExvY2FsUmFuZG9tSWRlbnRpZmllcihTdHJpbmcgcmVtb3RlUGF0aCwgRGF0ZSBkYXRlKSB7DQotCQlpbnQgZG90SW5kZXggPSByZW1vdGVQYXRoLmxhc3RJbmRleE9mKCIuIik7CS8vJE5PTi1OTFMtMSQNCi0JCWludCBmaWxlSW5kZXggPSByZW1vdGVQYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsNCi0JCS8vIGlmIHRoZXJlIGlzIGEgc2VwYXJhdG9yIGFmdGVyIHRoZSBkb3QNCi0JCS8vIGRvIG5vdCBjb25zaWRlciBpdCBhcyBhbiBleHRlbnNpb24NCi0JCVN0cmluZyBleHQgPSAoZG90SW5kZXggIT0gLTEgJiYgZmlsZUluZGV4IDwgZG90SW5kZXgpID8gcmVtb3RlUGF0aC5zdWJzdHJpbmcoZG90SW5kZXgpIDogIiI7IC8vJE5PTi1OTFMtMSQNCi0JCS8vIHRoZSBuYW1lIGlzIHRoZSBzdHJpbmcgYmV0d2VlbiB0aGUgc2VwYXJhdG9yIGFuZCB0aGUgZG90DQotCQkvLyBpZiB0aGVyZSBpcyBubyBzZXBhcmF0b3IsIGl0IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGRvdAkJDQotCQkvLyBpZiB0aGVyZSBpcyBubyBkb3QsIGdvIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyANCi0JCWlmIChmaWxlSW5kZXggPT0gLTEpDQotCQkJZmlsZUluZGV4ID0gMDsNCi0JCWlmIChkb3RJbmRleCA9PSAtMSkNCi0JCQlkb3RJbmRleCA9IHJlbW90ZVBhdGgubGVuZ3RoKCk7DQotCQkvLyBpZiBJIGhhdmUgYSBzZXBhcmF0b3IgYW5kIG5vIGRvdDogL2EvYi9jIC0+IGMNCi0JCS8vIGlmIG15IHNlcGFyYXRvciBpcyB0aGUgbGFzdCAvYS9iL2MvLCBmaWxlSW5kZXggYW5kIGRvdEluZGV4IGFyZSB0aGUgc2FtZSwgc28gaXQgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdGVtcCBuYW1lDQotCQlTdHJpbmcgbmFtZSA9IChmaWxlSW5kZXggPCBkb3RJbmRleCkgPyByZW1vdGVQYXRoLnN1YnN0cmluZyhmaWxlSW5kZXgsIGRvdEluZGV4KSA6ICJFY2xpcHNlX1VwZGF0ZV9UTVBfIjsgLy8kTk9OLU5MUy0xJA0KLQkJU3RyaW5nIHJlc3VsdCA9IG5hbWUgKyBkYXRlLmdldFRpbWUoKSArIGV4dDsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJlbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIGZpbGUgc3lzdGVtLg0KLQkgKiB1c2VkIHRvIGNsZWFuIHVwIGluc3RhbGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGcm9tRmlsZVN5c3RlbShGaWxlIGZpbGUpIHsNCi0JCWlmICghZmlsZS5leGlzdHMoKSkNCi0JCQlyZXR1cm47DQotDQotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKSB7DQotCQkJU3RyaW5nW10gZmlsZXMgPSBmaWxlLmxpc3QoKTsNCi0JCQlpZiAoZmlsZXMgIT0gbnVsbCkgLy8gYmUgY2FyZWZ1bCBzaW5jZSBmaWxlLmxpc3QoKSBjYW4gcmV0dXJuIG51bGwNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkNCi0JCQkJCXJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIGZpbGVzW2ldKSk7DQotCQl9DQotDQotCQlpZiAoIWZpbGUuZGVsZXRlKCkpIHsNCi0JCQlTdHJpbmcgbXNnID0gUG9saWN5LmJpbmQoIlVwZGF0ZU1hbmFnZXJVdGlscy5VbmFibGVUb1JlbW92ZUZpbGUiLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJVXBkYXRlQ29yZS5sb2cobXNnLCBuZXcgRXhjZXB0aW9uKCkpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiByZW1vdmUgYWxsIHRoZSBlbXB0eSBkaXJlY3RvcmllcyByZWN1cnNpdmVseQ0KLQkgKiB1c2VkIHRvIGNsZWFuIHVwIGluc3RhbGwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVFbXB0eURpcmVjdG9yaWVzRnJvbUZpbGVTeXN0ZW0oRmlsZSBmaWxlKSB7DQotCQlpZiAoIWZpbGUuaXNEaXJlY3RvcnkoKSkNCi0JCQlyZXR1cm47DQotDQotCQlTdHJpbmdbXSBmaWxlcyA9IGZpbGUubGlzdCgpOw0KLQkJaWYgKGZpbGVzICE9IG51bGwpIHsgLy8gYmUgY2FyZWZ1bCBzaW5jZSBmaWxlLmxpc3QoKSBjYW4gcmV0dXJuIG51bGwNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7DQotCQkJCXJlbW92ZUVtcHR5RGlyZWN0b3JpZXNGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCBmaWxlc1tpXSkpOw0KLQkJCX0NCi0JCX0NCi0JCWlmICghZmlsZS5kZWxldGUoKSkgew0KLQkJCVN0cmluZyBtc2cgPSBQb2xpY3kuYmluZCgiVXBkYXRlTWFuYWdlclV0aWxzLlVuYWJsZVRvUmVtb3ZlRmlsZSIsIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwkvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQNCi0JCQlVcGRhdGVDb3JlLmxvZyhtc2csIG5ldyBFeGNlcHRpb24oKSk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBsdWdpbiBlbnRyaWVzIHRoYXQgYXJlIGluIHNvdXJjZSBhcnJheSBhbmQNCi0JICogbm90IGluIHRhcmdldCBhcnJheQ0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBJUGx1Z2luRW50cnlbXSBkaWZmKElQbHVnaW5FbnRyeVtdIHNvdXJjZUFycmF5LCBJUGx1Z2luRW50cnlbXSB0YXJnZXRBcnJheSkgeyAvLyBObyBwbHVnaW5FbnRyeSB0byBJbnN0YWxsLCByZXR1cm4gTm90aGluZyB0byBpbnN0YWwNCi0JCWlmIChzb3VyY2VBcnJheSA9PSBudWxsIHx8IHNvdXJjZUFycmF5Lmxlbmd0aCA9PSAwKSB7DQotCQkJcmV0dXJuIG5ldyBJUGx1Z2luRW50cnlbMF07DQotCQl9IC8vIE5vIHBsdWdpbkVudHJ5IGluc3RhbGxlZCwgSW5zdGFsbCB0aGVtIGFsbA0KLQkJaWYgKHRhcmdldEFycmF5ID09IG51bGwgfHwgdGFyZ2V0QXJyYXkubGVuZ3RoID09IDApIHsNCi0JCQlyZXR1cm4gc291cmNlQXJyYXk7DQotCQl9IC8vIGlmIGEgSVBsdWdpbkVudHJ5IGZyb20gc291cmNlQXJyYXkgaXMgTk9UIGluDQotCQkvLyB0YXJnZXRBcnJheSwgYWRkIGl0IHRvIHRoZSBsaXN0DQotCQlMaXN0IGxpc3QxID0gQXJyYXlzLmFzTGlzdCh0YXJnZXRBcnJheSk7DQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKCFsaXN0MS5jb250YWlucyhzb3VyY2VBcnJheVtpXSkpDQotCQkJCXJlc3VsdC5hZGQoc291cmNlQXJyYXlbaV0pOw0KLQkJfQ0KLQ0KLQkJSVBsdWdpbkVudHJ5W10gcmVzdWx0RW50cnkgPSBuZXcgSVBsdWdpbkVudHJ5W3Jlc3VsdC5zaXplKCldOw0KLQkJaWYgKHJlc3VsdC5zaXplKCkgPiAwKQ0KLQkJCXJlc3VsdC50b0FycmF5KHJlc3VsdEVudHJ5KTsNCi0JCXJldHVybiByZXN1bHRFbnRyeTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogUmV0dXJucyB0aGUgcGFyZW50IFVSTCBvZiB0aGUgZ2l2ZW4gVVJMLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUNCi0JICogZ2l2ZW4gVVJMIGlzIHRoZSByb290Lg0KLQkgKiA8dGFibGU+DQotCSAqIDxjYXB0aW9uPkV4YW1wbGU8L2NhcHRpb24+DQotCSAqIDx0cj4NCi0JICogICA8dGg+R2l2ZW4gVVJMPC90aD4NCi0JICogICA8dGg+UGFyZW50IFVSTDwvdGg+DQotCSAqIDx0cj4NCi0JICogICA8dGQ+Imh0dHA6Ly9ob3N0bmFtZS8iPC90ZD4NCi0JICogICA8dGQ+bnVsbDwvdGQ+DQotCSAqIDx0cj4NCi0JICogICA8dGQ+Imh0dHA6Ly9ob3N0bmFtZS9mb2xkZXIvZmlsZTwvdGQ+DQotCSAqICAgPHRkPiJodHRwOi8vaG9zdG5hbWUvZm9sZGVyLzwvdGQ+DQotCSAqIDwvdGFibGU+DQotCSAqDQotCSAqIEBwYXJhbSB1cmwgYSBVUkwNCi0JICogQHJldHVybiAgICB0aGUgcGFyZW50IG9mIHRoZSBnaXZlbiBVUkwNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldFBhcmVudChVUkwgdXJsKSB7DQotCQlTdHJpbmcgZmlsZSA9IHVybC5nZXRGaWxlKCk7DQotCQlpbnQgbGVuID0gZmlsZS5sZW5ndGgoKTsNCi0JCWlmIChsZW4gPT0gMCB8fCBsZW4gPT0gMSAmJiBmaWxlLmNoYXJBdCgwKSA9PSAnLycpDQotCQkJcmV0dXJuIG51bGw7DQotCQlpbnQgbGFzdFNsYXNoSW5kZXggPSAtMTsNCi0JCWZvciAoaW50IGkgPSBsZW4gLSAyOyBsYXN0U2xhc2hJbmRleCA9PSAtMSAmJiBpID49IDA7IC0taSkgew0KLQkJCWlmIChmaWxlLmNoYXJBdChpKSA9PSAnLycpDQotCQkJCWxhc3RTbGFzaEluZGV4ID0gaTsNCi0JCX0NCi0JCWlmIChsYXN0U2xhc2hJbmRleCA9PSAtMSkNCi0JCQlmaWxlID0gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCWVsc2UNCi0JCQlmaWxlID0gZmlsZS5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoSW5kZXggKyAxKTsNCi0JCXRyeSB7DQotCQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgZmlsZSk7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgew0KLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JCXJldHVybiB1cmw7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBVUkwgYXNEaXJlY3RvcnlVUkwoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQkvL3VybCA9IFVSTEVuY29kZXIuZW5jb2RlKHVybCk7DQotCQlTdHJpbmcgcGF0aCA9IHVybC5nZXRGaWxlKCk7DQotCQlpZiAoIXBhdGguZW5kc1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkDQotCQkJaW50IGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpOw0KLQkJCWlmIChpbmRleCAhPSAtMSkNCi0JCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7DQotCQkJLy8gaWdub3JlIGFueSByZWYgaW4gb3JpZ2luYWwgVVJMDQotCQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgcGF0aCk7DQotCQl9DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qDQotCSAqIENvbXBhcmVzIHR3byBVUkwgZm9yIGVxdWFsaXR5DQotCSAqIFJldHVybiBmYWxzZSBpZiBvbmUgb2YgdGhlbSBpcyBudWxsDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FtZVVSTChVUkwgdXJsMSwgVVJMIHVybDIpIHsNCi0NCi0JCWlmICh1cmwxID09IG51bGwgfHwgdXJsMiA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0JCWlmICh1cmwxID09IHVybDIpDQotCQkJcmV0dXJuIHRydWU7DQotCQlpZiAodXJsMS5lcXVhbHModXJsMikpDQotCQkJcmV0dXJuIHRydWU7DQotDQotCQkvLyBjaGVjayBpZiBVUkwgYXJlIGZpbGU6IFVSTCBhcyB3ZSBtYXkNCi0JCS8vIGhhdmUgMiBVUkwgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmVhdHVyZVJlZmVyZW5jZQ0KLQkJLy8gYnV0IHdpdGggZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uDQotCQkvLyAoaS5lLiBmaWxlOi9DOy8gYW5kIGZpbGU6QzovKQ0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwxLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwyLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJRmlsZSBmaWxlMSA9IGdldEZpbGVGb3IodXJsMSk7Ly9uZXcgRmlsZSh1cmwxLmdldEZpbGUoKSk7DQotCQlGaWxlIGZpbGUyID0gZ2V0RmlsZUZvcih1cmwyKTsNCi0NCi0JCWlmIChmaWxlMSA9PSBudWxsKQ0KLQkJCXJldHVybiBmYWxzZTsNCi0NCi0JCXJldHVybiAoZmlsZTEuZXF1YWxzKGZpbGUyKSk7DQotCX0NCi0JDQotCS8qDQotCSAqIE1ldGhvZCBnZXRGaWxlRm9yLg0KLQkgKiBAcGFyYW0gdXJsMQ0KLQkgKiBAcmV0dXJuIEZpbGUNCi0JICovDQotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RmlsZUZvcihVUkwgdXJsMSkgew0KLQkJaWYgKHVybEZpbGVNYXAgPT0gbnVsbCkgdXJsRmlsZU1hcCA9IG5ldyBIYXNoTWFwKCk7DQotCQlpZiAodXJsRmlsZU1hcC5nZXQodXJsMSkhPW51bGwpIHJldHVybiAoRmlsZSl1cmxGaWxlTWFwLmdldCh1cmwxKTsNCi0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKHVybDEuZ2V0RmlsZSgpKTsNCi0JCXVybEZpbGVNYXAucHV0KHVybDEsbmV3RmlsZSk7DQotCQlyZXR1cm4gbmV3RmlsZTsgDQotCX0NCi0NCi0JLyoNCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBGZWF0dXJlUmVmZXJlbmNlIHRoYXQgYXJlIHBhcmVudCBvZiANCi0JICogdGhlIEZlYXR1cmUgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcGFyZW50IGZvdW5kLg0KLQkgKiBAcGFyYW0gb25seU9wdGlvbmFsIGlmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBvbmx5IHJldHVybiBwYXJlbnRzIHRoYXQgY29uc2lkZXIgdGhlIGZlYXR1cmUgb3B0aW9uYWwNCi0JICogQHBhcmFtIGNoaWxkDQotCSAqIEBwYXJhbSBwb3NzaWJsZXNQYXJlbnQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRQYXJlbnRGZWF0dXJlcyhJRmVhdHVyZSBjaGlsZEZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gcG9zc2libGVzUGFyZW50LCBib29sZWFuIG9ubHlPcHRpb25hbCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQ0KLQkJaWYgKGNoaWxkRmVhdHVyZSA9PSBudWxsKQ0KLQkJCXJldHVybiBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07DQotDQotCQlMaXN0IHBhcmVudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gY2hpbGRyZW4gPSBudWxsOw0KLQkJSUZlYXR1cmUgY29tcGFyZUZlYXR1cmUgPSBudWxsOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NzaWJsZXNQYXJlbnQubGVuZ3RoOyBpKyspIHsNCi0JCQl0cnkgew0KLQkJCQlJRmVhdHVyZSBwb3NzaWJsZVBhcmVudEZlYXR1cmUgPSBwb3NzaWJsZXNQYXJlbnRbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJaWYgKHBvc3NpYmxlUGFyZW50RmVhdHVyZSAhPSBudWxsKSB7DQotCQkJCQljaGlsZHJlbiA9IHBvc3NpYmxlUGFyZW50RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkcmVuLmxlbmd0aDsgaisrKSB7DQotCQkJCQkJdHJ5IHsNCi0JCQkJCQkJY29tcGFyZUZlYXR1cmUgPSBjaGlsZHJlbltqXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQkJCQlVcGRhdGVDb3JlLndhcm4oIiIsIGUpOyAvLyROT04tTkxTLTEkDQotCQkJCQkJfQ0KLQkJCQkJCWlmIChjaGlsZEZlYXR1cmUuZXF1YWxzKGNvbXBhcmVGZWF0dXJlKSkgew0KLQkJCQkJCQlpZiAob25seU9wdGlvbmFsKSB7DQotCQkJCQkJCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLmlzT3B0aW9uYWwoY2hpbGRyZW5bal0pKSB7DQotCQkJCQkJCQkJcGFyZW50TGlzdC5hZGQocG9zc2libGVzUGFyZW50W2ldKTsNCi0JCQkJCQkJCX0gZWxzZSB7DQotCQkJCQkJCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIDoiICsgY2hpbGRyZW5bal0gKyAiIG5vdCBvcHRpb25hbC4gTm90IGluY2x1ZGVkIGluIHBhcmVudHMgbGlzdC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQkJCQkJCQl9DQotCQkJCQkJCX0gZWxzZSB7DQotCQkJCQkJCQlwYXJlbnRMaXN0LmFkZChwb3NzaWJsZXNQYXJlbnRbaV0pOw0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQl9DQotCQl9DQotDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHBhcmVudHMgPSBuZXcgSUZlYXR1cmVSZWZlcmVuY2VbMF07DQotCQlpZiAocGFyZW50TGlzdC5zaXplKCkgPiAwKSB7DQotCQkJcGFyZW50cyA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtwYXJlbnRMaXN0LnNpemUoKV07DQotCQkJcGFyZW50TGlzdC50b0FycmF5KHBhcmVudHMpOw0KLQkJfQ0KLQkJcmV0dXJuIHBhcmVudHM7DQotCX0NCi0NCi0JLyoNCi0JICogcmV0dXJucyB0aGUgbGlzdCBvZiBGZWF0dXJlcyB0aGF0IGFyZSBwYXJlbnQgb2YgDQotCSAqIHRoZSBGZWF0dXJlIG9yIGFuIGVtcHR5IGFycmF5IGlmIG5vIHBhcmVudCBmb3VuZA0KLQkgKiBAcGFyYW0gb25seU9wdGlvbmFsIGlmIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBvbmx5IHJldHVybiBwYXJlbnRzIHRoYXQgY29uc2lkZXIgdGhlIGZlYXR1cmUgb3B0aW9uYWwNCi0JICogQHBhcmFtIGNoaWxkDQotCSAqIEBwYXJhbSBwb3NzaWJsZXNQYXJlbnQNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRQYXJlbnRGZWF0dXJlcyhJRmVhdHVyZVJlZmVyZW5jZSBjaGlsZCwgSUZlYXR1cmVSZWZlcmVuY2VbXSBwb3NzaWJsZXNQYXJlbnQsIGJvb2xlYW4gb25seU9wdGlvbmFsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotDQotCQlpZiAoY2hpbGQgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOw0KLQ0KLQkJSUZlYXR1cmUgY2hpbGRGZWF0dXJlID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJY2hpbGRGZWF0dXJlID0gY2hpbGQuZ2V0RmVhdHVyZShudWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVVwZGF0ZUNvcmUud2FybihudWxsLCBlKTsNCi0JCX0NCi0NCi0JCWlmIChjaGlsZEZlYXR1cmUgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlUmVmZXJlbmNlWzBdOw0KLQ0KLQkJcmV0dXJuIGdldFBhcmVudEZlYXR1cmVzKGNoaWxkRmVhdHVyZSwgcG9zc2libGVzUGFyZW50LCBvbmx5T3B0aW9uYWwpOw0KLQl9DQotDQotCS8qDQotCSAqIElmIHRoZSByZXR1cm4gY29kZSBvZiB0aGUgSFRUUCBjb25uZWN0aW9uIGlzIG5vdCAyMDAgKE9LKQ0KLQkgKiB0aG93IGFuIElPIGV4Y2VwdGlvbg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0Nvbm5lY3Rpb25SZXN1bHQoUmVzcG9uc2UgcmVzcG9uc2UsVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCS8vIGRpZCB0aGUgc2VydmVyIHJldHVybiBhbiBlcnJvciBjb2RlID8NCi0JCQlpbnQgcmVzdWx0ID0gcmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpOw0KLQ0KLQkJCWlmIChyZXN1bHQgIT0gSVN0YXR1c0NvZGVzLkhUVFBfT0spIHsNCi0JCQkJU3RyaW5nIHNlcnZlck1zZyA9IHJlc3BvbnNlLmdldFN0YXR1c01lc3NhZ2UoKTsNCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJDb250ZW50UmVmZXJlbmNlLkh0dHBOb2siLCBuZXcgT2JqZWN0W10geyBuZXcgSW50ZWdlcihyZXN1bHQpLCBzZXJ2ZXJNc2csIHVybCB9KSk7IC8vJE5PTi1OTFMtMSQJCQkJCQkNCi0JCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1Db25zdW1lciBleHRlbmRzIFRocmVhZCB7DQotCQlJbnB1dFN0cmVhbSBpczsNCi0JCWJ5dGVbXSBidWY7DQotCQlwdWJsaWMgU3RyZWFtQ29uc3VtZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsNCi0JCQlzdXBlcigpOw0KLQkJCXRoaXMuc2V0RGFlbW9uKHRydWUpOw0KLQkJCXRoaXMuaXMgPSBpbnB1dFN0cmVhbTsNCi0JCQlidWYgPSBuZXcgYnl0ZVs1MTJdOw0KLQkJfQ0KLQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCXRyeSB7DQotCQkJCWludCBuID0gMDsNCi0JCQkJd2hpbGUgKG4gPj0gMCkNCi0JCQkJCW4gPSBpcy5yZWFkKGJ1Zik7DQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBSZXR1cm4gdGhlIG9wdGlvbmFsIGNoaWxkcmVuIHRvIGluc3RhbGwNCi0JICogVGhlIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGluc3RhbGwgbWF5IG5vdCBhbGwgYmUgZGlyZWN0IGNoaWxkcmVuIA0KLQkgKiBvZiB0aGUgZmVhdHVyZS4NCi0JICogQWxzbyBpbmNsdWRlIG5vbi1vcHRpb25hbCBmZWF0dXJlcw0KLQkgKiANCi0JICogQHBhcmFtIGNoaWxkcmVuIGFsbCB0aGUgbmVzdGVkIGZlYXR1cmVzDQotCSAqIEBwYXJhbSBvcHRpb25hbGZlYXR1cmVzIG9wdGlvbmFsIGZlYXR1cmVzIHRvIGluc3RhbGwNCi0JICogQHJldHVybiBJRmVhdHVyZVJlZmVyZW5jZVtdDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbChJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuLCBJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsZmVhdHVyZXMpIHsNCi0NCi0JCUxpc3Qgb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbCA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZSBvcHRpb25hbEZlYXR1cmUgPSBjaGlsZHJlbltpXTsNCi0JCQlpZiAoIVVwZGF0ZU1hbmFnZXJVdGlscy5pc09wdGlvbmFsKG9wdGlvbmFsRmVhdHVyZSkpIHsNCi0JCQkJb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC5hZGQob3B0aW9uYWxGZWF0dXJlKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9wdGlvbmFsZmVhdHVyZXMubGVuZ3RoOyBqKyspIHsNCi0JCQkJCWlmIChvcHRpb25hbEZlYXR1cmUuZXF1YWxzKG9wdGlvbmFsZmVhdHVyZXNbal0pKSB7DQotCQkJCQkJb3B0aW9uYWxDaGlsZHJlblRvSW5zdGFsbC5hZGQob3B0aW9uYWxGZWF0dXJlKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVzdWx0ID0gbmV3IElGZWF0dXJlUmVmZXJlbmNlW29wdGlvbmFsQ2hpbGRyZW5Ub0luc3RhbGwuc2l6ZSgpXTsNCi0JCWlmIChvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsLnNpemUoKSA+IDApIHsNCi0JCQlvcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsLnRvQXJyYXkocmVzdWx0KTsNCi0JCX0NCi0NCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIHJldHVybnMgdGhlIG1hcHBpbmcgb2YgbWF0Y2hpbmcgcnVsZXMNCi0JICogdGhlIGRlZmF1bHQgcmV0dXJucyBwZXJmZWN0DQotCSAqIA0KLQkgKiBAc2luY2UgMi4wLjINCi0JICovDQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE1hdGNoaW5nUnVsZShTdHJpbmcgcnVsZSkgew0KLQkJaWYgKHJ1bGUgPT0gbnVsbCkNCi0JCQlyZXR1cm4gSUltcG9ydC5SVUxFX1BFUkZFQ1Q7DQotCQlpbnQgcnVsZUludCA9ICgoSW50ZWdlcikgdGFibGUuZ2V0KHJ1bGUpKS5pbnRWYWx1ZSgpOw0KLQkJaWYgKHJ1bGVJbnQgPT0gSUltcG9ydC5SVUxFX05PTkUpDQotCQkJcmV0dXJuIElJbXBvcnQuUlVMRV9QRVJGRUNUOw0KLQkJcmV0dXJuIHJ1bGVJbnQ7DQotCX0NCi0JDQotCS8qKg0KLQkgKiByZXR1cm5zIHRoZSBtYXBwaW5nIG9mIG1hdGNoaW5nIGlkIHJ1bGVzDQotCSAqIHRoZSBkZWZhdWx0IHJldHVybnMgcGVyZmVjdA0KLQkgKiANCi0JICogQHNpbmNlIDIuMC4yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNYXRjaGluZ0lkUnVsZShTdHJpbmcgcnVsZSkgew0KLQkJaWYgKHJ1bGUhPW51bGwgJiYgcnVsZS5lcXVhbHNJZ25vcmVDYXNlKCJwcmVmaXgiKSkgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybiBJSW1wb3J0LlJVTEVfUFJFRklYOw0KLQkJcmV0dXJuIElJbXBvcnQuUlVMRV9QRVJGRUNUOw0KLQl9DQotCQ0KLQkvKioNCi0JICogTWV0aG9kIGlzT3B0aW9uYWwuDQotCSAqIEBwYXJhbSBmZWF0dXJlUmVmZXJlbmNlDQotCSAqIEByZXR1cm4gYm9vbGVhbg0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzT3B0aW9uYWwoSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZmVyZW5jZSkgew0KLQkJaWYgKGZlYXR1cmVSZWZlcmVuY2U9PW51bGwpIHJldHVybiBmYWxzZTsNCi0JCWlmIChmZWF0dXJlUmVmZXJlbmNlIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSl7DQotCQkJcmV0dXJuICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSlmZWF0dXJlUmVmZXJlbmNlKS5pc09wdGlvbmFsKCk7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRFbnZpcm9ubWVudChJUGxhdGZvcm1FbnZpcm9ubWVudCBjYW5kaWRhdGUpIHsNCi0JCWlmIChjYW5kaWRhdGU9PW51bGwpIHJldHVybiBmYWxzZTsNCi0JCVN0cmluZyBvcyA9IGNhbmRpZGF0ZS5nZXRPUygpOw0KLQkJU3RyaW5nIHdzID0gY2FuZGlkYXRlLmdldFdTKCk7DQotCQlTdHJpbmcgYXJjaCA9IGNhbmRpZGF0ZS5nZXRPU0FyY2goKTsNCi0JCVN0cmluZyBubCA9IGNhbmRpZGF0ZS5nZXROTCgpOw0KLQkJaWYgKG9zIT1udWxsICYmICFpc01hdGNoaW5nKG9zLCBTaXRlTWFuYWdlci5nZXRPUygpKSkgcmV0dXJuIGZhbHNlOw0KLQkJaWYgKHdzIT1udWxsICYmICFpc01hdGNoaW5nKHdzLCBTaXRlTWFuYWdlci5nZXRXUygpKSkgcmV0dXJuIGZhbHNlOw0KLQkJaWYgKGFyY2ghPW51bGwgJiYgIWlzTWF0Y2hpbmcoYXJjaCwgU2l0ZU1hbmFnZXIuZ2V0T1NBcmNoKCkpKSByZXR1cm4gZmFsc2U7DQotCQlpZiAobmwhPW51bGwgJiYgIWlzTWF0Y2hpbmdMb2NhbGUobmwsIFNpdGVNYW5hZ2VyLmdldE5MKCkpKSByZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogDQotCSAqLwkNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nKFN0cmluZyBjYW5kaWRhdGVWYWx1ZXMsIFN0cmluZyBzaXRlVmFsdWVzKSB7DQotCQlpZiAoc2l0ZVZhbHVlcz09bnVsbCkgcmV0dXJuIGZhbHNlOw0KLQkJaWYgKCIqIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQNCi0JCWlmICgiIi5lcXVhbHMoY2FuZGlkYXRlVmFsdWVzKSkgcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQNCi0JCXNpdGVWYWx1ZXMgPSBzaXRlVmFsdWVzLnRvVXBwZXJDYXNlKCk7CQkNCi0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihjYW5kaWRhdGVWYWx1ZXMsICIsIik7IC8vJE5PTi1OTFMtMSQNCi0JCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgew0KLQkJCVN0cmluZyB0b2tlbiA9IHN0b2submV4dFRva2VuKCkudG9VcHBlckNhc2UoKTsNCi0JCQlpZiAoc2l0ZVZhbHVlcy5pbmRleE9mKHRva2VuKSE9LTEpIHJldHVybiB0cnVlOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCQ0KLQkvKioNCi0JICogDQotCSAqLwkNCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01hdGNoaW5nTG9jYWxlKFN0cmluZyBjYW5kaWRhdGVWYWx1ZXMsIFN0cmluZyBsb2NhbGUpIHsNCi0JCWlmIChsb2NhbGU9PW51bGwpIHJldHVybiBmYWxzZTsNCi0JCWlmICgiKiIuZXF1YWxzKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkDQotCQlpZiAoIiIuZXF1YWxzKGNhbmRpZGF0ZVZhbHVlcykpIHJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkDQotCQkNCi0JCWxvY2FsZSA9IGxvY2FsZS50b1VwcGVyQ2FzZSgpOw0KLQkJY2FuZGlkYXRlVmFsdWVzID0gY2FuZGlkYXRlVmFsdWVzLnRvVXBwZXJDYXNlKCk7CQ0KLQkJU3RyaW5nVG9rZW5pemVyIHN0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNhbmRpZGF0ZVZhbHVlcywgIiwiKTsgLy8kTk9OLU5MUy0xJA0KLQkJd2hpbGUgKHN0b2suaGFzTW9yZVRva2VucygpKSB7DQotCQkJU3RyaW5nIGNhbmRpZGF0ZSA9IHN0b2submV4dFRva2VuKCk7DQotCQkJaWYgKGxvY2FsZS5pbmRleE9mKGNhbmRpZGF0ZSkgPT0gMCkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJaWYgKGNhbmRpZGF0ZS5pbmRleE9mKGxvY2FsZSkgPT0gMCkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JDQotLyoqDQotICogd3JpdGUgWE1MIGZpbGUNCi0gKi8NCi1wdWJsaWMgc3RhdGljIGNsYXNzIFdyaXRlciB7DQotDQotCXByaXZhdGUgUHJpbnRXcml0ZXIgdzsNCi0JcHJpdmF0ZSBPdXRwdXRTdHJlYW0gb3V0Ow0KLQlwcml2YXRlIE91dHB1dFN0cmVhbVdyaXRlciBvdXRXcml0ZXI7DQotCXByaXZhdGUgQnVmZmVyZWRXcml0ZXIgYnVmZldyaXRlcjsNCi0JcHJpdmF0ZSBTdHJpbmcgZW5jb2Rpbmc7DQotDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JcHJpdmF0ZSBXcml0ZXIoKSB7DQotCQlzdXBlcigpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBpbml0KEZpbGUgZmlsZSwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uew0KLQkJdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOw0KLQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7DQotCQlvdXRXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dCwgZW5jb2RpbmcpOyAvLyROT04tTkxTLTEkDQotCQlidWZmV3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG91dFdyaXRlcik7DQotCQl3ID0gbmV3IFByaW50V3JpdGVyKGJ1ZmZXcml0ZXIpOw0KLQl9DQotDQotCQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIHdyaXRlKElXcml0YWJsZSBlbGVtZW50KSB7DQotCQl3LnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIrZW5jb2RpbmcrIlwiPz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotCQl3LnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkDQotCQl3LnByaW50bG4oIjwhLS0gRmlsZSB3cml0dGVuIGJ5IFVwZGF0ZSBtYW5hZ2VyIDIuMCAtLT4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJdy5wcmludGxuKCI8IS0tIGNvbW1lbnRzIGluIHRoaXMgZmlsZSBhcmUgbm90IHByZXNlcnZlZCAtLT4iKTsgLy8kTk9OLU5MUy0xJA0KLQkJdy5wcmludGxuKCIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJICgoSVdyaXRhYmxlKSBlbGVtZW50KS53cml0ZSgwLCB3KTsNCi0JCWNsb3NlKCk7DQotCX0NCi0JDQotCS8qDQotCSAqIA0KLQkgKi8NCi0JIHB1YmxpYyB2b2lkIGNsb3NlKCl7DQotCSAJCXcuY2xvc2UoKTsNCi0JIH0NCi0NCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZEVzY2FwZWRDaGFyKFN0cmluZ0J1ZmZlciBidWZmZXIsIGNoYXIgYykgew0KLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZ2V0UmVwbGFjZW1lbnQoYyk7DQotCQlpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgew0KLQkJCWJ1ZmZlci5hcHBlbmQoJyYnKTsNCi0JCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VtZW50KTsNCi0JCQlidWZmZXIuYXBwZW5kKCc7Jyk7DQotCQl9IGVsc2Ugew0KLQkJCWlmICgoYyA+PSAnICcgJiYgYyA8PSAweDdFKSB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInIHx8IGMgPT0gJ1x0Jykgew0KLQkJCQlidWZmZXIuYXBwZW5kKGMpOw0KLQkJCX0gZWxzZSB7DQotCQkJCWJ1ZmZlci5hcHBlbmQoIiYjIik7IC8vJE5PTi1OTFMtMSQNCi0JCQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMpKTsNCi0JCQkJYnVmZmVyLmFwcGVuZCgnOycpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHhtbFNhZmUoU3RyaW5nIHMpIHsNCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKyAxMCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7ICsraSkNCi0JCQlhcHBlbmRFc2NhcGVkQ2hhcihyZXN1bHQsIHMuY2hhckF0KGkpKTsNCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCi0JfQ0KLQkNCi0JLyoNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVwbGFjZW1lbnQoY2hhciBjKSB7DQotCQkvLyBFbmNvZGUgc3BlY2lhbCBYTUwgY2hhcmFjdGVycyBpbnRvIHRoZSBlcXVpdmFsZW50IGNoYXJhY3RlciByZWZlcmVuY2VzLg0KLQkJLy8gVGhlc2UgZml2ZSBhcmUgZGVmaW5lZCBieSBkZWZhdWx0IGZvciBhbGwgWE1MIGRvY3VtZW50cy4NCi0JCXN3aXRjaCAoYykgew0KLQkJCWNhc2UgJzwnIDoNCi0JCQkJcmV0dXJuICJsdCI7IC8vJE5PTi1OTFMtMSQNCi0JCQljYXNlICc+JyA6DQotCQkJCXJldHVybiAiZ3QiOyAvLyROT04tTkxTLTEkDQotCQkJY2FzZSAnIicgOg0KLQkJCQlyZXR1cm4gInF1b3QiOyAvLyROT04tTkxTLTEkDQotCQkJY2FzZSAnXCcnIDoNCi0JCQkJcmV0dXJuICJhcG9zIjsgLy8kTk9OLU5MUy0xJA0KLQkJCWNhc2UgJyYnIDoNCi0JCQkJcmV0dXJuICJhbXAiOyAvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCi0JcHVibGljIHN0YXRpYyBXcml0ZXIgZ2V0V3JpdGVyKEZpbGUgZmlsZSxTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gew0KLQkJaWYgKHdyaXRlcj09bnVsbCkgd3JpdGVyID0gbmV3IFdyaXRlcigpOw0KLQkJd3JpdGVyLmluaXQoZmlsZSxlbmNvZGluZyk7DQotCQlyZXR1cm4gd3JpdGVyOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTYW1lVGltZXN0YW1wKFVSTCB1cmwsIGxvbmcgdGltZXN0YW1wKSB7CQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOw0KLQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQocmVzb2x2ZWRVUkwpOw0KLQkJCWxvbmcgcmVtb3RlTGFzdE1vZGlmaWVkID0gcmVzcG9uc2UuZ2V0TGFzdE1vZGlmaWVkKCk7DQotCQkJLy8gMiBzZWNvbmRzIHRvbGVyYW5jZSwgYXMgc29tZSBPUydzIG1heSByb3VuZCB1cCB0aGUgdGltZSBzdGFtcA0KLQkJCS8vIHRvIHRoZSBjbG9zZXN0IHNlY29uZC4gRm9yIHNhZmV0eSwgd2UgbWFrZSBpdCAyIHNlY29uZHMuDQotCQkJcmV0dXJuIE1hdGguYWJzKHJlbW90ZUxhc3RNb2RpZmllZCAtIHRpbWVzdGFtcCkvMTAwMCA8PSAyOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBUaGUgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBsb29rdXAga2V5Lg0KLQkgKiBAcGFyYW0ga2V5IG9wdGlvbmFsIGxvb2t1cCBrZXksIG9yIDxjb2RlPm51bGw8L2NvZGU+Lg0KLQkgKiBAcGFyYW0gdGVtcCB0aGUgbG9jYWwgd29ya2luZyBmaWxlDQotCSAqLw0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIG1hcExvY2FsRmlsZUZyYWdtZW50KFN0cmluZyBrZXksIEZpbGVGcmFnbWVudCB0ZW1wKSB7DQotCQkvLyBjcmVhdGUgZmlsZSBhc3NvY2lhdGlvbiANCi0JCWlmIChrZXkgIT0gbnVsbCkgew0KLQkJCWlmIChsb2NhbEZpbGVGcmFnbWVudE1hcCA9PSBudWxsKQ0KLQkJCQlsb2NhbEZpbGVGcmFnbWVudE1hcCA9IG5ldyBIYXNoTWFwKCk7DQotCQkJbG9jYWxGaWxlRnJhZ21lbnRNYXAucHV0KGtleSwgdGVtcCk7DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIFRoZSBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIGxvb2t1cCBrZXkuDQotCSAqIEBwYXJhbSBrZXkgb3B0aW9uYWwgbG9va3VwIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4uDQotCSAqLw0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHVuTWFwTG9jYWxGaWxlRnJhZ21lbnQoU3RyaW5nIGtleSkgew0KLQkJLy8gcmVtb3ZlIGZpbGUgYXNzb2NpYXRpb24gDQotCQlpZiAoa2V5ICE9IG51bGwgJiYgbG9jYWxGaWxlRnJhZ21lbnRNYXAgIT1udWxsKSB7DQotCQkJbG9jYWxGaWxlRnJhZ21lbnRNYXAucmVtb3ZlKGtleSk7DQotCQl9DQotCX0NCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgcHJldmlvdXNseSBjYWNoZWQgbG9jYWwgZmlsZSAoaW4gdGVtcG9yYXJ5IGFyZWEpIG1hdGNoaW5nIHRoZQ0KLQkgKiBzcGVjaWZpZWQga2V5LiANCi0JICogDQotCSAqIEBwYXJhbSBrZXkgbG9va3VwIGtleQ0KLQkgKiBAcmV0dXJuIGNhY2hlZCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPi4NCi0JICovDQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEZpbGVGcmFnbWVudCBsb29rdXBMb2NhbEZpbGVGcmFnbWVudChTdHJpbmcga2V5KSB7DQotCQlpZiAobG9jYWxGaWxlRnJhZ21lbnRNYXAgPT0gbnVsbCkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiAoRmlsZUZyYWdtZW50KSBsb2NhbEZpbGVGcmFnbWVudE1hcC5nZXQoa2V5KTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvcGllcyBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiBOZWl0aGVyIHN0cmVhbQ0KLQkgKiBpcyBjbG9zZWQgYXMgcGFydCBvZiB0aGlzIG9wZXJhdGlvbi4NCi0JICogDQotCSAqIEBwYXJhbSBpcyBpbnB1dCBzdHJlYW0NCi0JICogQHBhcmFtIG9zIG91dHB1dCBzdHJlYW0NCi0JICogQHBhcmFtIG1vbml0b3IgcHJvZ3Jlc3MgbW9uaXRvcg0KLSAgICAgKiBAcGFyYW0gZXhwZWN0ZWRMZW5ndGggLSBpZiA+IDAsIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSBJbnB1dFN0cmVhbSB3aWxsIGJlIHZlcmlmaWVkDQotCSAqIEBAcmV0dXJuIHRoZSBvZmZzZXQgaW4gdGhlIGlucHV0IHN0cmVhbSB3aGVyZSBjb3B5aW5nIHN0b3BwZWQuIFJldHVybnMgLTEgaWYgZW5kIG9mIGlucHV0IHN0cmVhbSBpcyByZWFjaGVkLg0KLQkgKiBAc2luY2UgMi4wDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGxvbmcgY29weShJbnB1dFN0cmVhbSBpcywgT3V0cHV0U3RyZWFtIG9zLCBJbnN0YWxsTW9uaXRvciBtb25pdG9yLCBsb25nIGV4cGVjdGVkTGVuZ3RoKSB7DQotCQlieXRlW10gYnVmID0gZ2V0QnVmZmVyKCk7DQotCQlsb25nIG9mZnNldD0wOw0KLQkJdHJ5IHsNCi0JCQlpbnQgbGVuID0gaXMucmVhZChidWYpOw0KLQkJCWludCBuZXh0SW5jcmVtZW50ID0gMDsNCi0JCQl3aGlsZSAobGVuICE9IC0xKSB7DQotCQkJCW9zLndyaXRlKGJ1ZiwgMCwgbGVuKTsNCi0JCQkJCW9mZnNldCArPSBsZW47DQotCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsNCi0JCQkJCW5leHRJbmNyZW1lbnQgKz0gbGVuOw0KLQkJCQkJLy8gdXBkYXRlIG1vbml0b3IgcGVyaW9kaWNhbGx5DQotCQkJCQlpZiAobmV4dEluY3JlbWVudCA+PSBJTkNSRU1FTlRfU0laRSl7IAkNCi0JCQkJCQltb25pdG9yLmluY3JlbWVudENvdW50KG5leHRJbmNyZW1lbnQpOw0KLQkJCQkJCW5leHRJbmNyZW1lbnQgPSAwOw0KLQkJCQkJfQ0KLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCQkJcmV0dXJuIG9mZnNldDsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoZXhwZWN0ZWRMZW5ndGggPiAwICYmIG9mZnNldCA9PSBleHBlY3RlZExlbmd0aCkgew0KLQkJCQkJLy8gZXZlcnl0aGluZyByZWFkIGRvIG5vdCByZXR1cm4gb2Zmc2V0LCBvdGhlcndpc2UgdHJ5aW5nDQotCQkJCQkvLyB0byByZWFkIGFnYWluIGZyb20gdGhpcyBvZmZzZXQgd2lsbCByZXN1bHQgaW4gSFRUUCA0MTYNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJCQ0KLQkJCQlsZW4gPSBpcy5yZWFkKGJ1Zik7DQotCQkJfQ0KLQkJCWlmIChuZXh0SW5jcmVtZW50ID4gMCAmJiBtb25pdG9yICE9IG51bGwpDQotCQkJCW1vbml0b3IuaW5jcmVtZW50Q291bnQobmV4dEluY3JlbWVudCk7DQotCQkJaWYoZXhwZWN0ZWRMZW5ndGg+MCAmJiBvZmZzZXQhPWV4cGVjdGVkTGVuZ3RoKQ0KLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oUG9saWN5LmJpbmQoIlVwZGF0ZU1hbmFnZXJVdGlscy5pbnB1dFN0cmVhbUVuZGVkIiwgU3RyaW5nLnZhbHVlT2Yob2Zmc2V0KSwgU3RyaW5nLnZhbHVlT2YoZXhwZWN0ZWRMZW5ndGgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkDQotCQkJcmV0dXJuIC0xOw0KLQkJfSBjYXRjaChJT0V4Y2VwdGlvbiBlKXsNCi0JCQkvLyBMb2cgdGhlIGFjdHVhbCBlcnJvciwgYXMgdGhpcyBpcyBubyBsb25nZXINCi0JCQkvLyBwYXNzZWQgdXAgdGhlIGNhbGxpbmcgc3RhY2sNCi0JCQlVcGRhdGVDb3JlLmxvZyhQb2xpY3kuYmluZCgiVXBkYXRlTWFuYWdlclV0aWxzLmNvcHkiKSArIG9mZnNldCwgZSk7IC8vJE5PTi1OTFMtMSQNCi0JCQlyZXR1cm4gb2Zmc2V0Ow0KLQkJfSBmaW5hbGx5IHsNCi0JCQlmcmVlQnVmZmVyKGJ1Zik7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyBjbGFzcyBDb3B5RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0JCUV4Y2VwdGlvbiByb290RXhjZXB0aW9uOw0KLQkJaW50IGJ5dGVzQ29waWVkOw0KLQ0KLQkJLyoqDQotCQkgKiANCi0JCSAqLw0KLQkJcHVibGljIENvcHlFeGNlcHRpb24oRXhjZXB0aW9uIHJvb3RFeGNlcHRpb24sIGludCBieXRlc0NvcGllZCkgew0KLQkJCXN1cGVyKCk7DQotCQkJdGhpcy5yb290RXhjZXB0aW9uPSByb290RXhjZXB0aW9uOw0KLQkJCXRoaXMuYnl0ZXNDb3BpZWQ9Ynl0ZXNDb3BpZWQ7DQotCQl9DQotCQkvKioNCi0JCSAqIEluc3RhbmNlIG9mIElPRXhjZXB0aW9uIG9yIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uDQotCQkgKiBAcmV0dXJuDQotCQkgKi8NCi0JCXB1YmxpYyBFeGNlcHRpb24gZ2V0Um9vdEV4Y2VwdGlvbigpew0KLQkJCXJldHVybiByb290RXhjZXB0aW9uOw0KLQkJfQ0KLQkJcHVibGljIGludCBnZXRCeXRlc0NvcGllZCgpew0KLQkJCXJldHVybiBieXRlc0NvcGllZDsNCi0JCX0NCi0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGJ5dGVbXSBnZXRCdWZmZXIoKSB7DQotCQlpZiAoYnVmZmVyUG9vbCA9PSBudWxsKSB7DQotCQkJcmV0dXJuIG5ldyBieXRlW0JVRkZFUl9TSVpFXTsNCi0JCX0NCi0NCi0JCXRyeSB7DQotCQkJcmV0dXJuIChieXRlW10pIGJ1ZmZlclBvb2wucG9wKCk7DQotCQl9IGNhdGNoIChFbXB0eVN0YWNrRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIGZyZWVCdWZmZXIoYnl0ZVtdIGJ1Zikgew0KLQkJaWYgKGJ1ZmZlclBvb2wgPT0gbnVsbCkNCi0JCQlidWZmZXJQb29sID0gbmV3IFN0YWNrKCk7DQotCQlidWZmZXJQb29sLnB1c2goYnVmKTsNCi0JfQ0KLQkNCi0JDQotCS8qKg0KLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBmcmFnbWVudHMuIFplcm8gbGVuZ3RoIGlmIG5vIGZyYWdtZW50cy4NCi0JICogQHBhcmFtIGJ1bmRsZSB0aGUgYnVuZGxlIHRvIGdldCBmcmFnbWVudHMgZm9yDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIEZyYWdtZW50RW50cnlbXSBnZXRGcmFnbWVudHMoQnVuZGxlIGJ1bmRsZSkgew0KLQkJUGFja2FnZUFkbWluIHBrZ0FkbWluID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQYWNrYWdlQWRtaW4oKTsNCi0JCUJ1bmRsZVtdIGZyYWdtZW50QnVuZGxlcyA9IHBrZ0FkbWluLmdldEZyYWdtZW50cyhidW5kbGUpOw0KLQkJaWYgKGZyYWdtZW50QnVuZGxlcyA9PSBudWxsKSANCi0JCQlyZXR1cm4gbm9GcmFnbWVudHM7DQotCQkNCi0JCUZyYWdtZW50RW50cnlbXSBmcmFnbWVudHMgPSBuZXcgRnJhZ21lbnRFbnRyeVtmcmFnbWVudEJ1bmRsZXMubGVuZ3RoXTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJZnJhZ21lbnRzW2ldID0gbmV3IEZyYWdtZW50RW50cnkoKFN0cmluZykgZnJhZ21lbnRCdW5kbGVzW2ldDQotCQkJCQkuZ2V0SGVhZGVycygpLmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSksDQotCQkJCQkoU3RyaW5nKSBmcmFnbWVudEJ1bmRsZXNbaV0uZ2V0SGVhZGVycygpLmdldCgNCi0JCQkJCQkJQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSwgUGxhdGZvcm0NCi0JCQkJCQkJLmdldFJlc291cmNlU3RyaW5nKGZyYWdtZW50QnVuZGxlc1tpXSwNCi0JCQkJCQkJCQkoU3RyaW5nKSBmcmFnbWVudEJ1bmRsZXNbaV0uZ2V0SGVhZGVycygpDQotCQkJCQkJCQkJCQkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpLA0KLQkJCQkJZnJhZ21lbnRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCkpOw0KLQkJfQ0KLQkJcmV0dXJuIGZyYWdtZW50czsJDQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVQcmVmZXJlbmNlc0luaXRpYWxpemVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxNzVkYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLQotLyoqCi0gKiBDbGFzcyB0byBpbml0aWFsaXplIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIFVwZGF0ZSBjb3JlIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFVwZGF0ZVByZWZlcmVuY2VzSW5pdGlhbGl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZXMgc2V0dGluZ3MgZm9yIHRoaXMgcGx1Zy1pbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgc29tZXRpbWUgYWZ0ZXIgdGhlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHRoaXMKLQkgKiBwbHVnLWluIGlzIGNyZWF0ZWQuIERlZmF1bHQgdmFsdWVzIGFyZSBuZXZlciBzdG9yZWQgaW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlczsgdGhleSBtdXN0IGJlIGZpbGxlZCBpbiBlYWNoIHRpbWUuIFRoaXMgbWV0aG9kIHByb3ZpZGVzIHRoZQotCSAqIG9wcG9ydHVuaXR5IHRvIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgdmFsdWVzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuIEEgc3ViY2xhc3MgdGhhdCBuZWVkcwotCSAqIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgaXRzIHByZWZlcmVuY2VzIG11c3QgcmVpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0JICogRGVmYXVsdCB2YWx1ZXMgc2V0IGF0IGEgbGF0ZXIgcG9pbnQgd2lsbCBvdmVycmlkZSBhbnkgZGVmYXVsdCBvdmVycmlkZQotCSAqIHNldHRpbmdzIHN1cHBsaWVkIGZyb20gb3V0c2lkZSB0aGUgcGx1Zy1pbiAocHJvZHVjdCBjb25maWd1cmF0aW9uIG9yCi0JICogcGxhdGZvcm0gc3RhcnQgdXApLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlQbHVnaW4gcGx1Z2luID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKTsKLQkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFLCB0cnVlKTsJCQotCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUsIFVwZGF0ZUNvcmUuREVGQVVMVF9ISVNUT1JZKTsKLQkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TLCBVcGRhdGVDb3JlLkVRVUlWQUxFTlRfVkFMVUUpOwotCQkKLQkJLy8gSWYgcHJveHkgaG9zdCBhbmQgcG9ydCBhcmUgc2V0IGFzIHN5c3RlbSBwcm9wZXJ0aWVzLCB1c2UgdGhlbSBhcyBkZWZhdWx0cwotCQlTdHJpbmcgcHJveHlIb3N0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJodHRwLnByb3h5SG9zdCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwcm94eUhvc3QgIT0gbnVsbCAmJiBwcm94eUhvc3QudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIHByb3h5UG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiaHR0cC5wcm94eVBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHByb3h5UG9ydCA9PSBudWxsIHx8IHByb3h5UG9ydC50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQlwcm94eVBvcnQgPSAiODAiOyAvLyROT04tTkxTLTEkCi0JCQlwbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXREZWZhdWx0KFVwZGF0ZUNvcmUuSFRUUF9QUk9YWV9FTkFCTEUsIHRydWUpOwotCQkJcGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChVcGRhdGVDb3JlLkhUVFBfUFJPWFlfSE9TVCwgcHJveHlIb3N0KTsKLQkJCXBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldERlZmF1bHQoVXBkYXRlQ29yZS5IVFRQX1BST1hZX1BPUlQsIHByb3h5UG9ydCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1ZvbHVtZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9Wb2x1bWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmOTI4Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1ZvbHVtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsKLWltcG9ydCBqYXZhLmlvLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBhIElWb2x1bWUKLSAqLwotcHVibGljIGNsYXNzIFZvbHVtZSBleHRlbmRzIE1vZGVsT2JqZWN0IGltcGxlbWVudHMgSVZvbHVtZSB7Ci0KLQlwcml2YXRlIGxvbmcgc2l6ZTsKLQlwcml2YXRlIGludCB0eXBlOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgRmlsZSByb290OwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFZvbHVtZS4KLQkgKi8KLQlwdWJsaWMgVm9sdW1lKEZpbGUgcm9vdCxTdHJpbmcgbGFiZWwsaW50IHR5cGUsbG9uZyBzaXplKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5zaXplID0gc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWb2x1bWUjZ2V0RnJlZVNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRGcmVlU3BhY2UoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSVZvbHVtZSNnZXRGaWxlKCkKLQkgKi8KLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYXJnMCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1ZTI0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5zdGFsbCBVcGRhdGUgQ29yZSBQcm9wZXJ0aWVzIEZpbGUKLSMgCi0KLUJhc2VTaXRlRmFjdG9yeS5DYW5ub3RSZXRyaXZlUGFyZW50RGlyZWN0b3J5PVVuYWJsZSB0byByZXRyaWV2ZSBwYXJlbnQgZGlyZWN0b3J5IGZvciBVUkwgXCJ7MH1cIi4KLUJhc2VTaXRlRmFjdG9yeS5DYW5ub3RFbmNvZGVVUkw9IFVuYWJsZSB0byBlbmNvZGUgVVJMIFwiezB9XCIuCi1Db250ZW50UmVmZXJlbmNlLlVuYWJsZVRvQ3JlYXRlSW5wdXRTdHJlYW09IFVuYWJsZSB0byBjcmVhdGUgYW4gaW5wdXQgc3RyZWFtIGZvciB0aGUgcmVmZXJlbmNlIFwiezB9XCIuCi1Db250ZW50UmVmZXJlbmNlLlVuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNGaWxlPSBVbmFibGUgdG8gcmV0dXJuIHJlZmVyZW5jZSBcInswfVwiIGFzIEZpbGUuCi1Db250ZW50UmVmZXJlbmNlLlVuYWJsZVRvUmV0dXJuUmVmZXJlbmNlQXNVUkw9IFVuYWJsZSB0byByZXR1cm4gcmVmZXJlbmNlIFwiezB9XCIgYXMgVVJMLgotQ29udGVudFJlZmVyZW5jZS5IdHRwTm9rPSBTZXJ2ZXIgcmV0dXJuZWQgSFRUUCByZXNwb25zZSBjb2RlOiBcInswfSB7MX1cIiBmb3IgVVJMOiB7Mn0uCi1Db250ZW50UmVmZXJlbmNlLkZpbGVEb2VzTm90RXhpc3Q9VGhlIGZpbGUgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgZmlsZSBzeXN0ZW0uCi1GZWF0dXJlLlNpdGVBbHJlYWR5U2V0PSBJbnRlcm5hbCBFcnJvcjogU2l0ZSBhbHJlYWR5IHNldCBmb3IgdGhlIGZlYXR1cmUgXCJ7MH1cIi4KLUZlYXR1cmUuVGFza0luc3RhbGxGZWF0dXJlRmlsZXM9IEluc3RhbGxpbmcgZmVhdHVyZSBmaWxlczogCi1GZWF0dXJlLlRhc2tJbnN0YWxsUGx1Z2luRmlsZXM9IEluc3RhbGxpbmcgcGx1Zy1pbiBcInswfVwiIGZpbGVzOgotRmVhdHVyZS5UYXNrSW5zdGFsbE5vblBsdWdpbnNGaWxlcz0gSW5zdGFsbGluZyBub24tcGx1Zy1pbiBmaWxlczogCi1GZWF0dXJlLk5vQ29udGVudFByb3ZpZGVyPSBJbnRlcm5hbCBFcnJvci4gVGhlIGZlYXR1cmUgXCJ7MH1cIiBkb2VzIG5vdCBoYXZlIGEgY29udGVudCBwcm92aWRlci4KLUZlYXR1cmUuTm9GZWF0dXJlQ29udGVudENvbnN1bWVyPSBJbnRlcm5hbCBFcnJvci4gVGhlIEZlYXR1cmUgXCJ7MH1cIiBkb2VzIG5vdCBoYXZlIGEgY29udGVudCBjb25zdW1lci4KLUZlYXR1cmUuTm9VUkw9IFVua25vd24gVVJMLgotRmVhdHVyZS5GZWF0dXJlVmVyc2lvblRvU3RyaW5nPSBGZWF0dXJlOiBcInswfVwiIFZlcnNpb246IFwiezF9XCIuCi1GZWF0dXJlLkluc3RhbGxhdGlvbkNhbmNlbGxlZD0gSW5zdGFsbGF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZCBieSB0aGUgVXNlci4KLUZlYXR1cmUuVW5hYmxlVG9Jbml0aWFsaXplRmVhdHVyZVJlZmVyZW5jZT0gVW5hYmxlIHRvIGluaXRpYWxpemUgZmVhdHVyZSByZWZlcmVuY2UgZm9yIHZlcnNpb25lZCBpZGVudGlmaWVyIFwiezB9XCIuCi1GZWF0dXJlQ29udGVudFByb3ZpZGVyLkRvd25sb2FkaW5nPSBEb3dubG9hZGluZzoKLUZlYXR1cmVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZT0gVW5hYmxlIHRvIHJldHJpZXZlIHJlbW90ZSByZWZlcmVuY2UgXCJ7MH1cIi4KLUZlYXR1cmVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9DcmVhdGU9IFVuYWJsZSB0byBjcmVhdGUgbG9jYWwgZmlsZSBcInswfVwiLgotRmVhdHVyZUNvbnRlbnRQcm92aWRlci5FeGNlcHRpb25Eb3dubG9hZGluZyA9IEFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIGRvd25sb2FkaW5nIGZlYXR1cmUgZnJvbSBcInswfVwiLgotSW5zdGFsbEhhbmRsZXIudW5hYmxlVG9DcmVhdGVIYW5kbGVyID0gVW5hYmxlIHRvIGNyZWF0ZSBjdXN0b20gaW5zdGFsbCBoYW5kbGVyIGZvciBmZWF0dXJlIFwiezB9XCIuCi1JbnN0YWxsSGFuZGxlci5ub3RGb3VuZCA9IEN1c3RvbSBpbnN0YWxsIGhhbmRsZXIgcmVxdWlyZWQgYnkgZmVhdHVyZSBcInswfVwiIHdhcyBub3QgZm91bmQuCi1JbnN0YWxsSGFuZGxlci5pbnZhbGlkSGFuZGxlciA9IEZlYXR1cmUgXCJ7MH1cIiBjb250YWlucyBpbnZhbGlkIGN1c3RvbSBpbnN0YWxsIGhhbmRsZXIuCi1JbnN0YWxsSGFuZGxlci5jYWxsRXhjZXB0aW9uID0gRXJyb3IgcmVwb3J0ZWQgYnkgY3VzdG9tIGluc3RhbGwgaGFuZGxlciBmb3IgZmVhdHVyZSBcInswfVwiLgotSW5zdGFsbEhhbmRsZXIuZGVhY3RpdmF0ZWQgPSBDdXN0b20gaW5zdGFsbCBoYW5kbGVyIGZvciBmZWF0dXJlIFwiezB9XCIgZGVhY3RpdmF0ZWQgZHVlIHRvIGVycm9ycy4KLUluc3RhbGxIYW5kbGVyLmVycm9yID0gVW5hYmxlIHRvIGNvbXBsZXRlIGFjdGlvbiBmb3IgZmVhdHVyZSBcInswfVwiIGR1ZSB0byBlcnJvcnMuCi1JbnN0YWxsTW9uaXRvci5Eb3dubG9hZFNpemUgPSAoezB9SyBieXRlcykKLUluc3RhbGxNb25pdG9yLkRvd25sb2FkU2l6ZUxvbmcgPSAoezB9SyBvZiB7MX1LIGJ5dGVzKQotUmVjb25jaWxlci5hcHBOb3RGb3VuZCA9IEFwcGxpY2F0aW9uIFwiezB9XCIgbm90IGZvdW5kLgotSmFyQ29udGVudFJlZmVyZW5jZS5VbnBhY2tpbmc9IFVucGFja2luZzoKLVNpdGUuQ2Fubm90U2F2ZVNpdGVJbnRvPSBDYW5ub3Qgc2F2ZSBTaXRlIGluZm9ybWF0aW9uIGludG8gdGhlIEZpbGU6IFwiezB9XCIuCi1TaXRlLkNhbm5vdEZpbmRDYXRlZ29yeT0gVW5hYmxlIHRvIGZpbmQgY2F0ZWdvcnk6IFwiezB9XCIgaW4gU2l0ZTogXCJ7MX1cIi4KLVNpdGUuTm9DYXRlZ29yaWVzPSBUaGUgU2l0ZSBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzLgotU2l0ZS5Ob0NvbnRlbnRQcm92aWRlcj0gSW50ZXJuYWwgRXJyb3IuIENvbnRlbnQgUHJvdmlkZXIgbm90IHNldCBmb3IgU2l0ZTogXCJ7MH1cIi4KLVZlcnNpb25lZElkZW50aWZpZXIuSWRPclZlcnNpb25OdWxsPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGNyZWF0ZSBhbiBJZGVudGlmaWVyLiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb3IgdGhlIHZlcnNpb24gaXMgbnVsbCBvciBlbXB0eTogdW5pcXVlIGlkZW50aWZpZXI9XCJ7MH1cIiB2ZXJzaW9uPVwiezF9XCIuCi1TaXRlRmlsZS5DYW5ub3RSZW1vdmVQbHVnaW49IFVuYWJsZSB0byByZW1vdmUgcGx1Zy1pbjogXCJ7MH1cIiBmcm9tIFNpdGU6IFwiezF9XCIuCi1TaXRlRmlsZS5DYW5ub3RSZW1vdmVGZWF0dXJlPSBVbmFibGUgdG8gcmVtb3ZlIGZlYXR1cmU6IFwiezB9XCIgZnJvbSBTaXRlOiBcInsxfVwiLgotU2l0ZUZpbGUuVW5hYmxlVG9DcmVhdGVVUkw9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZvciBsb2NhdGlvbiBcInswfVwiLgotU2l0ZUZpbGUuUmVtb3Zpbmc9IFJlbW92aW5nOiAKLVNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLVNpdGVGaWxlRmFjdG9yeS5VbmFibGVUb0FjY2Vzc1NpdGU9IFVuYWJsZSB0byBhY2Nlc3Mgc2l0ZSAKLVNpdGVGaWxlRmFjdG9yeS5EaXJlY3RvcnlEb2VzTm90RXhpc3Q9VGhlIGRpcmVjdG9yeSBcInswfVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBmaWxlIHN5c3RlbS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLk5vRmVhdHVyZVRhZz0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5hYmxlIHRvIGZpbmQgcm9vdCBlbGVtZW50IFwiZmVhdHVyZVwiIGluIHRoZSBzdHJlYW0uCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5Xcm9uZ1BhcnNpbmdTdGFjaz0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5leHBlY3RlZCBQYXJzaW5nIFN0YWNrOiBcInswfVwiCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5Vbmtub3duRWxlbWVudD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVW5rbm93biBlbGVtZW50IFwiezB9XCIgaW4gcGFyc2luZyBzdGF0ZSBcInsxfVwiLiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFhNTCBmaWxlLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuVG9vTWFueVVSTHRhZz0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBcIlVSTFwiIGVsZW1lbnQgaW4gdGhlIFhNTCBzdHJlYW0uIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLlVua25vd25TdGFydFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmtub3duIHN0YXJ0IHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5JZE9yVmVyc2lvbkludmFsaWQ9IEVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvciB0aGUgdmVyc2lvbiBpcyBudWxsIG9yIGVtcHR5IGZvciB0aGUgU3RhdGU6IFwiezJ9XCI6IHVuaXF1ZSBpZGVudGlmaWVyPVwiezB9XCIgdmVyc2lvbj1cInsxfVwiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuTWlzc2luZ0lkPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGUgXCJpZFwiIHRhZyBvZiB0aGUgZWxlbWVudCBcInswfVwiIGlzIG51bGwgb3IgZW1wdHkuIFZhbHVlIGlzIHJlcXVpcmVkLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBQYXJzaW5nIHN0YWNrIGJhY2sgdG8gSW5pdGlhbCBTdGF0ZS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLkVsZW1lbnRBbHJlYWR5U2V0PSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBFbGVtZW50OiBcInswfVwiIGFscmVhZHkgc2V0IGZvciB0aGUgZmVhdHVyZS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLlN0YXRlSW5jbHVkZVdyb25nRWxlbWVudD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gU3RhdGU6IFwiezB9XCIgc2hvdWxkIG5vdCBpbmNsdWRlIEVsZW1lbnQgXCJ7MX1cIi4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLlJlcXVpcmVTdGF0ZVdpdGhvdXRJbXBvcnRFbGVtZW50PUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFN0YXRlOiBcInJlcXVpcmVcIiBtdXN0IGluY2x1ZGUgYXQgbGVhc3QgYW4gXCJpbXBvcnRcIiBlbGVtZW50LgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuTWlzc2luZ1BhdGNoVmVyc2lvbj1FcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBBdHRyaWJ1dGUgInZlcnNpb24iIG9mIHRoZSBlbGVtZW50ICJpbXBvcnQiIG11c3QgYmUgc2V0IHdoZW4gInBhdGNoIiBpcyBzZXQgdG8gInRydWUiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIud3JvbmdNYXRjaEZvclBhdGNoPUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIFdoZW4gYXR0cmlidXRlICJwYXRjaCIgb2YgdGhlIGVsZW1lbnQgImltcG9ydCIgaXMgc2V0IHRvICJ0cnVlIiwgdGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHRoZSAibWF0Y2giIGF0dHJpYnV0ZSBpcyAicGVyZmVjdCIuIAotRGVmYXVsdEZlYXR1cmVQYXJzZXIucGF0Y2hXaXRoUGx1Z2luPUVycm9yIHBhcnNpbmcgZmVhdHVyZSBzdHJlYW0uIEF0dHJpYnV0ZSAicGF0Y2giIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGZlYXR1cmVzLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuTXVsdGlwbGVQYXRjaEltcG9ydHM9RXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gU3RhdGU6ICJyZXF1aXJlIiBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgImltcG9ydCIgZWxlbWVudCB3aXRoIHRoZSBhdHRyaWJ1dGUgInBhdGNoIiBzZXQgdG8gInRydWUiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuVW5rbm93bkVuZFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBVbmtub3duIGVuZCBzdGF0ZSBcInswfVwiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuRXJyb3JQYXJzaW5nPSBFcnJvciBQYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBFcnJvcjogXCJ7MH1cIgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuRXJyb3JsaW5lQ29sdW1uTWVzc2FnZT0gRXJyb3IgUGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gRWxlbWVudCBcInswfVwiIGxpbmU6IFwiezF9XCIgY29sdW1uOlwiezJ9XCIuIEVycm9yOiBcInszfVwiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuRXJyb3JQYXJzaW5nRmVhdHVyZT0gRXJyb3IgUGFyc2luZyBmZWF0dXJlIHN0cmVhbS4KLURlZmF1bHRGZWF0dXJlUGFyc2VyLlVua25vd25TdGF0ZT0gVW5rbm93biBTdGF0ZSBcInswfVwiLgotRGVmYXVsdEZlYXR1cmVQYXJzZXIuTm9MaWNlbnNlVGV4dD0gRXJyb3IgcGFyc2luZyBmZWF0dXJlIHN0cmVhbS4gU3RhdGU6IFwibGljZW5zZVwiIG11c3QgaW5jbHVkZSBzb21lIHRleHQuCi1EZWZhdWx0RmVhdHVyZVBhcnNlci5QbHVnaW5BbmRGZWF0dXJlSWQ9T25lIEltcG9ydCBzdGF0ZW1lbnQgaXMgaW5jb3JyZWN0OiBCb3RoIGZlYXR1cmUgYW5kIHBsdWctaW4gSUQgYXJlIGVpdGhlciBudWxsIG9yIHNwZWNpZmllZC4KLVNpdGVDb250ZW50UHJvdmlkZXIuRXJyb3JDcmVhdGluZ1VSTEZvckFyY2hpdmVJRD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBjcmVhdGUgVVJMIGZvciBBcmNoaXZlIElkZW50aWZpZXIgXCJ7MH1cIiBvbiBTaXRlIFwiezF9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlci5Ob1NpdGVUYWc9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVuYWJsZSB0byBmaW5kIHJvb3QgZWxlbWVudCBcInNpdGVcIiBpbiB0aGUgc3RyZWFtLgotRGVmYXVsdFNpdGVQYXJzZXIuV3JvbmdQYXJzaW5nU3RhY2s9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVuZXhwZWN0ZWQgUGFyc2luZyBTdGFjazogXCJ7MH1cIgotRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93bkVsZW1lbnQ9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gZWxlbWVudCBcInswfVwiIGluIHBhcnNpbmcgc3RhdGUgXCJ7MX1cIi4gQ2hlY2sgdGhlIHZhbGlkaXR5IG9mIHRoZSBYTUwgZmlsZS4KLURlZmF1bHRTaXRlUGFyc2VyLlVua25vd25TdGFydFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmtub3duIHN0YXJ0IHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlci5NaXNzaW5nPSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBUaGUgXCJ7MH1cIiB0YWcgb2YgdGhlIGVsZW1lbnQgXCJ7MX1cIiBpcyBudWxsIG9yIGVtcHR5LiBWYWx1ZSBpcyByZXF1aXJlZC4KLURlZmF1bHRTaXRlUGFyc2VyLlBhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZT0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gUGFyc2luZyBzdGFjayBiYWNrIHRvIEluaXRpYWwgU3RhdGUuCi1EZWZhdWx0U2l0ZVBhcnNlci5FbGVtZW50QWxyZWFkeVNldD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudDogXCJ7MH1cIiBhbHJlYWR5IHNldCBmb3IgdGhlIFNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlci5DYXRlZ29yeUFscmVhZHlTZXQ9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVsZW1lbnQ6IFwiezB9XCI6IFwiezF9XCIgYWxyZWFkeSBzZXQgZm9yIHRoZSBTaXRlLgotRGVmYXVsdFNpdGVQYXJzZXIuVW5rbm93bkVuZFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBVbmtub3duIGVuZCBzdGF0ZSBcInswfVwiLgotRGVmYXVsdFNpdGVQYXJzZXIuRXJyb3JQYXJzaW5nPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLiBFcnJvcjogXCJ7MH1cIgotRGVmYXVsdFNpdGVQYXJzZXIuRXJyb3JsaW5lQ29sdW1uTWVzc2FnZT0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudCBcInswfVwiIGxpbmU6IFwiezF9XCIgY29sdW1uOlwiezJ9XCIuIEVycm9yOiBcInszfVwiLgotRGVmYXVsdFNpdGVQYXJzZXIuRXJyb3JQYXJzaW5nU2l0ZT0gRXJyb3IgUGFyc2luZyBzaXRlIHN0cmVhbS4KLURlZmF1bHRTaXRlUGFyc2VyLlVua25vd25TdGF0ZT0gVW5rbm93biBTdGF0ZSBcInswfVwiLgotRGVmYXVsdFNpdGVQYXJzZXIuSW52YWxpZFhNTFN0cmVhbT0gVGhlIFhNTCBzdHJlYW0gaXMgbm90IGEgdmFsaWQgZGVmYXVsdCBcInNpdGUueG1sXCIgZmlsZS4gVGhlIHJvb3QgdGFnIGlzIG5vdCBzaXRlLgotTW9kZWxPYmplY3QuTW9kZWxSZWFkT25seT0gSW50ZXJuYWwgRXJyb3IuIFRoZSBNb2RlbCBPYmplY3QgaXMgcmVhZC1vbmx5LgotU2l0ZU1vZGVsT2JqZWN0LkVycm9yUGFyc2luZ1NpdGVTdHJlYW09IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uCi1TaXRlTW9kZWxPYmplY3QuRXJyb3JBY2Nlc3NpbmdTaXRlU3RyZWFtPSBFcnJvciBhY2Nlc3Npbmcgc2l0ZSBzdHJlYW0uCi1JbnN0YWxsQ29uZmlndXJhdGlvbi5QYXJzaW5nRXJyb3JEdXJpbmdDcmVhdGlvbj0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBcInswfVwiOiBcInsxfVwiLgotSW5zdGFsbENvbmZpZ3VyYXRpb24uRXJyb3JEdXJpbmdGaWxlQWNjZXNzPSBFcnJvciBhY2Nlc3NpbmcgZmlsZTogXCJ7MH1cIi4KLVBhcnNlci5VbmFibGVUb0NyZWF0ZVVSTD0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzdHJlYW0uIENoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgVVJMcy4KLVBhcnNlci5JbnRlcm5hbEVycm9yPSBFcnJvciBQYXJzaW5nIFN0cmVhbS4gQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIFwiezB9XCIuCi1QYXJzZXIuVW5hYmxlVG9SZXNvbHZlVVJMPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHN0cmVhbS4gVW5hYmxlIHRvIHJlc29sdmUgVVJMIFwiezB9XCIuCi1JbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5GZWF0dXJlUmVmZXJlbmNlTm9VUkw9IEVycm9yIFBhcnNpbmcgU3RyZWFtLiBBIGZlYXR1cmUgcmVmZXJlbmNlIGVsZW1lbnQgZG9lcyBub3QgaGF2ZSBhIFVSTCB0YWcuIFZhbHVlIGlzIHJlcXVpcmVkLgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuRmlsZURvZXNOb3RFeGlzdD0gVGhlIGZpbGUgXCJ7MH1cIiBkb2VzIG5vdCBleGlzdC4KLUZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLkludmFsaWREaXJlY3Rvcnk9IFRoZSBwYXRoIFwiezB9XCIgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5LgotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9DcmVhdGVVUkxGb3I9VW5hYmxlIHRvIGNyZWF0ZSBhIFVSTCBmb3IgXCJ7MH1cIi4KLUZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyLlVuYWJsZVRvUmV0cmlldmVBcmNoaXZlPUVycm9yIHJldHJpZXZpbmcgdGhlIGFyY2hpdmUgZW50cnk6IFwiezB9XCIuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpZXZlTm9uUGx1Z2luRW50cnk9RXJyb3IgcmV0cmlldmluZyB0aGUgbm9uLXBsdWctaW4gZW50cnk6IFwiezB9XCIuIAotRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIuVW5hYmxlVG9SZXRyaWV2ZUZlYXR1cmVFbnRyeT1FcnJvciByZXRyaWV2aW5nIGZlYXR1cmUgZW50cnkgY29udGVudCByZWZlcmVuY2U6IFwiezB9XCIuCi1GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlci5VbmFibGVUb1JldHJpZXZlUGx1Z2luRW50cnkgPUVycm9yIHJldHJpZXZpbmcgdGhlIHBsdWctaW4gZW50cnk6IFwiezB9XCIuIAotQ29uZmlndXJlZFNpdGUuTm9uSW5zdGFsbGFibGVTaXRlPSBZb3UgY2Fubm90IGluc3RhbGwgaW4gdGhlIHNpdGUgXCJ7MH1cIi4gSXQgaXMgY29uc2lkZXJlZCBub24gdXBkYXRlYWJsZS4KLUNvbmZpZ3VyZWRTaXRlLk51bGxGZWF0dXJlVG9JbnN0YWxsPSBJbnRlcm5hbCBFcnJvci4gVGhlIGZlYXR1cmUgdG8gYmUgaW5zdGFsbGVkIGlzIG51bGwuCi1Db25maWd1cmVkU2l0ZS5Ob25Vbmluc3RhbGxhYmxlU2l0ZT0gWW91IGNhbm5vdCB1bmluc3RhbGwgZnJvbSB0aGUgc2l0ZSBcInswfVwiLiBJdCBpcyBjb25zaWRlcmVkIG5vbiB1cGRhdGVhYmxlLgotQ29uZmlndXJlZFNpdGUuTm9TaXRlPSBObyBTaXRlCi1Db25maWd1cmVkU2l0ZS5DYW5ub3RGaW5kRmVhdHVyZVRvVW5jb25maWd1cmU9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gZGlzYWJsZSBmZWF0dXJlIFwiezB9XCIgb24gc2l0ZSBcInsxfVwiLiBDYW5ub3QgZmluZCBmZWF0dXJlLgotQ29uZmlndXJlZFNpdGUuQ2Fubm90RmluZEZlYXR1cmVUb0NvbmZpZ3VyZT0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBlbmFibGUgZmVhdHVyZSBcInswfVwiLiBDYW5ub3QgZmluZCBmZWF0dXJlLiAKLUNvbmZpZ3VyZWRTaXRlLkNhbm5vdEZpbmRQbHVnaW5FbnRyeT0gVW5hYmxlIHRvIHJldHJpZXZlIFBsdWctaW4gRW50cnkgXCJ7MH1cIiBvbiBzaXRlIFwiezF9XCIuIENhbm5vdCBmaW5kIHBsdWctaW4gZW50cnkuIERvIHlvdSB3YW50IHRvIENvbnRpbnVlID8KLUNvbmZpZ3VyZWRTaXRlLk1pc3NpbmdQbHVnaW5zQnJva2VuRmVhdHVyZT0gUGx1Zy1pbiBcInswfVwiIHZlcnNpb24gXCJ7MX1cIiByZWZlcmVuY2VkIGJ5IHRoaXMgZmVhdHVyZSBpcyBtaXNzaW5nLgotQ29uZmlndXJlZFNpdGUuVW5hYmxlVG9SZW1vdmVDb25maWd1cmVkRmVhdHVyZT0gVW5hYmxlIHRvIHJlbW92ZSBhIGVuYWJsZWQgZmVhdHVyZTogXCJ7MH1cIiBZb3UgbXVzdCBkaXNhYmxlIHRoZSBmZWF0dXJlIGZpcnN0LgotQ29uZmlndXJlZFNpdGUuVW5hYmxlVG9GaW5kRmVhdHVyZT0gVW5hYmxlIHRvIEZpbmQgdGhlIGZlYXR1cmUgXCJ7MH1cIiBvbiB0aGlzIHNpdGUuCi1Db25maWd1cmVkU2l0ZS5TaXRlVVJMTnVsbD1UaGUgU2l0ZSBVUkwgaXMgbnVsbC4KLUNvbmZpZ3VyZWRTaXRlLk5vbkxvY2FsU2l0ZT1UaGUgU2l0ZSBpcyBub3Qgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLiBDYW5ub3QgdmFsaWRhdGUuIAotQ29uZmlndXJlZFNpdGUuTm90U2FtZVByb2R1Y3RJZD1UaGUgc2l0ZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhpcyBwcm9kdWN0LiBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBwcm9kdWN0OiBcInswfVwiLgotQ29uZmlndXJlZFNpdGUuQ29udGFpbmVkSW5Bbm90aGVyU2l0ZT1UaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZTogXCJ7MH1cIi4KLUNvbmZpZ3VyZWRTaXRlLlJlYWRPbmx5U2l0ZT1UaGUgc2l0ZSBpcyBtYXJrZWQgYXMgcmVhZCBvbmx5LgotQ29uZmlndXJlZFNpdGUuVW5hYmxlUmVzb2x2ZVVSTD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byByZXNvbHZlIFVSTCBcInswfVwiLgotQ29uZmlndXJlZFNpdGUuVW5hYmxlVG9BY2Nlc3NTaXRlPSBJbnRlcm5hbCBFcnJvci4gVW5hYmxlIHRvIGFjY2VzcyBwbGF0Zm9ybSBzaXRlIFwiezB9XCIuCi1GZWF0dXJlRmFjdG9yeS5DcmVhdGluZ0Vycm9yPSBFcnJvciBjcmVhdGluZyBmZWF0dXJlIFwiezB9XCIuCi1GZWF0dXJlTW9kZWxGYWN0b3J5LkVycm9yQWNjZXNpbmdGZWF0dXJlU3RyZWFtPSBFcnJvciBhY2Nlc3NpbmcgZmVhdHVyZSBzdHJlYW0uCi1GZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkuTnVsbFVSTD0gRXJyb3IgY3JlYXRpbmcgZmVhdHVyZS4gVGhlIFVSTCB1c2VkIHRvIGNyZWF0ZSB0aGUgZmVhdHVyZSBpcyBudWxsLgotRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5LkNhbm5vdENyZWF0ZVVSTD0gRXJyb3IgY3JlYXRpbmcgZmVhdHVyZS4gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZm9yIFwiezB9XCIuCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuTm9NYW5pZmVzdEZpbGU9IFVuYWJsZSB0byByZXRyaWV2ZSBcInswfVwiIGluIGZlYXR1cmUgbG9jYXRlZCBhdCBcInsxfVwiLiAKLUZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5Ob0ZlYXR1cmU9IE5vIGZlYXR1cmUKLUZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5GaWxlRG9lc05vdEV4aXN0PSBUaGUgRmlsZSBcInswfVwiIGRvZXMgbm90IGV4aXN0LgotRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyLkludmFsaWREaXJlY3Rvcnk9IFRoZSBkaXJlY3RvcnkgXCJ7MH1cIiBpcyBub3QgYSB2YWxpZCBkaXJlY3RvcnkuCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuRXJyb3JSZXRyaWV2aW5nPSBFcnJvciByZXRyaWV2aW5nIFwiezB9XCIuCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuQ29udGVudFJlZmVyZW5jZVN0cmluZz0gZnJvbSBcInswfVwiCi1GZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIuVVJMU3RyaW5nPSBsb2NhdGVkIGF0IFwiezB9XCIKLUZlYXR1cmVSZWZlcmVuY2UuVW5hYmxlVG9SZXNvbHZlVVJMPSBJbnRlcm5hbCBFcnJvcjogVW5hYmxlIHRvIHJlc29sdmUgbW9kZWwgdXNpbmcgVVJMOiBcInswfVwiLgotRmVhdHVyZVR5cGVGYWN0b3J5LlVuYWJsZVRvRmluZEZlYXR1cmVGYWN0b3J5PSBVbmFibGUgdG8gZmluZCBhIGZlYXR1cmUgZmFjdG9yeSBmb3IgdGhlIGV4dGVuc2lvbiBpZCBcInswfVwiLiAKLUluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvU2F2ZUNvbmZpZ3VyYXRpb249IFVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24gaW4gXCJ7MH1cIi4KLUluc3RhbGxDb25maWd1cmF0aW9uLlVuYWJsZVRvRW5jb2RlQ29uZmlndXJhdGlvbj0gVW5hYmxlIHRvIGVuY29kZSBjb25maWd1cmF0aW9uIGluIFwiezB9XCIuCi1JbnN0YWxsQ29uZmlndXJhdGlvbi5VbmFibGVUb0NyZWF0ZVVSTD0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9DYXN0PSBJbnRlcm5hbCBFcnJvci4gVGhlIENvbmZpZ3VyYXRpb24gU2l0ZSBvYmplY3QgaXMgbm90IGEgc3ViY2xhc3Mgb2YgQ29uZmlndXJlZFNpdGVNb2RlbAotSW5zdGFsbENvbmZpZ3VyYXRpb24uVW5hYmxlVG9TYXZlUGxhdGZvcm1Db25maWd1cmF0aW9uPVVuYWJsZSB0byBzYXZlIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24gaW4gXCJ7MH1cIi4KLUluc3RhbGxDb25maWd1cmF0aW9uLkFscmVhZHlOYXRpdmVseUxpbmtlZD1UaGUgc2l0ZSBpcyBhbHJlYWR5IGxpbmtlZC4KLUluc3RhbGxDb25maWd1cmF0aW9uLkFscmVhZHlQcm9kdWN0U2l0ZT1UaGUgbG9jYXRpb24gaXMgYWxyZWFkeSBhIHByb2R1Y3Qgc2l0ZS4KLUluc3RhbGxDb25maWd1cmF0aW9uLk5vdEFuRXh0ZW5zaW9uU2l0ZT1UaGUgc2l0ZSBjYW5ub3QgYmUgbGlua2VkIHRvLiBJdCBpcyBub3QgYW4gZXh0ZW5zaW9uIHNpdGUuCi1JbnRlcm5hbFNpdGVNYW5hZ2VyLlVuYWJsZVRvQ3JlYXRlU2l0ZVdpdGhUeXBlPSBFeHRlbnNpb24gRXJyb3IuIFRoZSBTaXRlIEZhY3Rvcnkgb2YgdHlwZSBcInswfVwiIGNhbm5vdCBhY2Nlc3MgdGhlIFNpdGUgXCJ7MX1cIi4KLUludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9BY2Nlc3NVUkw9IFVuYWJsZSB0byBhY2Nlc3MgXCJ7MH1cIi4KLUludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9DcmVhdGVVUkw9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gXCJ7MH1cIi4KLUludGVybmFsU2l0ZU1hbmFnZXIuVW5hYmxlVG9QYXJzZVVSTD0gVW5hYmxlIHRvIHBhcnNlIHRoZSBzdHJlYW0gXCJ7MH1cIi4KLUludGVybmFsU2l0ZU1hbmFnZXIuRmFpbGVkUmV0cnlBY2Nlc3NpbmdTaXRlPSBGYWlsZWQgcmV0cnkgYWNjZXNzaW5nIHNpdGUgdXNpbmcgZGVmYXVsdCBpbnN0YWxsZWQgZm9ybWF0IGluc3RlYWQgb2YgZGVmYXVsdCBwYWNrYWdlZCBmb3JtYXQuCi1JbnRlcm5hbFNpdGVNYW5hZ2VyLkNvbm5lY3RpbmdUb1NpdGUgPSBDb25uZWN0aW5nIFRvIFNpdGUuLi4KLVNpdGVSZWNvbmNpbGVyLlVuYWJsZVRvRmluZEluc3RhbGxEZWx0YUZhY3Rvcnk9IEludGVybmFsIEVycm9yOiBVbmFibGUgdG8gZmluZCBmYWN0b3J5IHRvIGRpc3BsYXkgY2hhbmdlcy4gT3BlbiB0aGUgVXBkYXRlIE1hbmFnZXIgbWFudWFsbHkuCi1Qb2xpY3kuTm9NZXNzYWdlQXZhaWxhYmxlPSBObyBtZXNzYWdlIGF2YWlsYWJsZS4KLVBvbGljeS5NaXNzaW5nTWVzc2FnZT0gTWlzc2luZyBtZXNzYWdlOiBcInswfVwiLgotUG9saWN5Lk1pc3Npbmc9IG1pc3NpbmcgXCJ7MH1cIi4KLUdsb2JhbENvbnN1bWVyLkVycm9yQ3JlYXRpbmdGaWxlPSBVbmFibGUgdG8gY3JlYXRlIGZpbGUgXCJ7MH1cIi4KLVNpdGVGaWxlQ29udGVudENvbnN1bWVyLlVuYWJsZVRvQ3JlYXRlVVJMPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1TaXRlRmlsZUNvbnRlbnRDb25zdW1lci5VbmFibGVUb0NyZWF0ZVVSTEZvckZpbGU9IFVuYWJsZSB0byBjcmVhdGUgVVJMIGZvciB0aGUgZmlsZSBcInswfVwiLgotQ29udGVudENvbnN1bWVyLlVuYWJsZVRvUmVuYW1lID0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byByZW5hbWUgXCJ7MH1cIiB0byBcInsxfVwiLgotU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvUmV0cml2ZVNpdGU9IFVuYWJsZSByZXRyaWV2ZSB0aGlzIFNpdGUgZnJvbSBhIGRpcmVjdG9yeS4gVGhlIFVSTCBzaG91bGQgcG9pbnQgdG8gYSBmaWxlIGluc3RlYWQuCi1TaXRlRmlsZUZhY3RvcnkuVW5hYmxlVG9PYnRhaW5QYXJlbnREaXJlY3Rvcnk9IFVuYWJsZSBvYnRhaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgZnJvbSB0aGUgZmlsZSBcInswfVwiLgotU2l0ZUZpbGVGYWN0b3J5LkZpbGVEb2VzTm90RXhpc3Q9IFVuYWJsZSB0byBhY2Nlc3Mgc2l0ZSBcInswfVwiLiBUaGUgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LgotU2l0ZUZpbGVGYWN0b3J5LlVuYWJsZVRvQ3JlYXRlVVJMRm9yRmlsZT0gVW5hYmxlIHRvIGNyZWF0ZSBVUkwgZnJvbSBcInswfVwiLgotU2l0ZUZpbGVGYWN0b3J5LkVycm9yUGFyc2luZ0ZpbGU9IFVuYWJsZSB0byBwYXJzZSBmaWxlIFwiezB9XCIuCi1TaXRlRmlsZUZhY3RvcnkuRXJyb3JBY2Nlc3Npbmc9IFVuYWJsZSB0byBhY2Nlc3MgZmlsZSBcInswfVwiLgotU2l0ZVR5cGVGYWN0b3J5LlVuYWJsZVRvRmluZFNpdGVGYWN0b3J5PSBVbmFibGUgdG8gZmluZCBhIHNpdGUgZmFjdG9yeSBmb3IgdGhlIGV4dGVuc2lvbiBpZCBcInswfVwiLiAKLVVwZGF0ZU1hbmFnZXJVdGlscy5VbmFibGVUb1JlbW92ZUZpbGU9IFVuYWJsZSB0byByZW1vdmUgXCJ7MH1cIiBmcm9tIHRoZSBmaWxlIHN5c3RlbS4KLVVwZGF0ZU1hbmFnZXJVdGlscy5GaWxlQWxyZWFkeUV4aXN0cz0gVW5hYmxlIHRvIGNyZWF0ZSBcInswfVwiIG9uIHRoZSBmaWxlIHN5c3RlbS4gRmlsZSBhbHJlYWR5IGV4aXN0cy4KLVNpdGVMb2NhbC5FcnJvclBhcnNpbmdTYXZlZFN0YXRlPSBFcnJvciBkdXJpbmcgcGFyc2luZyBvZiB0aGUgY29uZmlndXJhdGlvbiBzYXZlZCBzdGF0ZSBcInswfVwiLgotU2l0ZUxvY2FsLlVuYWJsZVRvQ3JlYXRlVVJMRm9yPSBVbmFibGUgdG8gY3JlYXRlIFVSTCBmcm9tIFwiezB9XCIuCi1TaXRlTG9jYWwuVW5hYmxlVG9BY2Nlc3NGaWxlPSBVbmFibGUgdG8gYWNjZXNzIGZpbGUgXCJ7MH1cIi4KLVNpdGVMb2NhbC5VbmFibGVUb1NhdmVTdGF0ZUluPSBVbmFibGUgdG8gcGVyc2lzdCBjb25maWd1cmF0aW9ucyBpbnRvIFwiezB9XCIuCi1TaXRlTG9jYWwuVW5hYmxlVG9FbmNvZGVDb25maWd1cmF0aW9uPSBVbmFibGUgdG8gZW5jb2RlIGNvbmZpZ3VyYXRpb25zIGludG8gXCJ7MH1cIi4KLVNpdGVMb2NhbC5VbmFibGVUb1Jlc29sdmU9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gcmVzb2x2ZSBcInswfVwiLgotU2l0ZUxvY2FsLlVuYWJsZVRvUmV0cmlldmVSV0FyZWE9IEludGVybmFsIEVycm9yLiBVbmFibGUgdG8gcmV0cmlldmUgbG9jYXRpb24gdG8gd3JpdGUgbWV0YWRhdGEuCi1TaXRlTG9jYWwuU2l0ZVVybElzTnVsbD0gSW50ZXJuYWwgRXJyb3I6IFVSTCBvZiBsb2NhbCBzaXRlIGlzIG51bGwuCi1TaXRlTG9jYWwuVW5hYmxlVG9EZXRlcm1pbmVGZWF0dXJlU3RhdHVzU2l0ZU51bGw9VW5hYmxlIHRvIGRldGVybWluZSBzdGF0dXMgb2YgZmVhdHVyZVwiezB9XCIgVGhlIHNpdGUgaXMgTlVMTC4KLVNpdGVMb2NhbC5Ud29WZXJzaW9uU2FtZVBsdWdpbjE9UGx1Zy1pbjogXCJ7MH1cIiB2ZXJzaW9uOiBcInsxfVwiIHJlZmVyZW5jZWQgYnkgdGhpcyBmZWF0dXJlIGlzIG5vdCBpbmNsdWRlZCBhdCBydW50aW1lLiBSdW50aW1lIGluY2x1ZGVzIHBsdWctaW4gdmVyc2lvbiBcInsyfVwiLgotU2l0ZUxvY2FsLlR3b1ZlcnNpb25TYW1lUGx1Z2luMj1QbHVnLWluOiBcInswfVwiIHZlcnNpb246IFwiezF9XCIgcmVmZXJlbmNlZCBieSB0aGlzIGZlYXR1cmUgaXMgbm90IGluY2x1ZGVkIGF0IHJ1bnRpbWUuIFJ1bnRpbWUgaW5jbHVkZXMgcGx1Zy1pbiB2ZXJzaW9uIFwiezJ9XCIgc3VwcGxpZWQgYnkgZmVhdHVyZSBcInszfVwiIHZlcnNpb24gXCJ7NH1cIi4KLVNpdGVMb2NhbC5GZWF0dXJlVW5IYXBweT1UaGUgZmVhdHVyZSBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4KLVNpdGVMb2NhbC5GZWF0dXJlSGFwcHk9VGhlIGZlYXR1cmUgaXMgY29uZmlndXJlZCBwcm9wZXJseS4KLVNpdGVMb2NhbC5GZWF0dXJlQW1iaWd1b3VzPVRoZSBmZWF0dXJlIG1heSBub3QgYmUgY29uZmlndXJlZCBwcm9wZXJseS4KLVNpdGVMb2NhbC5OZXN0ZWRGZWF0dXJlVW5IYXBweT1JbmNsdWRlZCBmZWF0dXJlIFwiezB9XCIgdmVyc2lvbiBcInsxfVwiIGNvbnRhaW5zIHByb2JsZW1zLgotU2l0ZUxvY2FsLk5lc3RlZEZlYXR1cmVVbmF2YWlsYWJsZT1JbmNsdWRlZCBmZWF0dXJlIFwiezB9XCIgaXMgbWlzc2luZy4KLVNpdGVMb2NhbC5Ob1BsdWdpblZlcnNpb249Tm8gcGx1Zy1pbjogXCJ7MH1cIiBpbmNsdWRlZCBhdCBydW50aW1lLgotU2l0ZUxvY2FsLlVuYWJsZVRvRGV0ZXJtaW5lRmVhdHVyZVN0YXR1c0NvbmZpZ3VyZWRTaXRlTnVsbD1VbmFibGUgdG8gZGV0ZXJtaW5lIHN0YXR1cyBvZiBmZWF0dXJlXCJ7MH1cIiBUaGUgQ29uZmlndXJlZCBTaXRlIGlzIE5VTEwuCi1TaXRlTG9jYWwuRmVhdHVyZURpc2FibGU9VGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQuCi1TaXRlTG9jYWwuRmVhdHVyZVN0YXR1c1Vua25vd249VW5rbm93biBzdGF0ZS4KLVNpdGVMb2NhbC5OZXN0ZWRGZWF0dXJlRGlzYWJsZT1JbmNsdWRlZCBmZWF0dXJlIFwiezB9XCIgdmVyc2lvbiBcInsxfVwiIGlzIGRpc2FibGVkLgotU2l0ZUxvY2FsLk51bGxGZWF0dXJlPVRoZSBmZWF0dXJlIGlzIG51bGwuCi1TaXRlTG9jYWwuV3JvbmdVUkw9QSBVUkwgb2YgYW4gT3JpZ2luYXRpbmcgc2l0ZSBpcyBub3QgdmFsaWQuCi1TaXRlUmVjb25jaWxlci5VbmFibGVUb1NhdmVTdGF0ZUluPSBVbmFibGUgdG8gcGVyc2lzdCBkZWx0YSBjaGFuZ2UgaW50byBcInswfVwiLgotU2l0ZVJlY29uY2lsZXIuVW5hYmxlVG9FbmNvZGVDb25maWd1cmF0aW9uPSBVbmFibGUgdG8gZW5jb2RlIGRlbHRhIGNoYW5nZSBpbnRvIFwiezB9XCIuCi1TaXRlVVJMRmFjdG9yeS5VbmFibGVUb0NyZWF0ZVVSTD0gSW50ZXJuYWwgRXJyb3IuIFVuYWJsZSB0byBjcmVhdGUgYSBVUkwgZnJvbSBcInswfVwiLgotU2l0ZVVSTEZhY3RvcnkuVW5hYmxlVG9BY2Nlc3NTaXRlU3RyZWFtPSBVbmFibGUgdG8gYWNjZXNzIHNpdGU6IFwiezB9XCIKLUphclZlcmlmaWVyLlZlcmlmeT0gVmVyaWZ5aW5nOiBcInswfVwiCi1KYXJWZXJpZmllci5VbmFibGVUb0ZpbmRFbmNyeXB0aW9uPSBVbmFibGUgdG8gZmluZCBhbGdvcml0aG0gdG8gdmVyaWZ5IGludGVncml0eSBvZiBLZXlTdG9yZSBcInswfVwiLgotSmFyVmVyaWZpZXIuVW5hYmxlVG9Mb2FkQ2VydGlmaWNhdGU9IFVuYWJsZSB0byBsb2FkIG9uZSBvciBtdWx0aXBsZXMgY2VydGlmaWNhdGVzIGluIHRoZSBLZXlTdG9yZSBcInswfVwiLgotSmFyVmVyaWZpZXIuVW5hYmxlVG9GaW5kUHJvdmlkZXJGb3JLZXlzdG9yZT0gVW5hYmxlIHRvIGZpbmQgcHJvdmlkZXIgZm9yIHRoZSBLZXlTdG9yZSB0eXBlIFwiezB9XCIuCi1KYXJWZXJpZmllci5LZXlTdG9yZU5vdExvYWRlZD0gSW50ZXJuYWwgRXJyb3IuIEtleVN0b3JlIG5vdCBJbml0aWFsaXplZC9Mb2FkZWQuCi1KYXJWZXJpZmllci5VbmFibGVUb0FjY2Vzc0phcj0gVW5hYmxlIHRvIGFjY2VzcyBKQVIgZmlsZSBcInswfVwiLgotSmFyVmVyaWZpZXIuSW52YWxpZEZpbGU9IFRoZSBGaWxlIFwiezB9XCIgaXMgbm90IGEgdmFsaWQgSkFSIGZpbGUuIEl0IGRvZXMgbm90IGNvbnRhaW4gYSBNYW5pZmVzdC4KLUphclZlcmlmaWVyLkludmFsaWRKYXI9IFRoZSBGaWxlIFwiezB9XCIgaXMgbm90IGEgdmFsaWQgSkFSIGZpbGUuCi1KYXJWZXJpZmljYXRpb25SZXN1bHQuVmFsaWRCZXR3ZWVuPSBWYWxpZCBiZXR3ZWVuIFwiezB9XCIgYW5kIFwiezF9XCIuCi1KYXJWZXJpZmljYXRpb25SZXN1bHQuRXhwaXJlZENlcnRpZmljYXRlPSAqIEVYUElSRUQgQ0VSVElGSUNBVEUgKgotSmFyVmVyaWZpY2F0aW9uUmVzdWx0LkNlcnRpZmljYXRlTm90WWV0VmFsaWQ9ICogQ0VSVElGSUNBVEUgTk9UIFlFVCBWQUxJRCAqCi1KYXJWZXJpZmljYXRpb25SZXN1bHQuQ2VydGlmaWNhdGVWYWxpZD0gVmFsaWQgY2VydGlmaWNhdGUuCi1KYXJWZXJpZmljYXRpb25TZXJ2aWNlLlVuc3VjZXNzZnVsVmVyaWZpY2F0aW9uPVZlcmlmaWNhdGlvbiBvZiBmZWF0dXJlIHVuc3VjY2Vzc2Z1bC4gSW5zdGFsbGF0aW9uIGNhbmNlbGxlZC4KLUphclZlcmlmaWNhdGlvblNlcnZpY2UuQ2FuY2VsSW5zdGFsbD1JbnN0YWxsYXRpb24gY2FuY2VsbGVkLgotVXBkYXRlTWFuYWdlclV0aWxzLlVuYWJsZVRvTG9nPVVuYWJsZSB0byBhY2Nlc3MgZXJyb3IgcmVjb3ZlcnkgbG9nIGZpbGU6IFwiezB9XCIuCi1Db25maWd1cmF0aW9uUG9saWN5LlVuYWJsZVRvRGlzYWJsZT0gVW5hYmxlIHRvIGRpc2FibGUgZmVhdHVyZSBcInswfVwiLgotQ29uZmlndXJhdGlvblBvbGljeS5QYXJlbnRJc0VuYWJsZT0gVGhlIHBhcmVudCBmZWF0dXJlOiBcInswfVwiIGlzIGVuYWJsZS4KLUNvbm5lY3Rpb25UaHJlYWRNYW5hZ2VyLnRvb01hbnlDb25uZWN0aW9ucyA9IFRoZXJlIGFyZSB0b28gbWFueSBuZXR3b3JrIGNvbm5lY3Rpb25zIHN0aWxsIGFjdGl2ZS4gXAotSWYgeW91IGFyZSBleHBlcmllbmNpbmcgbmV0d29yayBwcm9ibGVtcywgdHJ5IGFnYWluIGxhdGVyLiBJZiB0aGUgZXJyb3IgcGVyc2lzdHMsIHJlc3RhcnQgdGhlIFwKLWFwcGxpY2F0aW9uLgotQ29ubmVjdGlvblRocmVhZE1hbmFnZXIudW5yZXNwb25zaXZlVVJMID0gU3RpbGwgd2FpdGluZyBmb3IgcmVzcG9uc2U6IHswfQotSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlLmZlYXR1cmVVbmluc3RhbGxlZD0gRmVhdHVyZSB7MH0gaXMgdW5pbnN0YWxsZWQuCi0KLSMgUHJvcGVydGllcyBtb3ZlZCBtb3N0bHkgZnJvbSB0aGUgdWkgcGx1Z2luCi0KLUFjdGl2aXR5Q29uc3RyYWludHMud2FybmluZz1UaGUgY3VycmVudCBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGVycm9ycyBhbmQgdGhpcyBvcGVyYXRpb24gY2FuIGhhdmUgdW5wcmVkaWN0YWJsZSByZXN1bHRzLgotQWN0aXZpdHlDb25zdHJhaW50cy5yb290TWVzc2FnZSA9IFJlcXVlc3RlZCBvcGVyYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIGl0IHdvdWxkIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gU2VlIGRldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlSW5pdGlhbCA9IEN1cnJlbnQgY29uZmlndXJhdGlvbiBjb250YWlucyBlcnJvcnMgdGhhdCBhcmUgbm90IGNvcnJlY3RlZCBieSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiBhbmQgbW9yZSBlcnJvcnMgd291bGQgYmUgaW50cm9kdWNlZC4gU2VlIGRldGFpbHMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmJlZm9yZU1lc3NhZ2UgPSAtLS0tLSBDdXJyZW50IGNvbmZpZ3VyYXRpb24gcHJvYmxlbXMgLS0tLS0KLUFjdGl2aXR5Q29uc3RyYWludHMuYWZ0ZXJNZXNzYWdlID0gLS0tLS0gQ29uZmlndXJhdGlvbiBwcm9ibGVtcyBhZnRlciB0aGUgb3BlcmF0aW9uIC0tLS0tCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnBsYXRmb3JtID0gUmVzdWx0aW5nIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgY29udGFpbiB0aGUgcGxhdGZvcm0uCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnByaW1hcnkgPSBSZXN1bHRpbmcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBjb250YWluIHRoZSBwcmltYXJ5IGZlYXR1cmUuCi1BY3Rpdml0eUNvbnN0YWludHMucHJlcmVxLnBsdWdpbiA9IHBsdWctaW4KLUFjdGl2aXR5Q29uc3RhaW50cy5wcmVyZXEuZmVhdHVyZSA9IGZlYXR1cmUKLUFjdGl2aXR5Q29uc3RyYWludHMucHJlcmVxID0gcmVxdWlyZXMgezB9ICJ7MX0iLgotQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXFQZXJmZWN0ID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLgotQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXFFcXVpdmFsZW50ID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLCBvciBlcXVpdmFsZW50LgotQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXFDb21wYXRpYmxlID0gcmVxdWlyZXMgezB9ICJ7MX0gKHsyfSkiLCBvciBjb21wYXRpYmxlLgotQWN0aXZpdHlDb25zdHJhaW50cy5wcmVyZXFHcmVhdGVyT3JFcXVhbCA9IHJlcXVpcmVzIHswfSAiezF9ICh7Mn0pIiwgb3IgbGF0ZXIgdmVyc2lvbi4KLUFjdGl2aXR5Q29uc3RyYWludHMub3MgPSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZW52aXJvbm1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLndzID0gd2luZG93aW5nIHN5c3RlbSBkb2VzIG5vdCBtYXRjaCBjdXJyZW50IGVudmlyb25tZW50LgotQWN0aXZpdHlDb25zdHJhaW50cy5hcmNoID0gcGxhdGZvcm0gYXJjaGl0ZWN0dXJlIGRvZXMgbm90IG1hdGNoIGN1cnJlbnQgZW52aXJvbm1lbnQuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmN5Y2xlID0gZGVmaW5pdGlvbiBjb250YWlucyBhIG5lc3RlZCBmZWF0dXJlcyBjeWNsZTogezB9X3sxfXByZXJlcQotQWN0aXZpdHlDb25zdHJhaW50cy5jb25mbGljdCA9IFVwZGF0ZSBjb25mbGljdCBkZXRlY3RlZCAoc2VlIGRldGFpbHMpLiBQbGVhc2UgZGVzZWxlY3QgdGhpcyB1cGRhdGUgYW5kIHRyeSBhZ2Fpbi4KLUFjdGl2aXR5Q29uc3RyYWludHMuY2hpbGRNZXNzYWdlID0gezB9ICh7MX0pIHsyfQotQWN0aXZpdHlDb25zdHJhaW50cy5vcHRpb25hbENoaWxkID0gRmVhdHVyZSBpbmNsdWRlZCBpbiBhbm90aGVyIGZlYXR1cmUgY2Fubm90IGJlIGVuYWJsZWQgaWYgdGhlIHBhcmVudCBpcyBkaXNhYmxlZC4gRW5hYmxlIHRoZSBwYXJlbnQgZmlyc3QuCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnBhdGNoVW5jb25maWd1cmUgPSBpcyBhIHBhdGNoIGFuZCBjYW5ub3QgYmUgZGlyZWN0bHkgZGlzYWJsZWQuIFVzZSAnUmV2ZXJ0JyB0byByZXN0b3JlIFwKLXRoZSBsYXN0IGNvbmZpZ3VyYXRpb24gYmVmb3JlIHRoZSBwYXRjaCB3YXMgaW5zdGFsbGVkLgotQWN0aXZpdHlDb25zdHJhaW50cy5wYXRjaFVuY29uZmlndXJlQmFja3VwID0gaXMgYSBwYXRjaCBhbmQgY2Fubm90IGJlIGRpcmVjdGx5IGRpc2FibGVkLiBVc2UgJ1JldmVydCcgdG8gcmVzdG9yZSBcCi1jb25maWd1cmF0aW9uICJ7MH0iIGluIFNhdmVkIENvbmZpZ3VyYXRpb25zLgotQWN0aXZpdHlDb25zdHJhaW50cy50aW1lbGluZSA9IENhbm5vdCByZXZlcnQgdG8gInswfSIgYmVjYXVzZSBpdCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCi1BY3Rpdml0eUNvbnN0cmFpbnRzLmV4Y2x1c2l2ZSA9IG11c3QgYmUgcHJvY2Vzc2VkIHNlcGFyYXRlbHkgZnJvbSBvdGhlciBmZWF0dXJlcy4KLUFjdGl2aXR5Q29uc3RyYWludHMubm9MaWNlbnNlID0gZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGxpY2Vuc2UgYWdyZWVtZW50LgotQWN0aXZpdHlDb25zdHJhaW50cy5yZWFkT25seSA9IFRoZSBzaXRlIGlzIG5vdCB1cGRhdGVhYmxlOiB7MH0uCi1BY3Rpdml0eUNvbnN0cmFpbnRzLnBsYXRmb3JtTW9kaWZpZWQgPSBQbGF0Zm9ybSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIG91dHNpZGUgdGhpcyBwcm9ncmFtLiBBIHJlc3RhcnQgaXMgcmVjb21tZW5kZWQuCi1EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuY29uZmxpY3QgPSBWZXJzaW9uIHswfSBpbiB7MX0KLVVwZGF0ZU1hbmFnZXIuc2F2ZWRDb25maWcgPSB7MH0gYmFja3VwCi1PcGVyYXRpb25zTWFuYWdlci5lcnJvci51bmFibGU9ezB9OiB1bmFibGUgdG8gbG9jYXRlIGNvbmZpZ3VyYXRpb24gc2l0ZQotT3BlcmF0aW9uc01hbmFnZXIuZXJyb3Iub2xkPSB7MH06IEVycm9yIHdoaWxlIHVwZGF0aW5nIHRoZSBvbGQgZmVhdHVyZSB2ZXJzaW9uCi1PcGVyYXRpb25zTWFuYWdlci5pbnN0YWxsaW5nPUluaXRpYWxpemluZy4uLgotT3BlcmF0aW9uc01hbmFnZXIuZXJyb3IudW5pbnN0YWxsPSB7MH0gOiBFcnJvciB3aGlsZSB1bmluc3RhbGxpbmcgZmVhdHVyZQotU2VhcmNoLm5ldHdvcmtQcm9ibGVtcz1OZXR3b3JrIGNvbm5lY3Rpb24gcHJvYmxlbXMgZW5jb3VudGVyZWQgZHVyaW5nIHNlYXJjaC4KLU1pc3NpbmdGZWF0dXJlLmlkPXVua25vd24KLU1pc3NpbmdGZWF0dXJlLmRlc2MudW5rbm93bj1UaGlzIGZlYXR1cmUgcmVmZXJlbmNlIGNhbm5vdCBiZSByZXNvbHZlZC4KLU1pc3NpbmdGZWF0dXJlLmRlc2Mub3B0aW9uYWw9VGhpcyBmZWF0dXJlIGlzIHJlZmVyZW5jZWQgYXMgb3B0aW9uYWwgYW5kIGlzIGN1cnJlbnRseSBub3QgaW5zdGFsbGVkLgotTWlzc2luZ0ZlYXR1cmUucHJvdmlkZXI9VW5rbm93bgotSW5zdGFsbENvbmZpZ3VyYXRpb24ubG9jYXRpb24uZXhpc3RzID0gU2l0ZSBhbHJlYWR5IGV4aXN0cy4KLUluc3RhbGxMb2dQYXJzZXIuZXJyb3JzID0gRXJyb3JzIGdlbmVyYXRlZCB3aGlsZSBwYXJzaW5nIGluc3RhbGxhdGlvbiBoaXN0b3J5IGZpbGUuCi1TaXRlTG9jYWwuY2xvbmVDb25maWc9RXJyb3IgY2xvbm5pbmcgY3VycmVudCBjb25maWd1cmF0aW9uLgotCi1VcGRhdGVNYW5hZ2VyVXRpbHMuaW5wdXRTdHJlYW1FbmRlZD1JbnB1dFN0cmVhbSBlbmRlZCBhZnRlciB7MH0gYnl0ZXMgKGV4cGVjdGVkIHsxfSApCi1VcGRhdGVTZWFyY2hSZXF1ZXN0LmxvYWRpbmdQb2xpY3k9TG9hZGluZyB1cGRhdGUgcG9saWN5IC4uLgotVXBkYXRlTWFuYWdlclV0aWxzLmNvcHk9VXBkYXRlTWFuYWdlclV0aWxzIGNvcHkoKSBhdCBvZmZzZXQ6IAotVXBkYXRlUG9saWN5LnBhcnNlUG9saWN5PUVycm9ycyB3aGlsZSBwYXJzaW5nIHVwZGF0ZSBwb2xpY3kKLVVwZGF0ZVBvbGljeS5wYXJzZVBvbGljeT1FcnJvcnMgd2hpbGUgcGFyc2luZyB1cGRhdGUgcG9saWN5Ci1VcGRhdGVQb2xpY3kucG9saWN5RXhwZWN0ZWQ9JyBpcyBleHBlY3RlZC4KLVVwZGF0ZVNlYXJjaFJlcXVlc3Quc2VhcmNoaW5nPVNlYXJjaGluZy4uLgotVXBkYXRlU2VhcmNoUmVxdWVzdC5jb250YWN0aW5nPUNvbnRhY3RpbmcgCi1VcGRhdGVTZWFyY2hSZXF1ZXN0LmNoZWNraW5nPUNoZWNraW5nIAotVXBkYXRlUG9saWN5LmludmFsaWRVUkw9aW52YWxpZCBVUkwgLSAKLVVwZGF0ZVBvbGljeS5uYW1lTm9OdWxsPSBjYW5ub3QgYmUgbnVsbC4KLVVwZGF0ZVBvbGljeS5VcGRhdGVQb2xpY3k9VXBkYXRlIFBvbGljeTogCi1TaXRlRmlsZS5mZWF0dXJlTm90UmVtb3ZlZD1GZWF0dXJlIHswfSB3YXMgbm90IHJlbW92ZWQKLVNpdGVGaWxlLnBsdWdpbk5vdFJlbW92ZWQ9UGx1Z2luIHswfSB3YXMgbm90IHJlbW92ZWQKLUVycm9yUmVjb3ZlcnlMb2cucmVjb3ZlcmluZ1N0YXR1cz1SZWNvdmVyaW5nIHN0YXR1cwotRXJyb3JSZWNvdmVyeUxvZy5jYW5ub3RGaW5kTG9nRmlsZT1VbmFibGUgdG8gZmluZCBsb2cgZmlsZToKLUVycm9yUmVjb3ZlcnlMb2cubm9Qcm9wZXJ0eUZpbGU9VW5hYmxlIHRvIGFjY2VzcyBwcm9wZXJ0eSBmaWxlOgotRXJyb3JSZWNvdmVyeUxvZy5ub0xvZ0VudHJ5PVVuYWJsZSB0byByZWFkIGxvZyBmaWxlLiBGaWxlIGRvZXNuJ3QgY29udGFpbiB0aGUgbG9nIGVudHJ5OgotRXJyb3JSZWNvdmVyeUxvZy5ub1JlY292ZXJ5VG9FeGVjdXRlPVVuYWJsZSB0byByZWFkIGxvZyBmaWxlLiBVbmFibGUgdG8gZGV0ZXJtaW5lIHJlY292ZXJ5IHRvIGV4ZWN1dGUgYmFzZWQgb24gdGhlIGZpcnN0IGxpbmUgb2YgOgotRXJyb3JSZWNvdmVyeUxvZy53cm9uZ0xvZ0ZpbGU9V3JvbmcgbG9nIGZpbGUuIFVuYWJsZSB0byBmaW5kIGVudHJ5IGZvcjoKLUVycm9yUmVjb3ZlcnlMb2cubm9BY3Rpb249VW5hYmxlIHRvIGRldGVybWluZSB3aGF0IGFjdGlvbiB3YXMgdGFrZW4gYnkgcGFyc2luZwotRXJyb3JSZWNvdmVyeUxvZy5maWxlQWxyZWFkeVJlbmFtZWQ9RmlsZSBhbHJlYWR5IHJlbmFtZWQgaW50bzoKLUVycm9yUmVjb3ZlcnlMb2cuY2Fubm90RmluZEZpbGU9VW5hYmxlIHRvIGZpbmQgZmlsZToKLUVycm9yUmVjb3ZlcnlMb2cub2xkVG9OZXc9VW5hYmxlIHRvIHJlbmFtZSBvbGQgaW4gbmV3OgotRXJyb3JSZWNvdmVyeUxvZy5yZW5hbWVkPVN1Y2Vzc2Z1bGx5IHJlbmFtZWQ6Ci1FcnJvclJlY292ZXJ5TG9nLnRvPSB0bzoKLUVycm9yUmVjb3ZlcnlMb2cubm9BY3Rpb249VW5hYmxlIHRvIGRldGVybWluZSB3aGF0IGFjdGlvbiB3YXMgdGFrZW4gYnkgcGFyc2luZwotRXJyb3JSZWNvdmVyeUxvZy5jYW5ub3RGaW5kRmlsZT1VbmFibGUgdG8gZmluZCBmaWxlOgotRXJyb3JSZWNvdmVyeUxvZy5ub0ZpbGV0b1JlbW92ZT1VbmFibGUgdG8gZmluZCBmaWxlIHRvIHJlbW92ZToKLUVycm9yUmVjb3ZlcnlMb2cucmVtb3ZlRmVhdHVyZT1UaGUgcmVtb3ZlIHByb2Nlc3MgZGlkbid0IHN0YXJ0LiBQbGVhc2UgcmVtb3ZlIHRoZSBkaXNhYmxlIGZlYXR1cmUgZnJvbSB0aGUgcHJvZ3JhbS4KLUVycm9yUmVjb3ZlcnlMb2cud3JvbmdMb2dGaWxlPVdyb25nIGxvZyBmaWxlLiBVbmFibGUgdG8gZmluZCBlbnRyeSBmb3I6Ci1VcGRhdGVzU2VhcmNoQ2F0ZWdvcnkuZXJyb3JTZWFyY2hpbmdGb3JVcGRhdGVzPUVycm9yIHdoaWxlIGluaXRpYWxpemluZyB0aGUgc2VhcmNoIGZvciBuZXcgdXBkYXRlcwotU3RhbmRhbG9uZS5zaXRlQ29uZmlndXJlZD1TaXRlIGlzIGFscmVhZHkgY29uZmlndXJlZDogCi1TdGFuZGFsb25lLm5vU2l0ZT1DYW5ub3QgZmluZCBzaXRlOiAgCi1TdGFuZGFsb25lLm5vU2l0ZTI9Q2Fubm90IGZpbmQgc2l0ZSB0byBpbnN0YWxsIHRvOiAKLVN0YW5kYWxvbmUubm9TaXRlMz1ObyBzaXRlIHNwZWNpZmllZAotU3RhbmRhbG9uZS5ub0NvbmZpZ3VyZWRTaXRlPUNhbm5vdCBmaW5kIGNvbmZpZ3VyZWQgc2l0ZToKLVN0YW5kYWxvbmUuaW5zdGFsbGluZz1JbnN0YWxsaW5nIGZlYXR1cmUKLVN0YW5kYWxvbmUuZmVhdHVyZT1GZWF0dXJlIAotU3RhbmRhbG9uZS5ub3RGb3VuZD0gY2Fubm90IGJlIGZvdW5kIG9uIAotU3RhbmRhbG9uZS5uZXdlckluc3RhbGxlZD1cbm9yIGEgbmV3ZXIgdmVyc2lvbiBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLVN0YW5kYWxvbmUuZHVwbGljYXRlPUR1cGxpY2F0ZSBjb25mbGljdHMKLVN0YW5kYWxvbmUuZmVhdHVyZT1GZWF0dXJlIAotU3RhbmRhbG9uZS5pbnN0YWxsZWQ9IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbnN0YWxsZWQKLVN0YW5kYWxvbmUuY2Fubm90SW5zdGFsbD1DYW5ub3QgaW5zdGFsbCBmZWF0dXJlIAotU3RhbmRhbG9uZS5ub0ZlYXR1cmVzMT1UaGVyZSBhcmUgbm8gdW5jb25maWd1cmVkIGZlYXR1cmVzIHdpdGggaWQgezB9Ci1TdGFuZGFsb25lLm5vRmVhdHVyZXMyPUNhbm5vdCBmaW5kIHVuY29uZmlndXJlZCBmZWF0dXJlICB7MH0gd2l0aCB2ZXJzaW9uIHsxfQotU3RhbmRhbG9uZS5ub0ZlYXR1cmVzMz1UaGVyZSBhcmUgbm8gY29uZmlndXJlZCBmZWF0dXJlcyB3aXRoIGlkIHswfQotU3RhbmRhbG9uZS5ub0ZlYXR1cmVzND1DYW5ub3QgZmluZCBjb25maWd1cmVkIGZlYXR1cmUgIHswfSB3aXRoIHZlcnNpb24gezF9Ci1TdGFuZGFsb25lLm5vQ29uZmlnU2l0ZUZvckZlYXR1cmU9VGhlcmUgYXJlIG5vIGNvbmZpZ3VyZWQgc2l0ZXMgZm9yIGZlYXR1cmUgezB9Ci1TdGFuZGFsb25lLmZlYXR1cmVOb3RJbnN0YWxsZWRCeVVNPUZlYXR1cmUgezB9IHdhcyBub3QgaW5zdGFsbGVkIGJ5IHRoZSB1cGRhdGUgbWFuYWdlciwgc28gaXQgY2Fubm90IGJlIHVuaW5zdGFsbGVkLgotU3RhbmRhbG9uZS5pbnZhbGlkQ21kPUludmFsaWQgY29tbWFuZDoKLVN0YW5kYWxvbmUuY29ubmVjdGlvbiA9IENvbm5lY3Rpb24gZXJyb3IKLVN0YW5kYWxvbmUuc2VhcmNoaW5nID0gU2VhcmNoaW5nIG9uOiAKLVN0YW5kYWxvbmUuY21kRmFpbGVkID0gQ29tbWFuZCBmYWlsZWQuIFBsZWFzZSBjaGVjayBsb2cgZmlsZSB7MH0gZm9yIGRldGFpbHMuCi1TdGFuZGFsb25lLmNtZEZhaWxlZE5vTG9nID0gQ29tbWFuZCBmYWlsZWQuCi1TdGFuZGFsb25lLmNtZENvbXBsZXRlV2l0aEVycm9ycyA9IENvbW1hbmQgY29tcGxldGVkIHdpdGggZXJyb3JzLiBQbGVhc2UgY2hlY2sgbG9nIGZpbGUgezB9IGZvciBkZXRhaWxzLgotU3RhbmRhbG9uZS5jbWRPSyA9IENvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KLVN0YW5kYWxvbmUudXBkYXRpbmcgPSBCZWdpbiB1cGRhdGluZwotU3RhbmRhbG9uZS5ub1VwZGF0ZSA9IEZlYXR1cmUgezB9IGNhbm5vdCBiZSB1cGRhdGVkLgotU3RhbmRhbG9uZS51cGRhdGVkPSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdXBkYXRlZC4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzI1ZDRjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotLyoqCi0gKiBNaXJyb3JzIGEgcmVtb3RlIHNpdGUgbG9jYWxseS4KLSAqLwotcHVibGljIGNsYXNzIE1pcnJvckNvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCi0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOwotCXByaXZhdGUgU3RyaW5nIGZlYXR1cmVWZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGZyb21TaXRlVXJsOwotCXByaXZhdGUgU3RyaW5nIHRvU2l0ZURpcjsKLQlwcml2YXRlIFN0cmluZyBtaXJyb3JVUkw7Ci0JcHJpdmF0ZSBNaXJyb3JTaXRlIG1pcnJvclNpdGU7Ci0KLQlwdWJsaWMgTWlycm9yQ29tbWFuZCgKLQkJU3RyaW5nIGZlYXR1cmVJZCwKLQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uLAotCQlTdHJpbmcgZnJvbVNpdGVVcmwsCi0JCVN0cmluZyB0b1NpdGVEaXIsCi0JCVN0cmluZyBtaXJyb3JVcmwpIHsKLQkJdGhpcy5mZWF0dXJlSWQgPSBmZWF0dXJlSWQ7Ci0JCXRoaXMuZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlVmVyc2lvbjsKLQkJdGhpcy5mcm9tU2l0ZVVybCA9IGZyb21TaXRlVXJsOwotCQl0aGlzLnRvU2l0ZURpciA9IHRvU2l0ZURpcjsKLQkJdGhpcy5taXJyb3JVUkwgPSBtaXJyb3JVcmw7Ci0JfQotCi0JLyoqCi0JICogdHJ1ZSBpZiBzdWNjZXNzCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIXZhbGlkYXRlUGFyYW1ldGVycygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJaWYgKGdldE1pcnJvclNpdGUoKSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJVVJMIHJlbW90ZVNpdGVVcmwgPSBuZXcgVVJMKGZyb21TaXRlVXJsKTsKLQkJCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUocmVtb3RlU2l0ZVVybCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yW10gPQotCQkJCWZpbmRGZWF0dXJlc1RvTWlycm9yKHJlbW90ZVNpdGUpOwotCQkJaWYgKGZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3IubGVuZ3RoID09IDApIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkJIk5vIG1hdGNoaW5nIGZlYXR1cmVzIGZvdW5kIG9uICIgKyByZW1vdGVTaXRlVXJsICsgIi4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW51bGwpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCW1pcnJvclNpdGUubWlycm9yQW5kRXhwb3NlKAotCQkJCXJlbW90ZVNpdGUsCi0JCQkJZmVhdHVyZVJlZmVyZW5jZXNUb01pcnJvciwKLQkJCQludWxsLAotCQkJCW1pcnJvclVSTCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhjZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQlKYXJDb250ZW50UmVmZXJlbmNlLnNodXRkb3duKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUGFyYW1ldGVycygpIHsKLQkJaWYgKGZyb21TaXRlVXJsID09IG51bGwgfHwgZnJvbVNpdGVVcmwubGVuZ3RoKCkgPD0gMCkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oImZyb20gcGFyYW1ldGVyIGlzIG1pc3NpbmcuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdHJ5IHsKLQkJCW5ldyBVUkwoZnJvbVNpdGVVcmwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiZnJvbSBtdXN0IGJlIGEgdmFsaWQgVVJMIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHRvU2l0ZURpciA9PSBudWxsIHx8IHRvU2l0ZURpci5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZygKLQkJCQlVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigidG8gcGFyYW1ldGVyIGlzIG1pc3NpbmcuIiwgbnVsbCkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByaXZhdGUgTWlycm9yU2l0ZSBnZXRNaXJyb3JTaXRlKCkKLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIENyZWF0ZSBtaXJyb3Igc2l0ZQotCQlpZiAobWlycm9yU2l0ZSA9PSBudWxsKSB7Ci0JCQlpZiAodG9TaXRlRGlyICE9IG51bGwpIHsKLQkJCQlNaXJyb3JTaXRlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IE1pcnJvclNpdGVGYWN0b3J5KCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiQW5hbHl6aW5nIGZlYXR1cmVzIGFscmVhZHkgbWlycm9yZWQgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQltaXJyb3JTaXRlID0KLQkJCQkJCShNaXJyb3JTaXRlKSBmYWN0b3J5LmNyZWF0ZVNpdGUobmV3IEZpbGUodG9TaXRlRGlyKSk7Ci0JCQkJfSBjYXRjaCAoSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIGlzdGUpIHsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIERvbmUuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChtaXJyb3JTaXRlID09IG51bGwpIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkJIk1pcnJvciBzaXRlIGF0ICIgKyB0b1NpdGVEaXIgKyAiIGNhbm5vdCBiZSBhY2Nlc3NlZC4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCW51bGwpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWlycm9yU2l0ZTsKLQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHN1YnNldCBvZiBmZWF0dXJlIHJlZmVyZW5jZXMgb24gcmVtb3RlIHNpdGUKLQkgKiBhcyBzcGVjaWZpZWQgYnkgb3B0aW9uYWwgZmVhdHVyZUlkIGFuZCBmZWF0dXJlVmVyc2lvbgotCSAqIHBhcmFtZXRlcnMKLQkgKiBAcGFyYW0gcmVtb3RlU2l0ZQotCSAqIEByZXR1cm4gSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZpbmRGZWF0dXJlc1RvTWlycm9yKElTaXRlIHJlbW90ZVNpdGUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tdID0KLQkJCXJlbW90ZVNpdGUuZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBleGlzdGluZ0ZlYXR1cmVNb2RlbHNbXSA9Ci0JCQltaXJyb3JTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJQ29sbGVjdGlvbiBmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGZlYXR1cmVWZXJzaW9uSWRlbnRpZmllciA9IG51bGw7Ci0KLQkJaWYgKGZlYXR1cmVJZCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJIlBhcmFtZXRlciBmZWF0dXJlIG5vdCBzcGVjaWZpZWQuICBBbGwgZmVhdHVyZXMgb24gdGhlIHJlbW90ZSBzaXRlIHdpbGwgYmUgbWlycm9yZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZmVhdHVyZVZlcnNpb24gPT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSJQYXJhbWV0ZXIgdmVyc2lvbiBub3Qgc3BlY2lmaWVkLiAgQWxsIHZlcnNpb25zIG9mIGZlYXR1cmVzIG9uIHRoZSByZW1vdGUgc2l0ZSB3aWxsIGJlIG1pcnJvcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIgPQotCQkJCW5ldyBQbHVnaW5WZXJzaW9uSWRlbnRpZmllcihmZWF0dXJlVmVyc2lvbik7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIgPQotCQkJCXJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0KLQkJCWlmIChmZWF0dXJlSWQgIT0gbnVsbAotCQkJCSYmICFmZWF0dXJlSWQuZXF1YWxzKAotCQkJCQlyZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJLy8gaWQgZG9lcyBub3QgbWF0Y2gKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIgIT0gbnVsbAotCQkJCSYmICFmZWF0dXJlVmVyc2lvbklkZW50aWZpZXIuaXNQZXJmZWN0KAotCQkJCQlyZW1vdGVGZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllci5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJLy8gdmVyc2lvbiBkb2VzIG5vdCBtYXRjaAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlmb3IgKGludCBlID0gMDsgZSA8IGV4aXN0aW5nRmVhdHVyZU1vZGVscy5sZW5ndGg7IGUrKykgewotCQkJCWlmIChleGlzdGluZ0ZlYXR1cmVNb2RlbHNbZV0KLQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkuZXF1YWxzKHJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJCQkiRmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHJlbW90ZUZlYXR1cmVWZXJzaW9uZWRJZGVudGlmaWVyCi0JCQkJCQkJKyAiIGFscmVhZHkgbWlycm9yZWQgYW5kIGV4cG9zZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZmVhdHVyZSBhbHJlYWR5IG1pcnJvcmVkIGFuZCBleHBvc2VkIGluIHNpdGUueG1sCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gQ2hlY2sgZmVhdHVyZSB0eXBlCi0JCQlTdHJpbmcgdHlwZSA9Ci0JCQkJKChTaXRlRmVhdHVyZVJlZmVyZW5jZSkgcmVtb3RlU2l0ZUZlYXR1cmVSZWZlcmVuY2VzW2ldKQotCQkJCQkuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gbnVsbAotCQkJCSYmICFJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRS5lcXVhbHModHlwZSkpIHsKLQkJCQkvLyB1bnN1cHBvcnRlZAotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkiRmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgcmVtb3RlRmVhdHVyZVZlcnNpb25lZElkZW50aWZpZXIKLQkJCQkJCSsgIiBpcyBvZiB0eXBlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyB0eXBlCi0JCQkJCQkrICIuICBPbmx5IGZlYXR1cmVzIG9mIHR5cGUgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFCi0JCQkJCQkrICIgYXJlIHN1cHBvcnRlZC4iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwpOwotCQkJfQotCi0JCQlmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLmFkZChyZW1vdGVTaXRlRmVhdHVyZVJlZmVyZW5jZXNbaV0pOwotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHJlbW90ZVNpdGVGZWF0dXJlUmVmZXJlbmNlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJKyAiIHdpbGwgYmUgbWlycm9yZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gKElTaXRlRmVhdHVyZVJlZmVyZW5jZVtdKSBmZWF0dXJlUmVmZXJlbmNlc1RvTWlycm9yLnRvQXJyYXkoCi0JCQluZXcgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW2ZlYXR1cmVSZWZlcmVuY2VzVG9NaXJyb3Iuc2l6ZSgpXSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbWlycm9yL01pcnJvclNpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1Yzg3Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotLyoqCi0gKiBMb2NhbCBtaXJyb3Igc2l0ZS4gIFJlYWQvV3JpdGUKLSAqLwotcHVibGljIGNsYXNzIE1pcnJvclNpdGUgZXh0ZW5kcyBTaXRlIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgSU5ERU5UID0gIiAgICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeTsKLQkvKioKLQkgKiBwbHVnaW4gZW50cmllcyAKLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gZG93bmxvYWRlZFBsdWdpbkVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIGRvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXB1YmxpYyBNaXJyb3JTaXRlKFNpdGVNb2RlbEZhY3RvcnkgZmFjdG9yeSkgewotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIE1pcnJvcnMgdGhlIHNwZWNpZmllZCBmZWF0dXJlcyBhbmQgbGlzdGVkIG9wdGlvbmFsIGZlYXR1cmVzIG9uIHRoaXMgc2l0ZS4KLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAcGFyYW0gbWlycm9yU2l0ZVVybCBleHRlcm5hbCBVUkwgb2YgdGhlIG1pcnJvciBzaXRlIG9yIG51bGw7Ci0JICogaWYgcGFyYW1ldGVyIGlzIHByb3ZpZGVkIHBvbGljeSBmcmFnbWVudCB3aWxsIGJlIGdlbmVyYXRlZAotCSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIG1pcnJvckFuZEV4cG9zZSgKLQkJSVNpdGUgcmVtb3RlU2l0ZSwKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gc291cmNlRmVhdHVyZVJlZnMsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywKLQkJU3RyaW5nIG1pcnJvclNpdGVVcmwpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQltaXJyb3JBbmRFeHBvc2VGZWF0dXJlcygKLQkJCXJlbW90ZVNpdGUsCi0JCQlzb3VyY2VGZWF0dXJlUmVmcywKLQkJCW9wdGlvbmFsZmVhdHVyZXMpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCSJJbnN0YWxsaW5nIGZlYXR1cmVzIGZpbmlzaGVkLiBVcGRhdGluZyBjYXRlZ29yaWVzIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZUNhdGVnb3JpZXMocmVtb3RlU2l0ZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCSJVcGRhdGluZyBjYXRlZ29yaWVzIGZpbmlzaGVkLiBVcGRhdGluZyBzaXRlIGRlc2NyaXB0aW9uIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZURlc2NyaXB0aW9uKHJlbW90ZVNpdGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkiVXBkYXRpbmcgc2l0ZSBkZXNjcmlwdGlvbiBmaW5pc2hlZC4gU2F2aW5nIHNpdGUueG1sIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCXNhdmUoKTsKLQkJaWYgKG1pcnJvclNpdGVVcmwgIT0gbnVsbCkgewotCQkJZ2VuZXJhdGVVcGRhdGVQb2xpY3kobWlycm9yU2l0ZVVybCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIG1pcnJvckFuZEV4cG9zZUZlYXR1cmVzKAotCQlJU2l0ZSByZW1vdGVTaXRlLAotCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBzb3VyY2VGZWF0dXJlUmVmcywKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gRmVhdHVyZXMgdGhhdCBmYWlsZWQgd2lsbCBiZSByZXRyaWVkIG9uY2UgYWdhaW4KLQkJQ29sbGVjdGlvbiBmYWlsZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBzb3VyY2VGZWF0dXJlID0KLQkJCQkJc291cmNlRmVhdHVyZVJlZnNbaV0uZ2V0RmVhdHVyZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWYgPQotCQkJCQltaXJyb3JGZWF0dXJlKAotCQkJCQkJcmVtb3RlU2l0ZSwKLQkJCQkJCXNvdXJjZUZlYXR1cmUsCi0JCQkJCQlvcHRpb25hbGZlYXR1cmVzLAotCQkJCQkJMSk7Ci0JCQkJLy8gU2V0IGNhdGVnb3JpZXMgb2YgdGhlIG5ldyBmZWF0dXJlCi0JCQkJSUNhdGVnb3J5IHJlbW90ZUNhdGVnb3JpZXNbXSA9Ci0JCQkJCXNvdXJjZUZlYXR1cmVSZWZzW2ldLmdldENhdGVnb3JpZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlbW90ZUNhdGVnb3JpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJZmVhdHVyZVJlZi5hZGRDYXRlZ29yeU5hbWUocmVtb3RlQ2F0ZWdvcmllc1tqXS5nZXROYW1lKCkpOwotCQkJCX0KLQotCQkJCWFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChyZW1vdGVTaXRlLCBmZWF0dXJlUmVmKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlmYWlsZWRGZWF0dXJlcy5hZGQoc291cmNlRmVhdHVyZVJlZnNbaV0pOwotCQkJfQotCQl9Ci0KLQkJLy8gZG8gd2UgbmVlZCB0byByZXRyeT8KLQkJaWYgKGZhaWxlZEZlYXR1cmVzLnNpemUoKSA+IDApIHsKLQkJCXNvdXJjZUZlYXR1cmVSZWZzID0KLQkJCQkoSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10pIGZhaWxlZEZlYXR1cmVzLnRvQXJyYXkoCi0JCQkJCW5ldyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbZmFpbGVkRmVhdHVyZXMuc2l6ZSgpXSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZlYXR1cmVSZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBzb3VyY2VGZWF0dXJlID0KLQkJCQlzb3VyY2VGZWF0dXJlUmVmc1tpXS5nZXRGZWF0dXJlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmID0KLQkJCQltaXJyb3JGZWF0dXJlKHJlbW90ZVNpdGUsIHNvdXJjZUZlYXR1cmUsIG9wdGlvbmFsZmVhdHVyZXMsIDEpOwotCQkJLy8gU2V0IGNhdGVnb3JpZXMgb2YgdGhlIG5ldyBmZWF0dXJlCi0JCQlJQ2F0ZWdvcnkgcmVtb3RlQ2F0ZWdvcmllc1tdID0gc291cmNlRmVhdHVyZVJlZnNbaV0uZ2V0Q2F0ZWdvcmllcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZW1vdGVDYXRlZ29yaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJZmVhdHVyZVJlZi5hZGRDYXRlZ29yeU5hbWUocmVtb3RlQ2F0ZWdvcmllc1tqXS5nZXROYW1lKCkpOwotCQkJfQotCi0JCQlhZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwocmVtb3RlU2l0ZSwgZmVhdHVyZVJlZik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgbGlzdGVkIG9wdGlvbmFsIGZlYXR1cmVzIG9uIHRoaXMgc2l0ZS4KLQkgKiBAc2VlIElTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAZXhjZXB0aW9uIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgbWlycm9yRmVhdHVyZSgKLQkJSVNpdGUgcmVtb3RlU2l0ZSwKLQkJSUZlYXR1cmUgc291cmNlRmVhdHVyZSwKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbGZlYXR1cmVzLAotCQlpbnQgaW5kZW50KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0YWIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKQotCQkJdGFiICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJNaXJyb3JpbmcgZmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZXhpc3RpbmdGZWF0dXJlc1tdID0KLQkJCWdldERvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7Ci0JCWZvciAoaW50IGUgPSAwOyBlIDwgZXhpc3RpbmdGZWF0dXJlcy5sZW5ndGg7IGUrKykgewotCQkJaWYgKGV4aXN0aW5nRmVhdHVyZXNbZV0KLQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJLmVxdWFscyhzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJCXRhYgotCQkJCQkJKyAiRmVhdHVyZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCSsgIiBhbHJlYWR5IGV4aXN0cy4gIFNraXBwaW5nIGRvd25sb2FkaW5nLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGV4aXN0aW5nRmVhdHVyZXNbZV07Ci0JCQl9Ci0JCX0KLQotCQlmaW5hbCBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9Ci0JCQlzb3VyY2VGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiR2V0dGluZyBwbHVnaW4gZW50cmllcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJUGx1Z2luRW50cnlbXSBzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcyA9Ci0JCQlzb3VyY2VGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQotCQkvLyBkZXRlcm1pbmUgbGlzdCBvZiBwbHVnaW5zIHRvIGluc3RhbGwKLQkJLy8gZmluZCB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIHBsdWdpbiBlbnRyaWVzIGFscmVhZHkgY29udGFpbmVkCi0JCS8vIG9uIHRoZSB0YXJnZXQgc2l0ZSwgYW5kIHBsdWdpbiBlbnRyaWVzIHBhY2thZ2VkIGluIHNvdXJjZSBmZWF0dXJlCi0KLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luc1RvSW5zdGFsbCA9Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuZGlmZigKLQkJCQlzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcywKLQkJCQlnZXREb3dubG9hZGVkUGx1Z2luRW50cmllcygpKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJHZXR0aW5nIG5vbiBwbHVnaW4gZW50cmllcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBJTm9uUGx1Z2luRW50cnlbXSBub25QbHVnaW5zVG9JbnN0YWxsID0KLQkJCXNvdXJjZUZlYXR1cmUuZ2V0UmF3Tm9uUGx1Z2luRW50cmllcygpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkdldHRpbmcgaW5jbHVkZWQgZmVhdHVyZXMgZm9yICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCQlzb3VyY2VGZWF0dXJlLmdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJaWYgKG9wdGlvbmFsZmVhdHVyZXMgIT0gbnVsbCkgewotCQkJY2hpbGRyZW4gPQotCQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5vcHRpb25hbENoaWxkcmVuVG9JbnN0YWxsKAotCQkJCQljaGlsZHJlbiwKLQkJCQkJb3B0aW9uYWxmZWF0dXJlcyk7Ci0JCX0KLQotCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQl0YWIKLQkJCQkrICJEb3dubG9hZGluZyBmZWF0dXJlIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGRvd25sb2FkIGZlYXR1cmUgYXJjaGl2ZXMKLQkJcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobnVsbCk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiRG93bmxvYWRpbmcgcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBkb3dubG9hZCBwbHVnaW4gYXJjaGl2ZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm92aWRlci5nZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKHBsdWdpbnNUb0luc3RhbGxbaV0sIG51bGwpOwotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiRG93bmxvYWRpbmcgbm9uIHBsdWctaW4gYXJjaGl2ZXMgZm9yICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gZG93bmxvYWQgbm9uLXBsdWdpbiBhcmNoaXZlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCXByb3ZpZGVyLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoCi0JCQkJbm9uUGx1Z2luc1RvSW5zdGFsbFtpXSwKLQkJCQludWxsKTsKLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIkluc3RhbGxpbmcgY2hpbGQgZmVhdHVyZXMgZm9yICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gaW5zdGFsbCBjaGlsZCBmZWF0dXJlcyBmaXJzdAotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJbWlycm9yRmVhdHVyZSgKLQkJCQlyZW1vdGVTaXRlLAotCQkJCWNoaWxkRmVhdHVyZSwKLQkJCQlvcHRpb25hbGZlYXR1cmVzLAotCQkJCWluZGVudCArIDEpOwotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiU3RvcmluZyBwbHVnLWluIGFyY2hpdmVzIGZvciAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJKyAiIC4uLiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIHN0b3JlIHBsdWdpbnMnIGFyY2hpdmVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgewotCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPQotCQkJCXByb3ZpZGVyLmdldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoCi0JCQkJCXBsdWdpbnNUb0luc3RhbGxbaV0sCi0JCQkJCW51bGwpOwotCQkJc3RvcmVQbHVnaW5BcmNoaXZlKHJlZmVyZW5jZXNbMF0pOwotCQkJYWRkRG93bmxvYWRlZFBsdWdpbkVudHJ5KHBsdWdpbnNUb0luc3RhbGxbaV0pOwotCQl9Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiU3RvcmluZyBub24gcGx1Zy1pbiBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzdG9yZSBub24gcGx1Z2lucycgYXJjaGl2ZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub25QbHVnaW5zVG9JbnN0YWxsLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb250ZW50UmVmZXJlbmNlW10gcmVmZXJlbmNlcyA9Ci0JCQkJcHJvdmlkZXIuZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcygKLQkJCQkJbm9uUGx1Z2luc1RvSW5zdGFsbFtpXSwKLQkJCQkJbnVsbCk7Ci0JCQlmb3IgKGludCByID0gMDsgciA8IHJlZmVyZW5jZXMubGVuZ3RoOyByKyspIHsKLQkJCQlzdG9yZU5vblBsdWdpbkFyY2hpdmUoCi0JCQkJCXNvdXJjZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLAotCQkJCQlyZWZlcmVuY2VzW3JdKTsKLQkJCX0KLQkJfQotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIlN0b3JpbmcgZmVhdHVyZSBhcmNoaXZlcyBmb3IgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBzdG9yZSBmZWF0dXJlIGFyY2hpdmUKLQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPQotCQkJcHJvdmlkZXIuZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobnVsbCk7Ci0JCXN0b3JlRmVhdHVyZUFyY2hpdmUocmVmZXJlbmNlc1swXSk7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJdGFiCi0JCQkJKyAiQWRkaW5nIGZlYXR1cmUgIiAvLyROT04tTkxTLTEkCi0JCQkJKyBzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCSsgIiB0byBtb2RlbCAuLi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGFkZCBmZWF0dXJlIG1vZGVsIHRvIHNpdGUgbW9kZWwKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmID0KLQkJCWZhY3RvcnkuY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7Ci0JCWZlYXR1cmVSZWYuc2V0U2l0ZU1vZGVsKHRoaXMpOwotCQkvL2ZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWZlYXR1cmVSZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCWZlYXR1cmVSZWYuc2V0RmVhdHVyZUlkZW50aWZpZXIoCi0JCQlzb3VyY2VGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVWZXJzaW9uKAotCQkJc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQlhZGREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKGZlYXR1cmVSZWYpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCXRhYgotCQkJCSsgIk1pcnJvcmluZyBmZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgZmluaXNoZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZlYXR1cmVSZWY7Ci0KLQl9Ci0JLyoqCi0JICogQWRkcyBhIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIHRoaXMgc2l0ZSwKLQkgKiBhbmQgZXhwb3NlcyBpbiBzaXRlLnhtbCBpZiByZW1vdGUgc2l0ZSBleHBvc2VzIGdpdmVuIGZlYXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKAotCQlJU2l0ZSByZW1vdGVTaXRlLAotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJLy8gY2hlY2sgaWYgcmVtb3RlIHNpdGUgZXhwb3NlcyB0aGlzIGZlYXR1cmUKLQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlbW90ZUZlYXR1cmVzW10gPQotCQkJcmVtb3RlU2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW90ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVtb3RlRmVhdHVyZVJlZiA9IHJlbW90ZUZlYXR1cmVzW2ldOwotCQkJdHJ5IHsKLQkJCQlpZiAocmVtb3RlRmVhdHVyZVJlZgotCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCS5lcXVhbHMoZmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCWFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmZXJlbmNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKLQkJCX0KLQkJfQotCQlzYXZlKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCSJGZWF0dXJlICIgLy8kTk9OLU5MUy0xJAotCQkJCSsgZmVhdHVyZVJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkrICIgYWRkZWQgdG8gc2l0ZS54bWwuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JLyoqCi0JICogQWRkcyBmZWF0dXJlIG1vZGVsIHRvIHNpdGUgbW9kZWwsIHJlbW92aW5nIG9sZCBmZWF0dXJlCi0JICovCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZmVyZW5jZSkgewotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZXhpc3RpbmdNb2RlbHMgPQotCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGV4aXN0aW5nTW9kZWxzLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoZXhpc3RpbmdNb2RlbHNbal0KLQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJLmVxdWFscyhmZWF0dXJlUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQlzdXBlci5yZW1vdmVGZWF0dXJlUmVmZXJlbmNlTW9kZWwoZXhpc3RpbmdNb2RlbHNbal0pOwotCQkJfQotCQl9Ci0JCXN1cGVyLmFkZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN0b3JlRmVhdHVyZUFyY2hpdmUoQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJU3RyaW5nIGZlYXR1cmVQYXRoID0gbnVsbDsKLQotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9Ci0JCQkJbmV3IFVSTCgKLQkJCQkJdGhpcy5nZXRVUkwoKSwKLQkJCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJCSsgY29udGVudFJlZmVyZW5jZS5nZXRJZGVudGlmaWVyKCkKLQkJCQkJCSsgIi5qYXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZVBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOwotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIGZlYXR1cmVQYXRoLCBudWxsKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJIkVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nICIrIGZlYXR1cmVQYXRoKyIgZmlsZS4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0JLyoqCi0JKiBAc2VlIElTaXRlQ29udGVudENvbnN1bWVyI3N0b3JlKENvbnRlbnRSZWZlcmVuY2UsIElQcm9ncmVzc01vbml0b3IpCi0JKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVQbHVnaW5BcmNoaXZlKENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJU3RyaW5nIHBsdWdpblBhdGggPSBudWxsOwotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoZ2V0VVJMKCksIGNvbnRlbnRSZWZlcmVuY2UuZ2V0SWRlbnRpZmllcigpKTsKLQkJCXBsdWdpblBhdGggPSBuZXdVUkwuZ2V0RmlsZSgpOwotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoaW5TdHJlYW0sIHBsdWdpblBhdGgsIG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCSJFcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyAiKyBwbHVnaW5QYXRoKyIgZmlsZS4iLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQllKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3JlTm9uUGx1Z2luQXJjaGl2ZSgKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBmZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllciwKLQkJQ29udGVudFJlZmVyZW5jZSBjb250ZW50UmVmZXJlbmNlKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBudWxsOwotCQlGaWxlIG5vblBsdWdpbkFyY2hpdmVQYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBuZXdEaXJVUkwgPQotCQkJCW5ldyBVUkwoCi0JCQkJCWdldFVSTCgpLAotCQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkJKyAiLyIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBmZWF0dXJlVmVyc2lvbmVkSWRlbnRpZmllcik7Ci0JCQlGaWxlIGRpciA9IG5ldyBGaWxlKG5ld0RpclVSTC5nZXRGaWxlKCkpOwotCQkJZGlyLm1rZGlycygpOwotCQkJaW5TdHJlYW0gPSBjb250ZW50UmVmZXJlbmNlLmdldElucHV0U3RyZWFtKCk7Ci0JCQlub25QbHVnaW5BcmNoaXZlUGF0aCA9Ci0JCQkJbmV3IEZpbGUoZGlyLCBjb250ZW50UmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY29weVRvTG9jYWwoCi0JCQkJaW5TdHJlYW0sCi0JCQkJbm9uUGx1Z2luQXJjaGl2ZVBhdGguZ2V0QWJzb2x1dGVQYXRoKCksCi0JCQkJbnVsbCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJIkVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nICIrIG5vblBsdWdpbkFyY2hpdmVQYXRoLmdldEFic29sdXRlUGF0aCgpKyIgZmlsZS4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmUoKSB7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTCh0aGlzLmdldFVSTCgpLCAic2l0ZS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpKTsKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRXcml0ZXIpOwotCQkJc2F2ZSh3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCSJTaXRlIFhNTCBjb3VsZCBub3QgYmUgc2F2ZWQuIiwgLy8kTk9OLU5MUy0xJAotCQkJCQlpb2UpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmb3MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWZvcy5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZTIpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHNhdmUoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlci5wcmludGxuKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsgLy8kTk9OLU5MUy0xJAotCQkvL3dyaXRlci5wcmludGxuKCI8IURPQ1RZUEUgc2l0ZSBTWVNURU0gXCJkdGQvc2l0ZS5kdGRcIj4iKTsKLQkJd3JpdGVTaXRlKCIiLCB3cml0ZXIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlU2l0ZShTdHJpbmcgaW5kZW50LCBQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVyLnByaW50KGluZGVudCArICI8c2l0ZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgSU5ERU5UOwotCQkvLyBkZWZhdWx0IHR5cGUKLQkJLy93cml0ZUlmRGVmaW5lZChpbmRlbnRhLCB3cml0ZXIsICJ0eXBlIiwgZ2V0VHlwZSgpKTsKLQkJLy8gc3RvcmVkIHJlbGF0aXZlIHRvIHNpdGUueG1sCi0JCS8vd3JpdGVJZkRlZmluZWQoaW5kZW50YSwgd3JpdGVyLCAidXJsIiwgZ2V0VVJMKCkpOwotCQl3cml0ZXIucHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0JCVVSTEVudHJ5TW9kZWwgZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbk1vZGVsKCk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQl3cml0ZXIucHJpbnRsbigpOwotCQkJd3JpdGVEZXNjcmlwdGlvbihpbmRlbnQyLCB3cml0ZXIsIGRlc2NyaXB0aW9uKTsKLQkJCXdyaXRlci5wcmludGxuKCk7Ci0JCX0KLQkJd3JpdGVGZWF0dXJlcyhpbmRlbnQyLCB3cml0ZXIpOwotCQl3cml0ZUNhdGVnb3JpZXMoaW5kZW50Miwgd3JpdGVyKTsKLQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjwvc2l0ZT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQlwcml2YXRlIHZvaWQgd3JpdGVGZWF0dXJlcyhTdHJpbmcgaW5kZW50LCBQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMgPQotCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVSZWZlcmVuY2VNb2RlbHMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlci5wcmludChpbmRlbnQpOwotCQkJd3JpdGVyLnByaW50KCI8ZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoCi0JCQkJIiB1cmw9XCJmZWF0dXJlcy8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldEZlYXR1cmVJZGVudGlmaWVyKCkKLQkJCQkJKyAiXyIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHNbaV0uZ2V0RmVhdHVyZVZlcnNpb24oKQotCQkJCQkrICIuamFyXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KAotCQkJCSIgaWQ9XCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzW2ldLmdldEZlYXR1cmVJZGVudGlmaWVyKCkKLQkJCQkJKyAiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KAotCQkJCSIgdmVyc2lvbj1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHNbaV0uZ2V0RmVhdHVyZVZlcnNpb24oKQotCQkJCQkrICJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigiPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCVN0cmluZ1tdIGNhdGVnb3J5TmFtZXMgPQotCQkJCWZlYXR1cmVSZWZlcmVuY2VNb2RlbHNbaV0uZ2V0Q2F0ZWdvcnlOYW1lcygpOwotCQkJZm9yIChpbnQgY24gPSAwOyBjbiA8IGNhdGVnb3J5TmFtZXMubGVuZ3RoOyBjbisrKSB7Ci0JCQkJd3JpdGVyLnByaW50KGluZGVudCArIElOREVOVCk7Ci0JCQkJd3JpdGVyLnByaW50bG4oCi0JCQkJCSI8Y2F0ZWdvcnkgbmFtZT1cIiIgKyBjYXRlZ29yeU5hbWVzW2NuXSArICJcIiAvPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJfQotCi0JCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKLQkJCXdyaXRlci5wcmludGxuKCI8L2ZlYXR1cmU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHdyaXRlQ2F0ZWdvcmllcyhTdHJpbmcgaW5kZW50LCBQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3J5TW9kZWxzID0gZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsKLQkJaWYgKGNhdGVnb3J5TW9kZWxzLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeU1vZGVscy5sZW5ndGg7IGkrKykgewotCQkJd3JpdGVyLnByaW50KGluZGVudCk7Ci0JCQl3cml0ZXIucHJpbnQoIjxjYXRlZ29yeS1kZWYiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KAotCQkJCSIgbmFtZT1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGNhdGVnb3J5TW9kZWxzW2ldLmdldE5hbWUoKQotCQkJCQkrICJcIiBsYWJlbD1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGNhdGVnb3J5TW9kZWxzW2ldLmdldExhYmVsKCkKLQkJCQkJKyAiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVEZXNjcmlwdGlvbigKLQkJCQlpbmRlbnQgKyBJTkRFTlQsCi0JCQkJd3JpdGVyLAotCQkJCWNhdGVnb3J5TW9kZWxzW2ldLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7Ci0JCQl3cml0ZXIucHJpbnQoaW5kZW50KTsKLQkJCXdyaXRlci5wcmludGxuKCI8L2NhdGVnb3J5LWRlZj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50bG4oKTsKLQkJfQotCX0KLQlwcml2YXRlIHZvaWQgd3JpdGVEZXNjcmlwdGlvbigKLQkJU3RyaW5nIGluZGVudCwKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlVUkxFbnRyeU1vZGVsIHVybEVudHJ5TW9kZWwpIHsKLQkJU3RyaW5nIHVybCA9IHVybEVudHJ5TW9kZWwuZ2V0VVJMU3RyaW5nKCk7Ci0JCVN0cmluZyB0ZXh0ID0gdXJsRW50cnlNb2RlbC5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCk7Ci0JCWlmICh1cmwgPT0gbnVsbCAmJiB0ZXh0ID09IG51bGwgJiYgdGV4dC5sZW5ndGgoKSA8PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3JpdGVyLnByaW50KGluZGVudCk7Ci0JCXdyaXRlci5wcmludCgiPGRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJd3JpdGVyLnByaW50KCIgdXJsPVwiIiArIHVybCArICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDw9IDApIHsKLQkJCXdyaXRlci5wcmludGxuKCIgLz4iKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJd3JpdGVyLnByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHRleHQgIT0gbnVsbCkgewotCQkJCXdyaXRlci5wcmludGxuKAotCQkJCQlpbmRlbnQgKyBJTkRFTlQgKyBVcGRhdGVNYW5hZ2VyVXRpbHMuV3JpdGVyLnhtbFNhZmUodGV4dCkpOwotCQkJfQotCQkJd3JpdGVyLnByaW50bG4oaW5kZW50ICsgIjwvZGVzY3JpcHRpb24+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKioKLQkgKiBBZGRzIGEgcGx1Z2luIGVudHJ5IAotCSAqIEVpdGhlciBmcm9tIHBhcnNpbmcgdGhlIGZpbGUgc3lzdGVtIG9yIAotCSAqIGluc3RhbGxpbmcgYSBmZWF0dXJlCi0JICogCi0JICogV2UgY2Fubm90IGZpZ3VyZSBvdXQgdGhlIGxpc3Qgb2YgcGx1Z2lucyBieSByZWFkaW5nIHRoZSBTaXRlLnhtbCBhcwotCSAqIHRoZSBhcmNoaXZlcyB0YWcgYXJlIG9wdGlvbmFscwotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvd25sb2FkZWRQbHVnaW5FbnRyeShJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkpIHsKLQkJZG93bmxvYWRlZFBsdWdpbkVudHJpZXMuYWRkKHBsdWdpbkVudHJ5KTsKLQl9Ci0KLQlwcml2YXRlIElQbHVnaW5FbnRyeVtdIGdldERvd25sb2FkZWRQbHVnaW5FbnRyaWVzKCkgewotCQlyZXR1cm4gKElQbHVnaW5FbnRyeVtdKSBkb3dubG9hZGVkUGx1Z2luRW50cmllcy50b0FycmF5KAotCQkJbmV3IElQbHVnaW5FbnRyeVtkb3dubG9hZGVkUGx1Z2luRW50cmllcy5zaXplKCldKTsKLQl9Ci0JLyoqCi0JICogQWRkcyBhIHBsdWdpbiBlbnRyeSAKLQkgKiBFaXRoZXIgZnJvbSBwYXJzaW5nIHRoZSBmaWxlIHN5c3RlbSBvciAKLQkgKiBpbnN0YWxsaW5nIGEgZmVhdHVyZQotCSAqIAotCSAqIFdlIGNhbm5vdCBmaWd1cmUgb3V0IHRoZSBsaXN0IG9mIHBsdWdpbnMgYnkgcmVhZGluZyB0aGUgU2l0ZS54bWwgYXMKLQkgKiB0aGUgYXJjaGl2ZXMgdGFnIGFyZSBvcHRpb25hbHMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVsKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZU1vZGVsKSB7Ci0JCWRvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzLmFkZChmZWF0dXJlTW9kZWwpOwotCX0KLQotCXByaXZhdGUgU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGdldERvd25sb2FkZWRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCkgewotCQlyZXR1cm4gKAotCQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdKSBkb3dubG9hZGVkRmVhdHVyZVJlZmVyZW5jZU1vZGVscwotCQkJCS50b0FycmF5KAotCQkJbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbZG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMKLQkJCQkuc2l6ZSgpXSk7Ci0JfQotCS8qKgotCSAqIENoZWNrcyBpZiBtaXJyb3Igc2l0ZSBjb250YWlucyBhIGZlYXR1cmUgd2l0aCBnaXZlbiBJRCBhbmQgdmVyc2lvbgotCSAqIEBwYXJhbSBmZWF0dXJlUmVmTW9kZWwKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3VjaCBmZWF0dXJlIGV4aXN0cwotCSAqLwotCS8qcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zKFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZVJlZk1vZGVsKSB7Ci0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmc1tdID0gZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlpZiAoZmVhdHVyZVJlZnNbaV0KLQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkuZXF1YWxzKGZlYXR1cmVSZWZNb2RlbC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQljZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSovCi0KLQkvKioKLQkgKiBVcGRhdGVzIGRlc2NyaXB0aW9uIG9mIHRoaXMgc2l0ZQotCSAqIGZyb20gZGVzY3JpcHRpb24gb2YgdGhlIHJlbW90ZSBzaXRlLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVEZXNjcmlwdGlvbihJU2l0ZSByZW1vdGVTaXRlKSB7Ci0JCUlVUkxFbnRyeSB1cmxFbnRyeSA9IHJlbW90ZVNpdGUuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKHVybEVudHJ5ICE9IG51bGwpIHsKLQkJCVVSTEVudHJ5TW9kZWwgbmV3VXJsRW50cnlNb2RlbCA9IG5ldyBVUkxFbnRyeU1vZGVsKCk7Ci0JCQlVUkwgdXJsID0gdXJsRW50cnkuZ2V0VVJMKCk7Ci0JCQluZXdVcmxFbnRyeU1vZGVsLnNldEFubm90YXRpb24odXJsRW50cnkuZ2V0QW5ub3RhdGlvbigpKTsKLQkJCW5ld1VybEVudHJ5TW9kZWwuc2V0VVJMU3RyaW5nKHVybC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCXRoaXMuc2V0RGVzY3JpcHRpb25Nb2RlbChuZXdVcmxFbnRyeU1vZGVsKTsKLQkJfQotCX0KLQkvKioKLQkgKiBVcGRhdGVzIGFsbCBjYXRlZ29yaWVzIHVzZWQgYnkgZmVhdHVyZXMgb24gdGhpcyBzaXRlCi0JICogZnJvbSBjYXRlZ29yaWVzIGRlZmluZWQgb24gcmVtb3RlIHNpdGUuCi0JICogQ2F0ZWdvcmllcyBub3QgZGVmaW5lZCBvbiByZW1vdGUgc2l0ZSBhcmUgdW5jaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDYXRlZ29yaWVzKElTaXRlIHJlbW90ZVNpdGUpIHsKLQkJLy8gY29sbGVjdCBuYW1lIG9mIGNhdGVnb3JpZXMgdXNlZCBvbiB0aGlzIHNpdGUKLQkJU2V0IHVzZWRDYXRlZ29yeU5hbWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlUmVmTW9kZWxzW10gPQotCQkJZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOwotCQlmb3IgKGludCBmID0gMDsgZiA8IGZlYXR1cmVSZWZNb2RlbHMubGVuZ3RoOyBmKyspIHsKLQkJCVN0cmluZ1tdIGZlYXR1cmVDYXRlZ29yeU5hbWVzID0KLQkJCQlmZWF0dXJlUmVmTW9kZWxzW2ZdLmdldENhdGVnb3J5TmFtZXMoKTsKLQotCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBmZWF0dXJlQ2F0ZWdvcnlOYW1lcy5sZW5ndGg7IGMrKykgewotCQkJCXVzZWRDYXRlZ29yeU5hbWVzLmFkZChmZWF0dXJlQ2F0ZWdvcnlOYW1lc1tjXSk7Ci0JCQl9Ci0JCX0KLQotCQlDb2xsZWN0aW9uIG5ld0NhdGVnb3J5TW9kZWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdXNlZENhdGVnb3J5TmFtZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlJQ2F0ZWdvcnkgcmVtb3RlQ2F0ZWdvcnkgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5KG5hbWUpOwotCQkJaWYgKHJlbW90ZUNhdGVnb3J5ID09IG51bGwpIHsKLQkJCQkvLyByZW1vdGUgc2l0ZSBkb2VzIG5vdCBkZWZpbmUgdGhpcyBjYXRlZ29yeQotCQkJCUNhdGVnb3J5TW9kZWwgb2xkQ2F0ZWdvcnkgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW9sZENhdGVnb3J5ID0gKENhdGVnb3J5TW9kZWwpIGdldENhdGVnb3J5KG5hbWUpOwotCQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJCQkvLyBjYW5ub3QgcmVwcm9kdWNlIG5wZSBhbnltb3JlCi0JCQkJfQotCQkJCWlmIChvbGRDYXRlZ29yeSAhPSBudWxsKSB7Ci0JCQkJCW5ld0NhdGVnb3J5TW9kZWxzLmFkZChvbGRDYXRlZ29yeSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluZXdDYXRlZ29yeU1vZGVscy5hZGQocmVtb3RlQ2F0ZWdvcnkpOwotCQkJfQotCi0JCX0KLQkJc2V0Q2F0ZWdvcnlNb2RlbHMoCi0JCQkoQ2F0ZWdvcnlNb2RlbFtdKSBuZXdDYXRlZ29yeU1vZGVscy50b0FycmF5KAotCQkJCW5ldyBDYXRlZ29yeU1vZGVsW25ld0NhdGVnb3J5TW9kZWxzLnNpemUoKV0pKTsKLQotCX0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVVcGRhdGVQb2xpY3koU3RyaW5nIHVybCkgewotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwodGhpcy5nZXRVUkwoKSwgInBvbGljeS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpKTsKLQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRXcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGZvcywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXRXcml0ZXIpOwotCi0JCQl3cml0ZXIucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludGxuKCI8dXBkYXRlLXBvbGljeT4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl3cml0ZXIucHJpbnRsbigKLQkJCQkiPCEtLSBZb3UgY2FuIHBhc3RlIHRoZSBmb2xsb3dpbmcgZnJhZ21lbnQsIGNvbnRhaW5pbmcgdXJsLW1hcCBlbGVtZW50cywgaW50byBhbm90aGVyIHBvbGljeSBmaWxlLiAtLT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVVcmxNYXBzKHdyaXRlciwgdXJsKTsKLQkJCXdyaXRlci5wcmludGxuKCI8IS0tIEVuZCBvZiBmcmFnbWVudCB3aXRoIHVybC1tYXAgZWxlbWVudHMuIC0tPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXdyaXRlci5wcmludGxuKCI8L3VwZGF0ZS1wb2xpY3k+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coCi0JCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCSJwb2xpY3kueG1sIGNvdWxkIG5vdCBiZSBzYXZlZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJaW9lKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZm9zICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlmb3MuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UyKSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCB3cml0ZVVybE1hcHMoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgdXJsKSB7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzID0KLQkJCWdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmZXJlbmNlTW9kZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQl3cml0ZXIucHJpbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludCgiPHVybC1tYXAiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KAotCQkJCSIgcGF0dGVybj1cIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmVSZWZlcmVuY2VNb2RlbHNbaV0uZ2V0RmVhdHVyZUlkZW50aWZpZXIoKQotCQkJCQkrICJcIiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnQoIiB1cmw9XCIiICsgdXJsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJd3JpdGVyLnByaW50bG4oIiAvPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9taXJyb3IvTWlycm9yU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjgxNWUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21pcnJvci9NaXJyb3JTaXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1pcnJvcjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotcHVibGljIGNsYXNzIE1pcnJvclNpdGVGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IHsKLQkvKgotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjcmVhdGVTaXRlTWFwTW9kZWwoKQotCSAqLwotCXB1YmxpYyBTaXRlTW9kZWwgY3JlYXRlU2l0ZU1hcE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IE1pcnJvclNpdGUodGhpcyk7Ci0JfQotCS8qCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwpCi0JICovCi0JcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVTaXRlKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKTsKLQl9Ci0JLyoKLQkgKiBAc2VlIElTaXRlRmFjdG9yeSNjcmVhdGVTaXRlKFVSTCkKLQkgKi8KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShGaWxlIHNpdGVMb2NhdGlvbikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gc2l0ZVN0cmVhbSA9IG51bGw7Ci0KLQkJaWYgKCFzaXRlTG9jYXRpb24uZXhpc3RzKCkpIHsKLQkJCWlmICghc2l0ZUxvY2F0aW9uLm1rZGlycygpKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCSJEaXJlY3RvcnkgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIHNpdGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKQotCQkJCQkJKyAiIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCFzaXRlTG9jYXRpb24uaXNEaXJlY3RvcnkoKSB8fCAhc2l0ZUxvY2F0aW9uLmNhbldyaXRlKCkpCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlzaXRlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJKyAiIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBpcyBub3Qgd3JpdHRhYmxlLiIsIC8vJE5PTi1OTFMtMSQKLQkJCQludWxsKTsKLQotCQlNaXJyb3JTaXRlIHNpdGUgPSBudWxsOwotCQkvLyBwYXJzZSBwdWJsaWMgZmVhdHVyZXMKLQkJaWYgKG5ldyBGaWxlKHNpdGVMb2NhdGlvbiwgU2l0ZS5TSVRFX1hNTCkuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJc2l0ZVN0cmVhbSA9Ci0JCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLlNJVEVfWE1MKSk7Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJfQotCQkJc2l0ZSA9IChNaXJyb3JTaXRlKSBwYXJzZVNpdGUoc2l0ZVN0cmVhbSk7Ci0JCQl0cnkgewotCQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpCi0JCQkJCXNpdGVTdHJlYW0uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlpZiAoc2l0ZSA9PSBudWxsKSB7Ci0JCQlzaXRlID0gKE1pcnJvclNpdGUpIGNyZWF0ZVNpdGVNYXBNb2RlbCgpOwotCQl9Ci0JCS8vIHBhcnNlIGRvd25sb2FkZWQgcGx1Z2lucyBhbmQgZnJhZ21lbnRzCi0JCXBhcnNlRG93bmxvYWRlZFBsdWdpbnNBbmRGcmFnbWVudHMoCi0JCQlzaXRlLAotCQkJbmV3IEZpbGUoc2l0ZUxvY2F0aW9uLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgpKTsKLQkJLy8gcGFyc2UgZG93bmxvYWRlZCBmZWF0dXJlcwotCQlwYXJzZURvd25sb2FkZWRGZWF0dXJlcygKLQkJCXNpdGUsCi0JCQluZXcgRmlsZShzaXRlTG9jYXRpb24sIFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgpKTsKLQotCQlVUkwgdXJsOwotCQl0cnkgewotCQkJdXJsID0gc2l0ZUxvY2F0aW9uLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCSJBIFVSTCBmb3Igc2l0ZSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBzaXRlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkKLQkJCQkJKyAiIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIsIC8vJE5PTi1OTFMtMSQKLQkJCQltdWUpOwotCQl9Ci0JCVNpdGVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0gbnVsbDsKLQkJY29udGVudFByb3ZpZGVyID0gbmV3IFNpdGVGaWxlQ29udGVudFByb3ZpZGVyKHVybCk7Ci0KLQkJc2l0ZS5zZXRTaXRlQ29udGVudFByb3ZpZGVyKGNvbnRlbnRQcm92aWRlcik7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaXRlKHNpdGUpOwotCQl0cnkgewotCQkJc2l0ZS5yZXNvbHZlKHVybCwgdXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJIlVuYWJsZSB0byByZXNvbHZlIFVSTCAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAodXJsID09IG51bGwgPyAiIiA6IHVybC50b0V4dGVybmFsRm9ybSgpKSwgLy8kTk9OLU5MUy0xJAotCQkJCW11ZSk7Ci0JCX0KLQkJcmV0dXJuIHNpdGU7Ci0JfQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VEb3dubG9hZGVkUGx1Z2luc0FuZEZyYWdtZW50cyhNaXJyb3JTaXRlIHNpdGUsCi0JCQlGaWxlIHBsdWdpbkRpcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoIXBsdWdpbkRpci5leGlzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZ1tdIGRpciA9IHBsdWdpbkRpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpci5sZW5ndGg7IGkrKykgewotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwbHVnaW5EaXIsIGRpcltpXSk7Ci0JCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXJSZWZlcmVuY2UgPSBuZXcgSmFyQ29udGVudFJlZmVyZW5jZSgKLQkJCQkJCW51bGwsIGZpbGUpOwotCQkJCUNvbnRlbnRSZWZlcmVuY2UgcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoIk1FVEEtSU5GL01BTklGRVNULk1GIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJaW4gPSByZWYuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJQnVuZGxlTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgQnVuZGxlTWFuaWZlc3QoaW4pOwotCQkJCQlpZiAobWFuaWZlc3QuZXhpc3RzKCkpIHsKLQkJCQkJCXNpdGUKLQkJCQkJCQkJLmFkZERvd25sb2FkZWRQbHVnaW5FbnRyeShtYW5pZmVzdAotCQkJCQkJCQkJCS5nZXRQbHVnaW5FbnRyeSgpKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJlZiA9IGphclJlZmVyZW5jZS5wZWVrKCJwbHVnaW4ueG1sIiwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVmID09IG51bGwpIHsKLQkJCQkJcmVmID0gamFyUmVmZXJlbmNlLnBlZWsoImZyYWdtZW50LnhtbCIsIG51bGwsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChyZWYgIT0gbnVsbCkgewotCQkJCQlpbiA9IHJlZi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQlQbHVnaW5FbnRyeSBlbnRyeSA9IG5ldyBEZWZhdWx0UGx1Z2luUGFyc2VyKCkucGFyc2UoaW4pOwotCQkJCQlzaXRlLmFkZERvd25sb2FkZWRQbHVnaW5FbnRyeShlbnRyeSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZihpbiAhPW51bGwpewotCQkJCQl0cnl7Ci0JCQkJCQlpbi5jbG9zZSgpOwotCQkJCQl9Y2F0Y2goSU9FeGNlcHRpb24gY2UpewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSogTWV0aG9kIHBhcnNlRmVhdHVyZS4KLQkqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlRG93bmxvYWRlZEZlYXR1cmVzKE1pcnJvclNpdGUgc2l0ZSwgRmlsZSBmZWF0dXJlRGlyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmZWF0dXJlRGlyLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmdbXSBkaXI7Ci0JCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmVSZWY7Ci0JCQlVUkwgZmVhdHVyZVVSTDsKLQkJCUZpbGUgY3VycmVudEZlYXR1cmVGaWxlOwotCQkJU3RyaW5nIG5ld0ZpbGVQYXRoID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQkvLyBvbmx5IGxpc3QgSkFSIGZpbGVzCi0JCQkJZGlyID0gZmVhdHVyZURpci5saXN0KEZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlci5maWx0ZXIpOwotCQkJCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBkaXIubGVuZ3RoOyBpbmRleCsrKSB7Ci0KLQkJCQkJLy8gY2hlY2sgaWYgdGhlIEpBUiBmaWxlIGNvbnRhaW5zIGEgZmVhdHVyZS54bWwKLQkJCQkJY3VycmVudEZlYXR1cmVGaWxlID0gbmV3IEZpbGUoZmVhdHVyZURpciwgZGlyW2luZGV4XSk7Ci0JCQkJCUphckNvbnRlbnRSZWZlcmVuY2UgcmVmID0KLQkJCQkJCW5ldyBKYXJDb250ZW50UmVmZXJlbmNlKCIiLCBjdXJyZW50RmVhdHVyZUZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCUNvbnRlbnRSZWZlcmVuY2UgcmVzdWx0ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdCA9IHJlZi5wZWVrKEZlYXR1cmUuRkVBVFVSRV9YTUwsIG51bGwsIG51bGwpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLndhcm4oCi0JCQkJCQkJIkV4Y2VwdGlvbiByZXRyaWV2aW5nIGZlYXR1cmUueG1sIGluIGZpbGU6IiAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgY3VycmVudEZlYXR1cmVGaWxlLAotCQkJCQkJCWUpOwotCQkJCQl9Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJVXBkYXRlQ29yZS53YXJuKAotCQkJCQkJCSJVbmFibGUgdG8gZmluZCBmZWF0dXJlLnhtbCBpbiBmaWxlOiIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGN1cnJlbnRGZWF0dXJlRmlsZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlmZWF0dXJlVVJMID0gY3VycmVudEZlYXR1cmVGaWxlLnRvVVJMKCk7Ci0JCQkJCQlmZWF0dXJlUmVmID0gY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldFNpdGVNb2RlbChzaXRlKTsKLQkJCQkJCWZlYXR1cmVSZWYuc2V0VVJMU3RyaW5nKGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQkJCQkJZmVhdHVyZVJlZi5zZXRGZWF0dXJlSWRlbnRpZmllcigKLQkJCQkJCQlmZWF0dXJlUmVmCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKSk7Ci0JCQkJCQlmZWF0dXJlUmVmLnNldEZlYXR1cmVWZXJzaW9uKAotCQkJCQkJCWZlYXR1cmVSZWYKLQkJCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkJCS50b1N0cmluZygpKTsKLQkJCQkJCXNpdGUuYWRkRG93bmxvYWRlZEZlYXR1cmVSZWZlcmVuY2VNb2RlbChmZWF0dXJlUmVmKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCSJVbmFibGUgdG8gY3JlYXRlIFVSTCBmb3IgZmlsZSAiICsgbmV3RmlsZVBhdGggKyAiLiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0J1bmRsZU1hbmlmZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNTdjZjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQnVuZGxlTWFuaWZlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLS8qKgotICogUGFyc2VzIE1BTklGRVNULk1GCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVNYW5pZmVzdCB7Ci0JcHJpdmF0ZSBQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeTsKLQlwcml2YXRlIElPRXhjZXB0aW9uIGV4Y2VwdGlvbjsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgbG9jYWwgZmlsZQotCSAqLwotcHVibGljIEJ1bmRsZU1hbmlmZXN0KEZpbGUgbWFuaWZlc3QpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG1hbmlmZXN0LmV4aXN0cygpICYmICFtYW5pZmVzdC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZm9zID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZm9zID0gbmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdCk7Ci0JCQkJcGFyc2UoZm9zKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZm9zICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvcy5jbG9zZSgpOwotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIGxvY2FsIGZpbGUKLQkgKi8KLQlwdWJsaWMgQnVuZGxlTWFuaWZlc3QoSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCXBhcnNlKGlucHV0KTsKLQkJfQotCX0KLQkvKioKLQkgKiBQYXJzZXMgbWFuaWZlc3QsIGNyZWF0ZXMgUGx1Z2luRW50cnkgaWYgbWFuaWZlc3QgaXMgdmFsaWQsIHN0b3JlcwotCSAqIGV4Y2VwdGlvbiBpZiBhbnkgb2NjdXJzCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICBJbnB1dFN0cmVhbQotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbikgewotCQl0cnkgewotCQkJTWFuaWZlc3QgbSA9IG5ldyBNYW5pZmVzdChpbik7Ci0JCQlBdHRyaWJ1dGVzIGEgPSBtLmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCQkvLyBwbHVnaW4gaWQKLQkJCVN0cmluZyBzeW1ib2xpY05hbWUgPSBhLmdldFZhbHVlKENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCWlmIChzeW1ib2xpY05hbWUgPT0gbnVsbCkgewotCQkJCS8vIEluIEVjbGlwc2UgbWFuaWZlc3QgbXVzdCBoYXZlIEJ1bmRsZS1TeW1ib2xpY05hbWUgYXR0cmlidXRlCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJU3RyaW5nIGlkOwotCQkJdHJ5IHsKLQkJCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50cyA9IE1hbmlmZXN0RWxlbWVudC5wYXJzZUhlYWRlcigKLQkJCQkJCUNvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FLCBzeW1ib2xpY05hbWUpOwotCQkJCWlkID0gZWxlbWVudHNbMF0uZ2V0VmFsdWUoKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBiZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihiZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJLy8gcGx1Z2luIHZlcnNpb24KLQkJCVN0cmluZyB2ZXJzaW9uID0gYS5nZXRWYWx1ZShDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCVN0cmluZyBob3N0UGx1Z2luID0gYS5nZXRWYWx1ZShDb25zdGFudHMuRlJBR01FTlRfSE9TVCk7Ci0JCQlwbHVnaW5FbnRyeSA9IG5ldyBQbHVnaW5FbnRyeSgpOwotCQkJcGx1Z2luRW50cnkuc2V0VmVyc2lvbmVkSWRlbnRpZmllcihuZXcgVmVyc2lvbmVkSWRlbnRpZmllcihpZCwKLQkJCQkJdmVyc2lvbikpOwotCQkJcGx1Z2luRW50cnkuaXNGcmFnbWVudChob3N0UGx1Z2luICE9IG51bGwKLQkJCQkJJiYgaG9zdFBsdWdpbi5sZW5ndGgoKSA+IDApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCWV4Y2VwdGlvbiA9IGlvZTsKLQkJfQotCX0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBleGNlcHRpb24gIT0gbnVsbCB8fCBwbHVnaW5FbnRyeSAhPSBudWxsOwotCX0KLQkvKioKLQkgKiBPYnRhaW5zIFBsdWdpbkVudHJ5IGZyb20gYSBtYW5pZmVzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIFBsdWdpbkVudHJ5IG9yIG51bGwgaWYgdmFsaWQgbWFuaWZlc3QgZG9lcyBub3QgZXhpc3QKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgZXhjZXB0aW9uIGR1cmluZyBwYXJzaW5nCi0JICovCi0JcHVibGljIFBsdWdpbkVudHJ5IGdldFBsdWdpbkVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBleGNlcHRpb247Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gcGx1Z2luRW50cnk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0OTgxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uQWN0aXZpdHlNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotIAotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3R7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBpbnQgYWN0aW9uOwotCXByaXZhdGUgRGF0ZSBkYXRlOwotCXByaXZhdGUgaW50IHN0YXR1czsKLQlwcml2YXRlIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW5zdGFsbENvbmZpZ3VyYXRpb247Ci0JCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwuCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFjdGlvbigpIHsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKLQkJcmV0dXJuIGRhdGU7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRhdGUuCi0JICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0ZShEYXRlIGRhdGUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5kYXRlID0gZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGF0dXMuCi0JICogQHBhcmFtIHN0YXR1cyBUaGUgc3RhdHVzIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgc3RhdHVzKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFjdGlvbi4KLQkgKiBAcGFyYW0gYWN0aW9uIFRoZSBhY3Rpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aW9uKGludCBhY3Rpb24pIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFsbENvbmZpZ3VyYXRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbAotCSAqLwotCXB1YmxpYyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGdldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBpbnN0YWxsQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbi4KLQkgKiBAcGFyYW0gaW5zdGFsbENvbmZpZ3VyYXRpb24gVGhlIGluc3RhbGxDb25maWd1cmF0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBpbnN0YWxsQ29uZmlndXJhdGlvbikgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwkJCi0JCXRoaXMuaW5zdGFsbENvbmZpZ3VyYXRpb24gPSBpbnN0YWxsQ29uZmlndXJhdGlvbjsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJhdGlvblBvbGljeU1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uUG9saWN5TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzNjNmZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9Db25maWd1cmF0aW9uUG9saWN5TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQkKLQkKLQotCXByaXZhdGUgaW50IHBvbGljeTsKLQlwcml2YXRlIE1hcCAvKiBvZiBGZWF0dXJlUmVmZXJlbmNlTW9kZWwgKi9jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXM7Ci0JcHJpdmF0ZSBNYXAgLyogb2YgRmVhdHVyZVJlZmVyZW5jZU1vZGVsICovdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXM7Ci0JCi0JLy8gc2luY2UgMi4wLjIKLQlwcml2YXRlIENvbmZpZ3VyZWRTaXRlTW9kZWwgY29uZmlndXJlZFNpdGVNb2RlbDsKLQkKLQkvLyBzaW5jZSAyLjEKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkgewotCQlzdXBlcigpOwotCQllbmFibGUgPSB0cnVlOwotCQljb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotLy8JCXVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsJCQotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFBvbGljeSgpIHsKLQkJcmV0dXJuIHBvbGljeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwb2xpY3kuCi0JICogQHBhcmFtIHBvbGljeSBUaGUgcG9saWN5IHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvbGljeShpbnQgcG9saWN5KSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMucG9saWN5ID0gcG9saWN5OwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZ2V0Q29uZmlndXJlZEZlYXR1cmVzTW9kZWwoKSB7Ci0JCWlmIChjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXM9PW51bGwgfHwgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgRmVhdHVyZVJlZmVyZW5jZU1vZGVsWzBdOwotCQlyZXR1cm4gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdKSBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMua2V5U2V0KCkudG9BcnJheShhcnJheVR5cGVGb3IoY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmtleVNldCgpKSk7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBnZXRVbmNvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCkgewotCQkvLyBvYnRhaW4gdW5jb25maWd1cmVkIGZlYXR1cmVzIGJ5IGNvbXBhcmluZyBjb25maWd1cmVkIG9uZXMgd2l0aCB0aG9zZSBpbnN0YWxsZWQKLQkJaWYgKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwKLQkJCQkmJiBjb25maWd1cmVkU2l0ZU1vZGVsICE9IG51bGwKLQkJCQkmJiBjb25maWd1cmVkU2l0ZU1vZGVsLmdldFNpdGVNb2RlbCgpICE9IG51bGwpIHsKLQkJCUlTaXRlIHNpdGUgPSAoSVNpdGUpIGNvbmZpZ3VyZWRTaXRlTW9kZWwuZ2V0U2l0ZU1vZGVsKCk7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBzaXRlRmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlpZiAoc2l0ZUZlYXR1cmVzLmxlbmd0aCA+IGdldENvbmZpZ3VyZWRGZWF0dXJlc01vZGVsKCkubGVuZ3RoKSB7Ci0JCQkJZm9yIChpbnQgaT0wOyBpPHNpdGVGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIShzaXRlRmVhdHVyZXNbaV0gaW5zdGFuY2VvZiBTaXRlRmVhdHVyZVJlZmVyZW5jZSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCQl3aGlsZSghZm91bmQgJiYgaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZiA9IChGZWF0dXJlUmVmZXJlbmNlTW9kZWwpaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGYuZ2V0VVJMKCksIHNpdGVGZWF0dXJlc1tpXS5nZXRVUkwoKSkpCi0JCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghZm91bmQpCi0JCQkJCQlhZGRVbmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKChTaXRlRmVhdHVyZVJlZmVyZW5jZSlzaXRlRmVhdHVyZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgPT0gbnVsbAotCQkJCXx8IHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBuZXcgRmVhdHVyZVJlZmVyZW5jZU1vZGVsWzBdOwotCQlyZXR1cm4gKEZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdKSB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKQotCQkJCS50b0FycmF5KGFycmF5VHlwZUZvcih1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5rZXlTZXQoKSkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbmZpZ3VyZWRTaXRlTW9kZWwuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ29uZmlndXJlZFNpdGVNb2RlbAotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCXB1YmxpYyBDb25maWd1cmVkU2l0ZU1vZGVsIGdldENvbmZpZ3VyZWRTaXRlTW9kZWwoKSB7Ci0JCXJldHVybiBjb25maWd1cmVkU2l0ZU1vZGVsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNvbmZpZ3VyZWRTaXRlTW9kZWwuCi0JICogQHBhcmFtIGNvbmZpZ3VyZWRTaXRlTW9kZWwgVGhlIGNvbmZpZ3VyZWRTaXRlTW9kZWwgdG8gc2V0Ci0JICogQHNpbmNlIDIuMC4yCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJlZFNpdGVNb2RlbChDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ3VyZWRTaXRlTW9kZWwpIHsKLQkJdGhpcy5jb25maWd1cmVkU2l0ZU1vZGVsID0gY29uZmlndXJlZFNpdGVNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVtb3ZlKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlLCBNYXAgbGlzdCkgewotCQlVUkwgZmVhdHVyZVVSTCA9IGZlYXR1cmUuZ2V0VVJMKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlciA9IGxpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmICFmb3VuZCkgewotCQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGVsZW1lbnQgPSAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBpdGVyLm5leHQoKTsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChlbGVtZW50LmdldFVSTCgpLGZlYXR1cmVVUkwpKSB7Ci0JCQkJbGlzdC5yZW1vdmUoZWxlbWVudCk7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIGFuIGFycmF5IG9mIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHBsdWdpbnMgZmlsZQotCSAqLwotCS8qcGFja2FnZSovCi0KLQkKLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlLCBNYXAgbGlzdCkgewotCQlVUkwgZmVhdHVyZVVSTCA9IGZlYXR1cmUuZ2V0VVJMKCk7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJSXRlcmF0b3IgaXRlciA9IGxpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmICFmb3VuZCkgewotCQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGVsZW1lbnQgPSAoRmVhdHVyZVJlZmVyZW5jZU1vZGVsKSBpdGVyLm5leHQoKTsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChlbGVtZW50LmdldFVSTCgpLGZlYXR1cmVVUkwpKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFmb3VuZCkgewotCQkJbGlzdC5wdXQoZmVhdHVyZSxudWxsKTsKLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiRmVhdHVyZSBSZWZlcmVuY2UgOiIrZmVhdHVyZSsiIGFscmVhZHkgcGFydCBvZiB0aGUgbGlzdC4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGRzIGEgZmVhdHVyZSBpbiB0aGUgY29uZmlndXJlZFJlZmVyZW5jZSBsaXN0Ci0JICogYWxzbyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gYXZvaWQgY3JlYXRpbmcgYW5vdGhlciBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlKEZlYXR1cmVSZWZlcmVuY2VNb2RlbCBmZWF0dXJlKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCQotCQlpZiAoY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICghY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLmNvbnRhaW5zS2V5KGZlYXR1cmUpKXsKLQkJCS8vREVCVUc6Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTil7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQ29uZmlndXJpbmcgIitmZWF0dXJlLmdldFVSTFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5hZGQoZmVhdHVyZSwgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJfQkKLQotCQkvLyB3aGVuIHVzZXIgY29uZmlndXJlIGEgZmVhdHVyZSwKLQkJLy8gd2UgaGF2ZSB0byByZW1vdmUgaXQgZnJvbSB1bmNvbmZpZ3VyZWQgZmVhdHVyZSBpZiBpdCBleGlzdHMKLQkJLy8gYmVjYXVzZSB0aGUgdXNlciBkb2Vzbid0IGtub3cuLi4KLQkJaWYgKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHJlbW92ZShmZWF0dXJlLCB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyk7Ci0JCQlpZiAoIXN1Y2Nlc3MpCi0JCQkJVXBkYXRlQ29yZS53YXJuKCJGZWF0dXJlIG5vdCBwYXJ0IG9mIFVuY29uZmlndXJlZCBsaXN0OiAiK2ZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkpOwkJCSAvLyROT04tTkxTLTEkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIGFkZHMgYSBmZWF0dXJlIGluIHRoZSBsaXN0Ci0JICogYWxzbyB1c2VkIGJ5IHRoZSBwYXJzZXIgdG8gYXZvaWQgY3JlYXRpbmcgYW5vdGhlciBhY3Rpdml0eQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2UoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID09IG51bGwpCi0JCQl0aGlzLnVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKCF1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcy5jb250YWluc0tleShmZWF0dXJlKSl7Ci0JCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfQ09ORklHVVJBVElPTil7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiVW5jb25maWd1cmluZyAiK2ZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmFkZChmZWF0dXJlLCB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyk7Ci0JCX0JCi0KLQkJLy8gYW4gdW5jb25maWd1cmVkIGZlYXR1cmUgaXMgYWx3YXlzIGZyb20gYSBjb25maWd1cmVkIG9uZSBubyA/Ci0JCS8vIHVubGVzcyBpdCB3YXMgcGFyc2VkIHJpZ2h0ID8KLQkJaWYgKGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSByZW1vdmUoZmVhdHVyZSwgY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKTsKLQkJCWlmICghc3VjY2VzcykKLQkJCQlVcGRhdGVDb3JlLndhcm4oIkZlYXR1cmUgbm90IHBhcnQgb2YgQ29uZmlndXJlZCBsaXN0OiAiK2ZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkpOwkJCQkgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlcyBhIGZlYXR1cmUgZnJvbSBhbnkgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUZlYXR1cmVSZWZlcmVuY2UoRmVhdHVyZVJlZmVyZW5jZU1vZGVsIGZlYXR1cmUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJaWYgKHVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzIT1udWxsKXsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHJlbW92ZShmZWF0dXJlLCB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyk7Ci0JCQlpZiAoIXN1Y2Nlc3MpCi0JCQkJVXBkYXRlQ29yZS53YXJuKGZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkrIiBub3QgcGFydCBvZiB1bmNvbmZpZ3VyZWQgbGlzdC4iKTsJCQkJCQkJIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gcmVtb3ZlKGZlYXR1cmUsIGNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyk7Ci0JCQlpZiAoIXN1Y2Nlc3MpCi0JCQkJVXBkYXRlQ29yZS53YXJuKGZlYXR1cmUuZ2V0VVJMU3RyaW5nKCkrIiBub3QgcGFydCBvZiBjb25maWd1cmVkIGxpc3QuIik7CQkJCQkJCSAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2VzIFRoZSB1bmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyB0byBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVbmNvbmZpZ3VyZWRGZWF0dXJlUmVmZXJlbmNlcyhJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVSZWZlcmVuY2VzKSB7Ci0JCXVuY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJdW5jb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMucHV0KGZlYXR1cmVSZWZlcmVuY2VzW2ldLG51bGwpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMuCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2VzIFRoZSBjb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZXMgdG8gc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzKElGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZVJlZmVyZW5jZXMpIHsKLQkJY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlUmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJY29uZmlndXJlZEZlYXR1cmVSZWZlcmVuY2VzLnB1dChmZWF0dXJlUmVmZXJlbmNlc1tpXSxudWxsKTsKLQkJfQkJCi0JCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiB2YWx1ZSkgewotCQllbmFibGUgPSB2YWx1ZTsKLQl9Ci0KLQotCQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJlZFNpdGVNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvQ29uZmlndXJlZFNpdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDZhNzc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0NvbmZpZ3VyZWRTaXRlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmVkU2l0ZU1vZGVsIGV4dGVuZHMgTW9kZWxPYmplY3QgewotCXByaXZhdGUgU3RyaW5nW10gcHJldmlvdXNQbHVnaW5QYXRoOwotCi0JcHJpdmF0ZSBTaXRlTW9kZWwgc2l0ZTsKLQlwcml2YXRlIFN0cmluZyBwbGF0Zm9ybVVSTFN0cmluZzsKLQlwcml2YXRlIENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBwb2xpY3k7Ci0JcHJpdmF0ZSBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGluc3RhbGxDb25maWd1cmF0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBpbnN0YWxsYWJsZSA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJlZFNpdGVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRoZSBzaXRlCi0JICogQHJldHVybiBUaGUgSVNpdGUgCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTaXRlTW9kZWwgZ2V0U2l0ZU1vZGVsKCkgewotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzaXRlLgotCSAqIEBwYXJhbSBzaXRlIFRoZSBzaXRlIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGVNb2RlbChTaXRlTW9kZWwgc2l0ZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotCS8qKgotCSAqIHJldHVybnMgdGhlIHBvbGljeQotCSAqLwotCXB1YmxpYyBDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgZ2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKCkgewotCQlyZXR1cm4gcG9saWN5OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIHBvbGljeSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKLQkJcG9saWN5LnNldENvbmZpZ3VyZWRTaXRlTW9kZWwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7Ci0JCXJldHVybiBpbnN0YWxsYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKGJvb2xlYW4gaW5zdGFsbGFibGUpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5pbnN0YWxsYWJsZSA9IGluc3RhbGxhYmxlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbGxDb25maWd1cmF0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gaW5zdGFsbENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5zdGFsbENvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIGluc3RhbGxDb25maWd1cmF0aW9uIFRoZSBpbnN0YWxsQ29uZmlndXJhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgaW5zdGFsbENvbmZpZ3VyYXRpb24pIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5pbnN0YWxsQ29uZmlndXJhdGlvbiA9IGluc3RhbGxDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIHBsYXRmb3JtVVJMU3RyaW5nLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGxhdGZvcm1VUkxTdHJpbmcoKSB7Ci0JCXJldHVybiBwbGF0Zm9ybVVSTFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwbGF0Zm9ybVVSTFN0cmluZy4KLQkgKiBAcGFyYW0gcGxhdGZvcm1VUkxTdHJpbmcgVGhlIHBsYXRmb3JtVVJMU3RyaW5nIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBsYXRmb3JtVVJMU3RyaW5nKFN0cmluZyBwbGF0Zm9ybVVSTFN0cmluZykgewotCQl0aGlzLnBsYXRmb3JtVVJMU3RyaW5nID0gcGxhdGZvcm1VUkxTdHJpbmc7Ci0JfQotCi0JCi0JCS8qKgotCSAqIEdldHMgdGhlIHByZXZpb3VzUGx1Z2luUGF0aC4gVGhlIGxpc3Qgb2YgcGx1Z2lucyB0aGUgcGxhdGZvcm0gaGFkLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZ1tdCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFByZXZpb3VzUGx1Z2luUGF0aCgpIHsKLQkJaWYgKHByZXZpb3VzUGx1Z2luUGF0aCA9PSBudWxsKQotCQkJcHJldmlvdXNQbHVnaW5QYXRoID0gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIHByZXZpb3VzUGx1Z2luUGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcmV2aW91c1BsdWdpblBhdGguCi0JICogQHBhcmFtIHByZXZpb3VzUGx1Z2luUGF0aCBUaGUgcHJldmlvdXNQbHVnaW5QYXRoIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzUGx1Z2luUGF0aChTdHJpbmdbXSBwcmV2aW91c1BsdWdpblBhdGgpIHsKLQkJdGhpcy5wcmV2aW91c1BsdWdpblBhdGggPSBuZXcgU3RyaW5nW3ByZXZpb3VzUGx1Z2luUGF0aC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByZXZpb3VzUGx1Z2luUGF0aCwgMCwgdGhpcy5wcmV2aW91c1BsdWdpblBhdGgsIDAsIHByZXZpb3VzUGx1Z2luUGF0aC5sZW5ndGgpOwotCX0KLQotCS8qCi0JICogY3JlYXRlcyBhIFN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGNyZWF0ZVN0YXR1cyhpbnQgc3RhdHVzVHlwZSwgU3RyaW5nIG1zZywgRXhjZXB0aW9uIGUpewotCQlpZiAoc3RhdHVzVHlwZSE9SVN0YXR1cy5PSykgc3RhdHVzVHlwZSA9IElTdGF0dXMuRVJST1I7Ci0JCXJldHVybiBjcmVhdGVTdGF0dXMoc3RhdHVzVHlwZSxJU3RhdHVzLk9LLCBtc2cudG9TdHJpbmcoKSwgZSk7Ci0JfQotCi0JLyoKLQkgKiBjcmVhdGVzIGEgU3RhdHVzCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgY3JlYXRlU3RhdHVzKGludCBzdGF0dXNTZXZlcml0eSwgaW50IHN0YXR1c0NvZGUsIFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKXsKLQkJU3RyaW5nIGlkID0JVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQkKLQkJU3RyaW5nQnVmZmVyIGNvbXBsZXRlU3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1zZyE9bnVsbCkKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChtc2cpOwotCQlpZiAoZSE9bnVsbCl7Ci0JCQljb21wbGV0ZVN0cmluZy5hcHBlbmQoIlxyXG5bIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbXBsZXRlU3RyaW5nLmFwcGVuZChlLnRvU3RyaW5nKCkpOwotCQkJY29tcGxldGVTdHJpbmcuYXBwZW5kKCJdXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoc3RhdHVzU2V2ZXJpdHksIGlkLCBzdGF0dXNDb2RlLCBjb21wbGV0ZVN0cmluZy50b1N0cmluZygpLCBlKTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGUjaXNFbmFibGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBnZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKS5pc0VuYWJsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklDb25maWd1cmVkU2l0ZSNzZXRFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIHZhbHVlKSB7Ci0JCWdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpLnNldEVuYWJsZWQodmFsdWUpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0RlZmF1bHRQbHVnaW5QYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0RlZmF1bHRQbHVnaW5QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyZjlkZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9EZWZhdWx0UGx1Z2luUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy4qOwotCi0vKioKLSAqIFBhcnNlIGRlZmF1bHQgZmVhdHVyZS54bWwKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFBsdWdpblBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPQotCQlTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgU3RyaW5nIGlkID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uID0gbnVsbDsKLQlwcml2YXRlIFBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJwbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQUdNRU5UID0gImZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBjbGFzcyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIGV4dGVuZHMgU0FYRXhjZXB0aW9uIHsKLQkJcHVibGljIFBhcnNlQ29tcGxldGVFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsKLQkJCXN1cGVyKGFyZzApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRGZWF0dXJlUGFyc2VyCi0JICovCi0JcHVibGljIERlZmF1bHRQbHVnaW5QYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJdGhpcy5wYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBQbHVnaW5FbnRyeSBwYXJzZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsKLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKLQkJfSBjYXRjaCAoUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBleHBlY3RlZCwgd2Ugc3RvcHBlZCB0aGUgcGFyc2luZyB3aGVuIHdlIGhhdmUgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQKLQkJCS8vLyBubyBuZWVkIHRvIHB1cnN1ZSB0aGUgcGFyc2luZwotCQl9Ci0KLQkJaWYgKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQlpZCA9ICJfbm9faWRfIjsgLy8kTk9OLU5MUy0xJAotCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXJzaW9uKSk7Ci0JCXJldHVybiBwbHVnaW5FbnRyeTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIERlZmF1bHRIYW5kbGVyI3N0YXJ0RWxlbWVudChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBBdHRyaWJ1dGVzKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHRhZyA9IGxvY2FsTmFtZS50cmltKCk7Ci0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKFBMVUdJTikpIHsKLQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQoZmFsc2UpOwkJCQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0YWcuZXF1YWxzSWdub3JlQ2FzZShGUkFHTUVOVCkpIHsKLQkJCXBsdWdpbkVudHJ5LmlzRnJhZ21lbnQodHJ1ZSk7CQkJCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgcGx1Z2luIGVudHJ5IGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BsdWdpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uIHsKLQkJaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCXZlcnNpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhyb3cgbmV3IFBhcnNlQ29tcGxldGVFeGNlcHRpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWJmNDNmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL0luc3RhbGxDb25maWd1cmF0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBBbiBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGlzIAotICogCi0gKi8KLQotcHVibGljIGNsYXNzIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0KLQkvLyBwZXJmb3JtYW5jZQotCXByaXZhdGUgVVJMIGJ1bmRsZVVSTDsKLQlwcml2YXRlIFVSTCBiYXNlOwotCXByaXZhdGUgYm9vbGVhbiByZXNvbHZlZCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3VycmVudDsKLQlwcml2YXRlIFVSTCBsb2NhdGlvblVSTDsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTFN0cmluZzsKLQlwcm90ZWN0ZWQgRGF0ZSBkYXRlOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgTGlzdCAvKiBvZiBDb25maWd1cmV0aW9uQWN0aXZpdHlNb2RlbCAqLyBhY3Rpdml0aWVzOwotCXByaXZhdGUgTGlzdCAvKiBvZiBjb25maWd1cmF0aW9uU2l0ZU1vZGVsICovIGNvbmZpZ3VyYXRpb25TaXRlczsKLQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGNvbnN0cnVjdG9yLiBDcmVhdGUKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBnZXRDb25maWd1cmF0aW9uU2l0ZXNNb2RlbCgpIHsKLQkJaWYgKCFpbml0aWFsaXplZCkgCi0JCQlpbml0aWFsaXplKCk7Ci0JCWlmIChjb25maWd1cmF0aW9uU2l0ZXMgPT0gbnVsbCB8fCBjb25maWd1cmF0aW9uU2l0ZXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IENvbmZpZ3VyZWRTaXRlTW9kZWxbMF07Ci0JCi0JCXJldHVybiAoQ29uZmlndXJlZFNpdGVNb2RlbFtdKSBjb25maWd1cmF0aW9uU2l0ZXMudG9BcnJheShhcnJheVR5cGVGb3IoY29uZmlndXJhdGlvblNpdGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgbGlzdAotCSAqIGlzIGNhbGxlZCB3aGVuIGFkZGluZyBhIFNpdGUgb3IgcGFyc2luZyB0aGUgWE1MIGZpbGUKLQkgKiBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGFjdGl2aXR5LCBzbyB3ZSBkbyBub3Qgd2FudCB0IGNhbGwKLQkgKiBhZGRDb25maWd1cmF0aW9uU2l0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29uZmlndXJhdGlvblNpdGVNb2RlbChDb25maWd1cmVkU2l0ZU1vZGVsIHNpdGUpIHsKLQkJaWYgKGNvbmZpZ3VyYXRpb25TaXRlcyA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uU2l0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJaWYgKCFjb25maWd1cmF0aW9uU2l0ZXMuY29udGFpbnMoc2l0ZSkpIHsKLQkJCWNvbmZpZ3VyYXRpb25TaXRlcy5hZGQoc2l0ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWxbXSBzaXRlcykgewotCQljb25maWd1cmF0aW9uU2l0ZXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGRDb25maWd1cmF0aW9uU2l0ZU1vZGVsKHNpdGVzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKENvbmZpZ3VyZWRTaXRlTW9kZWwgc2l0ZSkgewotCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0KLQkJaWYgKGNvbmZpZ3VyYXRpb25TaXRlcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY29uZmlndXJhdGlvblNpdGVzLnJlbW92ZShzaXRlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDdXJyZW50KCkgewotCQlpZiAoIWluaXRpYWxpemVkKSBpbml0aWFsaXplKCk7Ci0JCXJldHVybiBpc0N1cnJlbnQ7Ci0JfQotCi0JLyoqCi0JICogIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50KGJvb2xlYW4gaXNDdXJyZW50KSB7Ci0JCS8vIGRvIG5vdCBjaGVjayBpZiB3cml0YWJsZSBhcyB3ZSBtYXkKLQkJLy8gc2V0IGFuIGluc3RhbGwgY29uZmlnIGFzIE5vdCBjdXJyZW50Ci0JCXRoaXMuaXNDdXJyZW50ID0gaXNDdXJyZW50OwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWxbXSBnZXRBY3Rpdml0eU1vZGVsKCkgewotCQlpZiAoYWN0aXZpdGllcyA9PSBudWxsICYmICFpbml0aWFsaXplZCkgCi0JCQlpbml0aWFsaXplKCk7Ci0JCWlmIChhY3Rpdml0aWVzID09IG51bGwgfHwgYWN0aXZpdGllcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWxbMF07Ci0JCXJldHVybiAoQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWxbXSkgYWN0aXZpdGllcy50b0FycmF5KGFycmF5VHlwZUZvcihhY3Rpdml0aWVzKSk7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFjdGl2aXR5TW9kZWwoQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwgYWN0aXZpdHkpIHsKLQkJaWYgKGFjdGl2aXRpZXMgPT0gbnVsbCkKLQkJCWFjdGl2aXRpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghYWN0aXZpdGllcy5jb250YWlucyhhY3Rpdml0eSkpIHsKLQkJCWFjdGl2aXRpZXMuYWRkKGFjdGl2aXR5KTsKLQkJCWFjdGl2aXR5LnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwodGhpcyk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERhdGUgZ2V0Q3JlYXRpb25EYXRlKCkgewotLy8JCWlmICghaW5pdGlhbGl6ZWQpIGluaXRpYWxpemUoKTsKLQkJaWYgKGRhdGUgPT0gbnVsbCkKLQkJCWluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGRhdGU7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIGRhdGUuCi0JICogQHBhcmFtIGRhdGUgVGhlIGRhdGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q3JlYXRpb25EYXRlKERhdGUgZGF0ZSkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmRhdGUgPSBkYXRlOwotCX0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCS8vaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotCQkvL25vIG5lZWQgdG8gaW5pdGlhbGl6ZSwgYWx3YXlzIHNldAotCQlkZWxheWVkUmVzb2x2ZSgpOwotCQlyZXR1cm4gbG9jYXRpb25VUkw7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0vLwkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotCQlpZiAobGFiZWwgPT0gbnVsbCkKLQkJCWluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAuMgotCSAqLwotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFiZWwuCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvY2F0aW9uVVJMU3RyaW5nLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSB7Ci0JCWlmICghaW5pdGlhbGl6ZWQpIGRlbGF5ZWRSZXNvbHZlKCk7Ci0JCXJldHVybiBsb2NhdGlvblVSTFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb2NhdGlvblVSTFN0cmluZy4KLQkgKiBAcGFyYW0gbG9jYXRpb25VUkxTdHJpbmcgVGhlIGxvY2F0aW9uVVJMU3RyaW5nIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uVVJMU3RyaW5nKFN0cmluZyBsb2NhdGlvblVSTFN0cmluZykgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxvY2F0aW9uVVJMU3RyaW5nID0gbG9jYXRpb25VUkxTdHJpbmc7Ci0JCXRoaXMubG9jYXRpb25VUkwgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbE9iamVjdCNyZXNvbHZlKFVSTCwgUmVzb3VyY2VCdW5kbGUpCi0JICovCi0JcHVibGljIHZvaWQgcmVzb2x2ZShVUkwgYmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5iYXNlID0gYmFzZTsKLQkJdGhpcy5idW5kbGVVUkwgPSBidW5kbGVVUkw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aW1lbGluZS4KLQkgKiBAcmV0dXJuIGxvbmcKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUaW1lbGluZSgpIHsKLQkJcmV0dXJuIDA7Ci0vLwkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwotLy8JCXJldHVybiB0aW1lbGluZTsKLQl9Ci0KLQotCS8qCi0JICogaW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbnMgZnJvbSB0aGUgcGVyc2lzdGVudCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCi0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWc7Ci0JCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKGdldFVSTCgpLCBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkpKQotCQkJCQlwbGF0Zm9ybUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJCQllbHNlIAotCQkJCQlwbGF0Zm9ybUNvbmZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihnZXRVUkwoKSk7Ci0JCQkJCi0JCQkJbmV3IEluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyKHBsYXRmb3JtQ29uZmlnLCB0aGlzKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQlVcGRhdGVDb3JlLndhcm4obG9jYXRpb25VUkxTdHJpbmcgKyAiIGRvZXMgbm90IGV4aXN0LCBUaGUgbG9jYWwgc2l0ZSBpcyBub3QgaW4gc3luY2ggd2l0aCB0aGUgZmlsZSBzeXN0ZW0gYW5kIGlzIHBvaW50aW5nIHRvIGEgZmlsZSB0aGF0IGRvZXNuJ3QgZXhpc3QuIiwgZXhjZXB0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5FcnJvckR1cmluZ0ZpbGVBY2Nlc3MiLCBsb2NhdGlvblVSTFN0cmluZyksIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJJbnN0YWxsQ29uZmlndXJhdGlvbi5FcnJvckR1cmluZ0ZpbGVBY2Nlc3MiLCBsb2NhdGlvblVSTFN0cmluZyksIGV4Y2VwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uIGhpc3Rvcnk6IiArIGxvY2F0aW9uVVJMLnRvRXh0ZXJuYWxGb3JtKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpbml0aWFsaXplZCA9IHRydWU7Ci0JCX0KLQkJCi0JCS8vZmluaXNoIHJlc29sdmUKLQkJLy8gUEVSRjoKLQkJdHJ5IHsKLQkJCS8vIGRlbGVnYXRlCi0JCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRBY3Rpdml0eU1vZGVsKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRDb25maWd1cmF0aW9uU2l0ZXNNb2RlbCgpLCBiYXNlLCBidW5kbGVVUkwpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fQkJCi0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgZGVsYXllZFJlc29sdmUoKSB7Ci0KLQkJLy8gUEVSRjogZGVsYXkgcmVzb2x1dGlvbgotCQlpZiAocmVzb2x2ZWQpCi0JCQlyZXR1cm47Ci0KLQkJcmVzb2x2ZWQgPSB0cnVlOwotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCXRyeSB7Ci0JCQkvL2xvY2F0aW9uVVJMID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIGxvY2F0aW9uVVJMU3RyaW5nKTsJCQotCQkJbG9jYXRpb25VUkwgPSBuZXcgVVJMKGxvY2F0aW9uVVJMU3RyaW5nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpewotCQkJRmlsZSBmID0gbmV3IEZpbGUobG9jYXRpb25VUkxTdHJpbmcpOwotCQkJdHJ5IHsKLQkJCQlpZiAoZi5leGlzdHMoKSkKLQkJCQkJbG9jYXRpb25VUkwgPSBmLnRvVVJMKCk7Ci0JCQkJZWxzZQotCQkJCQlsb2NhdGlvblVSTCA9IGJhc2U7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsKLQkJCQlsb2NhdGlvblVSTCA9IGJhc2U7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzZXRBY3Rpdml0aWVzKCkgewotCQlhY3Rpdml0aWVzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0NTA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9JbnN0YWxsQ29uZmlndXJhdGlvblBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm1vZGVsOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotCi0vKioKLSAqIHBhcnNlIHRoZSBkZWZhdWx0IHNpdGUueG1sCi0gKi8KLQotcHVibGljIGNsYXNzIEluc3RhbGxDb25maWd1cmF0aW9uUGFyc2VyIHsKLQlwcml2YXRlIFBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZzsKLQlwcml2YXRlIFVSTCBzaXRlVVJMOwotCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWc7Ci0JcHJpdmF0ZSBDb25maWd1cmVkU2l0ZU1vZGVsIGNvbmZpZ1NpdGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdFNpdGVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIoCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcsCi0JCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc1RydWUocGxhdGZvcm1Db25maWcgaW5zdGFuY2VvZiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pOwotCQl0aGlzLnBsYXRmb3JtQ29uZmlnID0gKFBsYXRmb3JtQ29uZmlndXJhdGlvbilwbGF0Zm9ybUNvbmZpZzsKLQkJCi0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCi0JCS8vIERFQlVHOgkJCi0JCWlmIChVcGRhdGVDb3JlLkRFQlVHICYmIFVwZGF0ZUNvcmUuREVCVUdfU0hPV19QQVJTSU5HKSB7Ci0JCQlVcGRhdGVDb3JlLmRlYnVnKCJTdGFydCBwYXJzaW5nIENvbmZpZ3VyYXRpb246IiArIChjb25maWcpLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCi0JCXByb2Nlc3NDb25maWcodGhpcy5wbGF0Zm9ybUNvbmZpZyk7Ci0JfQotCi0KLQotCS8qKiAKLQkgKiBwcm9jZXNzIHRoZSBTaXRlIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1NpdGUoU2l0ZUVudHJ5IHNpdGVFbnRyeSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQkvL3NpdGUgdXJsCi0JCXNpdGVVUkwgPSBzaXRlRW50cnkuZ2V0VVJMKCk7Ci0JCXRyeSB7Ci0JCQlzaXRlVVJMID0gUGxhdGZvcm0uYXNMb2NhbFVSTChzaXRlVVJMKTsKLQkJCS8vIFRPRE8gd29ya2Fyb3VuZCBidWcgaW4gcGxhdGZvcm0gdXJsIHJlc29sdXRpb24KLQkJCWlmIChzaXRlVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlzaXRlVVJMID0gbmV3IEZpbGUoc2l0ZVVSTC5nZXRGaWxlKCkpLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGtlZXAgb3JpZ2luYWwgdXJsCi0JCX0KLQotCQkvLyBwb2xpY3kKLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoc2l0ZVVSTCxudWxsKTsKLQotCQkvLyBjb25maWd1cmF0aW9uIHNpdGUKLQkJQmFzZVNpdGVMb2NhbEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpOwotCQljb25maWdTaXRlID0gZmFjdG9yeS5jcmVhdGVDb25maWd1cmF0aW9uU2l0ZU1vZGVsKChTaXRlTW9kZWwpIHNpdGUsIHNpdGVFbnRyeS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsKLQotCQkvL3BsYXRmb3JtIHVybAotCQljb25maWdTaXRlLnNldFBsYXRmb3JtVVJMU3RyaW5nKHNpdGVFbnRyeS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCi0JCS8vIGNvbmZpZ3VyZWQKLQkJY29uZmlnU2l0ZS5zZXRFbmFibGVkKHNpdGVFbnRyeS5pc0VuYWJsZWQoKSk7Ci0KLQkJLy8gY2hlY2sgaWYgdGhlIHNpdGUgZXhpc3RzIGFuZCBpcyB1cGRhdGFibGUKLQkgCWNvbmZpZ1NpdGUuc2V0VXBkYXRhYmxlKHNpdGVFbnRyeS5pc1VwZGF0ZWFibGUoKSk7Ci0JIAkKLQkJLy8gYWRkIHRvIGluc3RhbGwgY29uZmlndXJhdGlvbgotCSAJY29uZmlnLmFkZENvbmZpZ3VyYXRpb25TaXRlTW9kZWwoY29uZmlnU2l0ZSk7Ci0JIAljb25maWdTaXRlLnNldEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKLQkJCi0JCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVzID0gc2l0ZUVudHJ5LmdldEZlYXR1cmVFbnRyaWVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJcHJvY2Vzc0ZlYXR1cmUoZmVhdHVyZXNbaV0pOwotCQl9Ci0JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIERlZmF1bHRGZWF0dXJlIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmUoRmVhdHVyZUVudHJ5IGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJLy8gdXJsCi0JCVN0cmluZyBwYXRoID0gZmVhdHVyZS5nZXRVUkwoKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlVVJMLCBwYXRoLCBudWxsKTsKLQotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQkJcmVmLnNldFNpdGUoKElTaXRlKSBjb25maWdTaXRlLmdldFNpdGVNb2RlbCgpKTsKLQkJCXJlZi5zZXRVUkwodXJsKTsKLQkJCShjb25maWdTaXRlLmdldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpKS5hZGRDb25maWd1cmVkRmVhdHVyZVJlZmVyZW5jZShyZWYpOwotCi0JCQkvL3VwZGF0ZVVSTAotLy9UT0RPIGRvIHdlIG5lZWQgdGhlIHVwZGF0ZSB1cmwgYW5kIHRvIHJlc29sdmUgaXQ/Ci0vLwkJCVN0cmluZyB1cGRhdGVVUkxTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cGRhdGVVUkwiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQlVUkxFbnRyeSBlbnRyeSA9IG5ldyBVUkxFbnRyeSgpOwotLy8JCQllbnRyeS5zZXRVUkxTdHJpbmcodXBkYXRlVVJMU3RyaW5nKTsKLS8vCQkJZW50cnkucmVzb2x2ZShzaXRlVVJMLG51bGwpOwotCi0JCQkvLyBERUJVRzoJCQotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJFbmQgUHJvY2Vzc2luZyBEZWZhdWx0RmVhdHVyZSBUYWc6IHVybDoiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfSBlbHNlIHsKLQkJCVVwZGF0ZUNvcmUubG9nKCBQb2xpY3kuYmluZCgiSW5zdGFsbENvbmZpZ3VyYXRpb25QYXJzZXIuRmVhdHVyZVJlZmVyZW5jZU5vVVJMIiksIG5ldyBFeGNlcHRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIEFjdGl2aXR5IGluZm8KLQkgKi8KLS8vCXByaXZhdGUgdm9pZCBwcm9jZXNzQWN0aXZpdHkoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0vLwotLy8JCS8vIGFjdGlvbgotLy8JCVN0cmluZyBhY3Rpb25TdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotLy8JCWludCBhY3Rpb24gPSBJbnRlZ2VyLnBhcnNlSW50KGFjdGlvblN0cmluZyk7Ci0vLwotLy8JCS8vIGNyZWF0ZQotLy8JCUNvbmZpZ3VyYXRpb25BY3Rpdml0eU1vZGVsIGFjdGl2aXR5ID0KLS8vCQkJbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCkuY3JlYXRlQ29uZmlndXJhdGlvbkFjdGl2aXR5TW9kZWwoKTsKLS8vCQlhY3Rpdml0eS5zZXRBY3Rpb24oYWN0aW9uKTsKLS8vCi0vLwkJLy8gbGFiZWwKLS8vCQlTdHJpbmcgbGFiZWwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0vLwkJaWYgKGxhYmVsICE9IG51bGwpCi0vLwkJCWFjdGl2aXR5LnNldExhYmVsKGxhYmVsKTsKLS8vCi0vLwkJLy8gZGF0ZQotLy8JCVN0cmluZyBkYXRlU3RyaW5nID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZGF0ZSIpOyAvLyROT04tTkxTLTEkCi0vLwkJRGF0ZSBkYXRlID0gbmV3IERhdGUoTG9uZy5wYXJzZUxvbmcoZGF0ZVN0cmluZykpOwotLy8JCWFjdGl2aXR5LnNldERhdGUoZGF0ZSk7Ci0vLwotLy8JCS8vIHN0YXR1cwotLy8JCVN0cmluZyBzdGF0dXNTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJzdGF0dXMiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWludCBzdGF0dXMgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXR1c1N0cmluZyk7Ci0vLwkJYWN0aXZpdHkuc2V0U3RhdHVzKHN0YXR1cyk7Ci0vLwotLy8JCWNvbmZpZy5hZGRBY3Rpdml0eU1vZGVsKGFjdGl2aXR5KTsKLS8vCi0vLwkJLy8gREVCVUc6CQkKLS8vCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotLy8JCQlVcGRhdGVDb3JlLmRlYnVnKCJFbmQgUHJvY2Vzc2luZyBBY3Rpdml0eTogYWN0aW9uOiIgKyBhY3Rpb25TdHJpbmcgKyAiIGxhYmVsOiAiICsgbGFiZWwgKyAiIGRhdGU6IiArIGRhdGVTdHJpbmcgKyAiIHN0YXR1cyIgKyBzdGF0dXNTdHJpbmcpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0vLwkJfQotLy8KLS8vCX0KLQotCS8qKiAKLQkgKiBwcm9jZXNzIHRoZSBDb25maWcgaW5mbwotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29uZmlnKFBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZykgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQkvLyBkYXRlCi0JCURhdGUgZGF0ZSA9IG5ldyBEYXRlKHBsYXRmb3JtQ29uZmlnLmdldENoYW5nZVN0YW1wKCkpOwotCQljb25maWcuc2V0Q3JlYXRpb25EYXRlKGRhdGUpOwotCQljb25maWcuc2V0TGFiZWwoZGF0ZS50b1N0cmluZygpKTsKLQkJCi0JCS8vdGltZWxpbmUKLS8vCQlTdHJpbmcgdGltZWxpbmVTdHJpbmcgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ0aW1lbGluZSIpOyAvLyROT04tTkxTLTEkCi0vLwkJbG9uZyB0aW1lbGluZSA9IGNvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7Ci0vLwkJaWYgKHRpbWVsaW5lU3RyaW5nIT1udWxsKSB7Ci0vLwkJCXRpbWVsaW5lID0gTG9uZy5wYXJzZUxvbmcodGltZWxpbmVTdHJpbmcpOwotLy8JCX0KLS8vCQljb25maWcuc2V0VGltZWxpbmUodGltZWxpbmUpOwotCi0JCVNpdGVFbnRyeVtdIHNpdGVzID0gcGxhdGZvcm1Db25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFNpdGVzKCk7Ci0JCWZvciAoaW50IGk9MDsgaTxzaXRlcy5sZW5ndGg7IGkrKykKLQkJCXByb2Nlc3NTaXRlKHNpdGVzW2ldKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbE1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzNiMjZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL21vZGVsL1NpdGVMb2NhbE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWw7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBjb25maWd1cmF0aW9ucy4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2l0ZUxvY2FsTW9kZWwgZXh0ZW5kcyBNb2RlbE9iamVjdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0ZJTEUgPSAicGxhdGZvcm0ueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgbG9uZyBzdGFtcDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFVSTCBsb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTFN0cmluZzsKLQlwcml2YXRlIGludCBoaXN0b3J5ID0gVXBkYXRlQ29yZS5ERUZBVUxUX0hJU1RPUlk7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgKi9jb25maWd1cmF0aW9uczsKLQlwcml2YXRlIExpc3QgLyogb2YgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCAqL3ByZXNlcnZlZENvbmZpZ3VyYXRpb25zOwotCXByaXZhdGUgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjdXJyZW50Q29uZmlndXJhdGlvbjsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMb2NhbFNpdGUKLQkgKi8KLQlwdWJsaWMgU2l0ZUxvY2FsTW9kZWwoKXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgZ2V0Q3VycmVudENvbmZpZ3VyYXRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIGN1cnJlbnRDb25maWd1cmF0aW9uOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbFtdIGdldENvbmZpZ3VyYXRpb25IaXN0b3J5TW9kZWwoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9ucz09bnVsbCkKLQkJCS8vIGluaXRpYWxpemUgaGlzdG9yeQotCQkJcHJvY2Vzc0hpc3RvcnkoKTsKLQkJCi0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsIHx8IGNvbmZpZ3VyYXRpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbXSljb25maWd1cmF0aW9ucy50b0FycmF5KGFycmF5VHlwZUZvcihjb25maWd1cmF0aW9ucykpOwotCX0KLQotCS8qKgotCSAqIGFkZHMgYSBuZXcgY29uZmlndXJhdGlvbiB0byB0aGUgTG9jYWxTaXRlCi0JICogIHRoZSBuZXdseSBhZGRlZCBjb25maWd1cmF0aW9uIGlzIHRlaCBjdXJyZW50IG9uZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyYXRpb25Nb2RlbChJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZykgewotCQlpZiAoY29uZmlnICE9IG51bGwpIHsKLQkJCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKQotCQkJCWNvbmZpZ3VyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKCFjb25maWd1cmF0aW9ucy5jb250YWlucyhjb25maWcpKQotCQkJCWNvbmZpZ3VyYXRpb25zLmFkZChjb25maWcpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogYWRkcyBhIG5ldyBjb25maWd1cmF0aW9uIHRvIHRoZSBMb2NhbFNpdGUKLQkgKiAgdGhlIG5ld2x5IGFkZGVkIGNvbmZpZ3VyYXRpb24gaXMgdGVoIGN1cnJlbnQgb25lCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQ29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnKSB7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zLnJlbW92ZShjb25maWcpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgbG9jYXRpb24gb2YgdGhlIGxvY2FsIHNpdGUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgVVJMCi0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvblVSTCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvY2F0aW9uVVJMU3RyaW5nLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSB7Ci0JCXJldHVybiBsb2NhdGlvblVSTFN0cmluZzsKLQl9Ci0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxvY2F0aW9uVVJMU3RyaW5nLgotCSAqIEBwYXJhbSBsb2NhdGlvblVSTFN0cmluZyBUaGUgbG9jYXRpb25VUkxTdHJpbmcgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7Ci0JCWFzc2VydElzV3JpdGVhYmxlKCk7Ci0JCXRoaXMubG9jYXRpb25VUkxTdHJpbmcgPSBsb2NhdGlvblVSTFN0cmluZzsKLQkJdGhpcy5sb2NhdGlvbj1udWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQlhc3NlcnRJc1dyaXRlYWJsZSgpOwotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bUhpc3RvcnlDb3VudCgpIHsKLQkJcmV0dXJuIGhpc3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heGltdW1IaXN0b3J5Q291bnQoaW50IGhpc3RvcnkpIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5oaXN0b3J5ID0gaGlzdG9yeTsKLQl9Ci0KLQkKLQkvKioKLQkgKiBBZGRzIGEgcHJlc2VydmVkIGNvbmZpZ3VyYXRpb24gaW50byB0ZWggY29sbGVjdGlvbgotCSAqIGRvIG5vdCBzYXZlIHRoZSBjb25maWd1cmF0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFByZXNlcnZlZEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWd1cmF0aW9uKSB7Ci0JCWlmIChwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyA9PSBudWxsKQotCQkJcHJlc2VydmVkQ29uZmlndXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJlc2VydmVkQ29uZmlndXJhdGlvbnMuYWRkKGNvbmZpZ3VyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQcmVzZXJ2ZWRDb25maWd1cmF0aW9uTW9kZWwoSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCBjb25maWd1cmF0aW9uKSB7Ci0JCWlmIChwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJlc2VydmVkQ29uZmlndXJhdGlvbnMucmVtb3ZlKGNvbmZpZ3VyYXRpb24pOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbXSBnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uc01vZGVsKCkgewotCQlpZiAocHJlc2VydmVkQ29uZmlndXJhdGlvbnM9PW51bGwgfHwgcHJlc2VydmVkQ29uZmlndXJhdGlvbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsWzBdOwotCQlyZXR1cm4gKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWxbXSlwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucy50b0FycmF5KGFycmF5VHlwZUZvcihwcmVzZXJ2ZWRDb25maWd1cmF0aW9ucykpOwotCX0KLQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3VycmVudENvbmZpZ3VyYXRpb24uCi0JICogQHBhcmFtIGN1cnJlbnRDb25maWd1cmF0aW9uIFRoZSBjdXJyZW50Q29uZmlndXJhdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50Q29uZmlndXJhdGlvbk1vZGVsKEluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY3VycmVudENvbmZpZ3VyYXRpb24pIHsKLQkJYXNzZXJ0SXNXcml0ZWFibGUoKTsKLQkJdGhpcy5jdXJyZW50Q29uZmlndXJhdGlvbiA9IGN1cnJlbnRDb25maWd1cmF0aW9uOwotCQkKLQkJLy8yLjAuMiBzZXQgdGhlIGNvbmZpZ3VyZWRTaXRlIG9mIHNpdGVzCi0JCUNvbmZpZ3VyZWRTaXRlTW9kZWxbXSBjb25mU2l0ZXMgPSBjdXJyZW50Q29uZmlndXJhdGlvbi5nZXRDb25maWd1cmF0aW9uU2l0ZXNNb2RlbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJY29uZlNpdGVzW2ldLmdldFNpdGVNb2RlbCgpLnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoY29uZlNpdGVzW2ldKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBNb2RlbE9iamVjdCNyZXNvbHZlKFVSTCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCBiYXNlLFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvLyBsb2NhbAotCQlsb2NhdGlvbiA9IHJlc29sdmVVUkwoYmFzZSxidW5kbGVVUkwsZ2V0TG9jYXRpb25VUkxTdHJpbmcoKSk7Ci0JCQotCQkvLyBkZWxlZ2F0ZQotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRDb25maWd1cmF0aW9uSGlzdG9yeU1vZGVsKCksYmFzZSxidW5kbGVVUkwpOwotCQlyZXNvbHZlTGlzdFJlZmVyZW5jZShnZXRQcmVzZXJ2ZWRDb25maWd1cmF0aW9uc01vZGVsKCksYmFzZSxidW5kbGVVUkwpOwotCQlyZXNvbHZlUmVmZXJlbmNlKGdldEN1cnJlbnRDb25maWd1cmF0aW9uTW9kZWwoKSxiYXNlLGJ1bmRsZVVSTCk7Ci0JfQotCQotCi0JLyoqCi0JICogR2V0cyB0aGUgc3RhbXAuCi0JICogQHJldHVybiBSZXR1cm5zIGEgbG9uZwotCSAqLwotCXB1YmxpYyBsb25nIGdldFN0YW1wKCkgewotCQlyZXR1cm4gc3RhbXA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhbXAuCi0JICogQHBhcmFtIHN0YW1wIFRoZSBzdGFtcCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFtcChsb25nIHN0YW1wKSB7Ci0JCXRoaXMuc3RhbXAgPSBzdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLk1vZGVsT2JqZWN0I2dldFByb3BlcnR5TmFtZSgpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiAicGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiByZWFkcyB0aGUgY29uZmlndXJhdGlvbi9oaXN0b3J5IGRpcmVjdG9yeQotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9jZXNzSGlzdG9yeSgpIHsKLQkJdHJ5IHsKLQkJCVVSTCBoaXN0b3J5VVJMID0gbmV3IFVSTChnZXRMb2NhdGlvblVSTCgpLCAiaGlzdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCQloaXN0b3J5VVJMID0gUGxhdGZvcm0uYXNMb2NhbFVSTChoaXN0b3J5VVJMKTsKLQkJCUZpbGUgaGlzdG9yeURpciA9IG5ldyBGaWxlKGhpc3RvcnlVUkwuZ2V0RmlsZSgpKTsKLQkJCWlmIChoaXN0b3J5RGlyLmV4aXN0cygpKSB7Ci0JCQkJRmlsZVtdIGJhY2tlZENvbmZpZ3MgPSBoaXN0b3J5RGlyLmxpc3RGaWxlcygpOwotCQkJCUJhc2VTaXRlTG9jYWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8YmFja2VkQ29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJCQlTdHJpbmcgbmFtZSA9IGJhY2tlZENvbmZpZ3NbaV0uZ2V0TmFtZSgpOwotCQkJCQlpZiAobmFtZS5lbmRzV2l0aCgiLnhtbCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKS00KTsKLQkJCQkJZWxzZSAKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlEYXRlIGRhdGUgPSBuZXcgRGF0ZShMb25nLnBhcnNlTG9uZyhuYW1lKSk7Ci0JCQkJCUluc3RhbGxDb25maWd1cmF0aW9uTW9kZWwgY29uZmlnID0gZmFjdG9yeS5jcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsKCk7Ci0JCQkJCWNvbmZpZy5zZXRMb2NhdGlvblVSTFN0cmluZyhiYWNrZWRDb25maWdzW2ldLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoJ1xcJywgJy8nKSk7Ci0JCQkJCWNvbmZpZy5zZXRMYWJlbChkYXRlLnRvU3RyaW5nKCkpOwotCQkJCQljb25maWcuc2V0Q3JlYXRpb25EYXRlKGRhdGUpOwotCQkJCQljb25maWcucmVzb2x2ZShiYWNrZWRDb25maWdzW2ldLnRvVVJMKCksIGdldFJlc291cmNlQnVuZGxlVVJMKCkpOwotCQotCQkJCQkvLyBhZGQgdGhlIGNvbmZpZwotCQkJCQlhZGRDb25maWd1cmF0aW9uTW9kZWwoY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oIkVycm9yIHByb2Nlc3NpbmcgaGlzdG9yeTogIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHNpdGVsb2NhbAotCSAqLwotCVVSTCBnZXRSZXNvdXJjZUJ1bmRsZVVSTCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuYXNEaXJlY3RvcnlVUkwoZ2V0TG9jYXRpb25VUkwoKSk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgKyAiOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUud2FybihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvbW9kZWwvU2l0ZUxvY2FsUGFyc2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhNzM3ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9tb2RlbC9TaXRlTG9jYWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotCi0vKioKLSAqIHBhcnNlIHRoZSBkZWZhdWx0IHNpdGUueG1sCi0gKi8KLQotcHVibGljIGNsYXNzIFNpdGVMb2NhbFBhcnNlciB7Ci0KLQlwcml2YXRlIFBsYXRmb3JtQ29uZmlndXJhdGlvbiBwbGF0Zm9ybUNvbmZpZzsKLQlwcml2YXRlIFNpdGVMb2NhbE1vZGVsIHNpdGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHID0gImNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGJ1bmRsZTsKLQlwcml2YXRlIEJhc2VTaXRlTG9jYWxGYWN0b3J5IGZhY3RvcnkgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2UgYnVuZGxlIGZvciB0aGlzIHNpdGVsb2NhbAotCSAqLwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmFzRGlyZWN0b3J5VVJMKHNpdGUuZ2V0TG9jYXRpb25VUkwoKSk7Ci0JCQlDbGFzc0xvYWRlciBsID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IHVybCB9LCBudWxsKTsKLQkJCWJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgicGxhdGZvcm0iLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBsKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS53YXJuKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIjoiICsgdXJsLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVDb3JlLndhcm4oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVmYXVsdFNpdGVQYXJzZXIKLQkgKi8KLQlwdWJsaWMgU2l0ZUxvY2FsUGFyc2VyKElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcsIElMb2NhbFNpdGUgc2l0ZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzVHJ1ZShwbGF0Zm9ybUNvbmZpZyBpbnN0YW5jZW9mIFBsYXRmb3JtQ29uZmlndXJhdGlvbik7Ci0JCXRoaXMucGxhdGZvcm1Db25maWcgPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uKXBsYXRmb3JtQ29uZmlnOwotCQkKLQkJQXNzZXJ0LmlzVHJ1ZShzaXRlIGluc3RhbmNlb2YgU2l0ZUxvY2FsTW9kZWwpOwotCQl0aGlzLnNpdGUgPSAoU2l0ZUxvY2FsTW9kZWwpIHNpdGU7Ci0KLQkJLy8gREVCVUc6CQkKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX1BBUlNJTkcpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoIlN0YXJ0IHBhcnNpbmcgbG9jYWxzaXRlOiIgKyAoKFNpdGVMb2NhbE1vZGVsKSBzaXRlKS5nZXRMb2NhdGlvblVSTFN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlidW5kbGUgPSBnZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQkKLQkJcHJvY2Vzc0NvbmZpZygpOwotCQkvL3Byb2Nlc3NIaXN0b3J5KCk7Ci0JfQotCi0JCi0vLwkvKiogCi0vLwkgKiBwcm9jZXNzIHRoZSBTaXRlIGluZm8KLS8vCSAqLwotLy8JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0vLwkJLy8KLS8vCQlTdHJpbmcgaW5mbyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlpbmZvID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFJlc291cmNlU3RyaW5nKGluZm8sIGJ1bmRsZSk7Ci0vLwkJc2l0ZS5zZXRMYWJlbChpbmZvKTsKLS8vCQotLy8JCS8vIGhpc3RvcnkKLS8vCQlTdHJpbmcgaGlzdG9yeVN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImhpc3RvcnkiKTsgLy8kTk9OLU5MUy0xJAotLy8JCWludCBoaXN0b3J5OwotLy8JCWlmIChoaXN0b3J5U3RyaW5nID09IG51bGwgfHwgaGlzdG9yeVN0cmluZy5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLS8vCQkJaGlzdG9yeSA9IFNpdGVMb2NhbE1vZGVsLkRFRkFVTFRfSElTVE9SWTsKLS8vCQl9IGVsc2UgewotLy8JCQloaXN0b3J5ID0gSW50ZWdlci5wYXJzZUludChoaXN0b3J5U3RyaW5nKTsKLS8vCQl9Ci0vLwkJc2l0ZS5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KGhpc3RvcnkpOwotLy8JCi0vLwkJLy9zdGFtcAotLy8JCVN0cmluZyBzdGFtcFN0cmluZyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInN0YW1wIik7IC8vJE5PTi1OTFMtMSQKLS8vCQlsb25nIHN0YW1wID0gTG9uZy5wYXJzZUxvbmcoc3RhbXBTdHJpbmcpOwotLy8JCXNpdGUuc2V0U3RhbXAoc3RhbXApOwotLy8JCi0vLwkJLy8gREVCVUc6CQkKLS8vCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotLy8JCQlVcGRhdGVDb3JlLmRlYnVnKCJFbmQgcHJvY2VzcyBTaXRlIGxhYmVsOiIgKyBpbmZvKTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQotLy8JfQotCi0JLyoqIAotCSAqIHByb2Nlc3MgdGhlIENvbmZpZyBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25maWcoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbGFiZWwgPSBwbGF0Zm9ybUNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0RGF0ZSgpLnRvU3RyaW5nKCk7Ci0JCWxhYmVsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFJlc291cmNlU3RyaW5nKGxhYmVsLCBidW5kbGUpOwotCQlzaXRlLnNldExhYmVsKGxhYmVsKTsKLQotCQlVUkwgdXJsID0gc2l0ZS5nZXRMb2NhdGlvblVSTCgpOwotCQlJbnN0YWxsQ29uZmlndXJhdGlvbk1vZGVsIGNvbmZpZyA9IGZhY3RvcnkuY3JlYXRlSW5zdGFsbENvbmZpZ3VyYXRpb25Nb2RlbCgpOwotCQljb25maWcuc2V0TG9jYXRpb25VUkxTdHJpbmcodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQljb25maWcuc2V0TGFiZWwobGFiZWwpOwotCQljb25maWcucmVzb2x2ZSh1cmwsIHNpdGUuZ2V0UmVzb3VyY2VCdW5kbGVVUkwoKSk7Ci0KLQkJLy8gYWRkIHRoZSBjb25maWcKLQkJKChTaXRlTG9jYWwpc2l0ZSkuYWRkQ29uZmlndXJhdGlvbigoSW5zdGFsbENvbmZpZ3VyYXRpb24pY29uZmlnKTsKLQotCQkvLyBERUJVRzoJCQotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfUEFSU0lORykgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiRW5kIFByb2Nlc3NpbmcgQ29uZmlnIFRhZzogdXJsOiIgKyB1cmwudG9FeHRlcm5hbEZvcm0oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0JhdGNoSW5zdGFsbE9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzkzYjU2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvQmF0Y2hJbnN0YWxsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgQmF0Y2hJbnN0YWxsT3BlcmF0aW9uCi0JZXh0ZW5kcyBPcGVyYXRpb24KLQlpbXBsZW1lbnRzIElCYXRjaE9wZXJhdGlvbiB7Ci0JCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSU5TVEFMTElORyA9ICJPcGVyYXRpb25zTWFuYWdlci5pbnN0YWxsaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zOwotCi0JcHVibGljIEJhdGNoSW5zdGFsbE9wZXJhdGlvbihJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3BlcmF0aW9ucyA9IG9wZXJhdGlvbnM7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU11bHRpT3BlcmF0aW9uI2dldE9wZXJhdGlvbnMoKQotCSAqLwotCXB1YmxpYyBJRmVhdHVyZU9wZXJhdGlvbltdIGdldE9wZXJhdGlvbnMoKSB7Ci0JCXJldHVybiBvcGVyYXRpb25zOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb24jZXhlY3V0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCWludCBpbnN0YWxsQ291bnQgPSAwOwotCQlib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKLQkJCi0JCWlmIChvcGVyYXRpb25zID09IG51bGwgfHwgb3BlcmF0aW9ucy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCi0vLwkJLy8gQ2hlY2sgZm9yIGR1cGxpY2F0aW9uIGNvbmZsaWN0cwotLy8JCUFycmF5TGlzdCBjb25mbGljdHMgPQotLy8JCQlEdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygKLS8vCQkJCW9wZXJhdGlvbnMsCi0vLwkJCQljb25maWcpOwotLy8JCWlmIChjb25mbGljdHMgIT0gbnVsbCkgewotLy8JCQlib29sZWFuIGNvbnRpbnVlUHJvY2Vzc2luZyA9IGZhbHNlOwotLy8JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLS8vCQkJCWNvbnRpbnVlUHJvY2Vzc2luZyA9IGxpc3RlbmVyLmJlZm9yZUV4ZWN1dGUodGhpcywgY29uZmxpY3RzKTsKLS8vCQkJaWYgKCFjb250aW51ZVByb2Nlc3NpbmcpCi0vLwkJCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotCQkKLQkJT3BlcmF0aW9uc01hbmFnZXIuc2V0SW5Qcm9ncmVzcyh0cnVlKTsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCkgCi0JCQltb25pdG9yID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJCQotCQl0cnkgewkJCQotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJbGlzdGVuZXIuYmVmb3JlRXhlY3V0ZSh0aGlzLCBudWxsKTsKLQkJCQotCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJUG9saWN5LmJpbmQoS0VZX0lOU1RBTExJTkcpLAotCQkJCW9wZXJhdGlvbnMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0KLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcigKLQkJCQkJCW1vbml0b3IsCi0JCQkJCQkxLAotCQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQotCQkJCW9wZXJhdGlvbnNbaV0uZXhlY3V0ZShzdWJNb25pdG9yLCBsaXN0ZW5lcik7Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkUGVuZGluZ09wZXJhdGlvbihvcGVyYXRpb25zW2ldKTsKLQotCQkJCW9wZXJhdGlvbnNbaV0ubWFya1Byb2Nlc3NlZCgpOwotCQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUob3BlcmF0aW9uc1tpXSwgbnVsbCk7Ci0KLQkJCQkvL21vbml0b3Iud29ya2VkKDEpOwotCQkJCWluc3RhbGxDb3VudCsrOwotCQkJfQotCQkJc3VjY2VzcyA9IHRydWU7Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQl9IGNhdGNoIChJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzYXZlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0JCQlpZiAoaW5zdGFsbENvdW50ID4gMCkKLQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzYXZlcyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCi0JCQlpZiAoaW5zdGFsbENvdW50ID4gMCkKLQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCk7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLnNldEluUHJvZ3Jlc3MoZmFsc2UpOwotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbmZpZ09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Db25maWdPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkYTYxNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0NvbmZpZ09wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIENvbmZpZ3VyZSBhIGZlYXR1cmUuCi0gKiBDb25maWdPcGVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ09wZXJhdGlvbgotCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgotCWltcGxlbWVudHMgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gewotCi0JcHVibGljIENvbmZpZ09wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpIHsKLQkJc3VwZXIoc2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDb25maWcoZmVhdHVyZSk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShmZWF0dXJlKTsKLS8vCQllbnN1cmVVbmlxdWUoKTsKLQotCQl0cnkgewotCQkJLy8gUmVzdGFydCBub3QgbmVlZGVkCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBmYWxzZTsKLQotCQkJLy8gQ2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGluZyBvbmUgdGhhdCdzIGFscmVhZHkgcGVuZGluZwotCQkJSU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKTsKLQotCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gaW5zdGFuY2VvZiBJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7Ci0JCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOwotCQkJfQotCi0JCQltYXJrUHJvY2Vzc2VkKCk7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkKLQkJCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7Ci0KLQkJCXJlc3RhcnROZWVkZWQgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zYXZlKCkgJiYgcmVzdGFydE5lZWRlZDsKLQotCQkJLy8gbm90aWZ5IHRoZSBtb2RlbAotCQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgbnVsbCk7Ci0KLQkJCXJldHVybiByZXN0YXJ0TmVlZGVkOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXVuZG8oKTsKLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0YXJnZXRTaXRlLnVuY29uZmlndXJlKGZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0R1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmFiZGIzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yICB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTkZMSUNUID0KLQkJIkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy5jb25mbGljdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSWRFbnRyeSB7Ci0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZTsKLQkJSUZlYXR1cmUgZmVhdHVyZTsKLQotCQlwdWJsaWMgSWRFbnRyeShJRmVhdHVyZSBmZWF0dXJlLCBJQ29uZmlndXJlZFNpdGUgY3NpdGUpIHsKLQkJCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JCQl0aGlzLmNzaXRlID0gY3NpdGU7Ci0JCQlpZiAoY3NpdGUgPT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY3NpdGUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNJbnN0YWxsQ2FuZGlkYXRlKCkgewotCQkJcmV0dXJuIGNzaXRlICE9IG51bGw7Ci0JCX0KLQkJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoKSB7Ci0JCQlyZXR1cm4gZmVhdHVyZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJCXJldHVybiBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCX0KLQkJcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRDb25maWd1cmVkU2l0ZSgpIHsKLQkJCWlmIChjc2l0ZSAhPSBudWxsKQotCQkJCXJldHVybiBjc2l0ZTsKLQkJCXJldHVybiBmZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBzYW1lTGV2ZWwoSWRFbnRyeSBlbnRyeSkgewotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZXZpZCA9Ci0JCQkJZW50cnkuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCXJldHVybiB2aWQuZXF1YWxzKGV2aWQpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9Ci0JCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBjb25maWdTaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCk7Ci0JCQlyZXR1cm4gUG9saWN5LmJpbmQoCi0JCQkJS0VZX0NPTkZMSUNULAotCQkJCW5ldyBTdHJpbmdbXSB7IHZlcnNpb24sIGxvY2F0aW9uIH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUR1cGxpY2F0ZUNvbmZsaWN0cygKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcykgewotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQl0cnkgewotCQkJY29tcHV0ZVByZXNlbnRTdGF0ZShmZWF0dXJlVGFibGUsIGNvbmZpZyk7Ci0JCQljb21wdXRlTmV3RmVhdHVyZSgKLQkJCQlqb2IuZ2V0RmVhdHVyZSgpLAotCQkJCXRhcmdldFNpdGUsCi0JCQkJZmVhdHVyZVRhYmxlLAotCQkJCW9wdGlvbmFsRmVhdHVyZXMpOwotCQkJcmV0dXJuIGNvbXB1dGVDb25mbGljdHMoZmVhdHVyZVRhYmxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVEdXBsaWNhdGVDb25mbGljdHMoCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJY29tcHV0ZVByZXNlbnRTdGF0ZShmZWF0dXJlVGFibGUsIGNvbmZpZyk7Ci0JCWNvbXB1dGVOZXdGZWF0dXJlcyhqb2JzLCBmZWF0dXJlVGFibGUpOwotCQlyZXR1cm4gY29tcHV0ZUNvbmZsaWN0cyhmZWF0dXJlVGFibGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlQ29uZmxpY3RzKEhhc2h0YWJsZSBmZWF0dXJlVGFibGUpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bSA9IGZlYXR1cmVUYWJsZS5lbGVtZW50cygpOwotCQkJZW51bS5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCSkgewotCQkJQXJyYXlMaXN0IGNhbmRpZGF0ZSA9IChBcnJheUxpc3QpIGVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChjYW5kaWRhdGUuc2l6ZSgpID09IDEpCi0JCQkJY29udGludWU7Ci0JCQlBcnJheUxpc3QgY29uZmxpY3QgPSBjaGVja0ZvckNvbmZsaWN0KGNhbmRpZGF0ZSk7Ci0JCQlpZiAoY29uZmxpY3QgIT0gbnVsbCkgewotCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlc3VsdC5hZGQoY29uZmxpY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNoZWNrRm9yQ29uZmxpY3QoQXJyYXlMaXN0IGNhbmRpZGF0ZSkgewotCQlJZEVudHJ5IGZpcnN0RW50cnkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhbmRpZGF0ZS5zaXplKCk7IGkrKykgewotCQkJSWRFbnRyeSBlbnRyeSA9IChJZEVudHJ5KSBjYW5kaWRhdGUuZ2V0KGkpOwotCQkJaWYgKGZpcnN0RW50cnkgPT0gbnVsbCkKLQkJCQlmaXJzdEVudHJ5ID0gZW50cnk7Ci0JCQllbHNlIGlmICghZW50cnkuc2FtZUxldmVsKGZpcnN0RW50cnkpKQotCQkJCXJldHVybiBjYW5kaWRhdGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlUHJlc2VudFN0YXRlKAotCQlIYXNodGFibGUgdGFibGUsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQl0cnkgewotCQkJCQlhZGRFbnRyeShyZWZzW2pdLmdldEZlYXR1cmUobnVsbCksIGNzaXRlLCB0YWJsZSk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGRvbid0IGxldCBvbmUgYmFkIGZlYXR1cmUgc3RvcCB0aGUgbG9vcAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHV0ZU5ld0ZlYXR1cmVzKAotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzLAotCQlIYXNodGFibGUgZmVhdHVyZVRhYmxlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGpvYnNbaV07Ci0JCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSA9IGpvYi5nZXRUYXJnZXRTaXRlKCk7Ci0JCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCXRyeSB7Ci0JCQkJY29tcHV0ZU5ld0ZlYXR1cmUobmV3RmVhdHVyZSwgdGFyZ2V0U2l0ZSwgZmVhdHVyZVRhYmxlLCBudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlTmV3RmVhdHVyZSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlLAotCQlIYXNodGFibGUgdGFibGUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlhZGRFbnRyeShmZWF0dXJlLCBjc2l0ZSwgdGFibGUpOwotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJYm9vbGVhbiBhZGQgPSB0cnVlOwotCi0JCQlpZiAoaXJlZi5pc09wdGlvbmFsKCkgJiYgb3B0aW9uYWxGZWF0dXJlcyAhPSBudWxsKSB7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3B0aW9uYWxGZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjaGVja2VkID0gb3B0aW9uYWxGZWF0dXJlc1tqXTsKLQkJCQkJaWYgKGNoZWNrZWQuZXF1YWxzKGlyZWYpKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlhZGQgPSBmb3VuZDsKLQkJCX0KLQkJCWlmIChhZGQpCi0JCQkJY29tcHV0ZU5ld0ZlYXR1cmUoCi0JCQkJCWlyZWYuZ2V0RmVhdHVyZShudWxsKSwKLQkJCQkJY3NpdGUsCi0JCQkJCXRhYmxlLAotCQkJCQlvcHRpb25hbEZlYXR1cmVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRW50cnkoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSwKLQkJSGFzaHRhYmxlIGZlYXR1cmVUYWJsZSkgewotCQlTdHJpbmcgaWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCUFycmF5TGlzdCBlbnRyaWVzID0gKEFycmF5TGlzdCkgZmVhdHVyZVRhYmxlLmdldChpZCk7Ci0JCWlmIChlbnRyaWVzID09IG51bGwpIHsKLQkJCWVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmZWF0dXJlVGFibGUucHV0KGlkLCBlbnRyaWVzKTsKLQkJfQotCQlJZEVudHJ5IGVudHJ5ID0gbmV3IElkRW50cnkoZmVhdHVyZSwgY3NpdGUpOwotCQlib29sZWFuIHJlcGxhY2VkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCk7IGkrKykgewotCQkJSWRFbnRyeSBleGlzdGluZ0VudHJ5ID0gKElkRW50cnkpIGVudHJpZXMuZ2V0KGkpOwotCQkJSUNvbmZpZ3VyZWRTaXRlIGV4aXN0aW5nU2l0ZSA9IGV4aXN0aW5nRW50cnkuZ2V0Q29uZmlndXJlZFNpdGUoKTsKLQkJCWlmIChleGlzdGluZ1NpdGUuZXF1YWxzKGVudHJ5LmdldENvbmZpZ3VyZWRTaXRlKCkpKSB7Ci0JCQkJLy8gc2FtZSBzaXRlIC0gcmVwbGFjZSBpdCBpZiBub3QgbmV3Ci0JCQkJaWYgKGVudHJ5LmlzSW5zdGFsbENhbmRpZGF0ZSgpKSB7Ci0JCQkJCWVudHJpZXMuc2V0KGksIGVudHJ5KTsKLQkJCQkJZW50cmllcy5yZW1vdmUoZXhpc3RpbmdFbnRyeSk7Ci0JCQkJfQotCQkJCXJlcGxhY2VkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIXJlcGxhY2VkKQotCQkJZW50cmllcy5hZGQoZW50cnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzZmI5ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL0ZlYXR1cmVIaWVyYXJjaHlFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBhIGpvaW50IGZlYXR1cmUgaGllYXJjaHkuCi0gKiBPbGQgZmVhdHVyZSByZWZlcmVuY2UgcmVwcmVzZW50cyBmZWF0dXJlIHRoYXQgaXMKLSAqIGZvdW5kIG9uIGluIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIE5ldyBmZWF0dXJlCi0gKiByZWZlcmVuY2UgaXMgZm91bmQgaW4gdGhlIGZlYXR1cmUgdGhhdCBpcyBhbiBpbnN0YWxsL3VwZGF0ZQotICogY2FuZGlkYXRlLiBUaGUgZWxlbWVudCBpcyB1c2VkIHRvIGpvaW4gbm9kZXMgb2YgdGhlCi0gKiBoaWVhcmNoeSBmb3JtZWQgYnkgaW5jbHVkaW5nIGZlYXR1cmVzIHNvIHRoYXQKLSAqIGVhY2ggbm9kZSBpbiB0aGUgaGllYXJjaHkgY29udGFpbnMgcmVmZXJlbmNlcyB0byB0aGUKLSAqIG9sZCBhbmQgdGhlIG5ldyBmZWF0dXJlLiBPbGQgYW5kIG5ldyBmZWF0dXJlcyBoYXZlCi0gKiB0aGUgc2FtZSBJRHMgYnV0IGRpZmZlcmVudCB2ZXJzaW9ucywgZXhjZXB0IGluIAotICogdGhlIGNhc2Ugb2Ygb3B0aW9uYWwgZmVhdHVyZXMsIHdoZXJlIHRoZSB0cmVlIG1heQotICogYmUgY29uc3RydWN0ZWQgdG8gYnJpbmcgaW4gYW4gb3B0aW9uYWwgZmVhdHVyZQotICogdGhhdCB3YXMgbm90IGluc3RhbGxlZCBpbml0aWFsbHkuIEluIHRoYXQgY2FzZSwKLSAqIHNvbWUgbm9kZXMgbWF5IGhhdmUgb2xkIGFuIG5ldyByZWZlcmVuY2VzIHdpdGggdGhlCi0gKiBzYW1lIElEIGFuZCB2ZXJzaW9uLiAKLSAqIDxwPgotICogT2xkIGZlYXR1cmUgcmVmZXJlbmNlIG1heSBiZSBudWxsLiBUaGF0IG1lYW5zCi0gKiB0aGF0IHRoZSBvbGRlciBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQgYnV0IGxvd2VyCi0gKiB2ZXJzaW9uIHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IHsKLQotCXByaXZhdGUgT2JqZWN0IHJvb3Q7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY2hpbGRyZW47Ci0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZSBvbGRGZWF0dXJlUmVmOwotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2UgbmV3RmVhdHVyZVJlZjsKLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tlZDsKLQlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWxDaGlsZHJlbjsKLQlwcml2YXRlIGJvb2xlYW4gbmF0aXZlVXBncmFkZSA9IGZhbHNlOwotCi0JcHVibGljIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KAotCQlJRmVhdHVyZVJlZmVyZW5jZSBvbGRSZWYsCi0JCUlGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZikgewotCQlvbGRGZWF0dXJlUmVmID0gb2xkUmVmOwotCQluZXdGZWF0dXJlUmVmID0gbmV3UmVmOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3QoT2JqZWN0IHJvb3QpIHsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFJvb3QoKSB7Ci0JCXJldHVybiByb290OwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRydWUgaWYgZWxlbWVudCBjYW4gYmUgY2hlY2tlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRWRpdGFibGUoKSB7Ci0JCS8vIGNhbm5vdCB1bmNoZWNrIG5vbi1vcHRpb25hbCBmZWF0dXJlcwotCQlpZiAoaXNPcHRpb25hbCgpID09IGZhbHNlKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBjYW5ub3QgdW5jaGVjayBvcHRpb25hbCBmZWF0dXJlIHRoYXQKLQkJLy8gaGFzIGFscmVhZHkgYmVlbiBpbnN0YWxsZWQKLQkJaWYgKG9sZEZlYXR1cmVSZWYgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQSBoaXJlYXJjaHkgbm9kZSByZXByZXNlbnRzIGEgJ2ZhbHNlIHVwZGF0ZScgaWYKLQkgKiBib3RoIG9sZCBhbmQgbmV3IHJlZmVyZW5jZXMgZXhpc3QgYW5kIGJvdGgKLQkgKiBwb2ludCB0byB0aGUgZmVhdHVyZSB3aXRoIHRoZSBzYW1lIElEIGFuZCB2ZXJzaW9uLgotCSAqIFRoZXNlIG5vZGVzIHdpbGwgbm90IGFueSBieXRlcyB0byBiZSBkb3dubG9hZGVkIC0gCi0JICogdGhleSBzaW1wbHkgZXhpc3QgdG8gYWxsb3cgdGhlIGhpcmFyY2h5IHRvCi0JICogcmVhY2ggdGhlIG9wdGlvbmFsIGNoaWxkcmVuIHRoYXQgYXJlIG1pc3NpbmcKLQkgKiBhbmQgd2lsbCBiZSBpbnN0YWxsZWQuCi0JICovCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlVXBkYXRlKCkgewotCQlpZiAob2xkRmVhdHVyZVJlZiAhPSBudWxsICYmIG5ld0ZlYXR1cmVSZWYgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gb2xkRmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCQluZXdGZWF0dXJlUmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBmZWF0dXJlIGlzIGluY2x1ZGVkIGFzIG9wdGlvbmFsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBuZXdGZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZQotCQkJJiYgKChJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlKSBuZXdGZWF0dXJlUmVmKS5pc09wdGlvbmFsKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wdGlvbmFsIGZlYXR1cmUgaXMgc2VsZWN0ZWQKLQkgKiBmb3IgaW5zdGFsbGF0aW9uLiBOb24tb3B0aW9uYWwgZmVhdHVyZXMgb3Igbm9uLWVkaXRhYmxlCi0JICogZmVhdHVyZXMgYXJlIGFsd2F5cyBjaGVja2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLQkJcmV0dXJuIGNoZWNrZWQ7Ci0JfQotCi0Jdm9pZCBzZXROYXRpdmVVcGdyYWRlKGJvb2xlYW4gbmF0aXZlVXBncmFkZSkgewotCQl0aGlzLm5hdGl2ZVVwZ3JhZGUgPSBuYXRpdmVVcGdyYWRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wdGlvbmFsIGZlYXR1cmUgc2hvdWxkCi0JICogYmUgZW5hYmxlZCB3aGVuIGluc3RhbGxlZC4gQnkgZGVmYXVsdCwgYWxsCi0JICogZmVhdHVyZXMgaW4gdGhlIGhpZWFyY2h5IHNob3VsZCBiZSBlbmFibGVkLgotCSAqIFRoZSBleGNlcHRpb24gaXMgZm9yIG9wdGlvbmFsIGZlYXR1cmVzIHRoYXQKLQkgKiBhcmUgdXBkYXRlZCB0byBhIG5ldyB2ZXJzaW9uIGluIGNhc2Ugd2hlcmUKLQkgKiB0aGUgb2xkZXIgdmVyc2lvbiBvZiB0aGUgb3B0aW9uYWwgZmVhdHVyZQotCSAqIGlzIGRpc2FibGVkIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLiAKLQkgKiBJbiB0aGlzIGNhc2UsIHRoZSBmZWF0dXJlIGlzCi0JICogdXBkYXRlZCBhbmQgZGlzYWJsZWQgaW4gb3JkZXIgdG8gbWFpbnRhaW4KLQkgKiBpdHMgc3RhdGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKG5hdGl2ZVVwZ3JhZGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGlzT3B0aW9uYWwoKSAmJiBvbGRGZWF0dXJlUmVmICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IG9sZEZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPQotCQkJCQlVcGRhdGVVdGlscy5nZXRDb25maWdTaXRlKG9sZEZlYXR1cmUsIGNvbmZpZyk7Ci0JCQkJcmV0dXJuIGNzaXRlLmlzQ29uZmlndXJlZChvbGRGZWF0dXJlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQl0cnkgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IG5ld0ZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCXJldHVybiBmZWF0dXJlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBhbiBlZGl0YWJsZSBmZWF0dXJlIGZvciBpbnN0YWxsYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tlZChib29sZWFuIGNoZWNrZWQpIHsKLQkJdGhpcy5jaGVja2VkID0gY2hlY2tlZDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBsYWJlbCBmb3IgVUkgcHJlc2VudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmVhdHVyZUxhYmVsKG5ld0ZlYXR1cmVSZWYpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChuZXdGZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgewotCQkJCVN0cmluZyBpbmFtZSA9Ci0JCQkJCSgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgbmV3RmVhdHVyZVJlZikuZ2V0TmFtZSgpOwotCQkJCWlmIChpbmFtZSAhPSBudWxsKQotCQkJCQlyZXR1cm4gaW5hbWU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0KLQkJCQkJbmV3RmVhdHVyZVJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJcmV0dXJuIHZpZC50b1N0cmluZygpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMikgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkvKioKLQkgKiBDb21wdXRlcyBsYWJlbCBmcm9tIHRoZSBmZWF0dXJlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEZlYXR1cmVMYWJlbChJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkKLQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JfQotCS8qKgotCSAqIENvbXB1dGVzIGNoaWxkcmVuIGJ5IGxpbmtpbmcgbWF0Y2hpbmcgZmVhdHVyZXMgZnJvbSB0aGUKLQkgKiBvbGQgZmVhdHVyZSdzIGFuZCBuZXcgZmVhdHVyZSdzIGhpZXJhcmNoeS4KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBnZXRDaGlsZHJlbigKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCWJvb2xlYW4gcGF0Y2gsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJY29tcHV0ZUNoaWxkcmVuKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZyk7Ci0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gYXJyYXkgPQotCQkJbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W2NoaWxkcmVuLnNpemUoKV07Ci0JCWNoaWxkcmVuLnRvQXJyYXkoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JcHVibGljIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCWlmIChjaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGFycmF5ID0KLQkJCQluZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbY2hpbGRyZW4uc2l6ZSgpXTsKLQkJCWNoaWxkcmVuLnRvQXJyYXkoYXJyYXkpOwotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFswXTsKLQl9Ci0JLyoqCi0JICogQ29tcHV0ZXMgY2hpbGRyZW4gb2YgdGhpcyBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbXB1dGVDaGlsZHJlbigKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCWJvb2xlYW4gcGF0Y2gsCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCWNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJdHJ5IHsKLQkJCQlJRmVhdHVyZSBvbGRGZWF0dXJlID0gbnVsbDsKLQkJCQlJRmVhdHVyZSBuZXdGZWF0dXJlID0gbnVsbDsKLQkJCQluZXdGZWF0dXJlID0gbmV3RmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChvbGRGZWF0dXJlUmVmICE9IG51bGwpCi0JCQkJCW9sZEZlYXR1cmUgPSBvbGRGZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJb3B0aW9uYWxDaGlsZHJlbiA9Ci0JCQkJCWNvbXB1dGVFbGVtZW50cygKLQkJCQkJCW9sZEZlYXR1cmUsCi0JCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJdXBkYXRlLAotCQkJCQkJcGF0Y2gsCi0JCQkJCQljb25maWcsCi0JCQkJCQljaGlsZHJlbik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7IGkrKykgewotCQkJCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCBlbGVtZW50ID0KLQkJCQkJCShGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJCQllbGVtZW50LnNldFJvb3QoZ2V0Um9vdCgpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbENoaWxkcmVuKCkgewotCQlyZXR1cm4gb3B0aW9uYWxDaGlsZHJlbjsKLQl9Ci0JLyoqCi0JICogQWRkcyBjaGVja2VkIG9wdGlvbmFsIGZlYXR1cmVzIHRvIHRoZSBwcm92aWRlZCBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2hlY2tlZE9wdGlvbmFsRmVhdHVyZXMoCi0JCWJvb2xlYW4gdXBkYXRlLAotCQlib29sZWFuIHBhdGNoLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlTZXQgc2V0KSB7Ci0JCWlmIChpc09wdGlvbmFsKCkgJiYgaXNDaGVja2VkKCkpIHsKLQkJCS8vIERvIG5vdCBhZGQgY2hlY2tlZCBvcHRpb25hbCBmZWF0dXJlcwotCQkJLy8gaWYgdGhpcyBpcyBhbiB1cGRhdGUgY2FzZSBidXQKLQkJCS8vIHRoZSBub2RlIGlzIG5vdCBhICd0cnVlJyB1cGRhdGUKLQkJCS8vIChvbGQgYW5kIG5ldyBmZWF0dXJlIGFyZSB0aGUgZXF1YWwpCi0JCQlpZiAoIXVwZGF0ZSB8fCAhaXNGYWxzZVVwZGF0ZSgpKQotCQkJCXNldC5hZGQobmV3RmVhdHVyZVJlZik7Ci0JCX0KLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldENoaWxkcmVuKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWVsZW1lbnRzW2ldLmFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZywgc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIGZpcnN0LWxldmVsIGNoaWxkcmVuIG9mIHRoZSBsaW5rZWQgaGllcmFyY2h5Ci0JICogZm9yIHRoZSBwcm92aWRlZCBvbGQgYW5kIG5ldyBmZWF0dXJlcyAoc2FtZSBJRCwgZGlmZmVyZW50IHZlcnNpb24KLQkgKiB3aGVyZSBuZXcgdmVyc2lvbiBpcyBncmVhdGVyIG9yIGVxdWFsIHRoZSBvbGQgdmVyc2lvbikuCi0JICogT2xkIGZlYXR1cmUgbWF5IGJlIG51bGwuIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb21wdXRlRWxlbWVudHMoCi0JCUlGZWF0dXJlIG9sZEZlYXR1cmUsCi0JCUlGZWF0dXJlIG5ld0ZlYXR1cmUsCi0JCWJvb2xlYW4gdXBkYXRlLAotCQlib29sZWFuIHBhdGNoLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlBcnJheUxpc3QgbGlzdCkgewotCQlPYmplY3RbXSBvbGRDaGlsZHJlbiA9IG51bGw7Ci0JCU9iamVjdFtdIG5ld0NoaWxkcmVuID0gZ2V0SW5jbHVkZWRGZWF0dXJlcyhuZXdGZWF0dXJlKTsKLQkJYm9vbGVhbiBvcHRpb25hbENoaWxkcmVuID0gZmFsc2U7Ci0KLQkJdHJ5IHsKLQkJCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsKLQkJCQlvbGRDaGlsZHJlbiA9IGdldEluY2x1ZGVkRmVhdHVyZXMob2xkRmVhdHVyZSk7Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0NoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2Ugb2xkUmVmID0gbnVsbDsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBuZXdSZWYgPSAoSUZlYXR1cmVSZWZlcmVuY2UpIG5ld0NoaWxkcmVuW2ldOwotCQkJCWlmIChvbGRDaGlsZHJlbiAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuZXdJZCA9Ci0JCQkJCQluZXdSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsKLQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG9sZENoaWxkcmVuLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0KLQkJCQkJCQkoSUZlYXR1cmVSZWZlcmVuY2UpIG9sZENoaWxkcmVuW2pdOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpZiAoY3JlZgotCQkJCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJCS5nZXRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmVxdWFscyhuZXdJZCkpIHsKLQkJCQkJCQkJb2xkUmVmID0gY3JlZjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChwYXRjaCkgewotCQkJCQkvLyAzMDg0OSAtIGZpbmQgdGhlIG9sZCByZWZlcmVuY2UgaW4gdGhlCi0JCQkJCS8vIGNvbmZpZ3VyYXRpb24uCi0JCQkJCWlmICghVXBkYXRlVXRpbHMuaXNQYXRjaChuZXdGZWF0dXJlKSkgewotCQkJCQkJb2xkUmVmID0gZmluZFBhdGNoZWRSZWZlcmVuY2UobmV3UmVmLCBjb25maWcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHRlc3QgaWYgdGhlIG9sZCBvcHRpb25hbCBmZWF0dXJlIGV4aXN0cwotCQkJCWlmIChvbGRSZWYgIT0gbnVsbAotCQkJCQkmJiAoKG9sZFJlZiBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UKLQkJCQkJCSYmICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgb2xkUmVmKS5pc09wdGlvbmFsKCkpCi0JCQkJCQl8fCBwYXRjaCkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlGZWF0dXJlIGYgPSBvbGRSZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCWlmIChmID09IG51bGwpCi0JCQkJCQkJb2xkUmVmID0gbnVsbDsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBtaXNzaW5nCi0JCQkJCQlvbGRSZWYgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50IGVsZW1lbnQgPQotCQkJCQluZXcgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQob2xkUmVmLCBuZXdSZWYpOwotCQkJCS8vIElmIHRoaXMgaXMgYW4gdXBkYXRlIChvbGQgZmVhdHVyZSBleGlzdHMpLCAKLQkJCQkvLyBvbmx5IGNoZWNrIHRoZSBuZXcgb3B0aW9uYWwgZmVhdHVyZSBpZiB0aGUgb2xkIGV4aXN0cy4KLQkJCQkvLyBPdGhlcndpc2UsIGFsd2F5cyBjaGVjay4KLQkJCQlpZiAoZWxlbWVudC5pc09wdGlvbmFsKCkgJiYgKHVwZGF0ZSB8fCBwYXRjaCkpIHsKLQkJCQkJZWxlbWVudC5zZXRDaGVja2VkKG9sZFJlZiAhPSBudWxsKTsKLQkJCQkJaWYgKG9sZFJlZiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBEb2VzIG5vdCBoYXZlIGFuIG9sZCByZWZlcmVuY2UsCi0JCQkJCQkvLyBidXQgaXQgbWF5IGNvbnRhaW4gYW4gb2xkZXIKLQkJCQkJCS8vIGZlYXR1cmUgdGhhdCBtYXkgc3RpbGwgcXVhbGlmeQotCQkJCQkJLy8gZm9yIHVwZGF0ZS4gRm9yIGV4YW1wbGUsCi0JCQkJCQkvLyBhbiBvbGRlciB2ZXJzaW9uIG1heSBoYXZlIGJlZW4KLQkJCQkJCS8vIGluc3RhbGxlZCBuYXRpdmVseSBmcm9tIHRoZSBDRC1ST00uCi0JCQkJCQlpZiAoaGFzT2xkZXJWZXJzaW9uKG5ld1JlZikpIHsKLQkJCQkJCQllbGVtZW50LnNldE5hdGl2ZVVwZ3JhZGUodHJ1ZSk7Ci0JCQkJCQkJZWxlbWVudC5zZXRDaGVja2VkKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCWVsZW1lbnQuc2V0Q2hlY2tlZCh0cnVlKTsKLQkJCQlsaXN0LmFkZChlbGVtZW50KTsKLQkJCQllbGVtZW50LmNvbXB1dGVDaGlsZHJlbih1cGRhdGUsIHBhdGNoLCBjb25maWcpOwotCQkJCWlmIChlbGVtZW50LmlzT3B0aW9uYWwoKSB8fCBlbGVtZW50Lmhhc09wdGlvbmFsQ2hpbGRyZW4oKSkKLQkJCQkJb3B0aW9uYWxDaGlsZHJlbiA9IHRydWU7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBvcHRpb25hbENoaWxkcmVuOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT2xkZXJWZXJzaW9uKElGZWF0dXJlUmVmZXJlbmNlIG5ld1JlZikgewotCQl0cnkgewotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBuZXdSZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9IHZpZC5nZXRWZXJzaW9uKCk7Ci0JCQlTdHJpbmcgbW9kZSA9IGdldFVwZGF0ZVZlcnNpb25zTW9kZSgpOwotCi0JCQlJRmVhdHVyZVtdIGFsbEluc3RhbGxlZCA9Ci0JCQkJVXBkYXRlVXRpbHMuZ2V0SW5zdGFsbGVkRmVhdHVyZXModmlkLCBmYWxzZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbEluc3RhbGxlZC5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IGFsbEluc3RhbGxlZFtpXTsKLQkJCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdmVyc2lvbiA9Ci0JCQkJCWNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJCS8vIFZlcmlmeSB0aGF0IHRoZSBkaWZmZXJlbmNlIHF1YWxpZmllcyBhcwotCQkJCS8vIGFuIHVwZGF0ZS4KLQkJCQlpZiAobW9kZS5lcXVhbHMoVXBkYXRlQ29yZS5FUVVJVkFMRU5UX1ZBTFVFKSkgewotCQkJCQlpZiAodmVyc2lvbi5pc0VxdWl2YWxlbnRUbyhjdmVyc2lvbikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKG1vZGUuZXF1YWxzKFVwZGF0ZUNvcmUuQ09NUEFUSUJMRV9WQUxVRSkpIHsKLQkJCQkJaWYgKHZlcnNpb24uaXNDb21wYXRpYmxlV2l0aChjdmVyc2lvbikpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRmVhdHVyZVJlZmVyZW5jZSBmaW5kUGF0Y2hlZFJlZmVyZW5jZSgKLQkJSUZlYXR1cmVSZWZlcmVuY2UgbmV3UmVmLAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbmV3UmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gY3NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOwotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgcmVmVmlkID0gcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQlpZiAodmlkLmdldElkZW50aWZpZXIoKS5lcXVhbHMocmVmVmlkLmdldElkZW50aWZpZXIoKSkpCi0JCQkJCXJldHVybiByZWY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmNsdWRlZCBmZWF0dXJlIHJlZmVyZW5jZXMgZm9yIHRoZSBnaXZlbiByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQl0cnkgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJcmV0dXJuIGdldEluY2x1ZGVkRmVhdHVyZXMoZmVhdHVyZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2VzIGZvciB0aGUgZ2l2ZW4gZmVhdHVyZS4KLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRVcGRhdGVWZXJzaW9uc01vZGUoKSB7Ci0JCVByZWZlcmVuY2VzIHN0b3JlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gc3RvcmUuZ2V0U3RyaW5nKFVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MzkwYmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVPcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb24gaW1wbGVtZW50cyBJRmVhdHVyZU9wZXJhdGlvbiB7Ci0JCi0JcHJvdGVjdGVkIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHJvdGVjdGVkIElGZWF0dXJlIG9sZEZlYXR1cmU7Ci0JcHJvdGVjdGVkIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCi0vLwlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWxEZWx0YTsKLQkKLQkKLQlwdWJsaWMgRmVhdHVyZU9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCQl0aGlzLnRhcmdldFNpdGUgPSB0YXJnZXRTaXRlOwotCX0KLQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKCkgewotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0JCi0JcHVibGljIElGZWF0dXJlIGdldE9sZEZlYXR1cmUoKSB7Ci0JCXJldHVybiBvbGRGZWF0dXJlOwotCX0KLQkKLS8vCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWxEZWx0YSgpIHsKLS8vCQlyZXR1cm4gb3B0aW9uYWxEZWx0YTsKLS8vCX0KLQkKLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldFRhcmdldFNpdGUoKSB7Ci0JCXJldHVybiB0YXJnZXRTaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldFNpdGUoSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpIHsKLQkJdGhpcy50YXJnZXRTaXRlID0gdGFyZ2V0U2l0ZTsKLQl9Ci0JCi0KLQlzdGF0aWMgYm9vbGVhbiB1bmNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBJQ29uZmlndXJlZFNpdGUgc2l0ZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXNpdGUgPSBVcGRhdGVVdGlscy5nZXRDb25maWdTaXRlKGZlYXR1cmUsIGNvbmZpZyk7Ci0JCQotCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIoc2l0ZSwgZmVhdHVyZSk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCQljbGVhbmVyLmRpc3Bvc2UoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvRmVhdHVyZVN0YXR1cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNjQyZGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9GZWF0dXJlU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0KLS8qKgotICogVGhlIGZlYXR1cmUgc3RhdHVzIHByb3ZpZGUgaW5mbyBhYm91dCB0aGUgYnJva2VuIGZlYXR1cmVzIGFuZCB3aGF0IGlzCi0gKiB3cm9uZy4KLSAqLwotcHVibGljIGNsYXNzIEZlYXR1cmVTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfT1RIRVIgPSBJU3RhdHVzLk9LOy8vMAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfUFJFUkVRX0ZFQVRVUkUgPSAxOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfUFJFUkVRX1BMVUdJTiA9IDI7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09ERV9FWENMVVNJVkUgPSA0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfQ1lDTEUgPSA4OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPREVfT1BUSU9OQUxfQ0hJTEQgPSAxNjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT0RFX0VOVklST05NRU5UID0gMzI7Ci0JSUZlYXR1cmUgZmVhdHVyZTsKLQotCXB1YmxpYyBGZWF0dXJlU3RhdHVzKElGZWF0dXJlIGZlYXR1cmUsIGludCBzZXZlcml0eSwgU3RyaW5nIHBsdWdpbklkLCBpbnQgY29kZSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBjb2RlLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQl0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEZlYXR1cmVTdGF0dXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlGZWF0dXJlU3RhdHVzIGZzID0gKEZlYXR1cmVTdGF0dXMpIG9iajsKLQkJLy8gb25seSBjaGVjayBmb3IgZmVhdHVyZSwgcmVnYXJkbGVzcyBvZiBzdGF0dXMgdHlwZQotCQlpZiAoZnMuZ2V0RmVhdHVyZSgpID09IGZlYXR1cmUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoZnMuZ2V0RmVhdHVyZSgpID09IG51bGwgJiYgZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZzLmdldE1lc3NhZ2UoKS5lcXVhbHMoZ2V0TWVzc2FnZSgpKTsKLQkJZWxzZSBpZiAoZnMuZ2V0RmVhdHVyZSgpID09IG51bGwgJiYgZmVhdHVyZSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbHNlIGlmIChmcy5nZXRGZWF0dXJlKCkgIT0gbnVsbCAmJiBmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKGZzLmdldEZlYXR1cmUoKS5lcXVhbHMoZmVhdHVyZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSW5zdGFsbE9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JbnN0YWxsT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjliOGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9JbnN0YWxsT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBDb25maWd1cmUgYSBmZWF0dXJlLgotICogQ29uZmlnT3BlcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsT3BlcmF0aW9uCi0JZXh0ZW5kcyBGZWF0dXJlT3BlcmF0aW9uCi0JaW1wbGVtZW50cyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT0xEID0gIk9wZXJhdGlvbnNNYW5hZ2VyLmVycm9yLm9sZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUZlYXR1cmVSZWZlcmVuY2VbXSBvcHRpb25hbEZlYXR1cmVzOwotCXByaXZhdGUgSUZlYXR1cmVbXSB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzOwotCXByaXZhdGUgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IKLQkgKiBAcGFyYW0gc2l0ZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG9wdGlvbmFsRmVhdHVyZXMgb3B0aW9uYWwgZmVhdHVyZXMgdG8gaW5zdGFsbC4gSWYgbnVsbCwgdGhlIG9wZXJhdGlvbiB3aWxsIGluc3RhbGwgdGhlbSBhbGwgKGlmIGFueSkKLQkgKiBAcGFyYW0gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50cyBvcHRpb25hbCBmZWF0dXJlcyB1bmNvbmZpZ3VyZWQgYmVmb3JlIHRoZSBvcGVyYXRpb24uIFRoZXkgc2hvdWxkIHJlbWFpbiB1bmNvbmZpZ3VyZWQgYWZ0ZXIgdGhlIGluc3RhbGwuCi0JICogQHBhcmFtIHZlcmlmaWVyCi0JICovCi0JcHVibGljIEluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCi0JCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxFbGVtZW50cywKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKSB7Ci0JCXN1cGVyKHNpdGUsIGZlYXR1cmUpOwotCQlJRmVhdHVyZVtdIGluc3RhbGxlZCA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUpOwotCQlpZiAoaW5zdGFsbGVkLmxlbmd0aCA+IDApCi0JCQl0aGlzLm9sZEZlYXR1cmUgPSBpbnN0YWxsZWRbMF07Ci0JCXRoaXMudW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9IHVuY29uZmlndXJlZE9wdGlvbmFsRWxlbWVudHM7Ci0JCXRoaXMub3B0aW9uYWxGZWF0dXJlcyA9IG9wdGlvbmFsRmVhdHVyZXM7Ci0JCXRoaXMudmVyaWZpZXIgPSB2ZXJpZmllcjsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRPcHRpb25hbEZlYXR1cmVzKCkgewotCQlyZXR1cm4gb3B0aW9uYWxGZWF0dXJlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWJvb2xlYW4gcmVpbnN0YWxsID0gZmFsc2U7Ci0JCWlmIChvbGRGZWF0dXJlICE9IG51bGwKLQkJCSYmIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscygKLQkJCQlvbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQlyZWluc3RhbGwgPSB0cnVlOwotCi0JCXNldE9wdGlvbmFsRmVhdHVyZXMoKTsKLQotCQlpZiAob3B0aW9uYWxGZWF0dXJlcyA9PSBudWxsKQotCQkJdGFyZ2V0U2l0ZS5pbnN0YWxsKGZlYXR1cmUsIHZlcmlmaWVyLCBwbSk7Ci0JCWVsc2UKLQkJCXRhcmdldFNpdGUuaW5zdGFsbChmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzLCB2ZXJpZmllciwgcG0pOwotCi0JCWlmICghcmVpbnN0YWxsKSB7Ci0KLQkJCWlmIChvbGRGZWF0dXJlICE9IG51bGwpIHsgLy8mJiBpc09wdGlvbmFsRGVsdGEoKSkgewotCQkJCXByZXNlcnZlT3B0aW9uYWxTdGF0ZSgpOwotCi0JCQkJYm9vbGVhbiBvbGRTdWNjZXNzID0gdW5jb25maWd1cmUob2xkRmVhdHVyZSwgbnVsbCk7IC8vIHBpY2sgYW55IHNpdGUgY29udGFpbmluZyBvbGQgZmVhdHVyZQotCQkJCWlmICghb2xkU3VjY2VzcykgewotCQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQkJaWYgKCFVcGRhdGVVdGlscy5pc05lc3RlZENoaWxkKGNvbmZpZywgb2xkRmVhdHVyZSkpIHsKLQkJCQkJCS8vICJlYXQiIHRoZSBlcnJvciBpZiBuZXN0ZWQgY2hpbGQKLQkJCQkJCVN0cmluZyBtZXNzYWdlID0KLQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJS0VZX09MRCwKLQkJCQkJCQkJb2xkRmVhdHVyZS5nZXRMYWJlbCgpKTsKLQkJCQkJCUlTdGF0dXMgc3RhdHVzID0KLQkJCQkJCQluZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQkJCQlVcGRhdGVVdGlscy5nZXRQbHVnaW5JZCgpLAotCQkJCQkJCQlJU3RhdHVzLk9LLAotCQkJCQkJCQltZXNzYWdlLAotCQkJCQkJCQludWxsKTsKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLS8vCQkJaWYgKG9sZEZlYXR1cmUgPT0gbnVsbCkgewotLy8JCQkJZW5zdXJlVW5pcXVlKCk7Ci0vLwkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlc2VydmVPcHRpb25hbFN0YXRlKCkgewotCQlpZiAodW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkvLyBHZXQgdGhlIGZlYXR1cmUgdGhhdCBtYXRjaGVzIHRoZSBvcmlnaW5hbCB1bmNvbmZpZ3VyZWQgb25lcy4KLQkJCQlJRmVhdHVyZSBsb2NhbEZlYXR1cmUgPQotCQkJCQlVcGRhdGVVdGlscy5nZXRMb2NhbEZlYXR1cmUoCi0JCQkJCQl0YXJnZXRTaXRlLAotCQkJCQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlc1tpXSk7Ci0JCQkJaWYgKGxvY2FsRmVhdHVyZSAhPSBudWxsKQotCQkJCQl0YXJnZXRTaXRlLnVuY29uZmlndXJlKGxvY2FsRmVhdHVyZSk7Ci0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZSB0aGlzIC0gd2Ugd2lsbCBsZWF2ZSB3aXRoIGl0Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldE9wdGlvbmFsRmVhdHVyZXMoKSB7Ci0JCXRyeSB7Ci0JCQkvLyBFbnN1cmUgb3B0aW9uYWwgZmVhdHVyZXMgYXJlIGNvcnJlY3RseSBzZXQKLQkJCWlmIChvcHRpb25hbEZlYXR1cmVzID09IG51bGwgJiYgVXBkYXRlVXRpbHMuaGFzT3B0aW9uYWxGZWF0dXJlcyhmZWF0dXJlKSApIHsKLQkJCQlKb2JSb290IGpvYlJvb3QgPSBuZXcgSm9iUm9vdCh0aGlzKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJYm9vbGVhbiB1cGRhdGUgPSBvbGRGZWF0dXJlICE9IG51bGw7Ci0JCQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVV0aWxzLmlzUGF0Y2goZmVhdHVyZSk7Ci0JCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBlbGVtZW50cyA9IGpvYlJvb3QuZ2V0RWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWVsZW1lbnRzW2ldLmFkZENoZWNrZWRPcHRpb25hbEZlYXR1cmVzKHVwZGF0ZSwgcGF0Y2gsIGNvbmZpZywgc2V0KTsKLQkJCQl9Ci0JCQkJb3B0aW9uYWxGZWF0dXJlcyA9IG5ldyBJRmVhdHVyZVJlZmVyZW5jZVtzZXQuc2l6ZSgpXTsKLQkJCQlzZXQudG9BcnJheShvcHRpb25hbEZlYXR1cmVzKTsKLQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0gam9iUm9vdC5nZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKGNvbmZpZywgdGFyZ2V0U2l0ZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvSm9iUm9vdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Kb2JSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOWY2ZWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Kb2JSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBKb2JSb290IHsKLQlwcml2YXRlIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2I7Ci0JcHJpdmF0ZSBGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGVsZW1lbnRzOwotCi0JcHVibGljIEpvYlJvb3QoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgewotCQl0aGlzLmpvYiA9IGpvYjsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGdldEpvYigpIHsKLQkJcmV0dXJuIGpvYjsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQljb21wdXRlRWxlbWVudHMoKTsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdW5jb25maWd1cmVkIGZlYXR1cmVzIGJlZm9yZSBhbiBpbnN0YWxsLgotCSAqIEFmdGVyIGluc3RhbGxpbmcgdGhlIGZlYXR1cmVzLCB0aGUgY2FsbGVyIG11c3QgZ2V0IHRoZSBsb2NhbCBmZWF0dXJlcyB0aGF0IG1hdGNoCi0JICogdGhlc2UgdW5jb25maWd1cmVkIGZlYXR1cmVzIGFuZCB1bmNvbmZpZ3VyZSB0aGVtLgotCSAqIEBwYXJhbSBjb25maWcKLQkgKiBAcGFyYW0gdGFyZ2V0U2l0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVbXSBnZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSkgewotCi0JCUFycmF5TGlzdCB1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKHVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsIGNvbmZpZywgdGFyZ2V0U2l0ZSwgZ2V0RWxlbWVudHMoKSwgVXBkYXRlVXRpbHMuaXNQYXRjaChqb2IuZ2V0RmVhdHVyZSgpKSk7Ci0JCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlc0FycmF5ID0KLQkJCW5ldyBJRmVhdHVyZVt1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLnNpemUoKV07Ci0JCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMudG9BcnJheSh1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzQXJyYXkpOwotCQlyZXR1cm4gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlc0FycmF5OwotCX0KLQotCXByaXZhdGUgdm9pZCBnZXRVbmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzKAotCQlBcnJheUxpc3QgdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W10gb3B0aW9uYWxFbGVtZW50cywKLQkJYm9vbGVhbiBpc1BhdGNoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9uYWxFbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnRbXSBjaGlsZHJlbiA9Ci0JCQkJb3B0aW9uYWxFbGVtZW50c1tpXS5nZXRDaGlsZHJlbih0cnVlLCBpc1BhdGNoLCBjb25maWcpOwotCQkJZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcygKLQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLAotCQkJCWNvbmZpZywKLQkJCQl0YXJnZXRTaXRlLAotCQkJCWNoaWxkcmVuLAotCQkJCWlzUGF0Y2gpOwotCQkJaWYgKCFvcHRpb25hbEVsZW1lbnRzW2ldLmlzRW5hYmxlZChjb25maWcpKSB7Ci0JCQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcy5hZGQob3B0aW9uYWxFbGVtZW50c1tpXS5nZXRGZWF0dXJlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbXB1dGVFbGVtZW50cygpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBqb2IuZ2V0T2xkRmVhdHVyZSgpOwotCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWJvb2xlYW4gcGF0Y2ggPSBVcGRhdGVVdGlscy5pc1BhdGNoKG5ld0ZlYXR1cmUpOwotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQuY29tcHV0ZUVsZW1lbnRzKAotCQkJCW9sZEZlYXR1cmUsCi0JCQkJbmV3RmVhdHVyZSwKLQkJCQlvbGRGZWF0dXJlICE9IG51bGwsCi0JCQkJcGF0Y2gsCi0JCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSwKLQkJCQlsaXN0KTsKLQkJCWVsZW1lbnRzID0gbmV3IEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50W2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShlbGVtZW50cyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZWxlbWVudHNbaV0uc2V0Um9vdCh0aGlzKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MTZjODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPcGVyYXRpb24gaW1wbGVtZW50cyBJT3BlcmF0aW9uIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc2VkOwotCQotCQotCXB1YmxpYyBPcGVyYXRpb24oKSB7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHJvY2Vzc2VkKCkgewotCQlyZXR1cm4gcHJvY2Vzc2VkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYXJrUHJvY2Vzc2VkKCkgewotCQlwcm9jZXNzZWQgPSB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNmQwMmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9PcGVyYXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25GYWN0b3J5IGltcGxlbWVudHMgSU9wZXJhdGlvbkZhY3RvcnkgewotCi0JcHVibGljIE9wZXJhdGlvbkZhY3RvcnkoKSB7Ci0JfQotCi0JcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUNvbmZpZ09wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBDb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIElCYXRjaE9wZXJhdGlvbiBjcmVhdGVCYXRjaEluc3RhbGxPcGVyYXRpb24oSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucykgewotCQlyZXR1cm4gbmV3IEJhdGNoSW5zdGFsbE9wZXJhdGlvbihvcGVyYXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCi0JCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbE9wZXJhdGlvbigKLQkJCXRhcmdldFNpdGUsCi0JCQlmZWF0dXJlLAotCQkJb3B0aW9uYWxGZWF0dXJlcywKLQkJCXVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMsCi0JCQl2ZXJpZmllcik7Ci0JfQotCi0JcHVibGljIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gY3JlYXRlVW5jb25maWdPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgVW5jb25maWdPcGVyYXRpb24odGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZVJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKLQkKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oZmVhdHVyZSwgYW5vdGhlckZlYXR1cmUpOwkJCi0JfQotCQkKLQlwdWJsaWMgSVVuaW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3JlYXRlVW5pbnN0YWxsT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFVuaW5zdGFsbE9wZXJhdGlvbih0YXJnZXRTaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gY3JlYXRlUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyKSB7Ci0JCXJldHVybiBuZXcgUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJCWNvbmZpZywKLQkJCXByb2JsZW1IYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgSVRvZ2dsZVNpdGVPcGVyYXRpb24gY3JlYXRlVG9nZ2xlU2l0ZU9wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJcmV0dXJuIG5ldyBUb2dnbGVTaXRlT3BlcmF0aW9uKHNpdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL09wZXJhdGlvblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTIyMDliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotLy9pbXBvcnQgamF2YS5pby4qOwotLy9pbXBvcnQgamF2YS5uZXQuKjsKLS8vaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLio7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25WYWxpZGF0b3IgaW1wbGVtZW50cyBJT3BlcmF0aW9uVmFsaWRhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPT1RfTUVTU0FHRSA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnJvb3RNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9PVF9NRVNTQUdFX0lOSVQgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5yb290TWVzc2FnZUluaXRpYWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DSElMRF9NRVNTQUdFID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMuY2hpbGRNZXNzYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBVEZPUk0gPSAiQWN0aXZpdHlDb25zdHJhaW50cy5wbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSSU1BUlkgPSAiQWN0aXZpdHlDb25zdHJhaW50cy5wcmltYXJ5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1MgPSAiQWN0aXZpdHlDb25zdHJhaW50cy5vcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1dTID0gIkFjdGl2aXR5Q29uc3RyYWludHMud3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUkNIID0gIkFjdGl2aXR5Q29uc3RyYWludHMuYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUSA9ICJBY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVJFUV9QTFVHSU4gPQotCQkiQWN0aXZpdHlDb25zdGFpbnRzLnByZXJlcS5wbHVnaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVSRVFfRkVBVFVSRSA9Ci0JCSJBY3Rpdml0eUNvbnN0YWludHMucHJlcmVxLmZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVSRVFfUEVSRkVDVCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcVBlcmZlY3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVSRVFfRVFVSVZBTEVOVCA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUVxdWl2YWxlbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVSRVFfQ09NUEFUSUJMRSA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUNvbXBhdGlibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVSRVFfR1JFQVRFUiA9Ci0JCSJBY3Rpdml0eUNvbnN0cmFpbnRzLnByZXJlcUdyZWF0ZXJPckVxdWFsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1BUSU9OQUxfQ0hJTEQgPQotCQkiQWN0aXZpdHlDb25zdHJhaW50cy5vcHRpb25hbENoaWxkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1lDTEUgPSAiQWN0aXZpdHlDb25zdHJhaW50cy5jeWNsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTkZMSUNUID0gIkFjdGl2aXR5Q29uc3RyYWludHMuY29uZmxpY3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWENMVVNJVkUgPSAiQWN0aXZpdHlDb25zdHJhaW50cy5leGNsdXNpdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OT19MSUNFTlNFID0KLQkJIkFjdGl2aXR5Q29uc3RyYWludHMubm9MaWNlbnNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIG1vZGlmaWVkIG91dHNpZGUgdGhpcyBwcm9ncmFtLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKSB7Ci0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0UsIHN0YXR1cywgSVN0YXR1cy5FUlJPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKgotCSAqIENhbGxlZCBieSBVSSBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24uIFJldHVybnMgbnVsbCBpZiBubyBlcnJvcnMsIGEKLQkgKiBzdGF0dXMgd2l0aCBJU3RhdHVzLldBUk5JTkcgY29kZSB3aGVuIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gaXMKLQkgKiBicm9rZW4sIG9yIGEgc3RhdHVzIHdpdGggSVN0YXR1cy5FUlJPUiB3aGVuIHRoZXJlIHRoZSBvcGVyYXRpb24KLQkgKiBpbnRyb2R1Y2VzIG5ldyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdJbnN0YWxsKAotCQlJRmVhdHVyZSBvbGRGZWF0dXJlLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCXZhbGlkYXRlSW5zdGFsbChvbGRGZWF0dXJlLCBuZXdGZWF0dXJlLCBzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJcmV0dXJuIGNyZWF0ZUNvbWJpbmVkUmVwb3J0U3RhdHVzKGJlZm9yZVN0YXR1cywgc3RhdHVzKTsKLQl9Ci0KLQkvKgotCSAqIENhbGxlZCBieSBVSSBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdVbmNvbmZpZyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCXZhbGlkYXRlVW5jb25maWd1cmUoZmVhdHVyZSwgc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgYnkgVUkgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nQ29uZmlnKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJdmFsaWRhdGVDb25maWd1cmUoZmVhdHVyZSwgc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJlZm9yZSBwZXJmb3JtaW5nIG9wZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdSZXBsYWNlVmVyc2lvbigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUpIHsKLQkJLy8gY2hlY2sgaW5pdGlhbCBzdGF0ZQotCQlBcnJheUxpc3QgYmVmb3JlU3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljaGVja1BsYXRmb3JtV2FzTW9kaWZpZWQoc3RhdHVzKTsKLQkJdmFsaWRhdGVSZXBsYWNlVmVyc2lvbihmZWF0dXJlLCBhbm90aGVyRmVhdHVyZSwgc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7Ci0JfQotCi0KLQkvKgotCSAqIENhbGxlZCBieSB0aGUgVUkgYmVmb3JlIGRvaW5nIGEgcmV2ZXJ0LyByZXN0b3JlIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ1JldmVydChJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCS8vIGNoZWNrIGluaXRpYWwgc3RhdGUKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdmFsaWRhdGVJbml0aWFsU3RhdGUoYmVmb3JlU3RhdHVzKTsKLQotCQkvLyBjaGVjayBwcm9wb3NlZCBjaGFuZ2UKLQkJQXJyYXlMaXN0IHN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKHN0YXR1cyk7Ci0JCXZhbGlkYXRlUmV2ZXJ0KGNvbmZpZywgc3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBDYWxsZWQgYnkgdGhlIFVJIGJlZm9yZSBkb2luZyBhIGJhdGNoZWQgcHJvY2Vzc2luZyBvZiBzZXZlcmFsIHBlbmRpbmcKLQkgKiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQkvLyBjaGVjayBpbml0aWFsIHN0YXRlCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXZhbGlkYXRlSW5pdGlhbFN0YXRlKGJlZm9yZVN0YXR1cyk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChiZWZvcmVTdGF0dXMpOwotCi0JCS8vIGNoZWNrIHByb3Bvc2VkIGNoYW5nZQotCQlBcnJheUxpc3Qgc3RhdHVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl2YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKGpvYnMsIHN0YXR1cywgYmVmb3JlU3RhdHVzKTsKLQotCQkvLyByZXBvcnQgc3RhdHVzCi0JCXJldHVybiBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cyhiZWZvcmVTdGF0dXMsIHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpIHsKLQkJLy8gY2hlY2sgdGhlIHN0YXRlCi0JCUFycmF5TGlzdCBzdGF0dXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWNoZWNrUGxhdGZvcm1XYXNNb2RpZmllZChzdGF0dXMpOwotCQl2YWxpZGF0ZUluaXRpYWxTdGF0ZShzdGF0dXMpOwotCi0JCS8vIHJlcG9ydCBzdGF0dXMKLQkJaWYgKHN0YXR1cy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKEtFWV9ST09UX01FU1NBR0UsIHN0YXR1cywgSVN0YXR1cy5FUlJPUik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBub3QgYnJva2VuIGV2ZW4gYmVmb3JlIHdlIHN0YXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUluaXRpYWxTdGF0ZShBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCS8vIHVuY29tbWVudCB0aGlzIHdoZW4gcGF0Y2ggcmVsZWFzZWQgaW4gYm9vdAotCQkJLy9jaGVja0NvbmZpZ3VyYXRpb25Mb2NrKHN0YXR1cyk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGhhbmRsZSB1bmNvbmZpZ3VyZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVVbmNvbmZpZ3VyZSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJY2hlY2tTaXRlUmVhZE9ubHkoZmVhdHVyZSxzdGF0dXMpOwotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQlmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKGZlYXR1cmVzLCBudWxsLCBmZWF0dXJlKTsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJfQotCX0KLQotCi0JLyoKLQkgKiBoYW5kbGUgY29uZmlndXJlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUNvbmZpZ3VyZShJRmVhdHVyZSBmZWF0dXJlLCBBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0JCQljaGVja1NpdGVSZWFkT25seShmZWF0dXJlLHN0YXR1cyk7Ci0JCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBjb21wdXRlRmVhdHVyZXMoKTsKLQkJCWNoZWNrT3B0aW9uYWxDaGlsZENvbmZpZ3VyaW5nKGZlYXR1cmUsIHN0YXR1cyk7Ci0JCQljaGVja0ZvckN5Y2xlcyhmZWF0dXJlLCBudWxsLCBmZWF0dXJlcyk7Ci0JCQlmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKGZlYXR1cmVzLCBmZWF0dXJlLCBudWxsKTsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHN0YXR1cyk7Ci0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBoYW5kbGUgcmVwbGFjZSB2ZXJzaW9uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZVJlcGxhY2VWZXJzaW9uKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSwKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJY2hlY2tTaXRlUmVhZE9ubHkoZmVhdHVyZSxzdGF0dXMpOwotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQljaGVja0ZvckN5Y2xlcyhmZWF0dXJlLCBudWxsLCBmZWF0dXJlcyk7Ci0JCQlmZWF0dXJlcyA9Ci0JCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCi0JCQkJCWZlYXR1cmVzLAotCQkJCQlhbm90aGVyRmVhdHVyZSwKLQkJCQkJZmVhdHVyZSk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGhhbmRsZSBpbnN0YWxsIGFuZCB1cGRhdGUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlSW5zdGFsbCgKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSwKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSwKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQl0cnkgewotCQkJY2hlY2tTaXRlUmVhZE9ubHkob2xkRmVhdHVyZSxzdGF0dXMpOwotCQkJQXJyYXlMaXN0IGZlYXR1cmVzID0gY29tcHV0ZUZlYXR1cmVzKCk7Ci0JCQljaGVja0ZvckN5Y2xlcyhuZXdGZWF0dXJlLCBudWxsLCBmZWF0dXJlcyk7Ci0JCQlmZWF0dXJlcyA9Ci0JCQkJY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oZmVhdHVyZXMsIG5ld0ZlYXR1cmUsIG9sZEZlYXR1cmUpOwotCQkJY2hlY2tDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQkJCWNoZWNrTGljZW5zZShuZXdGZWF0dXJlLCBzdGF0dXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIGhhbmRsZSByZXZlcnQgYW5kIHJlc3RvcmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUmV2ZXJ0KAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlBcnJheUxpc3Qgc3RhdHVzKSB7Ci0JCXRyeSB7Ci0vLwkJCS8vIGNoZWNrIHRoZSB0aW1lbGluZSBhbmQgZG9uJ3QgYm90aGVyCi0vLwkJCS8vIHRvIGNoZWNrIGFueXRoaW5nIGVsc2UgaWYgbmVnYXRpdmUKLS8vCQkJaWYgKCFjaGVja1RpbWVsaW5lKGNvbmZpZywgc3RhdHVzKSkKLS8vCQkJCXJldHVybjsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlc0FmdGVyUmV2ZXJ0KGNvbmZpZyk7Ci0JCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQkJY2hlY2tSZXZlcnRDb25zdHJhaW50cyhmZWF0dXJlcywgc3RhdHVzKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCX0KLQl9Ci0KLQotCS8qCi0JICogSGFuZGxlIG9uZS1jbGljayBjaGFuZ2VzIGFzIGEgYmF0Y2gKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGVuZGluZ0NoYW5nZXMoCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMsCi0JCUFycmF5TGlzdCBzdGF0dXMsCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCUFycmF5TGlzdCBmZWF0dXJlcyA9IGNvbXB1dGVGZWF0dXJlcygpOwotCQkJQXJyYXlMaXN0IHNhdmVkRmVhdHVyZXMgPSBmZWF0dXJlczsKLQkJCWludCBuZXhjbHVzaXZlcyA9IDA7Ci0KLQkJCS8vIHBhc3MgMTogc2VlIGlmIHdlIGNhbiBwcm9jZXNzIHRoZSBlbnRpcmUgImJhdGNoIgotCQkJQXJyYXlMaXN0IHRtcFN0YXR1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgam9icy5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBqb2JzW2ldOwotCi0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCQkJY2hlY2tMaWNlbnNlKG5ld0ZlYXR1cmUsIHN0YXR1cyk7Ci0JCQkJaWYgKGpvYnMubGVuZ3RoID4gMSAmJiBuZXdGZWF0dXJlLmlzRXhjbHVzaXZlKCkpIHsKLQkJCQkJbmV4Y2x1c2l2ZXMrKzsKLQkJCQkJc3RhdHVzLmFkZCgKLQkJCQkJCWNyZWF0ZVN0YXR1cygKLQkJCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJCUZlYXR1cmVTdGF0dXMuQ09ERV9FWENMVVNJVkUsCi0JCQkJCQkJUG9saWN5LmJpbmQoS0VZX0VYQ0xVU0lWRSkpKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWNoZWNrRm9yQ3ljbGVzKG5ld0ZlYXR1cmUsIG51bGwsIGZlYXR1cmVzKTsKLQkJCQlmZWF0dXJlcyA9Ci0JCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJb2xkRmVhdHVyZSk7Ci0JCQl9Ci0JCQlpZiAobmV4Y2x1c2l2ZXMgPiAwKQotCQkJCXJldHVybjsKLQkJCWNoZWNrQ29uc3RyYWludHMoZmVhdHVyZXMsIHRtcFN0YXR1cyk7Ci0JCQlpZiAodG1wU3RhdHVzLnNpemUoKSA9PSAwKSAvLyB0aGUgd2hvbGUgImJhdGNoIiBpcyBPSwotCQkJCXJldHVybjsKLQotCQkJLy8gcGFzcyAyOiB3ZSBoYXZlIGNvbmZsaWN0cwotCQkJZmVhdHVyZXMgPSBzYXZlZEZlYXR1cmVzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGpvYnNbaV07Ci0JCQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0KLQkJCQlmZWF0dXJlcyA9Ci0JCQkJCWNvbXB1dGVGZWF0dXJlc0FmdGVyT3BlcmF0aW9uKAotCQkJCQkJZmVhdHVyZXMsCi0JCQkJCQluZXdGZWF0dXJlLAotCQkJCQkJb2xkRmVhdHVyZSk7Ci0KLQkJCQljaGVja0NvbnN0cmFpbnRzKGZlYXR1cmVzLCBzdGF0dXMpOwotCQkJCWlmIChzdGF0dXMuc2l6ZSgpID4gMAotCQkJCQkmJiAhaXNCZXR0ZXJTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpKSB7Ci0JCQkJCUlTdGF0dXMgY29uZmxpY3QgPQotCQkJCQkJY3JlYXRlU3RhdHVzKAotCQkJCQkJCW5ld0ZlYXR1cmUsCi0JCQkJCQkJRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLAotCQkJCQkJCVBvbGljeS5iaW5kKEtFWV9DT05GTElDVCkpOwotCQkJCQlzdGF0dXMuYWRkKDAsIGNvbmZsaWN0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlzdGF0dXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQbGF0Zm9ybVdhc01vZGlmaWVkKEFycmF5TGlzdCBzdGF0dXMpIHsKLQkJdHJ5IHsKLQkJCS8vIGNoZWNrcyBpZiB0aGUgcGxhdGZvcm0gaGFzIGJlZW4gbW9kaWZpZWQgb3V0c2lkZSB0aGlzIGVjbGlwc2UgaW5zdGFuY2UKLQkJCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gcGxhdGZvcm1Db25maWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCQkKLQkJCWxvbmcgY3VycmVudFRpbWVTdGFtcCA9IHBsYXRmb3JtQ29uZmlnLmdldENoYW5nZVN0YW1wKCk7Ci0JCQkvLyBnZXQgdGhlIGxhc3QgbW9kaWZpZWQgdmFsdWUgZm9yIHRoaXMgY29uZmlnLCBmcm9tIHRoaXMgcHJvY2VzcyBwb2ludCBvZiB2aWV3Ci0JCQlpZiAocGxhdGZvcm1Db25maWcgaW5zdGFuY2VvZiBQbGF0Zm9ybUNvbmZpZ3VyYXRpb24pIAotCQkJCWN1cnJlbnRUaW1lU3RhbXAgPSAoKFBsYXRmb3JtQ29uZmlndXJhdGlvbilwbGF0Zm9ybUNvbmZpZykuZ2V0Q29uZmlndXJhdGlvbigpLmxhc3RNb2RpZmllZCgpOwotCQkJCQotCQkJLy8gZ2V0IHRoZSByZWFsIGxhc3QgbW9kaWZpZWQgdmFsdWUKLQkJCVVSTCBwbGF0Zm9ybVhNTCA9IHBsYXRmb3JtQ29uZmlnLmdldENvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQkJbG9uZyBhY3R1YWxUaW1lU3RhbXAgPSBjdXJyZW50VGltZVN0YW1wOwotCQkJaWYgKCJmaWxlIi5lcXVhbHMocGxhdGZvcm1YTUwuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlhY3R1YWxUaW1lU3RhbXAgPSBuZXcgRmlsZShwbGF0Zm9ybVhNTC5nZXRGaWxlKCkpLmxhc3RNb2RpZmllZCgpOwotCQkJZWxzZSB7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gcGxhdGZvcm1YTUwub3BlbkNvbm5lY3Rpb24oKTsKLQkJCQlhY3R1YWxUaW1lU3RhbXAgPSBjb25uZWN0aW9uLmdldExhc3RNb2RpZmllZCgpOwotCQkJfQotCQkJaWYgKGN1cnJlbnRUaW1lU3RhbXAgIT0gYWN0dWFsVGltZVN0YW1wKQotCQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKAotCQkJCQkJCQludWxsLAotCQkJCQkJCQlGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsCi0JCQkJCQkJCVBvbGljeS5iaW5kKCJBY3Rpdml0eUNvbnN0cmFpbnRzLnBsYXRmb3JtTW9kaWZpZWQiKSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tTaXRlUmVhZE9ubHkoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IHN0YXR1cykgewotCQlpZihmZWF0dXJlID09IG51bGwpewotCQkJcmV0dXJuOwotCQl9Ci0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGZlYXR1cmUuZ2V0U2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpOwotCQlpZiAoY3NpdGUgIT0gbnVsbCAmJiAhY3NpdGUuaXNVcGRhdGFibGUoKSkKLQkJCXN0YXR1cy5hZGQoY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9PVEhFUiwKLQkJCQkJUG9saWN5Ci0JCQkJCS5iaW5kKCJBY3Rpdml0eUNvbnN0cmFpbnRzLnJlYWRPbmx5IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWNzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKSkpOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb21wdXRlRmVhdHVyZXModHJ1ZSk7Ci0JfQotCS8qCi0JICogQ29tcHV0ZSBhIGxpc3Qgb2YgY29uZmlndXJlZCBmZWF0dXJlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlRmVhdHVyZXMoYm9vbGVhbiBjb25maWd1cmVkT25seSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBjc2l0ZXNbaV07Ci0KLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gY3JlZnM7Ci0KLQkJCWlmIChjb25maWd1cmVkT25seSkKLQkJCQljcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZWxzZQotCQkJCWNyZWZzID0gY3NpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNyZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9IGNyZWZzW2pdOwotCQkJCUlGZWF0dXJlIGNmZWF0dXJlID0gY3JlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWZlYXR1cmVzLmFkZChjZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlIHRoZSBuZXN0ZWQgZmVhdHVyZSBzdWJ0cmVlIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgYmFzZQotCSAqIGZlYXR1cmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQkJSUZlYXR1cmUgdG9wLAotCQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJCWJvb2xlYW4gdG9sZXJhdGVNaXNzaW5nQ2hpbGRyZW4sCi0JCQlBcnJheUxpc3QgY29uZmlndXJlZEZlYXR1cmVzLAotCQkJQXJyYXlMaXN0IHZpc2l0ZWRGZWF0dXJlcykKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2hlY2sgYXJndW1lbnRzCi0JCWlmICh0b3AgPT0gbnVsbCkKLQkJCXJldHVybiBmZWF0dXJlczsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCWZlYXR1cmUgPSB0b3A7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKQotCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICh2aXNpdGVkRmVhdHVyZXMgPT0gbnVsbCkKLQkJCXZpc2l0ZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBjaGVjayBmb3IgPGluY2x1ZGVzPiBjeWNsZQotCQlpZiAodmlzaXRlZEZlYXR1cmVzLmNvbnRhaW5zKGZlYXR1cmUpKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQljcmVhdGVTdGF0dXModG9wLCBGZWF0dXJlU3RhdHVzLkNPREVfQ1lDTEUsIFBvbGljeS5iaW5kKEtFWV9DWUNMRSkpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGtlZXAgdHJhY2sgb2YgdmlzaXRlZCBmZWF0dXJlcyBzbyB3ZSBjYW4gZGV0ZWN0IGN5Y2xlcwotCQkJdmlzaXRlZEZlYXR1cmVzLmFkZChmZWF0dXJlKTsKLQkJfQotCi0JCS8vIHJldHVybiBzcGVjaWZpZWQgYmFzZSBmZWF0dXJlIGFuZCBhbGwgaXRzIGNoaWxkcmVuCi0JCWlmICghZmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpCi0JCQlmZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGNoaWxkID0gY2hpbGRyZW5baV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlmZWF0dXJlcyA9Ci0JCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKAotCQkJCQkJdG9wLAotCQkJCQkJY2hpbGQsCi0JCQkJCQlmZWF0dXJlcywKLQkJCQkJCXRvbGVyYXRlTWlzc2luZ0NoaWxkcmVuLAotCQkJCQkJbnVsbCwKLQkJCQkJCXZpc2l0ZWRGZWF0dXJlcyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWNoaWxkcmVuW2ldLmlzT3B0aW9uYWwoKSAmJiAhdG9sZXJhdGVNaXNzaW5nQ2hpbGRyZW4pCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gY3ljbGVzIGZvciB0aGlzIGZlYXR1cmUgZHVyaW5nIERGUwotCQl2aXNpdGVkRmVhdHVyZXMucmVtb3ZlKGZlYXR1cmUpOwotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpY2Vuc2UoSUZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IHN0YXR1cykgewotCQlJVVJMRW50cnkgbGljZW5zZUVudHJ5ID0gZmVhdHVyZS5nZXRMaWNlbnNlKCk7Ci0JCWlmIChsaWNlbnNlRW50cnkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxpY2Vuc2UgPSBsaWNlbnNlRW50cnkuZ2V0QW5ub3RhdGlvbigpOwotCQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCAmJiBsaWNlbnNlLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJcmV0dXJuOwotCQl9Ci0JCXN0YXR1cy5hZGQoCi0JCQljcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLCBQb2xpY3kuYmluZChLRVlfTk9fTElDRU5TRSkpKTsKLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFmdGVyIHRoZSBvcGVyYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBBcnJheUxpc3QgY29tcHV0ZUZlYXR1cmVzQWZ0ZXJPcGVyYXRpb24oCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJSUZlYXR1cmUgYWRkLAotCQlJRmVhdHVyZSByZW1vdmUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlBcnJheUxpc3QgYWRkVHJlZSA9IGNvbXB1dGVGZWF0dXJlU3VidHJlZShhZGQsIG51bGwsIG51bGwsIGZhbHNlLAotCQkvKiBkbyBub3QgdG9sZXJhdGUgbWlzc2luZyBjaGlsZHJlbiAqLwotCQlmZWF0dXJlcywgbnVsbCk7Ci0JCUFycmF5TGlzdCByZW1vdmVUcmVlID0KLQkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZSgKLQkJCQlyZW1vdmUsCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCXRydWUgLyogdG9sZXJhdGUgbWlzc2luZyBjaGlsZHJlbiAqLywKLQkJCQludWxsLAotCQkJCW51bGwKLQkJKTsKLQkJaWYgKHJlbW92ZSAhPSBudWxsKSB7Ci0JCQkvLyBQYXRjaGVzIHRvIGZlYXR1cmVzIGFyZSByZW1vdmVkIHRvZ2V0aGVyIHdpdGgKLQkJCS8vIHRob3NlIGZlYXR1cmVzLiBJbmNsdWRlIHRoZW0gaW4gdGhlIGxpc3QuCi0JCQljb250cmlidXRlUGF0Y2hlc0ZvcihyZW1vdmVUcmVlLCBmZWF0dXJlcywgcmVtb3ZlVHJlZSk7Ci0JCX0KLQotCQlpZiAocmVtb3ZlICE9IG51bGwpCi0JCQlmZWF0dXJlcy5yZW1vdmVBbGwocmVtb3ZlVHJlZSk7Ci0KLQkJaWYgKGFkZCAhPSBudWxsKQotCQkJZmVhdHVyZXMuYWRkQWxsKGFkZFRyZWUpOwotCi0JCXJldHVybiBmZWF0dXJlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnRyaWJ1dGVQYXRjaGVzRm9yKAotCQlBcnJheUxpc3QgcmVtb3ZlVHJlZSwKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcmVzdWx0KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1vdmVUcmVlLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSByZW1vdmVUcmVlLmdldChpKTsKLQkJCWNvbnRyaWJ1dGVQYXRjaGVzRm9yKGZlYXR1cmUsIGZlYXR1cmVzLCByZXN1bHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb250cmlidXRlUGF0Y2hlc0ZvcigKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcmVzdWx0KQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGNhbmRpZGF0ZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJaWYgKFVwZGF0ZVV0aWxzLmlzUGF0Y2goZmVhdHVyZSwgY2FuZGlkYXRlKSkgewotCQkJCUFycmF5TGlzdCByZW1vdmVUcmVlID0KLQkJCQkJY29tcHV0ZUZlYXR1cmVTdWJ0cmVlKGNhbmRpZGF0ZSwgbnVsbCwgbnVsbCwgdHJ1ZSxudWxsLG51bGwpOwotCQkJCXJlc3VsdC5hZGRBbGwocmVtb3ZlVHJlZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENvbXB1dGUgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgd2lsbCBiZSBjb25maWd1cmVkIGFmdGVyIHBlcmZvcm1pbmcgdGhlCi0JICogcmV2ZXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGNvbXB1dGVGZWF0dXJlc0FmdGVyUmV2ZXJ0KElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlcy5sZW5ndGg7IGorKykgewotCQkJCWxpc3QuYWRkKGZlYXR1cmVzW2pdLmdldEZlYXR1cmUobnVsbCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCi0KLQkvKgotCSAqIENvbXB1dGUgYSBsaXN0IG9mIHBsdWdpbiBlbnRyaWVzIGZvciB0aGUgc3BlY2lmaWVkIGZlYXR1cmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjb21wdXRlUGx1Z2luc0ZvckZlYXR1cmVzKEFycmF5TGlzdCBmZWF0dXJlcykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSGFzaE1hcCBwbHVnaW5zID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSVBsdWdpbkVudHJ5IGVudHJ5ID0gZW50cmllc1tqXTsKLQkJCQlwbHVnaW5zLnB1dChlbnRyeS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIGVudHJ5KTsKLQkJCX0KLQkJfQotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkQWxsKHBsdWdpbnMudmFsdWVzKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogQ2hlY2sgZm9yIGZlYXR1cmUgY3ljbGVzOgotCSAqIC0gdmlzaXQgZmVhdHVyZQotCSAqIC0gaWYgZmVhdHVyZSBpcyBpbiB0aGUgY3ljbGUgY2FuZGlkYXRlcyBsaXN0LCB0aGVuIGN5Y2xlIGZvdW5kLCBlbHNlIGFkZCBpdCB0byBjYW5kaWRhdGVzIGxpc3QKLQkgKiAtIERGUyBjaGlsZHJlbiAKLQkgKiAtIHdoZW4gcmV0dXJuIGZyb20gREZTIHJlbW92ZSB0aGUgZmVhdHVyZSBmcm9tIHRoZSBjYW5kaWRhdGVzIGxpc3QKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRm9yQ3ljbGVzKAotCQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJCUFycmF5TGlzdCBjYW5kaWRhdGVzLAotCQkJQXJyYXlMaXN0IGNvbmZpZ3VyZWRGZWF0dXJlcykKLQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gY2hlY2sgYXJndW1lbnRzCi0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb25maWd1cmVkRmVhdHVyZXMgPT0gbnVsbCkKLQkJCWNvbmZpZ3VyZWRGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNhbmRpZGF0ZXMgPT0gbnVsbCkKLQkJCWNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQkvLyBjaGVjayBmb3IgPGluY2x1ZGVzPiBjeWNsZQotCQlpZiAoY2FuZGlkYXRlcy5jb250YWlucyhmZWF0dXJlKSkgewotCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKAotCQkJCQlLRVlfQ1lDTEUsIAotCQkJCQluZXcgU3RyaW5nW10ge2ZlYXR1cmUuZ2V0TGFiZWwoKSwgCi0JCQkJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKX0pOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBjcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX0NZQ0xFLCBtc2cpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCi0JCS8vIHBvdGVudGlhbCBjYW5kaWRhdGUKLQkJY2FuZGlkYXRlcy5hZGQoZmVhdHVyZSk7Ci0JCQotCQkvLyByZWN1cnNpdmVseSwgY2hlY2sgY3ljbGVzIHdpdGggY2hpbGRyZW4KLQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgY2hpbGQgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWNoZWNrRm9yQ3ljbGVzKGNoaWxkLCBjYW5kaWRhdGVzLCBjb25maWd1cmVkRmVhdHVyZXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKCFjaGlsZHJlbltpXS5pc09wdGlvbmFsKCkpCi0JCQkJCXRocm93IGU7Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gbG9uZ2VyIGEgY2FuZGlkYXRlLCBiZWNhdXNlIG5vIGN5Y2xlcyB3aXRoIGNoaWxkcmVuCi0JCWNhbmRpZGF0ZXMucmVtb3ZlKGZlYXR1cmUpOwotCX0KLQkKLQkvKgotCSAqIHZhbGlkYXRlIGNvbnN0cmFpbnRzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnN0cmFpbnRzKEFycmF5TGlzdCBmZWF0dXJlcywgQXJyYXlMaXN0IHN0YXR1cykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBcnJheUxpc3QgcGx1Z2lucyA9IGNvbXB1dGVQbHVnaW5zRm9yRmVhdHVyZXMoZmVhdHVyZXMpOwotCi0JCWNoZWNrRW52aXJvbm1lbnQoZmVhdHVyZXMsIHN0YXR1cyk7Ci0JCWNoZWNrUGxhdGZvcm1GZWF0dXJlKGZlYXR1cmVzLCBwbHVnaW5zLCBzdGF0dXMpOwotCQljaGVja1ByaW1hcnlGZWF0dXJlKGZlYXR1cmVzLCBzdGF0dXMpOwotCQljaGVja1ByZXJlcXMoZmVhdHVyZXMsIHBsdWdpbnMsIHN0YXR1cyk7Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgYWxsIGZlYXR1cmVzIGFyZSBlaXRoZXIgcG9ydGFibGUsIG9yIG1hdGNoIHRoZSBjdXJyZW50Ci0JICogZW52aXJvbm1lbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrRW52aXJvbm1lbnQoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCVN0cmluZyBvcyA9IFBsYXRmb3JtLmdldE9TKCk7Ci0JCVN0cmluZyB3cyA9IFBsYXRmb3JtLmdldFdTKCk7Ci0JCVN0cmluZyBhcmNoID0gUGxhdGZvcm0uZ2V0T1NBcmNoKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJQXJyYXlMaXN0IGZvcyA9IGNyZWF0ZUxpc3QoZmVhdHVyZS5nZXRPUygpKTsKLQkJCUFycmF5TGlzdCBmd3MgPSBjcmVhdGVMaXN0KGZlYXR1cmUuZ2V0V1MoKSk7Ci0JCQlBcnJheUxpc3QgZmFyY2ggPSBjcmVhdGVMaXN0KGZlYXR1cmUuZ2V0T1NBcmNoKCkpOwotCi0JCQlpZiAoZm9zLnNpemUoKSA+IDApIHsKLQkJCQlpZiAoIWZvcy5jb250YWlucyhvcykpIHsKLQkJCQkJSVN0YXR1cyBzID0KLQkJCQkJCWNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfRU5WSVJPTk1FTlQsIFBvbGljeS5iaW5kKEtFWV9PUykpOwotCQkJCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKLQkJCQkJCXN0YXR1cy5hZGQocyk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZ3cy5zaXplKCkgPiAwKSB7Ci0JCQkJaWYgKCFmd3MuY29udGFpbnMod3MpKSB7Ci0JCQkJCUlTdGF0dXMgcyA9Ci0JCQkJCQljcmVhdGVTdGF0dXMoZmVhdHVyZSwgRmVhdHVyZVN0YXR1cy5DT0RFX0VOVklST05NRU5ULCBQb2xpY3kuYmluZChLRVlfV1MpKTsKLQkJCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJCQlzdGF0dXMuYWRkKHMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmYXJjaC5zaXplKCkgPiAwKSB7Ci0JCQkJaWYgKCFmYXJjaC5jb250YWlucyhhcmNoKSkgewotCQkJCQlJU3RhdHVzIHMgPQotCQkJCQkJY3JlYXRlU3RhdHVzKGZlYXR1cmUsIEZlYXR1cmVTdGF0dXMuQ09ERV9FTlZJUk9OTUVOVCwgUG9saWN5LmJpbmQoS0VZX0FSQ0gpKTsKLQkJCQkJaWYgKCFzdGF0dXMuY29udGFpbnMocykpCi0JCQkJCQlzdGF0dXMuYWRkKHMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBlbmQgdXAgd2l0aCBhIHZlcnNpb24gb2YgcGxhdGZvcm0gY29uZmlndXJlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tQbGF0Zm9ybUZlYXR1cmUoCi0JCUFycmF5TGlzdCBmZWF0dXJlcywKLQkJQXJyYXlMaXN0IHBsdWdpbnMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlTdHJpbmdbXSBib290c3RyYXBQbHVnaW5zID0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzCi0JCQkJLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRCb290c3RyYXBQbHVnaW5JZGVudGlmaWVycygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYm9vdHN0cmFwUGx1Z2lucy5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwbHVnaW5zLnNpemUoKTsgaisrKSB7Ci0JCQkJSVBsdWdpbkVudHJ5IHBsdWdpbiA9IChJUGx1Z2luRW50cnkpIHBsdWdpbnMuZ2V0KGopOwotCQkJCWlmIChib290c3RyYXBQbHVnaW5zW2ldCi0JCQkJCS5lcXVhbHMocGx1Z2luLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFmb3VuZCkgewotCQkJCUlTdGF0dXMgcyA9Ci0JCQkJCWNyZWF0ZVN0YXR1cyhudWxsLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIFBvbGljeS5iaW5kKEtFWV9QTEFURk9STSkpOwotCQkJCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQotCQkJCQlzdGF0dXMuYWRkKHMpOwotCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgd2UgZW5kIHVwIHdpdGggYSB2ZXJzaW9uIG9mIHByaW1hcnkgZmVhdHVyZSBjb25maWd1cmVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1ByaW1hcnlGZWF0dXJlKAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlTdHJpbmcgZmVhdHVyZUlkID0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzCi0JCQkJLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKQotCQkJCS5nZXRQcmltYXJ5RmVhdHVyZUlkZW50aWZpZXIoKTsKLQkJCi0JCWlmIChmZWF0dXJlSWQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gbm8gZXhpc3RpbmcgcHJpbWFyeSBmZWF0dXJlLCBub3RoaW5nIHRvIHdvcnJ5IGFib3V0Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZmVhdHVyZXMuZ2V0KGkpOwotCQkJaWYgKGZlYXR1cmVJZAotCQkJCS5lcXVhbHMoZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RhdHVzIHMgPSBjcmVhdGVTdGF0dXMobnVsbCwgRmVhdHVyZVN0YXR1cy5DT0RFX09USEVSLCBQb2xpY3kuYmluZChLRVlfUFJJTUFSWSkpOwotCQlpZiAoIXN0YXR1cy5jb250YWlucyhzKSkKLQkJCXN0YXR1cy5hZGQocyk7Ci0JfQotCi0JLyoKLQkgKiBWZXJpZnkgd2UgZG8gbm90IGJyZWFrIHByZXJlcXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUHJlcmVxcygKLQkJQXJyYXlMaXN0IGZlYXR1cmVzLAotCQlBcnJheUxpc3QgcGx1Z2lucywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoSUZlYXR1cmUpIGZlYXR1cmVzLmdldChpKTsKLQkJCUlJbXBvcnRbXSBpbXBvcnRzID0gZmVhdHVyZS5nZXRJbXBvcnRzKCk7Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW1wb3J0cy5sZW5ndGg7IGorKykgewotCQkJCUlJbXBvcnQgaWltcG9ydCA9IGltcG9ydHNbal07Ci0JCQkJLy8gZm9yIGVhY2ggaW1wb3J0IGRldGVybWluZSBwbHVnaW4gb3IgZmVhdHVyZSwgdmVyc2lvbiwgbWF0Y2gKLQkJCQkvLyB3ZSBuZWVkCi0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBpaWQgPSBpaW1wb3J0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQlTdHJpbmcgaWQgPSBpaWQuZ2V0SWRlbnRpZmllcigpOwotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHZlcnNpb24gPSBpaWQuZ2V0VmVyc2lvbigpOwotCQkJCWJvb2xlYW4gZmVhdHVyZVByZXJlcSA9Ci0JCQkJCWlpbXBvcnQuZ2V0S2luZCgpID09IElJbXBvcnQuS0lORF9GRUFUVVJFOwotCQkJCWJvb2xlYW4gaWdub3JlVmVyc2lvbiA9Ci0JCQkJCXZlcnNpb24uZ2V0TWFqb3JDb21wb25lbnQoKSA9PSAwCi0JCQkJCQkmJiB2ZXJzaW9uLmdldE1pbm9yQ29tcG9uZW50KCkgPT0gMAotCQkJCQkJJiYgdmVyc2lvbi5nZXRTZXJ2aWNlQ29tcG9uZW50KCkgPT0gMDsKLQkJCQlpbnQgcnVsZSA9IGlpbXBvcnQuZ2V0UnVsZSgpOwotCQkJCWlmIChydWxlID09IElJbXBvcnQuUlVMRV9OT05FKQotCQkJCQlydWxlID0gSUltcG9ydC5SVUxFX0NPTVBBVElCTEU7Ci0KLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0KLQkJCQlBcnJheUxpc3QgY2FuZGlkYXRlczsKLQotCQkJCWlmIChmZWF0dXJlUHJlcmVxKQotCQkJCQljYW5kaWRhdGVzID0gZmVhdHVyZXM7Ci0JCQkJZWxzZQotCQkJCQljYW5kaWRhdGVzID0gcGx1Z2luczsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IGNhbmRpZGF0ZXMuc2l6ZSgpOyBrKyspIHsKLQkJCQkJVmVyc2lvbmVkSWRlbnRpZmllciBjaWQ7Ci0JCQkJCWlmIChmZWF0dXJlUHJlcmVxKSB7Ci0JCQkJCQkvLyB0aGUgY2FuZGlkYXRlIGlzIGEgZmVhdHVyZQotCQkJCQkJSUZlYXR1cmUgY2FuZGlkYXRlID0gKElGZWF0dXJlKSBjYW5kaWRhdGVzLmdldChrKTsKLQkJCQkJCS8vIHNraXAgc2VsZgotCQkJCQkJaWYgKGZlYXR1cmUuZXF1YWxzKGNhbmRpZGF0ZSkpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQljaWQgPSBjYW5kaWRhdGUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gdGhlIGNhbmRpZGF0ZSBpcyBhIHBsdWctaW4KLQkJCQkJCUlQbHVnaW5FbnRyeSBwbHVnaW4gPSAoSVBsdWdpbkVudHJ5KSBjYW5kaWRhdGVzLmdldChrKTsKLQkJCQkJCWNpZCA9IHBsdWdpbi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQkJCX0KLQkJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgY3ZlcnNpb24gPSBjaWQuZ2V0VmVyc2lvbigpOwotCQkJCQlpZiAoaWQuZXF1YWxzKGNpZC5nZXRJZGVudGlmaWVyKCkpKSB7Ci0JCQkJCQkvLyBoYXZlIGEgY2FuZGlkYXRlCi0JCQkJCQlpZiAoaWdub3JlVmVyc2lvbikKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQllbHNlIGlmICgKLQkJCQkJCQlydWxlID09IElJbXBvcnQuUlVMRV9QRVJGRUNUCi0JCQkJCQkJCSYmIGN2ZXJzaW9uLmlzUGVyZmVjdCh2ZXJzaW9uKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQllbHNlIGlmICgKLQkJCQkJCQlydWxlID09IElJbXBvcnQuUlVMRV9FUVVJVkFMRU5UCi0JCQkJCQkJCSYmIGN2ZXJzaW9uLmlzRXF1aXZhbGVudFRvKHZlcnNpb24pKQotCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCWVsc2UgaWYgKAotCQkJCQkJCXJ1bGUgPT0gSUltcG9ydC5SVUxFX0NPTVBBVElCTEUKLQkJCQkJCQkJJiYgY3ZlcnNpb24uaXNDb21wYXRpYmxlV2l0aCh2ZXJzaW9uKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQllbHNlIGlmICgKLQkJCQkJCQlydWxlID09IElJbXBvcnQuUlVMRV9HUkVBVEVSX09SX0VRVUFMCi0JCQkJCQkJCSYmIGN2ZXJzaW9uLmlzR3JlYXRlck9yRXF1YWxUbyh2ZXJzaW9uKSkKLQkJCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGZvdW5kKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJaWYgKCFmb3VuZCkgewotCQkJCQkvLyByZXBvcnQgc3RhdHVzCi0JCQkJCVN0cmluZyB0YXJnZXQgPQotCQkJCQkJZmVhdHVyZVByZXJlcQotCQkJCQkJCT8gUG9saWN5LmJpbmQoS0VZX1BSRVJFUV9GRUFUVVJFKQotCQkJCQkJCTogUG9saWN5LmJpbmQoS0VZX1BSRVJFUV9QTFVHSU4pOwotCQkJCQlpbnQgZXJyb3JDb2RlID0gZmVhdHVyZVByZXJlcQotCQkJCQkJCT8gRmVhdHVyZVN0YXR1cy5DT0RFX1BSRVJFUV9GRUFUVVJFCi0JCQkJCQkJOiBGZWF0dXJlU3RhdHVzLkNPREVfUFJFUkVRX1BMVUdJTjsKLQkJCQkJU3RyaW5nIG1zZyA9Ci0JCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQlLRVlfUFJFUkVRLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHRhcmdldCwgaWQgfSk7Ci0KLQkJCQkJaWYgKCFpZ25vcmVWZXJzaW9uKSB7Ci0JCQkJCQlpZiAocnVsZSA9PSBJSW1wb3J0LlJVTEVfUEVSRkVDVCkKLQkJCQkJCQltc2cgPQotCQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJCUtFWV9QUkVSRVFfUEVSRkVDVCwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LAotCQkJCQkJCQkJCWlkLAotCQkJCQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKX0pOwotCQkJCQkJZWxzZSBpZiAocnVsZSA9PSBJSW1wb3J0LlJVTEVfRVFVSVZBTEVOVCkKLQkJCQkJCQltc2cgPQotCQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJCUtFWV9QUkVSRVFfRVFVSVZBTEVOVCwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LAotCQkJCQkJCQkJCWlkLAotCQkJCQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKX0pOwotCQkJCQkJZWxzZSBpZiAocnVsZSA9PSBJSW1wb3J0LlJVTEVfQ09NUEFUSUJMRSkKLQkJCQkJCQltc2cgPQotCQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJCUtFWV9QUkVSRVFfQ09NUEFUSUJMRSwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LAotCQkJCQkJCQkJCWlkLAotCQkJCQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKX0pOwotCQkJCQkJZWxzZSBpZiAocnVsZSA9PSBJSW1wb3J0LlJVTEVfR1JFQVRFUl9PUl9FUVVBTCkKLQkJCQkJCQltc2cgPQotCQkJCQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJCQkJCUtFWV9QUkVSRVFfR1JFQVRFUiwKLQkJCQkJCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQkJCQkJdGFyZ2V0LAotCQkJCQkJCQkJCWlkLAotCQkJCQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKX0pOwotCQkJCQl9Ci0JCQkJCUlTdGF0dXMgcyA9IGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBlcnJvckNvZGUsIG1zZyk7Ci0JCQkJCWlmICghc3RhdHVzLmNvbnRhaW5zKHMpKQotCQkJCQkJc3RhdHVzLmFkZChzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFZlcmlmeSB3ZSBlbmQgdXAgd2l0aCB2YWxpZCBuZXN0ZWQgZmVhdHVyZXMgYWZ0ZXIgcmV2ZXJ0Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1JldmVydENvbnN0cmFpbnRzKAotCQlBcnJheUxpc3QgZmVhdHVyZXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gKElGZWF0dXJlKSBmZWF0dXJlcy5nZXQoaSk7Ci0JCQl0cnkgewotCQkJCWNvbXB1dGVGZWF0dXJlU3VidHJlZSgKLQkJCQkJZmVhdHVyZSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJZmFsc2UgLyogZG8gbm90IHRvbGVyYXRlIG1pc3NpbmcgY2hpbGRyZW4gKi8sCi0JCQkJCW51bGwsCi0JCQkJCW51bGwKLQkJCQkpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJc3RhdHVzLmFkZChlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZ5IHRoYXQgYSBwYXJlbnQgb2YgYW4gb3B0aW9uYWwgY2hpbGQgaXMgY29uZmlndXJlZCBiZWZvcmUgd2UgYWxsb3cKLQkgKiB0aGUgY2hpbGQgdG8gYmUgY29uZmlndXJlZCBhcyB3ZWxsCi0JICovCi0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrT3B0aW9uYWxDaGlsZENvbmZpZ3VyaW5nKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlBcnJheUxpc3Qgc3RhdHVzKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCi0JCWJvb2xlYW4gaW5jbHVkZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNzaXRlc1tpXTsKLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGNyZWZzID0KLQkJCQljc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgY3JlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbal07Ci0JCQkJSUZlYXR1cmUgY2ZlYXR1cmUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWNmZWF0dXJlID0gY3JlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvL0ZJWE1FOiBjYW5ub3QgYXNrICdpc09wdGlvbmFsJyBoZXJlCi0JCQkJCS8vIElnbm9yZSBtaXNzaW5nIG9wdGlvbmFsIGZlYXR1cmUuCi0JCQkJCS8qCi0JCQkJCSAqIGlmIChjcmVmLmlzT3B0aW9uYWwoKSkgY29udGludWU7Ci0JCQkJCSAqLwotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCQlpZiAoaXNQYXJlbnQoY2ZlYXR1cmUsIGZlYXR1cmUsIHRydWUpKSB7Ci0JCQkJCS8vIEluY2x1ZGVkIGluIGF0IGxlYXN0IG9uZSBmZWF0dXJlIGFzIG9wdGlvbmFsCi0JCQkJCWluY2x1ZGVkID0gdHJ1ZTsKLQkJCQkJaWYgKGNzaXRlLmlzQ29uZmlndXJlZChjZmVhdHVyZSkpIHsKLQkJCQkJCS8vIEF0IGxlYXN0IG9uZSBmZWF0dXJlIHBhcmVudAotCQkJCQkJLy8gaXMgZW5hYmxlZCAtIGl0IGlzIE9LIHRvCi0JCQkJCQkvLyBjb25maWd1cmUgb3B0aW9uYWwgY2hpbGQuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGluY2x1ZGVkKSB7Ci0JCQkvLyBmZWF0dXJlIGlzIGluY2x1ZGVkIGFzIG9wdGlvbmFsIGJ1dAotCQkJLy8gbm8gcGFyZW50IGlzIGN1cnJlbnRseSBjb25maWd1cmVkLgotCQkJU3RyaW5nIG1zZyA9IFBvbGljeS5iaW5kKEtFWV9PUFRJT05BTF9DSElMRCk7Ci0JCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhmZWF0dXJlLCBGZWF0dXJlU3RhdHVzLkNPREVfT1BUSU9OQUxfQ0hJTEQsIG1zZykpOwotCQl9IGVsc2UgewotCQkJLy9mZWF0dXJlIGlzIHJvb3QgLSBjYW4gYmUgY29uZmlndXJlZAotCQl9Ci0JfQotLy8KLS8vCS8qKgotLy8JICogQ2hlY2tzIGlmIHRoZSBjb25maWd1cmF0aW9uIGlzIGxvY2tlZCBieSBvdGhlciBpbnN0YW5jZXMKLS8vCSAqIAotLy8JICogQHBhcmFtIHN0YXR1cwotLy8JICovCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ29uZmlndXJhdGlvbkxvY2soQXJyYXlMaXN0IHN0YXR1cykgewotLy8JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY29uZmlnID0KLS8vCQkJQm9vdExvYWRlci5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0vLwkJVVJMIGNvbmZpZ1VSTCA9IGNvbmZpZy5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLS8vCQlpZiAoISJmaWxlIi5lcXVhbHMoY29uZmlnVVJMLmdldFByb3RvY29sKCkpKSB7Ci0vLwkJCXN0YXR1cy5hZGQoCi0vLwkJCQljcmVhdGVTdGF0dXMoCi0vLwkJCQkJbnVsbCwKLS8vCQkJCQkiQ29uZmlndXJhdGlvbiBsb2NhdGlvbiBpcyBub3Qgd3JpdGFibGU6IiArIGNvbmZpZ1VSTCkpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8JCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IGNvbmZpZ1VSTC5nZXRGaWxlKCk7Ci0vLwkJRmlsZSBjb25maWdEaXIgPSBuZXcgRmlsZShsb2NhdGlvblN0cmluZyk7Ci0vLwkJaWYgKCFjb25maWdEaXIuaXNEaXJlY3RvcnkoKSkKLS8vCQkJY29uZmlnRGlyID0gY29uZmlnRGlyLmdldFBhcmVudEZpbGUoKTsKLS8vCQlpZiAoIWNvbmZpZ0Rpci5leGlzdHMoKSkgewotLy8JCQlzdGF0dXMuYWRkKAotLy8JCQkJY3JlYXRlU3RhdHVzKG51bGwsICJDb25maWd1cmF0aW9uIGxvY2F0aW9uIGRvZXMgbm90IGV4aXN0IikpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotLy8JCUZpbGUgbG9ja3NEaXIgPSBuZXcgRmlsZShjb25maWdEaXIsICJsb2NrcyIpOwotLy8JCS8vIGNoZWNrIGFsbCB0aGUgcG9zc2libGUgbG9jayBmaWxlcwotLy8JCUZpbGVbXSBsb2NrRmlsZXMgPSBsb2Nrc0Rpci5saXN0RmlsZXMoKTsKLS8vCQlGaWxlIGNvbmZpZ0xvY2sgPSBCb290TG9hZGVyLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRMb2NrRmlsZSgpOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9ja0ZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCWlmIChsb2NrRmlsZXNbaV0uZXF1YWxzKGNvbmZpZ0xvY2spKQotLy8JCQkJY29udGludWU7Ci0vLwkJCXRyeSB7Ci0vLwkJCQlSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGxvY2tGaWxlc1tpXSwgInJ3Iik7Ci0vLwkJCQlGaWxlQ2hhbm5lbCBjaGFubmVsID0gcmFmLmdldENoYW5uZWwoKTsKLS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjaGFubmVsLmlzT3BlbigpKTsKLS8vCQkJCUZpbGVMb2NrIGxvY2sgPSBjaGFubmVsLnRyeUxvY2soKTsKLS8vCQkJCWlmIChsb2NrID09IG51bGwpewotLy8JCQkJCS8vIHRoZXJlIGlzIGFub3RoZXIgZWNsaXBzZSBpbnN0YW5jZSBydW5uaW5nCi0vLwkJCQkJcmFmLmNsb3NlKCk7Ci0vLwkJCQkJc3RhdHVzLmFkZCgKLS8vCQkJCQkJY3JlYXRlU3RhdHVzKAotLy8JCQkJCQkJbnVsbCwKLS8vCQkJCQkJCSJBbm90aGVyIGluc3RhbmNlIGlzIHJ1bm5pbmcsIHBsZWFzZSBjbG9zZSBpdCBiZWZvcmUgcGVyZm9ybWluZyBhbnkgY29uZmlndXJhdGlvbiBvcGVyYXRpb25zIikpOwotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCi0vLwkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhudWxsLCAiRmFpbGVkIHRvIGNyZWF0ZSBsb2NrOiIrbG9ja0ZpbGVzW2ldKSk7Ci0vLwkJCQlyZXR1cm47Ci0vLwkJCX0gCi0vLwkJfQotLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1BhcmVudCgKLQkJSUZlYXR1cmUgY2FuZGlkYXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlib29sZWFuIG9wdGlvbmFsT25seSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9Ci0JCQljYW5kaWRhdGUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgY2hpbGQgPSByZWZzW2ldOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciBmdmlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN2aWQgPSBjaGlsZC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7Ci0KLQkJCWlmIChmdmlkLmdldElkZW50aWZpZXIoKS5lcXVhbHMoY3ZpZC5nZXRJZGVudGlmaWVyKCkpID09IGZhbHNlKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gc2FtZSBJRAotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZnZlcnNpb24gPSBmdmlkLmdldFZlcnNpb24oKTsKLQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGN2ZXJzaW9uID0gY3ZpZC5nZXRWZXJzaW9uKCk7Ci0KLQkJCWlmIChmdmVyc2lvbi5lcXVhbHMoY3ZlcnNpb24pKSB7Ci0JCQkJLy8gaW5jbHVkZWQgYW5kIG1hdGNoZWQ7IHJldHVybiB0cnVlIGlmIG9wdGlvbmFsaXR5IGlzIG5vdAotCQkJCS8vIGltcG9ydGFudCBvciBpdCBpcyBhbmQgdGhlIGluY2x1c2lvbiBpcyBvcHRpb25hbAotCQkJCXJldHVybiBvcHRpb25hbE9ubHkgPT0gZmFsc2UgfHwgY2hpbGQuaXNPcHRpb25hbCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLS8vCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tUaW1lbGluZSgKLS8vCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotLy8JCUFycmF5TGlzdCBzdGF0dXMpIHsKLS8vCQl0cnkgewotLy8JCQlJTG9jYWxTaXRlIGxzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0vLwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjY29uZmlnID0gbHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLS8vCQkJaWYgKGNjb25maWcuZ2V0VGltZWxpbmUoKSAhPSBjb25maWcuZ2V0VGltZWxpbmUoKSkgewotLy8JCQkJLy8gTm90IHRoZSBzYW1lIHRpbWVsaW5lIC0gY2Fubm90IHJldmVydAotLy8JCQkJU3RyaW5nIG1zZyA9Ci0vLwkJCQkJVXBkYXRlVXRpbHMuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgKLS8vCQkJCQkJS0VZX1dST05HX1RJTUVMSU5FLAotLy8JCQkJCQljb25maWcuZ2V0TGFiZWwoKSk7Ci0vLwkJCQlzdGF0dXMuYWRkKGNyZWF0ZVN0YXR1cyhudWxsLCBGZWF0dXJlU3RhdHVzLkNPREVfT1RIRVIsIG1zZykpOwotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCXN0YXR1cy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0vLwkJfQotLy8JCXJldHVybiB0cnVlOwotLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVNdWx0aVN0YXR1cygKLQkJU3RyaW5nIHJvb3RLZXksCi0JCUFycmF5TGlzdCBjaGlsZHJlbiwKLQkJaW50IGNvZGUpIHsKLQkJSVN0YXR1c1tdIGNhcnJheSA9Ci0JCQkoSVN0YXR1c1tdKSBjaGlsZHJlbi50b0FycmF5KG5ldyBJU3RhdHVzW2NoaWxkcmVuLnNpemUoKV0pOwotCQlTdHJpbmcgbWVzc2FnZSA9IFBvbGljeS5iaW5kKHJvb3RLZXkpOwotCQlyZXR1cm4gbmV3IE11bHRpU3RhdHVzKAotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwKLQkJCWNvZGUsCi0JCQljYXJyYXksCi0JCQltZXNzYWdlLAotCQkJbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSwgaW50IGVycm9yQ29kZSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQotCQlTdHJpbmcgZnVsbE1lc3NhZ2U7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlmdWxsTWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCWVsc2UgewotCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdmVyc2lvbiA9Ci0JCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJZnVsbE1lc3NhZ2UgPQotCQkJCVBvbGljeS5iaW5kKAotCQkJCQlLRVlfQ0hJTERfTUVTU0FHRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKSwKLQkJCQkJCXZlcnNpb24udG9TdHJpbmcoKSwKLQkJCQkJCW1lc3NhZ2UgfSk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEZlYXR1cmVTdGF0dXMoCi0JCQlmZWF0dXJlLAotCQkJSVN0YXR1cy5FUlJPUiwKLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksCi0JCQllcnJvckNvZGUsCi0JCQlmdWxsTWVzc2FnZSwKLQkJCW51bGwpOwotCX0KLQotCS8vCXByaXZhdGUgc3RhdGljIElTdGF0dXMgY3JlYXRlUmVwb3J0U3RhdHVzKEFycmF5TGlzdCBiZWZvcmVTdGF0dXMsCi0JLy8gQXJyYXlMaXN0IHN0YXR1cykgewotCS8vCQkvLyByZXBvcnQgc3RhdHVzCi0JLy8JCWlmIChzdGF0dXMuc2l6ZSgpID4gMCkgewotCS8vCQkJaWYgKGJlZm9yZVN0YXR1cy5zaXplKCkgPiAwKQotCS8vCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhLRVlfUk9PVF9NRVNTQUdFX0lOSVQsCi0JLy8gYmVmb3JlU3RhdHVzLElTdGF0dXMuRVJST1IpOwotCS8vCQkJZWxzZQotCS8vCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cyhLRVlfUk9PVF9NRVNTQUdFLCBzdGF0dXMsSVN0YXR1cy5FUlJPUik7Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIG51bGw7Ci0JLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVDb21iaW5lZFJlcG9ydFN0YXR1cygKLQkJQXJyYXlMaXN0IGJlZm9yZVN0YXR1cywKLQkJQXJyYXlMaXN0IHN0YXR1cykgewotCQlpZiAoYmVmb3JlU3RhdHVzLnNpemUoKSA9PSAwKSB7IC8vIGdvb2QgaW5pdGlhbCBjb25maWcKLQkJCWlmIChzdGF0dXMuc2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gbnVsbDsgLy8gYWxsIGZpbmUKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZU11bHRpU3RhdHVzKAotCQkJCQlLRVlfUk9PVF9NRVNTQUdFLAotCQkJCQlzdGF0dXMsCi0JCQkJCUlTdGF0dXMuRVJST1IpOwotCQkJCS8vIGVycm9yIGFmdGVyIG9wZXJhdGlvbgotCQkJfQotCQl9IGVsc2UgeyAvLyBiZWZvcmVTdGF0dXMuc2l6ZSgpID4gMCA6IGluaXRpYWwgY29uZmlnIGVycm9ycwotCQkJaWYgKHN0YXR1cy5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcnMgd2lsbCBiZSBmaXhlZAotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNCZXR0ZXJTdGF0dXMoYmVmb3JlU3RhdHVzLCBzdGF0dXMpKSB7Ci0JCQkJCXJldHVybiBjcmVhdGVNdWx0aVN0YXR1cygKLQkJCQkJCSJBY3Rpdml0eUNvbnN0cmFpbnRzLndhcm5pbmciLCAvLyROT04tTkxTLTEkCi0JCQkJCQliZWZvcmVTdGF0dXMsCi0JCQkJCQlJU3RhdHVzLldBUk5JTkcpOwotCQkJCQkvLyBlcnJvcnMgbWF5IGJlIGZpeGVkCi0JCQkJfSBlbHNlIHsKLQkJCQkJQXJyYXlMaXN0IGNvbWJpbmVkID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQljb21iaW5lZC5hZGQoCi0JCQkJCQljcmVhdGVNdWx0aVN0YXR1cygKLQkJCQkJCQkiQWN0aXZpdHlDb25zdHJhaW50cy5iZWZvcmVNZXNzYWdlIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWJlZm9yZVN0YXR1cywKLQkJCQkJCQlJU3RhdHVzLkVSUk9SKSk7Ci0JCQkJCWNvbWJpbmVkLmFkZCgKLQkJCQkJCWNyZWF0ZU11bHRpU3RhdHVzKAotCQkJCQkJCSJBY3Rpdml0eUNvbnN0cmFpbnRzLmFmdGVyTWVzc2FnZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlzdGF0dXMsCi0JCQkJCQkJSVN0YXR1cy5FUlJPUikpOwotCQkJCQlyZXR1cm4gY3JlYXRlTXVsdGlTdGF0dXMoCi0JCQkJCQlLRVlfUk9PVF9NRVNTQUdFX0lOSVQsCi0JCQkJCQljb21iaW5lZCwKLQkJCQkJCUlTdGF0dXMuRVJST1IpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBjcmVhdGVMaXN0KFN0cmluZyBjb21tYVNlcGFyYXRlZExpc3QpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChjb21tYVNlcGFyYXRlZExpc3QgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHQgPQotCQkJCW5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWFTZXBhcmF0ZWRMaXN0LnRyaW0oKSwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHQuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gdC5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKCF0b2tlbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWxpc3QuYWRkKHRva2VuKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc3RhdHVzIGlzIGEgc3Vic2V0IG9mIGJlZm9yZVN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBiZWZvcmVTdGF0dXMKLQkgKiBAcGFyYW0gc3RhdHVzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNCZXR0ZXJTdGF0dXMoCi0JCUFycmF5TGlzdCBiZWZvcmVTdGF0dXMsCi0JCUFycmF5TGlzdCBzdGF0dXMpIHsKLQkJLy8gaWYgbm8gc3RhdHVzIGF0IGFsbCwgdGhlbiBpdCdzIGEgc3Vic2V0Ci0JCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJLy8gdGhlcmUgaXMgc29tZSBzdGF0dXMsIHNvIGlmIHRoZXJlIGlzIG5vIGluaXRpYWwgc3RhdHVzLCB0aGVuIGl0J3MKLQkJLy8gbm90IGEgc3Vic2V0Ci0JCWlmIChiZWZvcmVTdGF0dXMgPT0gbnVsbCB8fCBiZWZvcmVTdGF0dXMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHF1aWNrIGNoZWNrCi0JCWlmIChiZWZvcmVTdGF0dXMuc2l6ZSgpIDwgc3RhdHVzLnNpemUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZiBhbGwgdGhlIHN0YXR1cyBlbGVtZW50cyBhcHBlYXIgaW4gdGhlIG9yaWdpbmFsIHN0YXR1cwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0YXR1cy5zaXplKCk7IGkrKykgewotCQkJSVN0YXR1cyBzID0gKElTdGF0dXMpIHN0YXR1cy5nZXQoaSk7Ci0JCQkvLyBpZiB0aGlzIGlzIG5vdCBhIGZlYXR1cmUgc3RhdHVzLCBzb21ldGhpbmcgaXMgd3JvbmcsIHNvIHJldHVybgotCQkJLy8gZmFsc2UKLQkJCWlmICghKHMgaW5zdGFuY2VvZiBGZWF0dXJlU3RhdHVzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlGZWF0dXJlU3RhdHVzIGZzID0gKEZlYXR1cmVTdGF0dXMpIHM7Ci0JCQkvLyBjaGVjayBhZ2FpbnN0IGFsbCBzdGF0dXMgZWxlbWVudHMKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyAhZm91bmQgJiYgaiA8IGJlZm9yZVN0YXR1cy5zaXplKCk7IGorKykgewotCQkJCWlmIChmcy5lcXVhbHMoYmVmb3JlU3RhdHVzLmdldChqKSkpCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUGF0Y2hDbGVhbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BhdGNoQ2xlYW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM3YjhlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUGF0Y2hDbGVhbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIFRoaXMgdXRpbGl0eSBjbGFzcyBhdHRhY2hlcyBhcyBhIGxpc3RlbmVkIHRvIHRoZSBwcm92aWRlZAotICogY29uZmlndXJlZCBzaXRlLCBhbmQgZm9yIGV2ZXJ5IHVuY29uZmlndXJlZCBmZWF0dXJlIAotICogaXQgdGVzdHMgaWYgaXQgaXMgYSBwYXRjaCBhbmQgY2xlYW5zIHVwIGl0cyBiYWNrdXAgY29uZmlndXJhdGlvbi4KLSAqLwotCi1wdWJsaWMgY2xhc3MgUGF0Y2hDbGVhbmVyIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBjc2l0ZTsKLQlwcml2YXRlIFNpdGVMaXN0ZW5lciBsaXN0ZW5lcjsKLQljbGFzcyBTaXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBmZWF0dXJlSW5zdGFsbGVkKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJfQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQljbGVhblNhdmVkQ29uZmlncyhmZWF0dXJlKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVVuY29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQljbGVhblNhdmVkQ29uZmlncyhmZWF0dXJlKTsKLQkJfQotCX0KLQlwdWJsaWMgUGF0Y2hDbGVhbmVyKElDb25maWd1cmVkU2l0ZSBjc2l0ZSwgSUZlYXR1cmUgcm9vdCkgewotCQl0aGlzLmNzaXRlID0gY3NpdGU7Ci0JCWxpc3RlbmVyID0gbmV3IFNpdGVMaXN0ZW5lcigpOwotCQljc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJY3NpdGUucmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwcml2YXRlIHZvaWQgY2xlYW5TYXZlZENvbmZpZ3MoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlpZiAoZmVhdHVyZS5pc1BhdGNoKCkpIHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBiYWNrdXBDb25maWcgPSBVcGRhdGVVdGlscy5nZXRCYWNrdXBDb25maWd1cmF0aW9uRm9yKGZlYXR1cmUpOwotCQkJaWYgKGJhY2t1cENvbmZpZyE9bnVsbCkgewotCQkJCS8vIGNsZWFuIGl0Ci0JCQkJcmVtb3ZlKGJhY2t1cENvbmZpZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHJlbW92ZShJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnKSB7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJbG9jYWxTaXRlLnJlbW92ZUZyb21QcmVzZXJ2ZWRDb25maWd1cmF0aW9ucyhjb25maWcpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1JlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODdiOGU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBTd2FwcyBhIGZlYXR1cmUuCi0gKiBSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VGZWF0dXJlVmVyc2lvbk9wZXJhdGlvbgotCWV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbgotCWltcGxlbWVudHMgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJRmVhdHVyZSBhbm90aGVyRmVhdHVyZTsKLQkKLQlwdWJsaWMgUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSkgewotCQlzdXBlcihmZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKSwgZmVhdHVyZSk7Ci0JCXRoaXMuYW5vdGhlckZlYXR1cmUgPSBhbm90aGVyRmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1JlcGxhY2VWZXJzaW9uKGZlYXR1cmUsIGFub3RoZXJGZWF0dXJlKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJLy8gdW5jb25maWd1cmUgY3VycmVudCBmZWF0dXJlIGZpcnN0LCB0aGVuIGNvbmZpZ3VyZSB0aGUgb3RoZXIgb25lCi0JCQotCQlQYXRjaENsZWFuZXIgY2xlYW5lciA9IG5ldyBQYXRjaENsZWFuZXIodGFyZ2V0U2l0ZSwgZmVhdHVyZSk7Ci0JCXRhcmdldFNpdGUudW5jb25maWd1cmUoZmVhdHVyZSk7Ci0JCWNsZWFuZXIuZGlzcG9zZSgpOwotCQkKLQkJdGFyZ2V0U2l0ZS5jb25maWd1cmUoYW5vdGhlckZlYXR1cmUpOwotLy8JCWVuc3VyZVVuaXF1ZSgpOwotCi0JCXRyeSB7Ci0JCQkvLyBSZXN0YXJ0IG5vdCBuZWVkZWQKLQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IGZhbHNlOwotCi0JCQkvLyBDaGVjayBpZiB0aGlzIG9wZXJhdGlvbiBpcyBjYW5jZWxsaW5nIG9uZSB0aGF0J3MgYWxyZWFkeSBwZW5kaW5nCi0JCQlJT3BlcmF0aW9uIHBlbmRpbmdPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpOwotCi0JCQlpZiAocGVuZGluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElDb25maWdGZWF0dXJlT3BlcmF0aW9uKSB7Ci0JCQkJLy8gbm8gbmVlZCB0byBkbyBlaXRoZXIgcGVuZGluZyBjaGFuZ2UKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVQZW5kaW5nT3BlcmF0aW9uKHBlbmRpbmdPcGVyYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5hZGRQZW5kaW5nT3BlcmF0aW9uKHRoaXMpOwotCQkJCXJlc3RhcnROZWVkZWQgPSB0cnVlOwotCQkJfQotCQkJCi0JCQlwZW5kaW5nT3BlcmF0aW9uID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihhbm90aGVyRmVhdHVyZSk7Ci0JCQkJCi0JCQlpZiAocGVuZGluZ09wZXJhdGlvbiBpbnN0YW5jZW9mIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24pIHsKLQkJCQkvLyBubyBuZWVkIHRvIGRvIGVpdGhlciBwZW5kaW5nIGNoYW5nZQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLnJlbW92ZVBlbmRpbmdPcGVyYXRpb24ocGVuZGluZ09wZXJhdGlvbik7Ci0JCQl9IGVsc2UgewotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFBlbmRpbmdPcGVyYXRpb24odGhpcyk7Ci0JCQkJcmVzdGFydE5lZWRlZCA9IHRydWU7Ci0JCQl9Ci0JCQkKLQkJCW1hcmtQcm9jZXNzZWQoKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsKQotCQkJCWxpc3RlbmVyLmFmdGVyRXhlY3V0ZSh0aGlzLCBudWxsKTsKLQotCQkJcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKSAmJiByZXN0YXJ0TmVlZGVkOwotCi0JCQkvLyBub3RpZnkgdGhlIG1vZGVsCi0JCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChmZWF0dXJlLCBudWxsKTsKLQotCQkJcmV0dXJuIHJlc3RhcnROZWVkZWQ7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdW5kbygpOwotCQkJVXBkYXRlVXRpbHMubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRhcmdldFNpdGUudW5jb25maWd1cmUoYW5vdGhlckZlYXR1cmUpOwotCQl0YXJnZXRTaXRlLmNvbmZpZ3VyZShmZWF0dXJlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1JldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdmZTViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gZXh0ZW5kcyBPcGVyYXRpb24gaW1wbGVtZW50cyBJUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWc7Ci0JcHJpdmF0ZSBJUHJvYmxlbUhhbmRsZXIgcHJvYmxlbUhhbmRsZXI7Ci0KLQlwdWJsaWMgUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQl0aGlzLnByb2JsZW1IYW5kbGVyID0gcHJvYmxlbUhhbmRsZXI7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmV2ZXJ0KGNvbmZpZyk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0KLQotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJCWxvY2FsU2l0ZS5yZXZlcnRUbyhjb25maWcsIG1vbml0b3IsIHByb2JsZW1IYW5kbGVyKTsKLQkJCWxvY2FsU2l0ZS5zYXZlKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Ub2dnbGVTaXRlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1RvZ2dsZVNpdGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNThkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1RvZ2dsZVNpdGVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFRvZ2dsZVNpdGVPcGVyYXRpb24KLQlleHRlbmRzIE9wZXJhdGlvbgotCWltcGxlbWVudHMgSVRvZ2dsZVNpdGVPcGVyYXRpb24gewotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgc2l0ZTsKLQotCXB1YmxpYyBUb2dnbGVTaXRlT3BlcmF0aW9uKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoCi0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKLQkJSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWJvb2xlYW4gb2xkVmFsdWUgPSBzaXRlLmlzRW5hYmxlZCgpOwotCQlzaXRlLnNldEVuYWJsZWQoIW9sZFZhbHVlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCS8vIHJldmVydAotCQkJc2l0ZS5zZXRFbmFibGVkKG9sZFZhbHVlKTsKLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWJvb2xlYW4gcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLQkJCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChzaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsgLy8gd2lsbCByZXN0YXJ0IG9ubHkgaWYgY2hhbmdlcyBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjdXJyZW50IGNvbmZpZwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9yZXZlcnQKLQkJCQlzaXRlLnNldEVuYWJsZWQob2xkVmFsdWUpOwotCQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl0aHJvdyBlOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ09wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VbmNvbmZpZ09wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmJhYzk2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVW5jb25maWdPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBVbmNvbmZpZ3VyZSBhIGZlYXR1cmUuCi0gKiBVbmNvbmZpZ09wZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVW5jb25maWdPcGVyYXRpb24KLQlleHRlbmRzIEZlYXR1cmVPcGVyYXRpb24KLQlpbXBsZW1lbnRzIElVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gewotCi0JcHVibGljIFVuY29uZmlnT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcG0sIElPcGVyYXRpb25MaXN0ZW5lciBsaXN0ZW5lcikKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1VuY29uZmlnKGZlYXR1cmUpOwotCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQl9Ci0KLQkJUGF0Y2hDbGVhbmVyIGNsZWFuZXIgPSBuZXcgUGF0Y2hDbGVhbmVyKHRhcmdldFNpdGUsIGZlYXR1cmUpOwotCQl0YXJnZXRTaXRlLnVuY29uZmlndXJlKGZlYXR1cmUpOwotCQljbGVhbmVyLmRpc3Bvc2UoKTsKLQotCQl0cnkgewotCQkJLy8gUmVzdGFydCBub3QgbmVlZGVkCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBmYWxzZTsKLQotCQkJLy8gQ2hlY2sgaWYgdGhpcyBvcGVyYXRpb24gaXMgY2FuY2VsbGluZyBvbmUgdGhhdCdzIGFscmVhZHkgcGVuZGluZwotCQkJSU9wZXJhdGlvbiBwZW5kaW5nT3BlcmF0aW9uID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKTsKLQotCQkJaWYgKHBlbmRpbmdPcGVyYXRpb24gaW5zdGFuY2VvZiBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbikgewotCQkJCS8vIG5vIG5lZWQgdG8gZG8gZWl0aGVyIHBlbmRpbmcgY2hhbmdlCi0JCQkJT3BlcmF0aW9uc01hbmFnZXIucmVtb3ZlUGVuZGluZ09wZXJhdGlvbihwZW5kaW5nT3BlcmF0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuYWRkUGVuZGluZ09wZXJhdGlvbih0aGlzKTsKLQkJCQlyZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKLQkJCX0KLQotCQkJbWFya1Byb2Nlc3NlZCgpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQkJbGlzdGVuZXIuYWZ0ZXJFeGVjdXRlKHRoaXMsIG51bGwpOwotCi0JCQlyZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpICYmIHJlc3RhcnROZWVkZWQ7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgbW9kZWwKLQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmZpcmVPYmplY3RDaGFuZ2VkKGZlYXR1cmUsIG51bGwpOwotCi0JCQlyZXR1cm4gcmVzdGFydE5lZWRlZDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl1bmRvKCk7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGFyZ2V0U2l0ZS5jb25maWd1cmUoZmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuaW5zdGFsbE9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Vbmluc3RhbGxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAwMjNjZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9vcGVyYXRpb25zL1VuaW5zdGFsbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogQ29uZmlndXJlIGEgZmVhdHVyZS4KLSAqIENvbmZpZ09wZXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVW5pbnN0YWxsT3BlcmF0aW9uIGV4dGVuZHMgRmVhdHVyZU9wZXJhdGlvbiBpbXBsZW1lbnRzIElVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uewotCi0JcHVibGljIFVuaW5zdGFsbE9wZXJhdGlvbihJQ29uZmlndXJlZFNpdGUgc2l0ZSwgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlzdXBlcihzaXRlLCBmZWF0dXJlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRTaXRlKElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKSB7Ci0JCXRoaXMudGFyZ2V0U2l0ZSA9IHRhcmdldFNpdGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHBtLCBJT3BlcmF0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkKLQkJCXRhcmdldFNpdGUgPSBVcGRhdGVVdGlscy5nZXRDb25maWdTaXRlKGZlYXR1cmUsIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpOwotCi0JCS8vIFJlc3RhcnQgbm90IG5lZWRlZAotCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSBmYWxzZTsKLQotCQlpZiAodGFyZ2V0U2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBpZiBuZWVkZWQsIHVuY29uZmlndXJlIHRoZSBmZWF0dXJlIGZpcnN0Ci0JCQlpZiAodGFyZ2V0U2l0ZS5pc0NvbmZpZ3VyZWQoZmVhdHVyZSkpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGVuZGluZ1VuY29uZmlnKGZlYXR1cmUpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuRVJST1IpCi0JCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7Ci0JCQkJaWYgKHVuY29uZmlndXJlKGZlYXR1cmUsIHRhcmdldFNpdGUpKQotCQkJCQlyZXN0YXJ0TmVlZGVkID0gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJPcGVyYXRpb25zTWFuYWdlci5lcnJvci51bmluc3RhbGwiLCBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRhcmdldFNpdGUucmVtb3ZlKGZlYXR1cmUsIHBtKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHdlIHNob3VsZCBkbyBzb21ldGhpbmcgaGVyZQotCQkJU3RyaW5nIG1lc3NhZ2UgPQotCQkJCVBvbGljeS5iaW5kKAotCQkJCQkiT3BlcmF0aW9uc01hbmFnZXIuZXJyb3IudW5pbnN0YWxsIiwgLy8kTk9OLU5MUy0xJAotCQkJCQlmZWF0dXJlLmdldExhYmVsKCkpOwotCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCVVwZGF0ZVV0aWxzLmdldFBsdWdpbklkKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCW51bGwpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCi0JCW1hcmtQcm9jZXNzZWQoKTsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpCi0JCQlsaXN0ZW5lci5hZnRlckV4ZWN1dGUodGhpcywgbnVsbCk7Ci0KLQkJcmVzdGFydE5lZWRlZCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKSAmJiByZXN0YXJ0TmVlZGVkOwotCi0JCS8vIG5vdGlmeSB0aGUgbW9kZWwKLQkJT3BlcmF0aW9uc01hbmFnZXIuZmlyZU9iamVjdENoYW5nZWQoZmVhdHVyZSwgVU5JTlNUQUxMKTsKLQkJCi0JCXJldHVybiByZXN0YXJ0TmVlZGVkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVVdGlscy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvb3BlcmF0aW9ucy9VcGRhdGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjA0YWZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL29wZXJhdGlvbnMvVXBkYXRlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIHBlcmZvcm1pbmcgdXBkYXRlIHJlbGF0ZWQgdGFza3MsIHF1ZXJpZXMsIGV0Yy4KLSAqIEFsbCB0aGUgbWV0aG9kcyBhcmUgc3RhdGljIGFuZCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVV0aWxzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VQREFURV9QT0xJQ1lfVVJMID0gInVwZGF0ZVBvbGljeVVSTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByaXZhdGUgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFVwZGF0ZVV0aWxzKCkgewotCX0KLQkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJCi0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIGdldFBsdWdpbklkKCksIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGUpOwotCQl9Ci0JCWxvZyhzdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykgewotCQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfSAKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gc2VhcmNoU2l0ZShTdHJpbmcgZmVhdHVyZUlkLCBJQ29uZmlndXJlZFNpdGUgc2l0ZSwgYm9vbGVhbiBvbmx5Q29uZmlndXJlZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBudWxsOwotCi0JCWlmIChvbmx5Q29uZmlndXJlZCkKLQkJCXJlZmVyZW5jZXMgPSBzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQllbHNlCi0JCQlyZWZlcmVuY2VzID0gc2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWZlcmVuY2VzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQlTdHJpbmcgaWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQlpZiAoZmVhdHVyZUlkLmVxdWFscyhpZCkpIHsKLQkJCQlyZXN1bHQuYWRkKGZlYXR1cmUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUZlYXR1cmVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElGZWF0dXJlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlyZXR1cm4gZ2V0SW5zdGFsbGVkRmVhdHVyZXMoZmVhdHVyZSwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcGFyYW0gb25seUNvbmZpZ3VyZWQKLQkgKiBAcmV0dXJuIElGZWF0dXJlW10gd2l0aCBmZWF0dXJlcyBtYXRjaGluZyBmZWF0dXJlIElECi0JICovCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIGdldEluc3RhbGxlZEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gb25seUNvbmZpZ3VyZWQpIHsKLQkJcmV0dXJuIGdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLCBvbmx5Q29uZmlndXJlZCk7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSB2aWQKLQkgKiBAcGFyYW0gb25seUNvbmZpZ3VyZWQKLQkgKiBAcmV0dXJuIElGZWF0dXJlW10gd2l0aCBmZWF0dXJlcyBtYXRjaGluZyBmZWF0dXJlIElECi0JICovCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIGdldEluc3RhbGxlZEZlYXR1cmVzKFZlcnNpb25lZElkZW50aWZpZXIgdmlkLCBib29sZWFuIG9ubHlDb25maWd1cmVkKSB7Ci0JCVZlY3RvciBmZWF0dXJlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQlJQ29uZmlndXJlZFNpdGVbXSBpc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQlTdHJpbmcgaWQgPSB2aWQuZ2V0SWRlbnRpZmllcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUlDb25maWd1cmVkU2l0ZSBpc2l0ZSA9IGlzaXRlc1tpXTsKLQkJCQlJRmVhdHVyZVtdIHJlc3VsdCA9IFVwZGF0ZVV0aWxzLnNlYXJjaFNpdGUoaWQsIGlzaXRlLCBvbmx5Q29uZmlndXJlZCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQubGVuZ3RoOyBqKyspIHsKLQkJCQkJSUZlYXR1cmUgaW5zdGFsbGVkRmVhdHVyZSA9IHJlc3VsdFtqXTsKLQkJCQkJZmVhdHVyZXMuYWRkKGluc3RhbGxlZEZlYXR1cmUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIChJRmVhdHVyZVtdKSBmZWF0dXJlcy50b0FycmF5KG5ldyBJRmVhdHVyZVtmZWF0dXJlcy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIHBhdGNoCi0JICogQHJldHVybiBJRmVhdHVyZSBvciBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZSBnZXRQYXRjaGVkRmVhdHVyZShJRmVhdHVyZSBwYXRjaCkgewotCQlJSW1wb3J0W10gaW1wb3J0cyA9IHBhdGNoLmdldEltcG9ydHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7Ci0JCQkJVmVyc2lvbmVkSWRlbnRpZmllciBwYXRjaGVkVmlkID0gaWltcG9ydAotCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCQkvLyBmZWF0dXJlcyB3aXRoIG1hdGNoaW5nIGlkCi0JCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IGdldEluc3RhbGxlZEZlYXR1cmVzKHBhdGNoZWRWaWQsIGZhbHNlKTsKLQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGZlYXR1cmVzLmxlbmd0aDsgZisrKSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHZlcnNpb24gbWF0Y2gKLQkJCQkJaWYgKHBhdGNoZWRWaWQuZXF1YWxzKGZlYXR1cmVzW2ZdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCXJldHVybiBmZWF0dXJlc1tmXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQYXRjaChJRmVhdHVyZSBjYW5kaWRhdGUpIHsKLQkJSUltcG9ydFtdIGltcG9ydHMgPSBjYW5kaWRhdGUuZ2V0SW1wb3J0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tpXTsKLQkJCWlmIChpaW1wb3J0LmlzUGF0Y2goKSkgcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIHRhcmdldCwgSUZlYXR1cmUgY2FuZGlkYXRlKSB7Ci0JCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gdGFyZ2V0LmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJSUltcG9ydFtdIGltcG9ydHMgPSBjYW5kaWRhdGUuZ2V0SW1wb3J0cygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykgewotCQkJSUltcG9ydCBpaW1wb3J0ID0gaW1wb3J0c1tpXTsKLQkJCWlmIChpaW1wb3J0LmlzUGF0Y2goKSkgewotCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9IGlpbXBvcnQuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCWlmICh2aWQuZXF1YWxzKGl2aWQpKSB7Ci0JCQkJCS8vIEJpbmdvLgotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEJhY2t1cENvbmZpZ3VyYXRpb25Gb3IoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQlTdHJpbmcga2V5ID0gIkAiICsgdmlkLmdldElkZW50aWZpZXIoKSArICJfIiArIHZpZC5nZXRWZXJzaW9uKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uW10gY29uZmlncyA9IGxzaXRlLmdldFByZXNlcnZlZENvbmZpZ3VyYXRpb25zKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpXTsKLQkJCQlpZiAoY29uZmlnLmdldExhYmVsKCkuc3RhcnRzV2l0aChrZXkpKQotCQkJCQlyZXR1cm4gY29uZmlnOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc0xpY2Vuc2UoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJVVJMRW50cnkgaW5mbyA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOwotCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbGljZW5zZVR4dCA9IGluZm8uZ2V0QW5ub3RhdGlvbigpOwotCQlpZiAobGljZW5zZVR4dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbGljZW5zZVR4dC50cmltKCkubGVuZ3RoKCkgPiAwOwotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT3B0aW9uYWxGZWF0dXJlcyhJRmVhdHVyZVJlZmVyZW5jZSBmcmVmKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gaGFzT3B0aW9uYWxGZWF0dXJlcyhmcmVmLmdldEZlYXR1cmUobnVsbCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzT3B0aW9uYWxGZWF0dXJlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPSBmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpcmVmc1tpXTsKLQkJCQlpZiAoaXJlZi5pc09wdGlvbmFsKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCS8vIHNlZSBpZiBpdCBoYXMgb3B0aW9uYWwgY2hpbGRyZW4KLQkJCQlJRmVhdHVyZSBjaGlsZCA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoaGFzT3B0aW9uYWxGZWF0dXJlcyhjaGlsZCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZSBnZXRMb2NhbEZlYXR1cmUoCi0JCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSwKLQkJSUZlYXR1cmUgZmVhdHVyZSkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciByZWZWaWQgPSByZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJaWYgKGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhyZWZWaWQpKQotCQkJCXJldHVybiByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0Q29uZmlnU2l0ZSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJQ29uZmlndXJlZFNpdGVbXSBjb25maWdTaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPSBjb25maWdTaXRlc1tpXTsKLQkJCWlmIChzaXRlLmdldFNpdGUoKS5lcXVhbHMoZmVhdHVyZS5nZXRTaXRlKCkpKSB7Ci0JCQkJcmV0dXJuIHNpdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldERlZmF1bHRUYXJnZXRTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGVuZGluZ0NoYW5nZSkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBwZW5kaW5nQ2hhbmdlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0RGVmYXVsdFRhcmdldFNpdGUoCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBwZW5kaW5nQ2hhbmdlLAotCQlib29sZWFuIGNoZWNrQWZmaW5pdHlGZWF0dXJlKSB7Ci0JCUlGZWF0dXJlIG9sZEZlYXR1cmUgPSBwZW5kaW5nQ2hhbmdlLmdldE9sZEZlYXR1cmUoKTsKLQkJSUZlYXR1cmUgbmV3RmVhdHVyZSA9IHBlbmRpbmdDaGFuZ2UuZ2V0RmVhdHVyZSgpOwotCQlpZiAob2xkRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkvLyBXZSBzaG91bGQgaW5zdGFsbCBpbnRvIHRoZSBzYW1lIHNpdGUgYXMKLQkJCS8vIHRoZSBvbGQgZmVhdHVyZQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZ2V0Q29uZmlnU2l0ZShvbGRGZWF0dXJlLCBjb25maWcpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nRXhjZXB0aW9uKGUpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhpcyBpcyBhIG5ldyBpbnN0YWxsLiBDaGVjayBpZiB0aGVyZSBpcyAKLQkJLy8gYSBkaXNhYmxlZCBmZWF0dXJlIHdpdGggdGhlIHNhbWUgSUQKLQkJU3RyaW5nIG5ld0ZlYXR1cmVJRCA9Ci0JCQluZXdGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBzYW1lU2l0ZSA9IGdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIG5ld0ZlYXR1cmVJRCk7Ci0JCWlmIChzYW1lU2l0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2FtZVNpdGU7Ci0JCX0KLQotCQlpZiAoY2hlY2tBZmZpbml0eUZlYXR1cmUpIHsKLQkJCXJldHVybiBnZXRBZmZpbml0eVNpdGUoY29uZmlnLCBuZXdGZWF0dXJlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJQ29uZmlndXJlZFNpdGUgZ2V0QWZmaW5pdHlTaXRlKAotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLAotCQlJRmVhdHVyZSBuZXdGZWF0dXJlKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBhZmZpbml0eSBmZWF0dXJlIGlzIGluc3RhbGxlZAotCQlTdHJpbmcgYWZmaW5pdHlJRCA9IG5ld0ZlYXR1cmUuZ2V0QWZmaW5pdHlGZWF0dXJlKCk7Ci0JCWlmIChhZmZpbml0eUlEICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBhZmZpbml0eVNpdGUgPQotCQkJCWdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIGFmZmluaXR5SUQpOwotCQkJaWYgKGFmZmluaXR5U2l0ZSAhPSBudWxsKQotCQkJCXJldHVybiBhZmZpbml0eVNpdGU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBpZiB0aGlzIGlzIGEgcGF0Y2gsIGNvbGxvY2F0ZSB3aXRoIHRoZSBmZWF0dXJlCi0JCQlJRmVhdHVyZSBwYXRjaGVkRmVhdHVyZSA9IGdldFBhdGNoZWRGZWF0dXJlKG5ld0ZlYXR1cmUpOwotCQkJaWYgKHBhdGNoZWRGZWF0dXJlICE9IG51bGwpCi0JCQkJcmV0dXJuIGdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIHBhdGNoZWRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbmZpZ3VyZWRTaXRlIGdldFNpdGVXaXRoRmVhdHVyZSgKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJU3RyaW5nIGZlYXR1cmVJRCkgewotCQlpZiAoZmVhdHVyZUlEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gc2l0ZXNbaV07Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOwotCQkJCXRyeSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJaWYgKGZlYXR1cmVJRAotCQkJCQkJLmVxdWFscygKLQkJCQkJCQlmZWF0dXJlCi0JCQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJCQkJLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCS8vIGZvdW5kIGl0Ci0JCQkJCQlyZXR1cm4gc2l0ZTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlsb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgY29sbGVjdE9sZEZlYXR1cmVzKAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZSwKLQkJQXJyYXlMaXN0IHJlc3VsdCkKLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQotCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsKLQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGluY2x1ZGVkW2ldOwotCi0JCQlJRmVhdHVyZSBpZmVhdHVyZTsKLQotCQkJdHJ5IHsKLQkJCQlpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWlmIChpcmVmLmlzT3B0aW9uYWwoKSkKLQkJCQkJY29udGludWU7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJCS8vIGZpbmQgb3RoZXIgZmVhdHVyZXMgYW5kIHVuY29uZmlndXJlCi0JCQlTdHJpbmcgaWQgPSBpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQlJRmVhdHVyZVtdIHNhbWVJZHMgPSBVcGRhdGVVdGlscy5zZWFyY2hTaXRlKGlkLCB0YXJnZXRTaXRlLCB0cnVlKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2FtZUlkcy5sZW5ndGg7IGorKykgewotCQkJCUlGZWF0dXJlIHNhbWVJZCA9IHNhbWVJZHNbal07Ci0JCQkJLy8gSWdub3JlIHNlbGYuCi0JCQkJaWYgKHNhbWVJZC5lcXVhbHMoaWZlYXR1cmUpKQotCQkJCQljb250aW51ZTsKLQkJCQlyZXN1bHQuYWRkKHNhbWVJZCk7Ci0JCQl9Ci0JCQljb2xsZWN0T2xkRmVhdHVyZXMoaWZlYXR1cmUsIHRhcmdldFNpdGUsIHJlc3VsdCk7Ci0JCX0KLQl9Ci0KLS8vCi0vLwlwdWJsaWMgc3RhdGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBjcmVhdGVJbnN0YWxsQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uewotLy8JCXRyeSB7Ci0vLwkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0vLwkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPQotLy8JCQkJbG9jYWxTaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsKLS8vCQkJY29uZmlnLnNldExhYmVsKFV0aWxpdGllcy5mb3JtYXQoY29uZmlnLmdldENyZWF0aW9uRGF0ZSgpKSk7Ci0vLwkJCXJldHVybiBjb25maWc7Ci0vLwkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0vLwkJCS8vIExldCBjYWxsZXJzIGhhbmRsZSBsb2dnaW5nCi0vLwkJCS8vbG9nRXhjZXB0aW9uKGUpOwotLy8JCQl0aHJvdyBlOwotLy8JCX0KLS8vCX0KLQkKLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVNlYXJjaFJlcXVlc3QgY3JlYXRlTmV3VXBkYXRlc1JlcXVlc3QoSUZlYXR1cmUgW10gZmVhdHVyZXMpIHsKLQkJVXBkYXRlU2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgVXBkYXRlU2VhcmNoU2NvcGUoKTsKLQkJc2NvcGUuc2V0VXBkYXRlTWFwVVJMKFVwZGF0ZVV0aWxzLmdldFVwZGF0ZU1hcFVSTCgpKTsKLQkJVXBkYXRlc1NlYXJjaENhdGVnb3J5IGNhdGVnb3J5ID0gbmV3IFVwZGF0ZXNTZWFyY2hDYXRlZ29yeSgpOwotCQlpZiAoZmVhdHVyZXMhPW51bGwpCi0JCQljYXRlZ29yeS5zZXRGZWF0dXJlcyhmZWF0dXJlcyk7Ci0JCVVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCA9IG5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KGNhdGVnb3J5LCBzY29wZSk7Ci0JCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBFbnZpcm9ubWVudEZpbHRlcigpKTsKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTmVzdGVkQ2hpbGQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywgSUZlYXR1cmUgZmVhdHVyZSkgewotCQlJQ29uZmlndXJlZFNpdGVbXSBjc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgY3NpdGVzICE9IG51bGwgJiYgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlc1tpXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCQlmb3IgKGludCBqID0gMDsgcmVmcyAhPSBudWxsICYmIGogPCByZWZzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUlGZWF0dXJlIHBhcmVudCA9IHJlZnNbal0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCQkJCQlwYXJlbnQuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBrID0gMDsKLQkJCQkJCWNoaWxkcmVuICE9IG51bGwgJiYgayA8IGNoaWxkcmVuLmxlbmd0aDsKLQkJCQkJCWsrKykgewotCQkJCQkJSUZlYXR1cmUgY2hpbGQgPSBjaGlsZHJlbltrXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJaWYgKGZlYXR1cmUuZXF1YWxzKGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3aWxsIHJldHVybiBmYWxzZQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc09ic29sZXRlUGF0Y2hlcyhJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCS8vIENoZWNrIGFsbCB0aGUgaW5jbHVkZWQgZmVhdHVyZXMgdGhhdAotCQkvLyBhcmUgdW5jb25maWd1cmVkLCBhbmQgc2VlIGlmIHRoZWlyIHBhdGNoIAotCQkvLyByZWZlcmVuY2VzIGFyZSBiZXR0ZXIgdGhhbiB0aGUgb3JpZ2luYWwuCi0JCXRyeSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGlyZWZzID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCUlGZWF0dXJlIGlmZWF0dXJlID0gaXJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGlmZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAoIWNzaXRlLmlzQ29uZmlndXJlZChpZmVhdHVyZSkpIHsKLQkJCQkJaWYgKCFpc1BhdGNoSGFwcHkoaWZlYXR1cmUpKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gQWxsIGNoZWNrcyB3ZW50IHdlbGwKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1BhdGNoSGFwcHkoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBJZiB0aGlzIGlzIGEgcGF0Y2ggYW5kIGl0IGluY2x1ZGVzIAotCQkvLyBhbm90aGVyIHBhdGNoIGFuZCB0aGUgaW5jbHVkZWQgcGF0Y2gKLQkJLy8gaXMgZGlzYWJsZWQgYnV0IHRoZSBmZWF0dXJlIGl0IHdhcyBkZWNsYXJlZAotCQkvLyB0byBwYXRjaCBpcyBub3cgbmV3ZXIgKGFuZCBpcyBwcmVzdW1lZCB0bwotCQkvLyBjb250YWluIHRoZSBub3cgZGlzYWJsZWQgcGF0Y2gpLCBhbmQKLQkJLy8gdGhlIG5ld2VyIHBhdGNoZWQgZmVhdHVyZSBpcyBlbmFibGVkLAotCQkvLyBhICdsZWFwIG9mIGZhaXRoJyBhc3N1bXB0aW9uIGNhbiBiZQotCQkvLyBtYWRlOgotCi0JCS8vIEFsdGhvdWdoIHRoZSBpbmNsdWRlZCBwYXRjaCBpcyBkaXNhYmxlZCwKLQkJLy8gdGhlIGZlYXR1cmUgaXQgd2FzIGRlc2lnbmVkIHRvIHBhdGNoCi0JCS8vIGlzIG5vdyBuZXdlciBhbmQgbW9zdCBsaWtlbHkgY29udGFpbnMKLQkJLy8gdGhlIGVxdWl2YWxlbnQgZml4IGFuZCBtb3JlLiBDb25zZXF1ZW50bHksCi0JCS8vIHdlIGNhbiBjbGFpbSB0aGF0IHRoZSBzdGF0dXMgYW5kIHRoZSBlcnJvcgotCQkvLyBpY29uIG92ZXJsYXkgYXJlIG1pc2xlYWRpbmcgYmVjYXVzZQotCQkvLyBhbGwgdGhlIHJpZ2h0IHBsdWctaW5zIGFyZSBjb25maWd1cmVkLgotCQlJSW1wb3J0W10gaW1wb3J0cyA9IGZlYXR1cmUuZ2V0SW1wb3J0cygpOwotCQlJSW1wb3J0IHBhdGNoUmVmZXJlbmNlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW1wb3J0IGlpbXBvcnQgPSBpbXBvcnRzW2ldOwotCQkJaWYgKGlpbXBvcnQuaXNQYXRjaCgpKSB7Ci0JCQkJcGF0Y2hSZWZlcmVuY2UgPSBpaW1wb3J0OwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChwYXRjaFJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHJlZlZpZCA9IHBhdGNoUmVmZXJlbmNlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQotCQkvLyBGaW5kIHRoZSBwYXRjaGVkIGZlYXR1cmUgYW5kIAotCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBmZWF0dXJlLmdldFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJaWYgKGNzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBjcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNyZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSBjcmVmID0gY3JlZnNbaV07Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIGN2aWQgPSBjcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCWlmIChjdmlkLmdldElkZW50aWZpZXIoKS5lcXVhbHMocmVmVmlkLmdldElkZW50aWZpZXIoKSkpIHsKLQkJCQkvLyBUaGlzIGlzIHRoZSBvbmUuCi0JCQkJaWYgKGN2aWQuZ2V0VmVyc2lvbigpLmlzR3JlYXRlclRoYW4ocmVmVmlkLmdldFZlcnNpb24oKSkpIHsKLQkJCQkJLy8gQmluZ286IHdlIGZvdW5kIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUKLQkJCQkJLy8gYW5kIGl0cyB2ZXJzaW9uIGlzIGdyZWF0ZXIgLSAKLQkJCQkJLy8gd2UgY2FuIGFzc3VtZSB0aGF0IGl0IGNvbnRhaW5zIGJldHRlciBjb2RlCi0JCQkJCS8vIHRoYW4gdGhlIHBhdGNoIHRoYXQgcmVmZXJlbmNlZCB0aGUKLQkJCQkJLy8gb2xkZXIgdmVyc2lvbi4KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRVcGRhdGVNYXBVUkwoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBtYXBGaWxlID0gcHJlZi5nZXRTdHJpbmcoVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCk7Ci0JCWlmIChtYXBGaWxlIT1udWxsICYmIG1hcEZpbGUubGVuZ3RoKCk+MCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgZGVjb2RlZEZpbGUgPSBVUkxEZWNvZGVyLmRlY29kZShtYXBGaWxlLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgVVJMKGRlY29kZWRGaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJfQotCQkJY2F0Y2goVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkRmVhdHVyZUNvbnRlbnQoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCWZpbmFsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCi0JCXRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJLy8gb25seSBkb3dubG9hZHMgb3VyIGtub3duIGZlYXR1cmUgdHlwZXMKLQkJaWYgKCEoZmVhdHVyZSBpbnN0YW5jZW9mIEZlYXR1cmUpKQotCQkJcmV0dXJuOwotCQkJCi0JCS8vREVCVUcKLQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpIHsKLQkJCVVwZGF0ZUNvcmUuZGVidWcoCi0JCQkJIkRvd25sb2FkaW5nLi4uOiIgKyBmZWF0dXJlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJUHJvZ3Jlc3NNb25pdG9yIHBtID0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCQkJCXJldHVybiBwcm9ncmVzcy5pc0NhbmNlbGVkKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgYW4gSW5zdGFsbE1vbml0b3IJCQotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yID0gbmV3IEluc3RhbGxNb25pdG9yKHBtKTsKLQotCQkvLyBHZXQgc291cmNlIGZlYXR1cmUgcHJvdmlkZXIgYW5kIHZlcmlmaWVyLgotCQkvLyBJbml0aWFsaXplIHRhcmdldCB2YXJpYWJsZXMuCi0JCWZpbmFsIElGZWF0dXJlQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0KLQkJCWZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpOwotCQlJUGx1Z2luRW50cnlbXSB0YXJnZXRTaXRlUGx1Z2luRW50cmllcyA9IG51bGw7Ci0KLQkJLy8gZGV0ZXJtaW5lIGxpc3Qgb2YgcGx1Z2lucyB0byBpbnN0YWxsCi0JCS8vIGZpbmQgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBwbHVnaW4gZW50cmllcyBhbHJlYWR5IGNvbnRhaW5lZAotCQkvLyBvbiB0aGUgdGFyZ2V0IHNpdGUsIGFuZCBwbHVnaW4gZW50cmllcyBwYWNrYWdlZCBpbiBzb3VyY2UgZmVhdHVyZQotCQlJUGx1Z2luRW50cnlbXSBzb3VyY2VGZWF0dXJlUGx1Z2luRW50cmllcyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlID0KLQkJCWdldFNpdGVXaXRoRmVhdHVyZSgKLQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLAotCQkJCSgoRmVhdHVyZSlmZWF0dXJlKS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkgewotCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcgJiYgVXBkYXRlQ29yZS5ERUJVR19TSE9XX0lOU1RBTEwpIHsKLQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJUaGUgc2l0ZSB0byBpbnN0YWxsIGluIGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl0YXJnZXRTaXRlUGx1Z2luRW50cmllcyA9IG5ldyBJUGx1Z2luRW50cnlbMF07Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRTaXRlUGx1Z2luRW50cmllcyA9IHRhcmdldFNpdGUuZ2V0U2l0ZSgpLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJfQotCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5zVG9JbnN0YWxsID0KLQkJCVVwZGF0ZU1hbmFnZXJVdGlscy5kaWZmKAotCQkJCXNvdXJjZUZlYXR1cmVQbHVnaW5FbnRyaWVzLAotCQkJCXRhcmdldFNpdGVQbHVnaW5FbnRyaWVzKTsKLQkJSU5vblBsdWdpbkVudHJ5W10gbm9uUGx1Z2luc1RvSW5zdGFsbCA9IGZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cmllcygpOwotCi0JCS8vIERvd25sb2FkIGZlYXR1cmUgYXJjaGl2ZShzKQotCQlwcm92aWRlci5nZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhtb25pdG9yKTsKLQkJLy8gRG93bmxvYWQgcGx1Z2luIGFyY2hpdmVzCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luc1RvSW5zdGFsbC5sZW5ndGg7IGkrKykgewotCQkJcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhwbHVnaW5zVG9JbnN0YWxsW2ldLCBtb25pdG9yKTsKLQkJfQotCi0JCS8vIERvd25sb2FkIG5vbi1wbHVnaW4gYXJjaGl2ZXMuIFZlcmlmaWNhdGlvbiBoYW5kbGVkIGJ5IG9wdGlvbmFsIGluc3RhbGwgaGFuZGxlcgotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblBsdWdpbnNUb0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCXByb3ZpZGVyLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMobm9uUGx1Z2luc1RvSW5zdGFsbFtpXSwgbW9uaXRvcik7Ci0JCX0KLQotCQkvLyBEb3dubG9hZCBjaGlsZCBmZWF0dXJlcwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0gZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0KLQkJLy8gVE9ETzogY2hlY2sgaWYgdGhleSBhcmUgb3B0aW9uYWwsIGFuZCBpZiB0aGV5IHNob3VsZCBiZSBpbnN0YWxsZWQgWzIuMC4xXQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljaGlsZEZlYXR1cmUgPSBjaGlsZHJlbltpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJVXBkYXRlQ29yZS53YXJuKG51bGwsIGUpOwotCQkJfQotCQkJaWYgKGNoaWxkRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJZG93bmxvYWRGZWF0dXJlQ29udGVudChjaGlsZEZlYXR1cmUsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL0Jhc2VTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL0Jhc2VTZWFyY2hDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjAzNGY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9CYXNlU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VTZWFyY2hDYXRlZ29yeSBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hDYXRlZ29yeSB7Ci0JcHJpdmF0ZSBTdHJpbmcgaWQ7Ci0JCi0JcHJvdGVjdGVkIEJhc2VTZWFyY2hDYXRlZ29yeShTdHJpbmcgaWQpIHsKLQkJc2V0SWQoaWQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQlpZiAodGhpcy5pZD09bnVsbCkKLQkJCXRoaXMuaWQgPSBpZDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9PcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGU5Mjg2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9PcHRpb25hbEZlYXR1cmVTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi0vKioKLSAqIFNlYXJjaGVzIGZvciBvcHRpb25hbCBmZWF0dXJlcwotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkgZXh0ZW5kcyBCYXNlU2VhcmNoQ2F0ZWdvcnkgewotCXByaXZhdGUgSVVwZGF0ZVNlYXJjaFF1ZXJ5W10gcXVlcmllczsKLQlwcml2YXRlIEFycmF5TGlzdCB2aWRzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9JRCA9Ci0JCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmlmaWVkLXNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgY2xhc3MgT3B0aW9uYWxRdWVyeSBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hRdWVyeSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigKLQkJCUlTaXRlIHNpdGUsCi0JCQlTdHJpbmdbXSBjYXRlZ29yaWVzVG9Ta2lwLAotCQkJSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIsCi0JCQlJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgdmlkcy5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZpZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IChWZXJzaW9uZWRJZGVudGlmaWVyKSB2aWRzLmdldChpKTsKLQkJCQltb25pdG9yLnN1YlRhc2sodmlkLnRvU3RyaW5nKCkpOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPQotCQkJCQljcmVhdGVGZWF0dXJlKAotCQkJCQkJc2l0ZSwKLQkJCQkJCXZpZCwKLQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCWlmIChmZWF0dXJlIT1udWxsICYmIGZpbHRlci5hY2NlcHQoZmVhdHVyZSkpCi0JCQkJCWNvbGxlY3Rvci5hY2NlcHQoZmVhdHVyZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIElGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoCi0JCQlJU2l0ZSBzaXRlLAotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsCi0JCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXRyeSB7Ci0JCQkJVVJMIHNpdGVVUkwgPSBzaXRlLmdldFVSTCgpOwotCQkJCS8vVE9ETyBUaGlzIGFzc3VtcHRpb24gc3RhbmRzIG9ubHkgaW4gdGhlIGRlZmF1bHQgY2FzZQotCQkJCS8vIEluIGdlbmVyYWwsIGZlYXR1cmUgYXJjaGl2ZSBVUkwgbWF5IGJlIG1hcHBlZCBvbiBzaXRlLgotCQkJCS8vIEFsc28sIGZlYXR1cmUgdHlwZSBtYXkgYmUgc29tZXRoaW5nIGVsc2UgKG5vdCBwYWNrYWdlZCkuCi0JCQkJLy8gV2UgbWF5IG5lZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAobm90IG9ubHkgaWQgYW5kIHZlcnNpb24pCi0JCQkJLy8gaW4gb3JkZXIgdG8gY3JlYXRlIGEgZmVhdHVyZSBvbiBhIHNpdGUuCi0JCQkJU3RyaW5nIHJlbGF0aXZlID0gdmlkLnRvU3RyaW5nKCk7Ci0JCQkJVVJMIGZlYXR1cmVVUkwgPSBuZXcgVVJMKHNpdGVVUkwsICJmZWF0dXJlcy8iICsgcmVsYXRpdmUrIi5qYXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcmV0dXJuIHNpdGUuY3JlYXRlRmVhdHVyZSgKLQkJCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIiwgLy8kTk9OLU5MUy0xJAotCQkJCQlmZWF0dXJlVVJMLAotCQkJCQltb25pdG9yKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaC5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoU2l0ZSgpCi0JCSAqLwotCQlwdWJsaWMgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0UXVlcnlTZWFyY2hTaXRlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRWZXJzaW9uZWRJZGVudGlmaWVyKFZlcnNpb25lZElkZW50aWZpZXIgdmlkKSB7Ci0JCXZpZHMuYWRkKHZpZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXZpZHMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkoKSB7Ci0JCXN1cGVyKENBVEVHT1JZX0lEKTsKLQkJdmlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcXVlcmllcyA9IG5ldyBJVXBkYXRlU2VhcmNoUXVlcnlbXSB7IG5ldyBPcHRpb25hbFF1ZXJ5KCl9OwotCX0KLQotCXB1YmxpYyBJVXBkYXRlU2VhcmNoUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gcXVlcmllczsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1F1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1MWE0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvUXVlcnlVcGRhdGVTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotcHVibGljIGNsYXNzIFF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZXh0ZW5kcyBVcGRhdGVTaXRlQWRhcHRlciBpbXBsZW1lbnRzIElRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIHsKLQlwcml2YXRlIFN0cmluZyBtYXBwaW5nSWQ7Ci0KLQlwdWJsaWMgUXVlcnlVcGRhdGVTaXRlQWRhcHRlcihTdHJpbmcgbGFiZWwsIFVSTCB1cmwsIFN0cmluZyBtYXBwaW5nSWQpIHsKLQkJc3VwZXIobGFiZWwsIHVybCk7Ci0JCXRoaXMubWFwcGluZ0lkID0gbWFwcGluZ0lkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdJZCgpIHsKLQkJcmV0dXJuIG1hcHBpbmdJZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1NpdGVTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1NpdGVTZWFyY2hDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjA4OGM2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9TaXRlU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogU2VhcmNoZXMgYW4gdXBkYXRlIHNpdGUKLSAqLwotcHVibGljIGNsYXNzIFNpdGVTZWFyY2hDYXRlZ29yeSBleHRlbmRzIEJhc2VTZWFyY2hDYXRlZ29yeSB7Ci0JcHJpdmF0ZSBJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9JRCA9Ci0JCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmlmaWVkLXNlYXJjaCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXJ5IGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFF1ZXJ5IHsKLQkJcHVibGljIHZvaWQgcnVuKAotCQkJSVNpdGUgc2l0ZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXAsCi0JCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKLQkJCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJSGFzaFNldCBpZ25vcmVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCWlmIChjYXRlZ29yaWVzVG9Ta2lwICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNhdGVnb3JpZXNUb1NraXAubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWdub3Jlcy5hZGQoY2F0ZWdvcmllc1RvU2tpcFtpXSk7Ci0JCQkJfQotCQkJfQotCi0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVmcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJCWJvb2xlYW4gc2tpcEZlYXR1cmUgPSBmYWxzZTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChpZ25vcmVzLnNpemUoKSA+IDApIHsKLQkJCQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlZi5nZXRDYXRlZ29yaWVzKCk7Ci0KLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjYXRlZ29yaWVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlJQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzW2pdOwotCQkJCQkJaWYgKGlnbm9yZXMuY29udGFpbnMoY2F0ZWdvcnkuZ2V0TmFtZSgpKSkgewotCQkJCQkJCXNraXBGZWF0dXJlID0gdHJ1ZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpZiAoIXNraXBGZWF0dXJlKSB7Ci0JCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChyZWYpKSB7Ci0JCQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGZlYXR1cmUpKQotCQkJCQkJCQljb2xsZWN0b3IuYWNjZXB0KGZlYXR1cmUpOwotCQkJCQkJCW1vbml0b3Iuc3ViVGFzayhmZWF0dXJlLmdldExhYmVsKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlYXJjaC5JU2VhcmNoUXVlcnkjZ2V0U2VhcmNoU2l0ZSgpCi0JCSAqLwotCQlwdWJsaWMgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0UXVlcnlTZWFyY2hTaXRlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU2l0ZVNlYXJjaENhdGVnb3J5KCkgewotCQlzdXBlcihDQVRFR09SWV9JRCk7Ci0JCXF1ZXJpZXMgPSBuZXcgSVVwZGF0ZVNlYXJjaFF1ZXJ5W10geyBuZXcgUXVlcnkoKX07Ci0JfQotCi0JcHVibGljIElVcGRhdGVTZWFyY2hRdWVyeVtdIGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVQb2xpY3kuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVQb2xpY3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyZDY1ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWFyY2gvVXBkYXRlUG9saWN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIG9wZW5zIGNvbm5lY3Rpb24gdG8gdGhlIHVwZGF0ZSBtYXAgcmVzb3VyY2UKLSAqIGFuZCBwYXJzZXMgdGhlIGZpbGUgdG8gbG9hZCB1cGRhdGUgVVJMIG1hcHBpbmdzLgotICogVGhlc2UgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVkaXJlY3QgbmV3IHVwZGF0ZXMgc2VhcmNoCi0gKiB3aGVuIHRoZSByZWRpcmVjdGlvbiBwYXR0ZXJuIG1hdGNoZXMuCi0gKi8KLQotcHVibGljIGNsYXNzIFVwZGF0ZVBvbGljeSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19QT0xJQ1kgPSAidXBkYXRlLXBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1VSTF9NQVAgPSAidXJsLW1hcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQVRURVJOID0gInBhdHRlcm4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50QnVpbGRlckZhY3RvcnkgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNYXBTaXRlIGltcGxlbWVudHMgSVVwZGF0ZVNpdGVBZGFwdGVyIHsKLQkJcHJpdmF0ZSBVUkwgdXJsOwotCQlwdWJsaWMgTWFwU2l0ZShVUkwgdXJsKSB7Ci0JCQl0aGlzLnVybCA9IHVybDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIHVybC50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyBVUkwgZ2V0VVJMKCkgewotCQkJcmV0dXJuIHVybDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFVwZGF0ZU1hcEVudHJ5IHsKLQkJcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgc2l0ZTsKLQkJcHJpdmF0ZSBTdHJpbmcgcGF0dGVybjsKLQotCQlwdWJsaWMgVXBkYXRlTWFwRW50cnkoU3RyaW5nIHBhdHRlcm4sIFVSTCB1cmwpIHsKLQkJCXRoaXMucGF0dGVybiA9IHBhdHRlcm47Ci0JCQl0aGlzLnNpdGUgPSBuZXcgTWFwU2l0ZSh1cmwpOwotCQl9Ci0JCXB1YmxpYyBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0U2l0ZSgpIHsKLQkJCXJldHVybiBzaXRlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIGlkKSB7Ci0JCQlyZXR1cm4gaWQuc3RhcnRzV2l0aChwYXR0ZXJuKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFBhdHRlcm4oKSB7Ci0JCQlyZXR1cm4gcGF0dGVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IGVudHJpZXM7Ci0JcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgZGVmYXVsdFNpdGU7Ci0JcHJpdmF0ZSBib29sZWFuIGxvYWRlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmYWxsYmFja0FsbG93ZWQgPSB0cnVlOwotCi0JcHVibGljIFVwZGF0ZVBvbGljeSgpIHsKLQkJZW50cmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFVSTCBtYXBGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gcG9saWN5U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVJlc3BvbnNlIHJlc3BvbnNlID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXQobWFwRmlsZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMuY2hlY2tDb25uZWN0aW9uUmVzdWx0KHJlc3BvbnNlLCBtYXBGaWxlKTsKLQkJCXBvbGljeVN0cmVhbSA9IHJlc3BvbnNlLmdldElucHV0U3RyZWFtKG1vbml0b3IpOwotCQkJLy8gdGhlIHN0cmVhbSBjYW4gYmUgbnVsbCBpZiB0aGUgdXNlciBjYW5jZWxzIHRoZSBjb25uZWN0aW9uCi0JCQlpZiAocG9saWN5U3RyZWFtID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJCi0JCQlkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJRG9jdW1lbnRCdWlsZGVyIHBhcnNlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlEb2N1bWVudCBkb2MgPSBwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKHBvbGljeVN0cmVhbSkpOwotCi0JCQlwcm9jZXNzVXBkYXRlUG9saWN5KGRvYyk7Ci0JCQlsb2FkZWQgPSB0cnVlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQlQb2xpY3kuYmluZCgKLQkJCQkJIlNpdGVVUkxGYWN0b3J5LlVuYWJsZVRvQWNjZXNzU2l0ZVN0cmVhbSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbWFwRmlsZSA9PSBudWxsID8gIiIgOiBtYXBGaWxlLnRvRXh0ZXJuYWxGb3JtKCkpLCAvLyROT04tTkxTLTEkCi0JCQkJSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OLAotCQkJCWUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJUG9saWN5LmJpbmQoIlVwZGF0ZVBvbGljeS5wYXJzZVBvbGljeSIpLCAvLyROT04tTkxTLTEkCi0JCQkJMCwKLQkJCQllKTsKLQotCQl9IGNhdGNoKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJUG9saWN5LmJpbmQoIlVwZGF0ZVBvbGljeS5wYXJzZVBvbGljeSIpLCAvLyROT04tTkxTLTEkCi0JCQkJMCwKLQkJCQllKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwb2xpY3lTdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXBvbGljeVN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYWRlZCgpIHsKLQkJcmV0dXJuIGxvYWRlZDsKLQl9Ci0JCi0JLyoKLQkgKiBHaXZlbiB0aGUgZmVhdHVyZSBJRCwgcmV0dXJucyB0aGUgbWFwcGVkIHVwZGF0ZSBVUkwgaWYKLQkgKiBmb3VuZCBpbiB0aGUgbWFwcGluZ3MuIFRoaXMgVVJMIHdpbGwgYmUgdXNlZCBJTlNURUFEIG9mCi0JICogdGhlIHVwZGF0ZSBVUkwgZW5jb2RlZCBpbiB0aGUgZmVhdHVyZSBpdHNlbGYgZHVyaW5nIHRoZQotCSAqIG5ldyB1cGRhdGUgc2VhcmNoLgotCSAqIDxwPkluIGNhc2Ugb2YgbXVsdGlwbGUgbWF0Y2hlcyAoZS5nLiBvcmcuZWNsaXBzZSBhbmQgb3JnLmVjbGlwc2UucGxhdGZvcm0pCi0JICogdGhlIFVSTCBmb3IgdGhlIGxvbmdlciBwYXR0ZXJuIHdpbGwgYmUgcGlja2VkIChpLmUuIG9yZy5lY2xpcHNlLnBsYXRmb3JtKS4KLQkgKi8KLQlwdWJsaWMgSVVwZGF0ZVNpdGVBZGFwdGVyIGdldE1hcHBlZFNpdGUoU3RyaW5nIGlkKSB7Ci0JCVVwZGF0ZU1hcEVudHJ5IGxhc3RFbnRyeSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5zaXplKCk7IGkrKykgewotCQkJVXBkYXRlTWFwRW50cnkgZW50cnkgPSAoVXBkYXRlTWFwRW50cnkpIGVudHJpZXMuZ2V0KGkpOwotCQkJaWYgKGVudHJ5Lm1hdGNoZXMoaWQpKSB7Ci0JCQkJaWYgKGxhc3RFbnRyeSA9PSBudWxsKQotCQkJCQlsYXN0RW50cnkgPSBlbnRyeTsKLQkJCQllbHNlIHsKLQkJCQkJLy8gQ2hvb3NlIHRoZSBtYXRjaCB3aXRoIGxvbmdlciBwYXR0ZXJuLgotCQkJCQkvLyBGb3IgZXhhbXBsZSwgaWYgdHdvIG1hdGNoZXMgYXJlIGZvdW5kOgotCQkJCQkvLyAnb3JnLmVjbGlwc2UnIGFuZCAnb3JnLmVjbGlwc2UucGxhdGZvcm0nLAotCQkJCQkvLyBwaWNrICdvcmcuZWNsaXBzZS5wbGF0Zm9ybScuCi0JCQkJCVN0cmluZyBwYXR0ZXJuID0gZW50cnkuZ2V0UGF0dGVybigpOwotCQkJCQlTdHJpbmcgbGFzdFBhdHRlcm4gPSBsYXN0RW50cnkuZ2V0UGF0dGVybigpOwotCQkJCQlpZiAocGF0dGVybi5sZW5ndGgoKSA+IGxhc3RQYXR0ZXJuLmxlbmd0aCgpKQotCQkJCQkJbGFzdEVudHJ5ID0gZW50cnk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChsYXN0RW50cnkgIT0gbnVsbCkKLQkJCXJldHVybiBsYXN0RW50cnkuZ2V0U2l0ZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gZGVmYXVsdFNpdGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGYWxsYmFja0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxsYmFja0FsbG93ZWQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXNldCgpIHsKLQkJaWYgKGVudHJpZXMuaXNFbXB0eSgpID09IGZhbHNlKQotCQkJZW50cmllcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzVXBkYXRlUG9saWN5KERvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCU5vZGUgcm9vdCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQlyZXNldCgpOwotCQkKLQkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoVEFHX1BPTElDWSk9PWZhbHNlKQotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKCInIitUQUdfUE9MSUNZK1BvbGljeS5iaW5kKCJVcGRhdGVQb2xpY3kucG9saWN5RXhwZWN0ZWQiKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQotCQlOb2RlTGlzdCBub2RlcyA9IHJvb3QuZ2V0Q2hpbGROb2RlcygpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgdGFnID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmICh0YWcuZXF1YWxzKFRBR19VUkxfTUFQKSkKLQkJCQlwcm9jZXNzTWFwTm9kZShjaGlsZCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NNYXBOb2RlKE5vZGUgbm9kZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgcGF0dGVybiA9IGdldEF0dHJpYnV0ZShub2RlLCBBVFRfUEFUVEVSTik7Ci0JCVN0cmluZyB1cmxOYW1lID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVF9VUkwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChBVFRfUEFUVEVSTiwgcGF0dGVybik7Ci0JCWFzc2VydE5vdE51bGwoQVRUX1VSTCwgdXJsTmFtZSk7Ci0JCQotCQkvLyBlbXB0eSB1cmwgbWVhbnMgZmVhdHVyZSBpcyBub3QgdXBkYXRlYWJsZQotCQlpZiAodXJsTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJYWRkRW50cnkocGF0dGVybiwgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJU3RyaW5nIGRlY29kZWRWYWx1ZSA9IFVSTERlY29kZXIuZGVjb2RlKHVybE5hbWUsICJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgdXJsID0gbmV3IFVSTChkZWNvZGVkVmFsdWUpOwotCQkJYWRkRW50cnkocGF0dGVybiwgdXJsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiVXBkYXRlUG9saWN5LmludmFsaWRVUkwiKSt1cmxOYW1lLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYXNzZXJ0Tm90TnVsbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh2YWx1ZT09bnVsbCkKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihuYW1lK1BvbGljeS5iaW5kKCJVcGRhdGVQb2xpY3kubmFtZU5vTnVsbCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGUoTm9kZSBub2RlLCBTdHJpbmcgbmFtZSkgewotCQlOYW1lZE5vZGVNYXAgYXR0TWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgYXR0ID0gYXR0TWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJaWYgKGF0dD09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhdHQuZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVudHJ5KFN0cmluZyBwYXR0ZXJuLCBVUkwgdXJsKSB7Ci0JCWlmIChwYXR0ZXJuLmVxdWFsc0lnbm9yZUNhc2UoIioiKSkgLy8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdFNpdGUgPSBuZXcgTWFwU2l0ZSh1cmwpOwotCQllbHNlCi0JCQllbnRyaWVzLmFkZChuZXcgVXBkYXRlTWFwRW50cnkocGF0dGVybiwgdXJsKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB0aHJvd0NvcmVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmdWxsTWVzc2FnZSA9IFBvbGljeS5iaW5kKCJVcGRhdGVQb2xpY3kuVXBkYXRlUG9saWN5IikrbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihmdWxsTWVzc2FnZSwgMCwgZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZVNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YjU4YzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZVNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNpdGVBZGFwdGVyIGltcGxlbWVudHMgSVVwZGF0ZVNpdGVBZGFwdGVyIHsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFVSTCB1cmw7Ci0JCi0JcHVibGljIFVwZGF0ZVNpdGVBZGFwdGVyKFN0cmluZyBsYWJlbCwgVVJMIHVybCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLS8qCi0JcHVibGljIElTaXRlIGdldFNpdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShnZXRVUkwoKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0qLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuICIiICsgZ2V0VVJMKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VhcmNoL1VwZGF0ZXNTZWFyY2hDYXRlZ29yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU3Y2JmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlYXJjaC9VcGRhdGVzU2VhcmNoQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkgZXh0ZW5kcyBCYXNlU2VhcmNoQ2F0ZWdvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9JRCA9Ci0JCSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5uZXctdXBkYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIElGZWF0dXJlIFtdIGZlYXR1cmVzOwotCi0JY2xhc3MgQ2FuZGlkYXRlIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuOwotCQlDYW5kaWRhdGUgcGFyZW50OwotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWY7Ci0JCXB1YmxpYyBDYW5kaWRhdGUoSUZlYXR1cmVSZWZlcmVuY2UgcmVmKSB7Ci0JCQl0aGlzLnJlZiA9IHJlZjsKLQkJfQotCQlwdWJsaWMgQ2FuZGlkYXRlKElGZWF0dXJlUmVmZXJlbmNlIHJlZiwgQ2FuZGlkYXRlIHBhcmVudCkgewotCQkJdGhpcyhyZWYpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkKENhbmRpZGF0ZSBjaGlsZCkgewotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQkJY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljaGlsZC5zZXRQYXJlbnQodGhpcyk7Ci0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQl9Ci0JCXZvaWQgc2V0UGFyZW50KENhbmRpZGF0ZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBnZXRSZWZlcmVuY2UoKSB7Ci0JCQlyZXR1cm4gcmVmOwotCQl9Ci0JCXZvaWQgc2V0UmVmZXJlbmNlKElGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQkJcHVibGljIElGZWF0dXJlIGdldEZlYXR1cmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiByZWYuZ2V0RmVhdHVyZShtb25pdG9yKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBDYW5kaWRhdGUgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCQlwdWJsaWMgQ2FuZGlkYXRlIGdldFJvb3QoKSB7Ci0JCQlDYW5kaWRhdGUgcm9vdCA9IHRoaXM7Ci0KLQkJCXdoaWxlIChyb290LmdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJCQlyb290ID0gcm9vdC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCXJldHVybiByb290OwotCQl9Ci0JCXB1YmxpYyBJVVJMRW50cnkgZ2V0VXBkYXRlRW50cnkoKSB7Ci0JCQlpbnQgbG9jYXRpb24gPSBJVXBkYXRlQ29uc3RhbnRzLlNFQVJDSF9ST09UOwotCi0JCQlpZiAocmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkKLQkJCQlsb2NhdGlvbiA9Ci0JCQkJCSgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmKS5nZXRTZWFyY2hMb2NhdGlvbigpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGxvY2F0aW9uID09IElVcGRhdGVDb25zdGFudHMuU0VBUkNIX1NFTEYpIHsKLQkJCQlyZXR1cm4gZ2V0RmVhdHVyZShudWxsKS5nZXRVcGRhdGVTaXRlRW50cnkoKTsKLQkJCX0KLQkJCXJldHVybiBnZXRSb290KCkuZ2V0VXBkYXRlRW50cnkoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHJlZi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgc291cmNlKSB7Ci0JCQlpZiAoc291cmNlIGluc3RhbmNlb2YgQ2FuZGlkYXRlKSB7Ci0JCQkJcmV0dXJuIHRoaXMucmVmLmVxdWFscygoKENhbmRpZGF0ZSkgc291cmNlKS5nZXRSZWZlcmVuY2UoKSk7Ci0JCQl9Ci0JCQlpZiAoc291cmNlIGluc3RhbmNlb2YgSUZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJCQlyZXR1cm4gdGhpcy5yZWYuZXF1YWxzKHNvdXJjZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkVG9GbGF0TGlzdChBcnJheUxpc3QgbGlzdCwgYm9vbGVhbiB1cGRhdGFibGVPbmx5KSB7Ci0JCQkvLyBhZGQgaXRzZWxmCi0JCQlpZiAoIXVwZGF0YWJsZU9ubHkgfHwgaXNVcGRhdGFibGUoKSkKLQkJCQlsaXN0LmFkZCh0aGlzKTsKLQkJCS8vIGFkZCBjaGlsZHJlbgotCQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUNhbmRpZGF0ZSBjaGlsZCA9IChDYW5kaWRhdGUpIGNoaWxkcmVuLmdldChpKTsKLQkJCQkJY2hpbGQuYWRkVG9GbGF0TGlzdChsaXN0LCB1cGRhdGFibGVPbmx5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7Ci0JCQlyZXR1cm4gKHBhcmVudCA9PSBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEhpdCB7Ci0JCUlGZWF0dXJlIGNhbmRpZGF0ZTsKLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmOwotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGF0Y2hGb3I7Ci0JCWJvb2xlYW4gcGF0Y2g7Ci0JCXB1YmxpYyBIaXQoSUZlYXR1cmUgY2FuZGlkYXRlLCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJCXRoaXMuY2FuZGlkYXRlID0gY2FuZGlkYXRlOwotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQkJcHVibGljIEhpdChJRmVhdHVyZSBjYW5kaWRhdGUsIElGZWF0dXJlUmVmZXJlbmNlIHJlZiwgYm9vbGVhbiBwYXRjaCkgewotCQkJdGhpcyhjYW5kaWRhdGUsIHJlZik7Ci0JCQl0aGlzLnBhdGNoID0gcGF0Y2g7Ci0JCX0KLQotCQlwdWJsaWMgSGl0KElGZWF0dXJlIGNhbmRpZGF0ZSwgSUZlYXR1cmVSZWZlcmVuY2UgcmVmLCBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gcGF0Y2hGb3IpIHsKLQkJCXRoaXMoY2FuZGlkYXRlLCByZWYsIHRydWUpOwotCQkJdGhpcy5wYXRjaEZvciA9IHBhdGNoRm9yOwotCQl9Ci0KLQkJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBnZXRKb2IoKSB7Ci0JCQl0cnkgewotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24obnVsbCwgZmVhdHVyZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKSB7Ci0JCQlyZXR1cm4gcGF0Y2g7Ci0JCX0KLQkJcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBnZXRQYXRjaGVkSm9iKCkgewotCQkJcmV0dXJuIHBhdGNoRm9yOwotCQl9Ci0JfQotCi0JY2xhc3MgVXBkYXRlUXVlcnkgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoUXVlcnkgewotCQlJRmVhdHVyZSBjYW5kaWRhdGU7Ci0JCUlRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyIGFkYXB0ZXI7Ci0KLQkJcHVibGljIFVwZGF0ZVF1ZXJ5KAotCQkJSUZlYXR1cmUgY2FuZGlkYXRlLAotCQkJSVVSTEVudHJ5IHVwZGF0ZUVudHJ5KSB7Ci0JCQl0aGlzLmNhbmRpZGF0ZSA9IGNhbmRpZGF0ZTsKLQkJCWlmICh1cGRhdGVFbnRyeSAhPSBudWxsICYmIHVwZGF0ZUVudHJ5LmdldFVSTCgpICE9IG51bGwpCi0JCQkJYWRhcHRlciA9Ci0JCQkJCW5ldyBRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyKAotCQkJCQkJZ2V0TGFiZWxGb3JFbnRyeSh1cGRhdGVFbnRyeSksCi0JCQkJCQl1cGRhdGVFbnRyeS5nZXRVUkwoKSwKLQkJCQkJCWNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJfQotCQlwcml2YXRlIFN0cmluZyBnZXRMYWJlbEZvckVudHJ5KElVUkxFbnRyeSBlbnRyeSkgewotCQkJU3RyaW5nIGxhYmVsID0gZW50cnkuZ2V0QW5ub3RhdGlvbigpOwotCQkJaWYgKGxhYmVsID09IG51bGwgfHwgbGFiZWwubGVuZ3RoKCkgPT0gMCkKLQkJCQlsYWJlbCA9IGVudHJ5LmdldFVSTCgpLnRvU3RyaW5nKCk7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQlwdWJsaWMgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0UXVlcnlTZWFyY2hTaXRlKCkgewotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCX0KLQkJcHJpdmF0ZSBib29sZWFuIGlzQnJva2VuKCkgewotCQkJdHJ5IHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEZlYXR1cmVTdGF0dXMoY2FuZGlkYXRlKTsKLQkJCQlyZXR1cm4gc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaXNNaXNzaW5nT3B0aW9uYWxDaGlsZHJlbihJRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCQl0cnkgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbXSBjaGlsZHJlbiA9Ci0JCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBjaGlsZHJlbltpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlGZWF0dXJlIGNoaWxkID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQkvLyBJZiB3ZSBhcmUgaGVyZSwgdGhlIGNoaWxkIGlzIG5vdCBtaXNzaW5nLgotCQkJCQkJLy8gQ2hlY2sgaXQncyBjaGlsZHJlbiByZWN1cnNpdmVseS4KLQkJCQkJCWlmIChpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBNaXNzaW5nIGNoaWxkLiBSZXR1cm4gdHJ1ZSBpZiBvcHRpb25hbCwKLQkJCQkJCS8vIG90aGVyd2lzZSBpdCBpcyBhIGJyb2tlbiBmZWF0dXJlIHRoYXQgd2UgCi0JCQkJCQkvLyBkbyBub3QgY2FyZSBhYm91dC4KLQkJCQkJCWlmIChyZWYuaXNPcHRpb25hbCgpKSB7Ci0JCQkJCQkJcmV0dXJuIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50Lmhhc09sZGVyVmVyc2lvbihyZWYpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKAotCQkJSVNpdGUgc2l0ZSwKLQkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXAsCi0JCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKLQkJCUlVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlBcnJheUxpc3QgaGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWJvb2xlYW4gYnJva2VuID0gaXNCcm9rZW4oKTsKLQkJCWJvb2xlYW4gbWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4gPSBmYWxzZTsKLQotCQkJLy8gRG9uJ3QgYm90aGVyIHRvIGNvbXB1dGUgbWlzc2luZyBvcHRpb25hbCBjaGlsZHJlbgotCQkJLy8gaWYgdGhlIGZlYXR1cmUgaXMgYnJva2VuIC0gYWxsIHdlIHdhbnQgaXMgdG8gCi0JCQkvLyBzZWUgaWYgd2Ugc2hvdWxkIGFsbG93IHNhbWUtdmVyc2lvbiByZS1pbnN0YWxsLgotCQkJaWYgKCFicm9rZW4pCi0JCQkJbWlzc2luZ09wdGlvbmFsQ2hpbGRyZW4gPSBpc01pc3NpbmdPcHRpb25hbENoaWxkcmVuKGNhbmRpZGF0ZSk7Ci0JCQlJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHJlZnMubGVuZ3RoICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCUFycmF5TGlzdCB1cGRhdGVKb2JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHJlZnNbaV07Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGlzTmV3ZXJWZXJzaW9uKGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkscmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpIHsKLQkJCQkJCUhpdCBoID0gbmV3IEhpdChjYW5kaWRhdGUsIHJlZik7Ci0JCQkJCQloaXRzLmFkZChoKTsKLQkJCQkJCXVwZGF0ZUpvYnMuYWRkKGguZ2V0Sm9iKCkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gYWNjZXB0IHRoZSBzYW1lIGZlYXR1cmUgaWYgdGhlIGluc3RhbGxlZAotCQkJCQkJLy8gZmVhdHVyZSBpcyBicm9rZW4KLQkJCQkJCWlmICgoYnJva2VuIHx8IG1pc3NpbmdPcHRpb25hbENoaWxkcmVuKQotCQkJCQkJCSYmIGNhbmRpZGF0ZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZXF1YWxzKAotCQkJCQkJCQlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSl7Ci0JCQkJCQkJaGl0cy5hZGQobmV3IEhpdChjYW5kaWRhdGUsIHJlZikpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY2hlY2sgZm9yIHBhdGNoZXMKLQkJCQkJCQlpZiAoaXNQYXRjaChjYW5kaWRhdGUsIHJlZikpewotCQkJCQkJCQloaXRzLmFkZChuZXcgSGl0KGNhbmRpZGF0ZSwgcmVmLCB0cnVlKSk7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCQotCQkJfQotCQkJLy8gYWNjZXB0IHBhdGNoZXMgZm9yIHVwZGF0ZWQgZmVhdHVyZXMKLQkJCWZvciAoaW50IG4gPSAwOyBuIDwgdXBkYXRlSm9icy5zaXplKCk7IG4rKykgewotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSB1cGRhdGVKb2JzCi0JCQkJCQkuZ2V0KG4pOwotCQkJCQlJRmVhdHVyZSBuZXdDYW5kaWRhdGUgPSBqb2IuZ2V0RmVhdHVyZSgpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJCQkJaWYgKGlzUGF0Y2gobmV3Q2FuZGlkYXRlLCByZWYpKSB7Ci0JCQkJCQkJSGl0IGggPSBuZXcgSGl0KG5ld0NhbmRpZGF0ZSwgcmVmLCBqb2IpOwotCQkJCQkJCWhpdHMuYWRkKGgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQkJLy9tb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJfQotCQkJaWYgKGhpdHMuc2l6ZSgpID4gMCkgewotCQkJCWNvbGxlY3RWYWxpZEhpdHMoaGl0cywgZmlsdGVyLCBjb2xsZWN0b3IpOwotCQkJfQotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IGNhbmRpZGF0ZXM7Ci0KLQlwdWJsaWMgVXBkYXRlc1NlYXJjaENhdGVnb3J5KCkgewotCQlzdXBlcihDQVRFR09SWV9JRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RWYWxpZEhpdHMoCi0JCUFycmF5TGlzdCBoaXRzLAotCQlJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwKLQkJSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBoaXRzLnRvQXJyYXkoKTsKLQkJSUZlYXR1cmUgdG9wSGl0ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBoaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQlIaXQgaGl0ID0gKEhpdCkgaGl0cy5nZXQoaSk7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gaGl0LmdldEpvYigpOwotCQkJaWYgKGpvYiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gZG8gbm90IGFjY2VwdCB1cGRhdGVzIHdpdGhvdXQgYSBsaWNlbnNlCi0JCQlpZiAoIVVwZGF0ZVV0aWxzLmhhc0xpY2Vuc2Uoam9iLmdldEZlYXR1cmUoKSkpIHsKLQkJCQlVcGRhdGVDb3JlLmxvZyhqb2IuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSArICI6ICIgKyBQb2xpY3kuYmluZCgiRGVmYXVsdEZlYXR1cmVQYXJzZXIuTm9MaWNlbnNlVGV4dCIpLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJU3RhdHVzIHN0YXR1czsKLQkJCWlmKCBoaXQuZ2V0UGF0Y2hlZEpvYigpPT1udWxsKXsKLQkJCQlzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdJbnN0YWxsKGpvYi5nZXRPbGRGZWF0dXJlKCksIGpvYi5nZXRGZWF0dXJlKCkpOwotCQkJfWVsc2V7Ci0JCQkJc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhuZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW117aGl0LmdldFBhdGNoZWRKb2IoKSwgam9ifSk7Ci0JCQkJCQkKLQkJCX0KLQkJCWlmIChzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJCWlmIChoaXQuaXNQYXRjaCgpKSB7Ci0JCQkJCUlGZWF0dXJlIHBhdGNoID0gam9iLmdldEZlYXR1cmUoKTsKLQkJCQkJLy8gRG8gbm90IGFkZCB0aGUgcGF0Y2ggaWYgYWxyZWFkeSBpbnN0YWxsZWQKLQkJCQkJSUZlYXR1cmVbXSBzYW1lSWQgPSBVcGRhdGVVdGlscy5nZXRJbnN0YWxsZWRGZWF0dXJlcyhwYXRjaCwgZmFsc2UpOwotCQkJCQlpZiAoc2FtZUlkLmxlbmd0aD09MCkgewotCQkJCQkJaWYgKGZpbHRlci5hY2NlcHQocGF0Y2gpKQotCQkJCQkJCWNvbGxlY3Rvci5hY2NlcHQocGF0Y2gpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRvcEhpdCA9PSBudWxsKSB7Ci0JCQkJCXRvcEhpdCA9IGpvYi5nZXRGZWF0dXJlKCk7Ci0JCQkJCWlmIChmaWx0ZXIuYWNjZXB0KHRvcEhpdCkpCi0JCQkJCQljb2xsZWN0b3IuYWNjZXB0KHRvcEhpdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gaXNpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljb250cmlidXRlQ2FuZGlkYXRlcyhpc2l0ZXNbaV0pOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKAotCQkJCVBvbGljeS5iaW5kKCJVcGRhdGVzU2VhcmNoQ2F0ZWdvcnkuZXJyb3JTZWFyY2hpbmdGb3JVcGRhdGVzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQllKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb250cmlidXRlQ2FuZGlkYXRlcyhJQ29uZmlndXJlZFNpdGUgaXNpdGUpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZzID0gaXNpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCUFycmF5TGlzdCBjYW5kaWRhdGVzUGVyU2l0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJLy8gRG9uJ3Qgd2FzdGUgdGltZSBzZWFyY2hpbmcgZm9yIHVwZGF0ZXMgdG8gCi0JCQkvLyBwYXRjaGVzLgotCQkJdHJ5IHsKLQkJCQlpZiAoVXBkYXRlVXRpbHMuaXNQYXRjaChyZWYuZ2V0RmVhdHVyZShudWxsKSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJQ2FuZGlkYXRlIGMgPSBuZXcgQ2FuZGlkYXRlKHJlZik7Ci0JCQljYW5kaWRhdGVzUGVyU2l0ZS5hZGQoYyk7Ci0JCX0KLQkJLy8gQ3JlYXRlIGEgdHJlZSBmcm9tIGEgZmxhdCBsaXN0Ci0JCWJ1aWxkSGllcmFyY2h5KGNhbmRpZGF0ZXNQZXJTaXRlKTsKLQkJLy8gQWRkIHRoZSByZW1haW5pbmcgcm9vdCBjYW5kaWRhdGVzIHRvIAotCQkvLyB0aGUgZ2xvYmFsIGxpc3Qgb2YgY2FuZGlkYXRlcy4KLQkJY2FuZGlkYXRlcy5hZGRBbGwoY2FuZGlkYXRlc1BlclNpdGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEhpZXJhcmNoeShBcnJheUxpc3QgY2FuZGlkYXRlcykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDYW5kaWRhdGVbXSBhcnJheSA9Ci0JCQkoQ2FuZGlkYXRlW10pIGNhbmRpZGF0ZXMudG9BcnJheShuZXcgQ2FuZGlkYXRlW2NhbmRpZGF0ZXMuc2l6ZSgpXSk7Ci0JCS8vIGZpbHRlciBvdXQgaW5jbHVkZWQgZmVhdHVyZXMgc28gdGhhdCBvbmx5IHRvcC1sZXZlbCBmZWF0dXJlcyByZW1haW4gb24gdGhlIGxpc3QKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJQ2FuZGlkYXRlIHBhcmVudCA9IGFycmF5W2ldOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IHBhcmVudC5nZXRGZWF0dXJlKG51bGwpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpbmNsdWRlZCA9Ci0JCQkJZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGluY2x1ZGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUZlYXR1cmVSZWZlcmVuY2UgZnJlZiA9IGluY2x1ZGVkW2pdOwotCQkJCUNhbmRpZGF0ZSBjaGlsZCA9IGZpbmRDYW5kaWRhdGUoY2FuZGlkYXRlcywgZnJlZik7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCQkJcGFyZW50LmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkLnNldFJlZmVyZW5jZShmcmVmKTsKLQkJCQkJY2FuZGlkYXRlcy5yZW1vdmUoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQlwcml2YXRlIENhbmRpZGF0ZSBmaW5kQ2FuZGlkYXRlKEFycmF5TGlzdCBsaXN0LCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgYyA9IChDYW5kaWRhdGUpIGxpc3QuZ2V0KGkpOwotCQkJaWYgKGMucmVmLmVxdWFscyhyZWYpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJVXBkYXRlU2VhcmNoUXVlcnlbXSBnZXRRdWVyaWVzKCkgewotCQlpbml0aWFsaXplKCk7Ci0JCUFycmF5TGlzdCBhbGxDYW5kaWRhdGVzID0gZ2V0QWxsQ2FuZGlkYXRlcygpOwotCi0JCUlVcGRhdGVTZWFyY2hRdWVyeVtdIHF1ZXJpZXMgPQotCQkJbmV3IElVcGRhdGVTZWFyY2hRdWVyeVthbGxDYW5kaWRhdGVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcXVlcmllcy5sZW5ndGg7IGkrKykgewotCQkJQ2FuZGlkYXRlIGNhbmRpZGF0ZSA9IChDYW5kaWRhdGUpIGFsbENhbmRpZGF0ZXMuZ2V0KGkpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOwotCQkJSVVSTEVudHJ5IHVwZGF0ZUVudHJ5ID0gY2FuZGlkYXRlLmdldFVwZGF0ZUVudHJ5KCk7Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJcXVlcmllc1tpXSA9IG51bGw7Ci0JCQl9IGVsc2UgewotCQkJCXF1ZXJpZXNbaV0gPSBuZXcgVXBkYXRlUXVlcnkoZmVhdHVyZSwgdXBkYXRlRW50cnkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLQkKLS8qKgotICogU2V0cyB0aGUgZmVhdHVyZXMgZm9yIHdoaWNoIG5ldyB1cGRhdGVzIG5lZWQgdG8gYmUgZm91bmQuIElmCi0gKiBub3Qgc2V0LCB1cGRhdGVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGFsbCB0aGUgaW5zdGFsbGVkCi0gKiBhbmQgY29uZmlndXJlZCBmZWF0dXJlcy4KLSAqIEBwYXJhbSBmZWF0dXJlcyB0aGUgZmVhdHVyZXMgdG8gc2VhcmNoIHVwZGF0ZXMgZm9yCi0gKi8JCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZXMoSUZlYXR1cmUgW10gZmVhdHVyZXMpIHsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQkKLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiBmZWF0dXJlcyBmb3Igd2hpY2ggdXBkYXRlcyBuZWVkIHRvCi0gKiBiZSBmb3VuZC4gCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmVzIG9yIDxzYW1wPm51bGw8L3NhbXA+IGlmIG5vdAotICogc2V0LgotICovCQotCXB1YmxpYyBJRmVhdHVyZSBbXSBnZXRGZWF0dXJlcygpIHsKLQkJcmV0dXJuIGZlYXR1cmVzOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZnZpCi0JICogQHBhcmFtIGN2aQotCSAqIEByZXR1cm4gZnZpIDwgY3ZpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmV3ZXJWZXJzaW9uKAotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGZ2aSwKLQkJVmVyc2lvbmVkSWRlbnRpZmllciBjdmkpIHsKLQkJaWYgKCFmdmkuZ2V0SWRlbnRpZmllcigpLmVxdWFscyhjdmkuZ2V0SWRlbnRpZmllcigpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZnYgPSBmdmkuZ2V0VmVyc2lvbigpOwotCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBjdiA9IGN2aS5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBtb2RlID0gZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCk7Ci0JCWJvb2xlYW4gZ3JlYXRlciA9IGN2LmlzR3JlYXRlclRoYW4oZnYpOwotCQlpZiAoIWdyZWF0ZXIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChtb2RlLmVxdWFscyhVcGRhdGVDb3JlLkVRVUlWQUxFTlRfVkFMVUUpKQotCQkJcmV0dXJuIGN2LmlzRXF1aXZhbGVudFRvKGZ2KTsKLQkJZWxzZSBpZiAobW9kZS5lcXVhbHMoVXBkYXRlQ29yZS5DT01QQVRJQkxFX1ZBTFVFKSkKLQkJCXJldHVybiBjdi5pc0NvbXBhdGlibGVXaXRoKGZ2KTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1BhdGNoKElGZWF0dXJlIGNhbmRpZGF0ZSwgSVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZikgewotCQlpZiAocmVmLmlzUGF0Y2goKSA9PSBmYWxzZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCWlmKCBVcGRhdGVVdGlscy5pc1BhdGNoKGNhbmRpZGF0ZSwgZmVhdHVyZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQkvLyBDaGVjayBpZiBwYXRjaCBpcyBmb3IgY2hpbGRyZW4KLQkJCXRyeSB7Ci0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGNoaWxkcmVuID0KLQkJCQkJY2FuZGlkYXRlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgY3JlZiA9IGNoaWxkcmVuW2ldOwotCQkJCQl0cnkgewotCQkJCQkJSUZlYXR1cmUgY2hpbGQgPSBjcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCQlpZiAoaXNQYXRjaChjaGlsZCwgcmVmKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VXBkYXRlVmVyc2lvbnNNb2RlKCkgewotCQlQcmVmZXJlbmNlcyBzdG9yZSA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHN0b3JlLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TKTsKLQl9Ci0vKgotICogVGhpcyBtZXRob2QgcmVjdXJzaXZlbHkgd2Fsa3MgdGhlIGxpc3Qgb2YgY2FuZGlkYXRlcwotICogYnVpbGRpbmcgdGhlIGZsYXQgdGhhdCBzdGFydHMgd2l0aCB0aGUgcm9vdHMgYnV0Ci0gKiBhbHNvIGluY2x1ZGVzIGFsbCB0aGUgY2hpbGRyZW4gdGhhdCBhcmUgdXBkYXRhYmxlCi0gKiAodXNlICdpbmNsdWRlJyBjbGF1c2Ugd2l0aCBhIG1hdGNoIHRoYXQgaXMgbm90ICdwZXJmZWN0JykuCi0gKi8KLQlwcml2YXRlIEFycmF5TGlzdCBnZXRBbGxDYW5kaWRhdGVzKCkgewotCQlBcnJheUxpc3Qgc2VsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGk9MDsgaTxjYW5kaWRhdGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlDYW5kaWRhdGUgYyA9IChDYW5kaWRhdGUpY2FuZGlkYXRlcy5nZXQoaSk7Ci0JCQlpZiAoaXNPblRoZUxpc3QoYykpCi0JCQkJYy5hZGRUb0ZsYXRMaXN0KHNlbGVjdGVkLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWQ7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc09uVGhlTGlzdChDYW5kaWRhdGUgYykgewotCQlpZiAoZmVhdHVyZXM9PW51bGwpIHJldHVybiB0cnVlOwotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZDsKLQkJdHJ5IHsKLQkJCXZpZCA9IGMuZ2V0UmVmZXJlbmNlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgZnZpZCA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJaWYgKGZ2aWQuZXF1YWxzKHZpZCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9DZXJ0aWZpY2F0ZVBhaXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0NlcnRpZmljYXRlUGFpci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWU0ZTA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0NlcnRpZmljYXRlUGFpci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKLSAKLSBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Lio7Ci0gCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBDZXJ0aWZpY2F0ZVBhaXIgewotCXByaXZhdGUgQ2VydGlmaWNhdGUgcm9vdDsKLQlwcml2YXRlIENlcnRpZmljYXRlIGlzc3VlcjsKLQkKLQkKLQotCS8qKgotCSAqIEdldHMgdGhlIHJvb3QuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ2VydGlmaWNhdGUKLQkgKi8KLQlwdWJsaWMgQ2VydGlmaWNhdGUgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcm9vdC4KLQkgKiBAcGFyYW0gcm9vdCBUaGUgcm9vdCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290KENlcnRpZmljYXRlIHJvb3QpIHsKLQkJdGhpcy5yb290ID0gcm9vdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpc3N1ZXIuCi0JICogQHJldHVybiBSZXR1cm5zIGEgQ2VydGlmaWNhdGUKLQkgKi8KLQlwdWJsaWMgQ2VydGlmaWNhdGUgZ2V0SXNzdWVyKCkgewotCQlyZXR1cm4gaXNzdWVyOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGlzc3Vlci4KLQkgKiBAcGFyYW0gaXNzdWVyIFRoZSBpc3N1ZXIgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SXNzdWVyKENlcnRpZmljYXRlIGlzc3VlcikgewotCQl0aGlzLmlzc3VlciA9IGlzc3VlcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCi0JCWlmIChvYmo9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJCi0JCWlmICghKG9iaiBpbnN0YW5jZW9mIENlcnRpZmljYXRlUGFpcikpIHJldHVybiBmYWxzZTsKLQkJCi0JCWlmIChyb290PT1udWxsIHx8IGlzc3Vlcj09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQkKLQkJQ2VydGlmaWNhdGVQYWlyIHBhaXIgPSAoQ2VydGlmaWNhdGVQYWlyKW9iajsKLQkJCi0JCXJldHVybiAocm9vdC5lcXVhbHMocGFpci5nZXRSb290KCkpICYmIGlzc3Vlci5lcXVhbHMocGFpci5nZXRJc3N1ZXIoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3OTkzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS50ZXh0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlBvbGljeTsKLQotLyoqCi0gKiBSZXN1bHQgb2YgdGhlIHNlcnZpY2UKLSAqLwotcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblJlc3VsdCBpbXBsZW1lbnRzIElWZXJpZmljYXRpb25SZXN1bHQgewotCi0KLQlwcml2YXRlIGludCByZXN1bHRDb2RlOwotCXByaXZhdGUgaW50IHZlcmlmaWNhdGlvbkNvZGU7Ci0JcHJpdmF0ZSBFeGNlcHRpb24gcmVzdWx0RXhjZXB0aW9uOwotCXByaXZhdGUgTGlzdCAvKm9mIENlcnRpZmljYXRlc1tdICovCi0JY2VydGlmaWNhdGVzOwotCXByaXZhdGUgQ2VydGlmaWNhdGVQYWlyW10gcm9vdENlcnRpZmljYXRlczsKLQlwcml2YXRlIENlcnRpZmljYXRlUGFpciBmb3VuZENlcnRpZmljYXRlOyAvLyBjZXJ0aWZpY2F0ZSBmb3VuZCBpbiBvbmUga2V5c3RvcmUKLQkKLQlwcml2YXRlIFN0cmluZyBzaWduZXJJbmZvOwotCXByaXZhdGUgU3RyaW5nIHZlcmlmaWVySW5mbzsKLQlwcml2YXRlIENvbnRlbnRSZWZlcmVuY2UgY29udGVudFJlZmVyZW5jZTsKLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0JcHJpdmF0ZSBib29sZWFuIGZlYXR1cmVWZXJpZmljYXRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGFscmVhZHlTZWVuOwotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlc3VsdENvZGUoKSB7Ci0JCXJldHVybiByZXN1bHRDb2RlOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBFeGNlcHRpb24gZ2V0VmVyaWZpY2F0aW9uRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gcmVzdWx0RXhjZXB0aW9uOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlc3VsdENvZGUoaW50IG5ld1Jlc3VsdENvZGUpIHsKLQkJcmVzdWx0Q29kZSA9IG5ld1Jlc3VsdENvZGU7Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0RXhjZXB0aW9uKEV4Y2VwdGlvbiBuZXdSZXN1bHRFeGNlcHRpb24pIHsKLQkJcmVzdWx0RXhjZXB0aW9uID0gbmV3UmVzdWx0RXhjZXB0aW9uOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmVyaWZpY2F0aW9uQ29kZSgpIHsKLQkJcmV0dXJuIHZlcmlmaWNhdGlvbkNvZGU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWZXJpZmljYXRpb25Db2RlKGludCB2ZXJpZmljYXRpb25Db2RlKSB7Ci0JCXRoaXMudmVyaWZpY2F0aW9uQ29kZSA9IHZlcmlmaWNhdGlvbkNvZGU7Ci0JfQotCi0JLyoKLQkgKiBhZGRzIGFuIGFycmF5IG9mIENlcnRpZmljYXRlcyB0byB0aGUgbGlzdAotCSAqIGZvcmNlIHJlY29tcHV0YXRpb24gb2Ygcm9vdCBjZXJ0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ2VydGlmaWNhdGVzKENlcnRpZmljYXRlW10gY2VydHMpIHsKLQkJaWYgKGNlcnRpZmljYXRlcyA9PSBudWxsKQotCQkJY2VydGlmaWNhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQljZXJ0aWZpY2F0ZXMuYWRkKGNlcnRzKTsKLQkJcm9vdENlcnRpZmljYXRlcyA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHJvb3QgY2VydGlmaWNhdGVzCi0JICogVGhlIGxpc3Qgb2YgY2VydGlmaWNhdGVzIHdlIHJlY2VpdmVkIGlzIGFuIGFycmF5IG9mIGNlcnRpZmljYXRlcwotCSAqIHdlIGhhdmUgdG8gZGV0ZXJtaW5lIAotCSAqIDEpIGhvdyBtYW55IGNoYWluIGRvIHdlIGhhdmUgKGEgY2hhaW4gc3RvcHMgd2hlbiB2ZXJpZmllciBvZiBhIGNlcnQgaXMgCi0JICogbm90IHRoZSBzaWduZXIgb2YgdGhlIG5leHQgY2VydCBpbiB0aGUgbGlzdCAKLQkgKiAyKSBidWlsZCBhIGNlcnQgd2l0aCB0aGUgbGVhZiBzaWduZXIgYW5kIHRoZSByb290IHZlcmlmaWVyIGZvciBlYWNoIGNoYWluCi0JICovCi0JcHVibGljIENlcnRpZmljYXRlUGFpcltdIGdldFJvb3RDZXJ0aWZpY2F0ZXMoKSB7Ci0JCWlmIChyb290Q2VydGlmaWNhdGVzID09IG51bGwpIHsKLQkJCXJvb3RDZXJ0aWZpY2F0ZXMgPSBuZXcgQ2VydGlmaWNhdGVQYWlyWzBdOwkJCQotCQkJTGlzdCByb290Q2VydGlmaWNhdGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChjZXJ0aWZpY2F0ZXMgIT0gbnVsbCAmJiBjZXJ0aWZpY2F0ZXMuc2l6ZSgpID4gMCkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBjZXJ0aWZpY2F0ZXMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQotCQkJCQlDZXJ0aWZpY2F0ZVtdIGNlcnRzID0gKENlcnRpZmljYXRlW10pIGl0ZXIubmV4dCgpOwotCQkJCQlpZiAoY2VydHMgIT0gbnVsbCAmJiBjZXJ0cy5sZW5ndGggPiAwKSB7Ci0KLQkJCQkJCUNlcnRpZmljYXRlUGFpciBwYWlyID0gbmV3IENlcnRpZmljYXRlUGFpcigpOwotCQkJCQkJcGFpci5zZXRJc3N1ZXIoY2VydHNbMF0pOwotCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNlcnRzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCQkJCVg1MDlDZXJ0aWZpY2F0ZSB4NTA5Y2VydFJvb3QgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1tpXTsKLQkJCQkJCQlYNTA5Q2VydGlmaWNhdGUgeDUwOWNlcnRJc3N1ZXIgPSAoWDUwOUNlcnRpZmljYXRlKSBjZXJ0c1tpKzFdOwotCQkJCQkJCWlmICgheDUwOWNlcnRSb290LmdldElzc3VlckROKCkuZXF1YWxzKHg1MDljZXJ0SXNzdWVyLmdldFN1YmplY3RETigpKSkgewotCQkJCQkJCQlwYWlyLnNldFJvb3QoeDUwOWNlcnRSb290KTsKLQkJCQkJCQkJaWYgKCFyb290Q2VydGlmaWNhdGVzTGlzdC5jb250YWlucyhwYWlyKSkgewotCQkJCQkJCQkJcm9vdENlcnRpZmljYXRlc0xpc3QuYWRkKHBhaXIpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXBhaXIgPSBuZXcgQ2VydGlmaWNhdGVQYWlyKCk7Ci0JCQkJCQkJCXBhaXIuc2V0SXNzdWVyKHg1MDljZXJ0SXNzdWVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8vIGFkZCB0aGUgbGF0ZXN0IG9uZQotCQkJCQkJaWYgKHBhaXIgIT0gbnVsbCkgewotCQkJCQkJCXBhaXIuc2V0Um9vdChjZXJ0c1tjZXJ0cy5sZW5ndGggLSAxXSk7Ci0JCQkJCQkJaWYgKCFyb290Q2VydGlmaWNhdGVzTGlzdC5jb250YWlucyhwYWlyKSkgewotCQkJCQkJCQlyb290Q2VydGlmaWNhdGVzTGlzdC5hZGQocGFpcik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQkKLQkJCWlmIChyb290Q2VydGlmaWNhdGVzTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJcm9vdENlcnRpZmljYXRlcyA9IG5ldyBDZXJ0aWZpY2F0ZVBhaXJbcm9vdENlcnRpZmljYXRlc0xpc3Quc2l6ZSgpXTsJCQkJCi0JCQkJcm9vdENlcnRpZmljYXRlc0xpc3QudG9BcnJheShyb290Q2VydGlmaWNhdGVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdENlcnRpZmljYXRlczsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ2VydGlmaWNhdGVQYWlyIGdldEZvdW5kQ2VydGlmaWNhdGUoKSB7Ci0JCXJldHVybiBmb3VuZENlcnRpZmljYXRlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm91bmRDZXJ0aWZpY2F0ZShDZXJ0aWZpY2F0ZVBhaXIgZm91bmRDZXJ0aWZpY2F0ZSkgewotCQl0aGlzLmZvdW5kQ2VydGlmaWNhdGUgPSBmb3VuZENlcnRpZmljYXRlOwotCX0KLQotCi0JLyoKLQkgKiBJbml0aWFsaXplcyB0aGUgc2lnbmVySW5mbyBhbmQgdGhlIFZlcmlmaWVySW5mbyBmcm9tIHRoZSBDZXJ0aWZpY2F0ZSBQYWlyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDZXJ0aWZpY2F0ZXMoKXsKLQkJWDUwOUNlcnRpZmljYXRlIGNlcnRSb290ID0gbnVsbDsKLQkJWDUwOUNlcnRpZmljYXRlIGNlcnRJc3N1ZXIgPSBudWxsOwotCQlDZXJ0aWZpY2F0ZVBhaXIgdHJ1c3RlZENlcnRpZmljYXRlOwotCQlpZiAoZ2V0Rm91bmRDZXJ0aWZpY2F0ZSgpID09IG51bGwpIHsKLQkJCUNlcnRpZmljYXRlUGFpcltdIGNlcnRzID0gZ2V0Um9vdENlcnRpZmljYXRlcygpOwotCQkJaWYgKGNlcnRzLmxlbmd0aCA9PSAwKQotCQkJCXJldHVybjsKLQkJCXRydXN0ZWRDZXJ0aWZpY2F0ZSA9IGNlcnRzWzBdOwotCQl9IGVsc2UgewotCQkJdHJ1c3RlZENlcnRpZmljYXRlID0gZ2V0Rm91bmRDZXJ0aWZpY2F0ZSgpOwotCQl9Ci0JCWNlcnRSb290ID0gKFg1MDlDZXJ0aWZpY2F0ZSkgdHJ1c3RlZENlcnRpZmljYXRlLmdldFJvb3QoKTsKLQkJY2VydElzc3VlciA9IChYNTA5Q2VydGlmaWNhdGUpIHRydXN0ZWRDZXJ0aWZpY2F0ZS5nZXRJc3N1ZXIoKTsKLQotCQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3RyYi5hcHBlbmQoaXNzdWVyU3RyaW5nKGNlcnRJc3N1ZXIuZ2V0U3ViamVjdEROKCkpKTsKLQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlzdHJiLmFwcGVuZChQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uUmVzdWx0LlZhbGlkQmV0d2VlbiIsIGRhdGVTdHJpbmcoY2VydElzc3Vlci5nZXROb3RCZWZvcmUoKSksIGRhdGVTdHJpbmcoY2VydElzc3Vlci5nZXROb3RBZnRlcigpKSkpOyAvLyROT04tTkxTLTEkCi0JCXN0cmIuYXBwZW5kKGNoZWNrVmFsaWRpdHkoY2VydElzc3VlcikpOwotCQlzaWduZXJJbmZvID0gc3RyYi50b1N0cmluZygpOwotCQlpZiAoY2VydElzc3VlciAhPSBudWxsICYmICFjZXJ0SXNzdWVyLmVxdWFscyhjZXJ0Um9vdCkpIHsKLQkJCXN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CQotCQkJc3RyYi5hcHBlbmQoaXNzdWVyU3RyaW5nKGNlcnRJc3N1ZXIuZ2V0SXNzdWVyRE4oKSkpOwotCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyYi5hcHBlbmQoUG9saWN5LmJpbmQoIkphclZlcmlmaWNhdGlvblJlc3VsdC5WYWxpZEJldHdlZW4iLCBkYXRlU3RyaW5nKGNlcnRSb290LmdldE5vdEJlZm9yZSgpKSwgZGF0ZVN0cmluZyhjZXJ0Um9vdC5nZXROb3RBZnRlcigpKSkpOyAvLyROT04tTkxTLTEkIAotCQkJc3RyYi5hcHBlbmQoY2hlY2tWYWxpZGl0eShjZXJ0Um9vdCkpOwotCQkJdmVyaWZpZXJJbmZvID0gc3RyYi50b1N0cmluZygpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgYSBTdHJpbmcgdG8gc2hvdyBpZiB0aGUgY2VydGlmaWNhdGUgaXMgdmFsaWQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjaGVja1ZhbGlkaXR5KFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0KSB7Ci0KLQkJdHJ5IHsKLQkJCWNlcnQuY2hlY2tWYWxpZGl0eSgpOwotCQl9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4cGlyZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuICgiXHJcbiIgKyBQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uUmVzdWx0LkV4cGlyZWRDZXJ0aWZpY2F0ZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQl9IGNhdGNoIChDZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAoIlxyXG4iICsgUG9saWN5LmJpbmQoIkphclZlcmlmaWNhdGlvblJlc3VsdC5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCX0KLQkJcmV0dXJuICgiXHJcbiIgKyBQb2xpY3kuYmluZCgiSmFyVmVyaWZpY2F0aW9uUmVzdWx0LkNlcnRpZmljYXRlVmFsaWQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbGFiZWwgU3RyaW5nIGZyb20gYSBYNTBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgaXNzdWVyU3RyaW5nKFByaW5jaXBhbCBwcmluY2lwYWwpIHsKLS8vIDE5OTAyCi0vLwkJdHJ5IHsKLS8vCQkJaWYgKHByaW5jaXBhbCBpbnN0YW5jZW9mIFg1MDBOYW1lKSB7Ci0vLwkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotLy8JCQkJWDUwME5hbWUgbmFtZSA9IChYNTAwTmFtZSkgcHJpbmNpcGFsOwotLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRETlF1YWxpZmllcigpICE9IG51bGwpID8gbmFtZS5nZXRETlF1YWxpZmllcigpICsgIiwgIiA6ICIiKTsKLS8vCQkJCWJ1Zi5hcHBlbmQobmFtZS5nZXRDb21tb25OYW1lKCkpOwotLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRPcmdhbml6YXRpb25hbFVuaXQoKSAhPSBudWxsKSA/ICIsICIgKyBuYW1lLmdldE9yZ2FuaXphdGlvbmFsVW5pdCgpIDogIiIpOwotLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRPcmdhbml6YXRpb24oKSAhPSBudWxsKSA/ICIsICIgKyBuYW1lLmdldE9yZ2FuaXphdGlvbigpIDogIiIpOwotLy8JCQkJYnVmLmFwcGVuZCgobmFtZS5nZXRMb2NhbGl0eSgpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0TG9jYWxpdHkoKSA6ICIiKTsKLS8vCQkJCWJ1Zi5hcHBlbmQoKG5hbWUuZ2V0Q291bnRyeSgpICE9IG51bGwpID8gIiwgIiArIG5hbWUuZ2V0Q291bnRyeSgpIDogIiIpOwotLy8JCQkJcmV0dXJuIG5ldyBTdHJpbmcoYnVmKTsKLS8vCQkJfQotLy8JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLwkJCVVwZGF0ZUNvcmUud2FybigiRXJyb3IgcGFyc2luZyBYNTAwIENlcnRpZmljYXRlIixlKTsKLS8vCQl9Ci0JCXJldHVybiBwcmluY2lwYWwudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRhdGVTdHJpbmcoRGF0ZSBkYXRlKSB7Ci0JCXJldHVybiBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdChkYXRlKTsKLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaWduZXJJbmZvKCkgewotCQlpZiAoc2lnbmVySW5mbz09bnVsbCkgaW5pdGlhbGl6ZUNlcnRpZmljYXRlcygpOwotCQlyZXR1cm4gc2lnbmVySW5mbzsKLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJpZmllckluZm8oKSB7Ci0JCWlmIChzaWduZXJJbmZvPT1udWxsKSBpbml0aWFsaXplQ2VydGlmaWNhdGVzKCk7CQkKLQkJcmV0dXJuIHZlcmlmaWVySW5mbzsKLQl9Ci0KLQkvKgotCSAqCi0JICovCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2UgZ2V0Q29udGVudFJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGNvbnRlbnRSZWZlcmVuY2U7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50UmVmZXJlbmNlKENvbnRlbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCXRoaXMuY29udGVudFJlZmVyZW5jZSA9IHJlZjsKLQl9Ci0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpIHsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmVhdHVyZVZlcmlmaWNhdGlvbigpIHsKLQkJcmV0dXJuIGZlYXR1cmVWZXJpZmljYXRpb247Ci0JfQotCQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaXNGZWF0dXJlVmVyaWZpY2F0aW9uKGJvb2xlYW4gZmVhdHVyZVZlcmlmaWNhdGlvbikgewotCQl0aGlzLmZlYXR1cmVWZXJpZmljYXRpb24gPSBmZWF0dXJlVmVyaWZpY2F0aW9uOwotCX0KLQotCS8qCi0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhbHJlYWR5U2VlbigpIHsKLQkJcmV0dXJuIGFscmVhZHlTZWVuOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWxyZWFkeVNlZW4oYm9vbGVhbiBzZWVuKSB7Ci0JCXJldHVybiB0aGlzLmFscmVhZHlTZWVuID0gc2VlbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9KYXJWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzdkYTdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0phclZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlBvbGljeTsKLQotLyoqCi0gKiBUaGUgSmFyVmVyaWZpZXIgd2lsbCBjaGVjayB0aGUgaW50ZWdyaXR5IG9mIHRoZSBKQVIuCi0gKiBJZiB0aGUgSmFyIGlzIHNpZ25lZCBhbmQgdGhlIGludGVncml0eSBpcyB2YWxpZGF0ZWQsCi0gKiBpdCB3aWxsIGNoZWNrIGlmIG9uZSBvZiB0aGUgY2VydGlmaWNhdGUgb2YgZWFjaCBmaWxlCi0gKiBpcyBpbiBvbmUgb2YgdGhlIGtleXN0b3JlLgotICoKLSAqLwotCi1wdWJsaWMgY2xhc3MgSmFyVmVyaWZpZXIgZXh0ZW5kcyBWZXJpZmllciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1QgPSAiTUVUQS1JTkYiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEphclZlcmlmaWNhdGlvblJlc3VsdCByZXN1bHQ7Ci0JcHJpdmF0ZSBMaXN0IC8qb2YgQ2VydGlmaWNhdGVQYWlyKi8KLQl0cnVzdGVkQ2VydGlmaWNhdGVzOwotCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRVbnNpZ25lZEZpbGVzOwotCXByaXZhdGUgTGlzdCAvKiBvZiBLZXlTdG9yZSAqLwotCWxpc3RPZktleXN0b3JlczsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcjsKLQlwcml2YXRlIEZpbGUgamFyRmlsZTsKLQotCS8qCi0JICogRGVmYXVsdCBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmllcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiB0aGUga2V5c3RvcmVzLgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRLZXlTdG9yZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChsaXN0T2ZLZXlzdG9yZXMgPT0gbnVsbCkgewotCQkJbGlzdE9mS2V5c3RvcmVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCUtleVN0b3JlcyBsaXN0T2ZLZXlzdG9yZUhhbmRsZXMgPSBuZXcgS2V5U3RvcmVzKCk7Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQlLZXlTdG9yZSBrZXlzdG9yZSA9IG51bGw7Ci0JCQlLZXlzdG9yZUhhbmRsZSBoYW5kbGUgPSBudWxsOwotCQkJd2hpbGUgKGxpc3RPZktleXN0b3JlSGFuZGxlcy5oYXNOZXh0KCkpIHsKLQkJCQl0cnkgewotCQkJCQloYW5kbGUgPSBsaXN0T2ZLZXlzdG9yZUhhbmRsZXMubmV4dCgpOwotCQkJCQlpbiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0KGhhbmRsZS5nZXRMb2NhdGlvbigpKS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQl0cnkgewotCQkJCQkJa2V5c3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShoYW5kbGUuZ2V0VHlwZSgpKTsKLQkJCQkJCWtleXN0b3JlLmxvYWQoaW4sIG51bGwpOyAvLyBubyBwYXNzd29yZAotCQkJCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWVyLlVuYWJsZVRvRmluZEVuY3J5cHRpb24iLCBoYW5kbGUuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIkphclZlcmlmaWVyLlVuYWJsZVRvTG9hZENlcnRpZmljYXRlIiwgaGFuZGxlLmdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmllci5VbmFibGVUb0ZpbmRQcm92aWRlckZvcktleXN0b3JlIiwgaGFuZGxlLmdldFR5cGUoKSksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCX0gLy8gbm90aGluZwotCQkJCQkJfQotCQkJCQl9IC8vIHRyeSBsb2FkaW5nIGEga2V5U3RvcmUKLQotCQkJCQkvLyBrZXlzdG9yZSB3YXMgbG9hZGVkCi0JCQkJCWxpc3RPZktleXN0b3Jlcy5hZGQoa2V5c3RvcmUpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90aGluZy4uLiBpZiB0aGUga2V5c3RvcmUgZG9lc24ndCBleGlzdCwgY29udGludWUJCi0JCQkJfQotCi0JCQl9IC8vIHdoaWxlIGFsbCBrZXkgc3RvcmVzCi0KLQkJfQotCi0JCXJldHVybiBsaXN0T2ZLZXlzdG9yZXM7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJcmVzdWx0ID0gbnVsbDsKLQkJdHJ1c3RlZENlcnRpZmljYXRlcyA9IG51bGw7Ci0JCWFjY2VwdFVuc2lnbmVkRmlsZXMgPSBmYWxzZTsKLQkJbGlzdE9mS2V5c3RvcmVzID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIGluaXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdChJRmVhdHVyZSBmZWF0dXJlLCBDb250ZW50UmVmZXJlbmNlIGNvbnRlbnRSZWYpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJamFyRmlsZSA9IG51bGw7Ci0JCWlmIChjb250ZW50UmVmIGluc3RhbmNlb2YgSmFyQ29udGVudFJlZmVyZW5jZSkgewotCQkJSmFyQ29udGVudFJlZmVyZW5jZSBqYXJSZWZlcmVuY2UgPSAoSmFyQ29udGVudFJlZmVyZW5jZSkgY29udGVudFJlZjsKLQkJCXRyeSB7Ci0JCQkJamFyRmlsZSA9IGphclJlZmVyZW5jZS5hc0ZpbGUoKTsKLQkJCQlpZiAoVXBkYXRlQ29yZS5ERUJVRyAmJiBVcGRhdGVDb3JlLkRFQlVHX1NIT1dfSU5TVEFMTCkKLQkJCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQXR0ZW1wdGluZyB0byByZWFkIEpBUiBmaWxlOiIramFyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJCS8vICMgb2YgZW50cmllcwotCQkJCWlmICghamFyRmlsZS5leGlzdHMoKSkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCQkJSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZShqYXJGaWxlKTsKLQkJCQlpZiAoamFyICE9bnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlqYXIuY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJCS8vIHVuY2hlY2tlZAotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpewotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmllci5JbnZhbGlkSmFyIiwgamFyUmVmZXJlbmNlLnRvU3RyaW5nKCkpLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSmFyVmVyaWZpZXIuVW5hYmxlVG9BY2Nlc3NKYXIiLCBqYXJSZWZlcmVuY2UudG9TdHJpbmcoKSksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXN1bHQgPSBuZXcgSmFyVmVyaWZpY2F0aW9uUmVzdWx0KCk7Ci0JCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUik7Ci0JCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24obnVsbCk7Ci0JCXJlc3VsdC5zZXRGZWF0dXJlKGZlYXR1cmUpOwotCQlyZXN1bHQuc2V0Q29udGVudFJlZmVyZW5jZShjb250ZW50UmVmKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBvbmUgb2YgdGhlIGNlcnRpZmljYXRlIGV4aXN0cyBpbiB0aGUga2V5c3RvcmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXhpc3RzSW5LZXlzdG9yZShDZXJ0aWZpY2F0ZSBjZXJ0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlMaXN0IGtleVN0b3JlcyA9IGdldEtleVN0b3JlcygpOwotCQkJaWYgKCFrZXlTdG9yZXMuaXNFbXB0eSgpKSB7Ci0JCQkJSXRlcmF0b3IgbGlzdE9mS2V5c3RvcmVzID0ga2V5U3RvcmVzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGxpc3RPZktleXN0b3Jlcy5oYXNOZXh0KCkpIHsKLQkJCQkJS2V5U3RvcmUga2V5c3RvcmUgPSAoS2V5U3RvcmUpIGxpc3RPZktleXN0b3Jlcy5uZXh0KCk7Ci0KLQkJCQkJaWYgKGtleXN0b3JlLmdldENlcnRpZmljYXRlQWxpYXMoY2VydCkgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKEtleVN0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJKYXJWZXJpZmllci5LZXlTdG9yZU5vdExvYWRlZCIpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgTGlzdCByZWFkSmFyRmlsZShKYXJGaWxlIGphckZpbGUsIFN0cmluZyBpZGVudGlmaWVyKQotCQl0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsKLQkJSmFyRW50cnkgY3VycmVudEVudHJ5ID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJbW9uaXRvci5zZXRUYXNrTmFtZShQb2xpY3kuYmluZCgiSmFyVmVyaWZpZXIuVmVyaWZ5IiwgaWRlbnRpZmllciA9PSBudWxsID8gamFyRmlsZS5nZXROYW1lKCk6IGlkZW50aWZpZXIpKTsgLy8kTk9OLU5MUy0xJCAKLQotCQl0cnkgewotCQkJd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQljdXJyZW50RW50cnkgPSAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKTsKLQkJCQlsaXN0LmFkZChjdXJyZW50RW50cnkpOwotCQkJCWluID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShjdXJyZW50RW50cnkpOwotCQkJCXdoaWxlICgoaW4ucmVhZChidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpKSAhPSAtMSkgewotCQkJCQkvLyBTZWN1cml0eSBlcnJvciB0aHJvd24gaWYgdGVtcGVyZWQKLQkJCQl9Ci0JCQkJaWYgKGluIT1udWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlVOS05PV05fRVJST1IpOwotCQkJcmVzdWx0LnNldFJlc3VsdEV4Y2VwdGlvbihlKTsKLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qCi0JICogQHBhcmFtIG5ld01vbml0b3Igb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbmV3TW9uaXRvcikgewotCQltb25pdG9yID0gbmV3TW9uaXRvcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVZlcmlmaWVyI3ZlcmlmeShJRmVhdHVyZSxDb250ZW50UmVmZXJlbmNlLGJvb2xlYW4sIEluc3RhbGxNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmeSgKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJQ29udGVudFJlZmVyZW5jZSByZWZlcmVuY2UsCi0JCWJvb2xlYW4gaXNGZWF0dXJlVmVyaWZpY2F0aW9uLAotCQlJbnN0YWxsTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkvLyBpZiBwYXJlbnQga25vd3MgaG93IHRvIHZlcmlmeSwgYXNrIHRoZSBwYXJlbnQgZmlyc3QKLQkJaWYgKGdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJCUlWZXJpZmljYXRpb25SZXN1bHQgdnIgPQotCQkJCWdldFBhcmVudCgpLnZlcmlmeShmZWF0dXJlLCByZWZlcmVuY2UsIGlzRmVhdHVyZVZlcmlmaWNhdGlvbiwgbW9uaXRvcik7Ci0JCQlpZiAodnIuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpICE9IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQpCi0JCQkJcmV0dXJuIHZyOwotCQl9Ci0KLQkJLy8gdGhlIHBhcmVudCBjb3VsZG4ndCB2ZXJpZnkKLQkJc2V0TW9uaXRvcihtb25pdG9yKTsKLQkJaW5pdChmZWF0dXJlLCByZWZlcmVuY2UpOwotCQlyZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKGlzRmVhdHVyZVZlcmlmaWNhdGlvbik7Ci0KLQkJaWYgKGphckZpbGUhPW51bGwpIHsKLQkJCQlyZXN1bHQgPSB2ZXJpZnkoamFyRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgcmVmZXJlbmNlLmdldElkZW50aWZpZXIoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfVU5SRUNPR05JWkVEKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlwcml2YXRlIEphclZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZnkoU3RyaW5nIGZpbGUsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0KLQkJdHJ5IHsKLQotCQkJLy8gdmVyaWZ5IGludGVncml0eQotCQkJdmVyaWZ5SW50ZWdyaXR5KGZpbGUsIGlkZW50aWZpZXIpOwotCi0JCQkvLyBkbyBub3QgY2xvc2UgaW5wdXQgc3RyZWFtCi0JCQkvLyBhcyB2ZXJpZnlJbnRlZ3JpdHkgYWxyZWFkeSBkaWQgaXQKLQotCQkJLy9pZiB1c2VyIGFscmVhZHkgc2FpZCB5ZXMKLQkJCXJlc3VsdC5hbHJlYWR5U2VlbihhbHJlYWR5VmFsaWRhdGVkKCkpOwotCi0JCQkvLyB2ZXJpZnkgc291cmNlIGNlcnRpZmljYXRlCi0JCQlpZiAocmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQotCQkJCT09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEKSB7Ci0JCQkJdmVyaWZ5QXV0aGVudGljYXRpb24oKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSB0aGUgZmFjdCB0aGUgZmlsZSBpcyBub3Qgc2lnbmVkLCBzbyB0aGUgdXNlciB3aWxsIG5vdCBiZSBwcm9tcHRlZCBhZ2FpbiAKLQkJCWlmIChyZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX05PVF9TSUdORUQpIHsKLQkJCQlhY2NlcHRVbnNpZ25lZEZpbGVzID0gdHJ1ZTsKLQkJCX0KLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKLQkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7Ci0JCX0KLQotCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVkVSSUZJQ0FUSU9OX0NBTkNFTExFRCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogVmVyaWZpZXMgdGhhdCBlYWNoIGZpbGUgaGFzIGF0IGxlYXN0IG9uZSBjZXJ0aWZpY2F0ZQotCSAqIHZhbGlkIGluIHRoZSBrZXlzdG9yZQotCSAqCi0JICogQXQgbGVhc3Qgb25lIGNlcnRpZmljYXRlIGZyb20gZWFjaCBDZXJ0aWZpY2F0ZSBBcnJheQotCSAqIG9mIHRoZSBKYXIgZmlsZSBtdXN0IGJlIGZvdW5kIGluIHRoZSBrbm93biBDZXJ0aWZpY2F0ZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QXV0aGVudGljYXRpb24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQ2VydGlmaWNhdGVQYWlyW10gZW50cmllcyA9IHJlc3VsdC5nZXRSb290Q2VydGlmaWNhdGVzKCk7Ci0JCWJvb2xlYW4gY2VydGlmaWNhdGVGb3VuZCA9IGZhbHNlOwotCi0JCS8vIElmIGFsbCB0aGUgY2VydGlmaWNhdGUgb2YgYW4gZW50cnkgYXJlCi0JCS8vIG5vdCBmb3VuZCBpbiB0aGUgbGlzdCBvZiBrbm93biBjZXJ0aWZjYXRlCi0JCS8vIHRoZSBjZXJ0aWZpY2F0ZSBpcyBub3QgdHJ1c3RlZCBieSBhbnkga2V5c3RvcmUuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJY2VydGlmaWNhdGVGb3VuZCA9IGV4aXN0c0luS2V5c3RvcmUoZW50cmllc1tpXS5nZXRSb290KCkpOwotCQkJaWYgKGNlcnRpZmljYXRlRm91bmQpIHsKLQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1JFQ09HTklaRUQpOwotCQkJCXJlc3VsdC5zZXRGb3VuZENlcnRpZmljYXRlKGVudHJpZXNbaV0pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogVmVyaWZpZXMgdGhlIGludGVncml0eSBvZiB0aGUgSkFSCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUludGVncml0eShTdHJpbmcgZmlsZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQotCQlKYXJGaWxlIGphckZpbGUgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQkvLyBJZiB0aGUgSkFSIGlzIHNpZ25lZCBhbmQgbm90IHZhbGlkCi0JCQkvLyBhIHNlY3VyaXR5IGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgotCQkJLy8gd2hpbGUgcmVhZGluZyBpdAotCQkJamFyRmlsZSA9IG5ldyBKYXJGaWxlKGZpbGUsIHRydWUpOwotCQkJTGlzdCBmaWxlc0luSmFyID0gcmVhZEphckZpbGUoamFyRmlsZSwgaWRlbnRpZmllcik7Ci0KLQkJCS8vIHlvdSBoYXZlIHRvIHJlYWQgYWxsIHRoZSBmaWxlcyBvbmNlCi0JCQkvLyBiZWZvcmUgZ2V0dGluZyB0aGUgY2VydGlmaWNhdGVzIAotCQkJaWYgKGphckZpbGUuZ2V0TWFuaWZlc3QoKSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlciA9IGZpbGVzSW5KYXIuaXRlcmF0b3IoKTsKLQkJCQlib29sZWFuIGNlcnRpZmljYXRlRm91bmQgPSBmYWxzZTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJSmFyRW50cnkgY3VycmVudEphckVudHJ5ID0gKEphckVudHJ5KSBpdGVyLm5leHQoKTsKLQkJCQkJQ2VydGlmaWNhdGVbXSBjZXJ0cyA9IGN1cnJlbnRKYXJFbnRyeS5nZXRDZXJ0aWZpY2F0ZXMoKTsKLQkJCQkJaWYgKChjZXJ0cyAhPSBudWxsKSAmJiAoY2VydHMubGVuZ3RoICE9IDApKSB7Ci0JCQkJCQljZXJ0aWZpY2F0ZUZvdW5kID0gdHJ1ZTsKLQkJCQkJCXJlc3VsdC5hZGRDZXJ0aWZpY2F0ZXMoY2VydHMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJU3RyaW5nIGphckVudHJ5TmFtZSA9IGN1cnJlbnRKYXJFbnRyeS5nZXROYW1lKCk7Ci0JCQkJCQlpZiAoIWphckVudHJ5TmFtZS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoTUFOSUZFU1QpCi0JCQkJCQkJJiYgIWN1cnJlbnRKYXJFbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCQkJLy8gaWYgdGhlIGphckVudHJ5IGlzIG5vdCBpbiBNQU5JRkVTVCwgY29uc2lkZXIgdGhlIHdob2xlIGZpbGUgdW5zaWduZWQJCQkJCQkJCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjZXJ0aWZpY2F0ZUZvdW5kKQotCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfU0lHTkVEX1VOUkVDT0dOSVpFRCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCk7Ci0JCQl9IGVsc2UgewotCQkJCUV4Y2VwdGlvbiBlID0gbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiSmFyVmVyaWZpZXIuSW52YWxpZEZpbGUiLCBmaWxlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuc2V0UmVzdWx0RXhjZXB0aW9uKGUpOwotCQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKTsKLQkJCQlVcGRhdGVDb3JlLndhcm4obnVsbCxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJLy8gSmFyIGZpbGUgaXMgc2lnbmVkCi0JCQkvLyBidXQgY29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBzaWduZWQKLQkJCXJlc3VsdC5zZXRWZXJpZmljYXRpb25Db2RlKElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuc2V0VmVyaWZpY2F0aW9uQ29kZShJVmVyaWZpY2F0aW9uUmVzdWx0LlZFUklGSUNBVElPTl9DQU5DRUxMRUQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldFZlcmlmaWNhdGlvbkNvZGUoSVZlcmlmaWNhdGlvblJlc3VsdC5VTktOT1dOX0VSUk9SKTsKLQkJCXJlc3VsdC5zZXRSZXN1bHRFeGNlcHRpb24oZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoamFyRmlsZSE9bnVsbCl7Ci0JCQkJdHJ5IHtqYXJGaWxlLmNsb3NlKCk7fSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7fQotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5VmFsaWRhdGVkKCkgewotCi0JCWlmIChyZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpID09IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9OT1RfU0lHTkVEKQotCQkJcmV0dXJuIChhY2NlcHRVbnNpZ25lZEZpbGVzKTsKLQotCQlpZiAoZ2V0VHJ1c3RlZENlcnRpZmljYXRlcygpICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCUNlcnRpZmljYXRlUGFpcltdIGphclBhaXJzID0gcmVzdWx0LmdldFJvb3RDZXJ0aWZpY2F0ZXMoKTsKLQotCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBub3QgYSB1c2VyIGFjY2VwdGVkIGNlcnRpZmljYXRlIGZvciB0aGlzIGZlYXR1cmUJCi0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlDZXJ0aWZpY2F0ZVBhaXIgdHJ1c3RlZENlcnRpZmljYXRlID0gKENlcnRpZmljYXRlUGFpcikgaXRlci5uZXh0KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXJQYWlycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAodHJ1c3RlZENlcnRpZmljYXRlLmVxdWFscyhqYXJQYWlyc1tpXSkpIHsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiBjZXJ0aWZpY2F0ZSBwYWlyIG5vdCBmb3VuZCBpbiB0cnVzdGVkIGFkZCBpdCBmb3IgbmV4dCB0aW1lCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGphclBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYWRkVHJ1c3RlZENlcnRpZmljYXRlKGphclBhaXJzW2ldKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUcnVzdGVkQ2VydGlmaWNhdGUoQ2VydGlmaWNhdGVQYWlyIHBhaXIpIHsKLQkJaWYgKHRydXN0ZWRDZXJ0aWZpY2F0ZXMgPT0gbnVsbCkKLQkJCXRydXN0ZWRDZXJ0aWZpY2F0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChwYWlyICE9IG51bGwpCi0JCQl0cnVzdGVkQ2VydGlmaWNhdGVzLmFkZChwYWlyKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkgewotCQlpZiAodHJ1c3RlZENlcnRpZmljYXRlcyA9PSBudWxsKQotCQkJdHJ1c3RlZENlcnRpZmljYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHRydXN0ZWRDZXJ0aWZpY2F0ZXM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJVmVyaWZpZXIjc2V0UGFyZW50KElWZXJpZmllcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSVZlcmlmaWVyIHBhcmVudFZlcmlmaWVyKSB7Ci0JCXN1cGVyLnNldFBhcmVudChwYXJlbnRWZXJpZmllcik7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NlY3VyaXR5L0tleVN0b3Jlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvS2V5U3RvcmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxN2NjNmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvS2V5U3RvcmVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotLyoqCi0gKiBDbGFzcyB0byBtYW5hZ2UgdGhlIGRpZmZlcmVudCBLZXlTdG9yZXMgd2Ugc2hvdWxkCi0gKiBjaGVjayBmb3IgY2VydGlmaWNhdGVzIG9mIFNpZ25lZCBKQVIKLSAqLwotcHVibGljIGNsYXNzIEtleVN0b3JlcyB7Ci0KLQotCS8qKgotCSAqIGphdmEucG9saWN5IGZpbGVzIHByb3BlcnRpZXMgb2YgdGhlIGphdmEuc2VjdXJpdHkgZmlsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBX1BPTElDWV9VUkwgPSAicG9saWN5LnVybC4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWZhdWx0IGtleXN0b3JlIHR5cGUgaW4gamF2YS5zZWN1cml0eSBmaWxlCi0JICovCQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0tFWVNUT1JFX1RZUEUgPSAia2V5c3RvcmUudHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3Qgb2YgS2V5c3RvcmVIYW5kbGUgcG9pbnRpbmcgb2YgdmFsaWQgS2V5U3RvcmVzCi0JICogdGhlIFVSTCBvZiB0aGUgS2V5c3RvcmVIYW5kbGUgaXMgbm90IHRlc3RlZCB5ZXQuLi4KLQkgKi8KLQlwcml2YXRlIExpc3QgLyogb2YgS2V5c3RvcmVIYW5kbGUgKi8gbGlzdE9mS2V5U3RvcmVzOwotCi0JLyoqCi0JICogSXRlcmF0b3IKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yIGl0ZXJhdG9yOwotCS8qKgotCSAqIEtleVN0b3JlcyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBLZXlTdG9yZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0S2V5U3RvcmVzKCk7Ci0JfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7Ci0JCWlmIChpdGVyYXRvciA9PSBudWxsKQotCQkJaXRlcmF0b3IgPSBsaXN0T2ZLZXlTdG9yZXMuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIGl0ZXJhdG9yOwotCX0KLQkvKioKLQkgKiByZXR1cm5zIHRydXMgaWYgdGhlcmUgaXMgbW9yZSBLZXlzdG9yZXMgaW4gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gZ2V0SXRlcmF0b3IoKS5oYXNOZXh0KCk7Ci0JfQotCS8qKgotCSAqIHBvcHVsYXRlIHRoZSBsaXN0IG9mIEtleXN0b3JlcwotCSAqIHNob3VsZCBiZSBkb25lIHdpdGggRGlhbG9nIHdpdGggQ2FuY2VsL1NraXAgYnV0dG9uIGlmCi0JICogdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFVSTCBpcyBkb3duLi4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0S2V5U3RvcmVzKCkgewotCi0JCWxpc3RPZktleVN0b3JlcyA9IG5ldyBBcnJheUxpc3QoNSk7Ci0KLQkJLy8gZ2V0IEpSRSBjYWNlcnRzCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsIG51bGwsIDAsIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikgKyBGaWxlLnNlcGFyYXRvciArICJsaWIiICsgRmlsZS5zZXBhcmF0b3IgKyAic2VjdXJpdHkiICsgRmlsZS5zZXBhcmF0b3IgKyAiY2FjZXJ0cyIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQlsaXN0T2ZLZXlTdG9yZXMuYWRkKG5ldyBLZXlzdG9yZUhhbmRsZSh1cmwsU2VjdXJpdHkuZ2V0UHJvcGVydHkoREVGQVVMVF9LRVlTVE9SRV9UWVBFKSkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4sIGhhcmRjb2RlZC4uLgotCQl9Ci0KLQkJLy8gZ2V0IGphdmEuaG9tZSAua2V5c3RvcmUKLQkJdHJ5IHsKLQkJCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgbnVsbCwgMCwgU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgIi5rZXlzdG9yZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJbGlzdE9mS2V5U3RvcmVzLmFkZChuZXcgS2V5c3RvcmVIYW5kbGUodXJsLFNlY3VyaXR5LmdldFByb3BlcnR5KERFRkFVTFRfS0VZU1RPUkVfVFlQRSkpKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBub3QgaGFwcGVuLCBoYXJkY29kZWQuLi4KLQkJfQotCi0JCS8vIGdldCBLZXlTdG9yZXMgZnJvbSBwb2xpY3kgZmlsZXMuLi4KLQkJaW50IGluZGV4ID0gMTsKLQkJU3RyaW5nIGphdmFfcG9saWN5ID0gU2VjdXJpdHkuZ2V0UHJvcGVydHkoSkFWQV9QT0xJQ1lfVVJMK2luZGV4KTsKLQkJd2hpbGUgKGphdmFfcG9saWN5IT1udWxsKXsKLQkJCS8vIHJldHJpZXZlIGtleXN0b3JlIHVybCBmcm9tIGphdmEucG9saWN5Ci0JCQkvLyBhbHNvIHJldHJpZXZlIGtleXN0b3JlIHR5cGUKLQkJCUtleXN0b3JlSGFuZGxlIGtleXN0b3JlID0gZ2V0S2V5c3RvcmVGcm9tTG9jYXRpb24oamF2YV9wb2xpY3kpOwotCQkJaWYgKGtleXN0b3JlIT1udWxsKXsKLQkJCQlsaXN0T2ZLZXlTdG9yZXMuYWRkKGtleXN0b3JlKTsKLQkJCX0KLQkJCWluZGV4Kys7CQotCQkJamF2YV9wb2xpY3kgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShKQVZBX1BPTElDWV9VUkwraW5kZXgpOwkJCQotCQl9Ci0KLQl9Ci0JLyoqCi0JICogcmV0dXJucyB0aGUgVVJMIGZvciB0aGUgTmV4dCBLZXlzdG9yZUhhbmRsZQotCSAqLwotCXB1YmxpYyBLZXlzdG9yZUhhbmRsZSBuZXh0KCkgewotCQlyZXR1cm4gKEtleXN0b3JlSGFuZGxlKSBnZXRJdGVyYXRvcigpLm5leHQoKTsKLQl9Ci0JCi0JLyoqCi0JICogcmV0cmlldmUgdGhlIGtleXN0b3JlIGZyb20gamF2YS5wb2xpY3kgZmlsZQotCSAqLwotCXByaXZhdGUgS2V5c3RvcmVIYW5kbGUgZ2V0S2V5c3RvcmVGcm9tTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKXsKLQkJCi0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJY2hhcltdIGJ1ZmYgPSBuZXcgY2hhcls0MDk2XTsKLQkJCi0JCQotCQlpbnQgaW5kZXhPZiQgPSBsb2NhdGlvbi5pbmRleE9mKCIkeyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBpbmRleE9mQ3VybHkgPSBsb2NhdGlvbi5pbmRleE9mKCd9JyxpbmRleE9mJCk7Ci0JCWlmIChpbmRleE9mJCE9LTEgJiYgaW5kZXhPZkN1cmx5IT0tMSl7Ci0JCQlTdHJpbmcgcHJvcCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShsb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXhPZiQrMixpbmRleE9mQ3VybHkpKTsKLQkJCVN0cmluZyBsb2NhdGlvbjIgPSBsb2NhdGlvbi5zdWJzdHJpbmcoMCxpbmRleE9mJCk7Ci0JCQlsb2NhdGlvbjIgKz0gcHJvcDsKLQkJCWxvY2F0aW9uMiArPSBsb2NhdGlvbi5zdWJzdHJpbmcoaW5kZXhPZkN1cmx5KzEpOwotCQkJbG9jYXRpb24gPSBsb2NhdGlvbjI7Ci0JCX0KLQkJCi0JCQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotCQkJaW4gPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldCh1cmwpLmdldElucHV0U3RyZWFtKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGluKTsKLQkJCWludCByZXN1bHQgPSByZWFkZXIucmVhZChidWZmKTsKLQkJCVN0cmluZ0J1ZmZlciBjb250ZW50QnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXdoaWxlIChyZXN1bHQhPS0xKXsKLQkJCQljb250ZW50QnVmZi5hcHBlbmQoYnVmZiwwLHJlc3VsdCk7Ci0JCQkJcmVzdWx0ID0gcmVhZGVyLnJlYWQoYnVmZik7CQkJCQotCQkJfQotCi0JCQlpZiAoY29udGVudEJ1ZmYubGVuZ3RoKCk+MCl7CQkJCi0JCQkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGNvbnRlbnRCdWZmKTsKLQkJCQlpbnQgaW5kZXhPZktleXN0b3JlID0gY29udGVudC5pbmRleE9mKCJrZXlzdG9yZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZGV4T2ZLZXlzdG9yZSAhPSAtMSl7Ci0JCQkJCWludCBpbmRleE9mU2VtaUNvbHVtbiA9IGNvbnRlbnQuaW5kZXhPZignOycsaW5kZXhPZktleXN0b3JlKTsKLQkJCQkJcmV0dXJuIGdldEtleXN0b3JlRnJvbVN0cmluZyhjb250ZW50LnN1YnN0cmluZyhpbmRleE9mS2V5c3RvcmUsaW5kZXhPZlNlbWlDb2x1bW4pLHVybCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7Ci0JCQlsb2coZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotCQkJLy8gdXJsLm9wZW5TdHJlYW0sIHJlYWRlci5yZWFkICh4MikKLQkJCS8vIG9ubHkgbG9nLCB0aGUga2V5c3RvcmUgbWF5IG5vdCBleGlzdAotCQkJbG9nKGUpOwkKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbiE9bnVsbCl7Ci0JCQkJdHJ5IHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKXt9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHJldHJpZXZlIHRoZSBrZXlzdG9yZSBmcm9tIGphdmEucG9saWN5IGZpbGUKLQkgKi8KLQlwcml2YXRlIEtleXN0b3JlSGFuZGxlIGdldEtleXN0b3JlRnJvbVN0cmluZyhTdHJpbmcgY29udGVudCxVUkwgcm9vdFVSTCl7Ci0JCUtleXN0b3JlSGFuZGxlIGhhbmRsZSA9IG51bGw7Ci0JCVN0cmluZyBrZXlTdG9yZVR5cGUgPSBTZWN1cml0eS5nZXRQcm9wZXJ0eShERUZBVUxUX0tFWVNUT1JFX1RZUEUpOwotCQkKLQkJCi0JCWludCBpbmRleE9mU3BhY2UgPSBjb250ZW50LmluZGV4T2YoJyAnKTsKLQkJaWYgKGluZGV4T2ZTcGFjZT09LTEpIHJldHVybiBudWxsOwotCQkKLQkJaW50IHNlY29uZFNwYWNlID0gY29udGVudC5sYXN0SW5kZXhPZignLCcpOwotCQlpZiAoc2Vjb25kU3BhY2U9PS0xKSB7Ci0JCQlzZWNvbmRTcGFjZSA9IGNvbnRlbnQubGVuZ3RoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlrZXlTdG9yZVR5cGUgPSBjb250ZW50LnN1YnN0cmluZyhzZWNvbmRTcGFjZSsxLGNvbnRlbnQubGVuZ3RoKCkpLnRyaW0oKTsKLQkJfQotCQkKLQkJVVJMIHVybCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4T2ZTcGFjZSxzZWNvbmRTcGFjZSkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7Ci0JCQlsb2coZSk7Ci0JCQkvLyB0aGUgdXJsIG1heWJlIHJlbGF0aXZlCi0JCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChyb290VVJMLGNvbnRlbnQuc3Vic3RyaW5nKGluZGV4T2ZTcGFjZSxzZWNvbmRTcGFjZSkpOwkJCQkKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSl7Ci0JCQkJbG9nKGUxKTsJCQkKLQkJCX0KLQkJfQotCi0JCWlmICh1cmwhPW51bGwpCi0JCQloYW5kbGUgPSBuZXcgS2V5c3RvcmVIYW5kbGUodXJsLGtleVN0b3JlVHlwZSk7CQkJCQotCQkJCi0JCXJldHVybiBoYW5kbGU7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgbG9nKEV4Y2VwdGlvbiBlKXsKLQkJVXBkYXRlQ29yZS53YXJuKCJDYW5ub3QgcmV0cmlldmUgYSBLZXlTdG9yZSIsZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlzdG9yZUhhbmRsZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2VjdXJpdHkvS2V5c3RvcmVIYW5kbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2MDVlZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zZWN1cml0eS9LZXlzdG9yZUhhbmRsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VjdXJpdHk7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi0KLSAKLS8qKgotICogTWFuYWdlcyBhIGhhbmRsZSB0byBhIGtleXN0b3JlCi0gKi8KLXB1YmxpYyBjbGFzcyBLZXlzdG9yZUhhbmRsZSB7Ci0JCi0JcHJpdmF0ZSBVUkwgbG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQkKLQlwdWJsaWMgS2V5c3RvcmVIYW5kbGUoVVJMIHVybCwgU3RyaW5nIHR5cGUpewotCQl0aGlzLmxvY2F0aW9uID0gdXJsOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxvY2F0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFVSTAotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsb2NhdGlvbi4KLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFVSTCBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgdHlwZS4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHR5cGUuCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JQmF0Y2hPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSUJhdGNoT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNWQ3ZjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JQmF0Y2hPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotLyoqCi0gKiBCYXRjaCBvZiBvcGVyYXRpb25zIG9uIGZlYXR1cmUuIEZvciBleGFtcGxlLCBhIGJhdGNoIGZlYXR1cmVzIGluc3RhbGxhdGlvbi4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJhdGNoT3BlcmF0aW9uICBleHRlbmRzIElPcGVyYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIGJhdGNoIG9wZXJhdGlvbnMuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRmVhdHVyZU9wZXJhdGlvbltdIGdldE9wZXJhdGlvbnMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lDb25maWdGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lDb25maWdGZWF0dXJlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZDczNWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JQ29uZmlnRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotLyoqCi0gKiBPcGVyYXRpb24gdGhhdCBlbmFibGUgYSBmZWF0dXJlIGluIGEgY29uZmlndXJhdGlvbi4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24gZXh0ZW5kcyBJRmVhdHVyZU9wZXJhdGlvbiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JRmVhdHVyZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JRmVhdHVyZU9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjk1ZDRjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSUZlYXR1cmVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gdGhhdCBhcHBsaWVzIHRvIGEgZmVhdHVyZSwgc3VjaCBhcyBpbnN0YWxsLCB1bmluc3RhbGwsIGV0Yy4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZlYXR1cmVPcGVyYXRpb24gZXh0ZW5kcyBJT3BlcmF0aW9uIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZlYXR1cmUgdG8gd2hpY2ggdGhlIG9wZXJhdGlvbiBhcHBsaWVzLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUZlYXR1cmUgZ2V0RmVhdHVyZSgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpdGUgaW4gd2hpY2ggdGhlIG9wZXJhdGlvbiBpcyBhcHBsaWVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbmZpZ3VyZWRTaXRlIGdldFRhcmdldFNpdGUoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoZSBmZWF0dXJlIChpZiBhbnkpLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUZlYXR1cmUgZ2V0T2xkRmVhdHVyZSgpOwotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgaW4gd2hpY2ggdGhlIGZlYXR1cmUgaXMgYmVpbmcgb3BlcmF0ZWQgb24uCi0JICogQHBhcmFtIHRhcmdldFNpdGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRUYXJnZXRTaXRlKElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhZDYwNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogQW4gaW5zdGFsbGF0aW9uIG9wZXJhdGlvbi4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGV4dGVuZHMgSUZlYXR1cmVPcGVyYXRpb24gewotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygb3B0aW9uYWwgZmVhdHVyZXMgdG8gYmUgaW5zdGFsbGVkLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRPcHRpb25hbEZlYXR1cmVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyMjQ4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLQotLyoqCi0gKiBCYXNlIHVwZGF0ZSBtYW5hZ2VyIG9wZXJhdGlvbi4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIHdoZW4gdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiBwcm9jZXNzZWQuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHJvY2Vzc2VkKCk7Ci0JLyoqCi0JICogTWFya3MgdGhlIG9wZXJhdGlvbiBhcyBwcm9jZXNzZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgbWFya1Byb2Nlc3NlZCgpOwotCS8qKgotCSAqIEV4ZWN1dGVzIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gcG0gUHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhlIG9wZXJhdGlvbgotCSAqIEBwYXJhbSBsaXN0ZW5lciBPcGVyYXRpb24gbGlzdGVuZXIKLQkgKiBAcmV0dXJuIHRydWUgaWYgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsIGFuZCBhIHJlc3RhcnQgaXMgbmVlZGVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwbSwgSU9wZXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25GYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjZmMzUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JT3BlcmF0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBBIGZhY3RvcnkgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBvcGVyYXRpb25zLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJT3BlcmF0aW9uRmFjdG9yeSB7Ci0JLyoqCi0JICogQ3JlYXRlcyBhICJjb25maWd1cmUgZmVhdHVyZSIgb3BlcmF0aW9uLgotCSAqIEBwYXJhbSB0YXJnZXRTaXRlCi0JICogQHBhcmFtIGZlYXR1cmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUNvbmZpZ09wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpOwotCQkKLQkvKioKLQkgKiBDcmVhdGVzIGFuICJ1bmNvbmZpZ3VyZSBmZWF0dXJlIiBvcGVyYXRpb24uCi0JICogQHBhcmFtIHRhcmdldFNpdGUKLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVVuY29uZmlnRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVVbmNvbmZpZ09wZXJhdGlvbigKLQkJSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUsCi0JCUlGZWF0dXJlIGZlYXR1cmUpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSAiaW50YWxsIGZlYXR1cmUiIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gdGFyZ2V0U2l0ZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHBhcmFtIG9wdGlvbmFsRmVhdHVyZXMKLQkgKiBAcGFyYW0gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcwotCSAqIEBwYXJhbSB2ZXJpZmllcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsCi0JCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcywKLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWVyKTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhbiAidW5pbnN0YWxsIGZlYXR1cmUiIG9wZXJhdGlvbi4KLQkgKiBAcGFyYW0gdGFyZ2V0U2l0ZQotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVVbmluc3RhbGxPcGVyYXRpb24oCi0JCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlLAotCQlJRmVhdHVyZSBmZWF0dXJlKTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhICJyZXZlcnQgZmVhdHVyZSB2ZXJzaW9uIiBvcGVyYXRpb24uCi0JICogQHBhcmFtIGZlYXR1cmUgY3VycmVudCBmZWF0dXJlCi0JICogQHBhcmFtIGFub3RoZXJGZWF0dXJlIHRoZSBuZXcgZmVhdHVyZSB0byBiZSBzd2FwcGVkIGluCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJQ29uZmlnRmVhdHVyZU9wZXJhdGlvbiBjcmVhdGVSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlKTsKLQkJCi0JLyoqCi0JICogQ3JlYXRlcyBhICJiYXRjaCBpbnN0YWxsIiBvcGVyYXRpb24uCi0JICogQHBhcmFtIG9wZXJhdGlvbnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElCYXRjaE9wZXJhdGlvbiBjcmVhdGVCYXRjaEluc3RhbGxPcGVyYXRpb24oSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BlcmF0aW9ucyk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiAiZW5hYmxlL2Rpc2FibGUgc2l0ZSIgb3BlcmF0aW9uLgotCSAqIEBwYXJhbSBzaXRlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJVG9nZ2xlU2l0ZU9wZXJhdGlvbiBjcmVhdGVUb2dnbGVTaXRlT3BlcmF0aW9uKAotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSk7Ci0JCQotCi0JLyoqCi0JICogQ3JlYXRlcyBhICJyZXZlcnQgdG8gYSBwcmV2aW91cyBjb25maWd1cmF0aW9uIiBvcGVyYXRpb24uCi0JICogQHBhcmFtIGNvbmZpZwotCSAqIEBwYXJhbSBwcm9ibGVtSGFuZGxlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24gY3JlYXRlUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbigKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZywKLQkJSVByb2JsZW1IYW5kbGVyIHByb2JsZW1IYW5kbGVyKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25MaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JT3BlcmF0aW9uTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYzZTkwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25MaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotLyoqCi0gKiBMaXN0ZW5lciBmb3Igb3BlcmF0aW9uIGxpZmVjeWNsZS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvbkxpc3RlbmVyIHsKLQkvKioKLQkgKiBNYXkgYmUgY2FsbGVkIGJlZm9yZSBhbiBvcGVyYXRpb24gc3RhcnRzIGV4ZWN1dGluZy4KLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYmVmb3JlRXhlY3V0ZShJT3BlcmF0aW9uIG9wZXJhdGlvbiwgT2JqZWN0IGRhdGEpOwotCS8qKgotCSAqIE1heSBiZSBjYWxsZWQgYWZ0ZXIgYW4gb3BlcmF0aW9uIGZpbmlzaGVzIGV4ZWN1dGluZy4KLQkgKiBAcGFyYW0gb3BlcmF0aW9uCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWZ0ZXJFeGVjdXRlKElPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgZGF0YSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JT3BlcmF0aW9uVmFsaWRhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFkYmRiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lPcGVyYXRpb25WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogT3BlcmF0aW9uIHZhbGlkYXRvci4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdGlvblZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBDYWxsZWQgYmVmb3JlIHBlcmZvcm1pbmcgaW5zdGFsbC4KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMsIG9yIG51bGwgaWYgbm8gZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nSW5zdGFsbChJRmVhdHVyZSBvbGRGZWF0dXJlLCBJRmVhdHVyZSBuZXdGZWF0dXJlKTsKLQotCS8qKgotCSAqIENhbGxlZCBiZWZvcmUgcGVyZm9ybWluZyBvcGVyYXRpb24uCi0JICogQHJldHVybiB0aGUgZXJyb3Igc3RhdHVzLCBvciBudWxsIGlmIG5vIGVycm9ycwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUGVuZGluZ0NvbmZpZyhJRmVhdHVyZSBmZWF0dXJlKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdVbmNvbmZpZyhJRmVhdHVyZSBmZWF0dXJlKTsKLQkKLQkvKioKLQkgKiBDYWxsZWQgYmVmb3JlIHBlcmZvcm1pbmcgb3BlcmF0aW9uLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVBlbmRpbmdSZXBsYWNlVmVyc2lvbihJRmVhdHVyZSBmZWF0dXJlLCBJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSk7Ci0JCi0JLyoqCi0JICogQ2FsbGVkIGJlZm9yZSBkb2luZyBhIHJldmVydC8gcmVzdG9yZSBvcGVyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMsIG9yIG51bGwgaWYgbm8gZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nUmV2ZXJ0KElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpOwotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBVSSBiZWZvcmUgZG9pbmcgYSBiYXRjaGVkIHByb2Nlc3Npbmcgb2YKLQkgKiBzZXZlcmFsIHBlbmRpbmcgY2hhbmdlcy4KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMsIG9yIG51bGwgaWYgbm8gZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQZW5kaW5nQ2hhbmdlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKTsKLQotCS8qKgotCSAqIENoZWNrIHRoZSBjdXJyZW50IHN0YXRlLgotCSAqIEByZXR1cm4gdGhlIGVycm9yIHN0YXR1cywgb3IgbnVsbCBpZiBubyBlcnJvcnMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpOwotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcGxhdGZvcm0gY29uZmlndXJhdGlvbiBoYXMgYmVlbiBtb2RpZmllZCBvdXRzaWRlIHRoaXMgcHJvZ3JhbS4KLQkgKiBAcmV0dXJuIHRoZSBlcnJvciBzdGF0dXMsIG9yIG51bGwgaWYgbm8gZXJyb3JzCi0JICovCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhYzYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnM7Ci0KLS8qKgotICogT3BlcmF0aW9uIHRoYXQgcmV2ZXJ0cyBhIGZlYXR1cmUgdG8gYW5vdGhlciB2ZXJzaW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVwbGFjZUZlYXR1cmVWZXJzaW9uT3BlcmF0aW9uIGV4dGVuZHMgSUZlYXR1cmVPcGVyYXRpb24gewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVJldmVydENvbmZpZ3VyYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY2YWRmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiBpbiB3aGljaCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIGlzIHJlcGxhY2VkIGJ5IGEgcHJldmlvdXMgb25lLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmV2ZXJ0Q29uZmlndXJhdGlvbk9wZXJhdGlvbiBleHRlbmRzIElPcGVyYXRpb24gewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVRvZ2dsZVNpdGVPcGVyYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVRvZ2dsZVNpdGVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YxNjQwYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lUb2dnbGVTaXRlT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIEFuIG9wZXJhdGlvbiBpbiB3aGljaCB0aGUgdW5jb25maWd1cmVkL2NvbmZpZ3VyZWQgc3RhdGUgb2YgYSBzaXRlIGlzIHRvZ2dsZWQuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUb2dnbGVTaXRlT3BlcmF0aW9uIGV4dGVuZHMgSU9wZXJhdGlvbiB7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA5NmQzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVbmNvbmZpZ0ZlYXR1cmVPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotLyoqCi0gKiBBbiBvcGVyYXRpb24gdGhhdCBkaXNhYmxlcyBhIGZlYXR1cmUgaW4gYSBzaXRlLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uICBleHRlbmRzIElGZWF0dXJlT3BlcmF0aW9uIHsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVbmluc3RhbGxGZWF0dXJlT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMWNlMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9JVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotCi0vKioKLSAqIEEgZmVhdHVyZSB1bmluc3RhbGwgb3BlcmF0aW9uLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBleHRlbmRzIElGZWF0dXJlT3BlcmF0aW9uIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVTklOU1RBTEwgPSAidW5pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL0lVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjhhY2VlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zOwotCi0vKioKLSAqIExpc3RlbmVyIGZvciB1cGRhdGUgbW9kZWwgY2hhbmdlcy4gCi0gKiBVc3VhbGx5LCB3aGVuIGZlYXR1cmVzIGFyZSBpbnN0YWxsZWQsIGNvbmZpZ3VyZWQsIGV0Yy4KLSAqIGEgR1VJIG1heSBuZWVkIHRvIHVwZGF0ZSBpdHMgc3RhdGUsIHNvIGl0IHdpbGwgaGF2ZSB0byByZWdpc3RlcgotICogd2l0aCB0aGUgT3BlcmF0aW9uc01hbmFnZXIgZm9yIHVwZGF0ZSBldmVudHMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIGEgZmVhdHVyZS9zaXRlL2V0Yy4gaXMgYWRkZWQKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBjaGlsZHJlbik7Ci0JLyoqCi0JICogQ2FsbGVkIGFmdGVyIGEgZmVhdHVyZS9zaXRlL2V0Yy4gaXMgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHZvaWQgb2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKTsKLQkvKioKLQkgKiBDYWxsZWQgd2hlbiB0aGVyZSBhcmUgY2hhbmdlcyB0byBhIHNpdGUvZmVhdHVyZS9ldGMuCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KTsKLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvT3BlcmF0aW9uc01hbmFnZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvT3BlcmF0aW9uc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3NDFhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9vcGVyYXRpb25zL09wZXJhdGlvbnNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogRW50cnkgcG9pbnQgZm9yIHVwZGF0ZSBtYW5hZ2VyIG9wZXJhdGlvbnMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgT3BlcmF0aW9uc01hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIElPcGVyYXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yOwotCXByaXZhdGUgc3RhdGljIElPcGVyYXRpb25GYWN0b3J5IG9wZXJhdGlvbkZhY3Rvcnk7Ci0JcHJpdmF0ZSBzdGF0aWMgVmVjdG9yIGxpc3RlbmVycyA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIHN0YXRpYyBWZWN0b3IgcGVuZGluZ09wZXJhdGlvbnMgPSBuZXcgVmVjdG9yKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpblByb2dyZXNzOwotCi0JcHJpdmF0ZSBPcGVyYXRpb25zTWFuYWdlcigpIHsKLQl9Ci0JCi0JLyoqCi0JICogRWFjaCB1cGRhdGUgb3BlcmF0aW9ucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIG9wZXJhdGlvbiBmYWN0b3J5LiAKLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gb2J0YWluIHRoZSBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU9wZXJhdGlvbkZhY3RvcnkgZ2V0T3BlcmF0aW9uRmFjdG9yeSgpIHsKLQkJaWYgKG9wZXJhdGlvbkZhY3RvcnkgPT0gbnVsbCkKLQkJCW9wZXJhdGlvbkZhY3RvcnkgPSBuZXcgT3BlcmF0aW9uRmFjdG9yeSgpOwotCQlyZXR1cm4gb3BlcmF0aW9uRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB0aGUgZmVhdHVyZSBpcyB0aGUgc3ViamVjdCBvZiBhbiB1cGRhdGUgb3BlcmF0aW9uIHN1Y2ggYXMgaW5zdGFsbCwKLQkgKiBjb25maWd1cmUsIGV0Yy4gYW5kIHJldHVybiBpdC4gQ3VycmVudGx5IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBwZW5kaW5nCi0JICogb3BlcmF0aW9uIG9uIGEgZmVhdHVyZS4KLQkgKiBAcGFyYW0gZmVhdHVyZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlT3BlcmF0aW9uIGZpbmRQZW5kaW5nT3BlcmF0aW9uKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZW5kaW5nT3BlcmF0aW9ucy5zaXplKCk7IGkrKykgewotCQkJSUZlYXR1cmVPcGVyYXRpb24gb3BlcmF0aW9uID0KLQkJCQkoSUZlYXR1cmVPcGVyYXRpb24pIHBlbmRpbmdPcGVyYXRpb25zLmVsZW1lbnRBdChpKTsKLQkJCWlmIChvcGVyYXRpb24uZ2V0RmVhdHVyZSgpLmVxdWFscyhmZWF0dXJlKSkKLQkJCQlyZXR1cm4gb3BlcmF0aW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZWdpc3RlciBhIHBlbmRpbmcgb3BlcmF0aW9uLgotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGVuZGluZ09wZXJhdGlvbihJT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlwZW5kaW5nT3BlcmF0aW9ucy5hZGQob3BlcmF0aW9uKTsKLQkJLy9maXJlT2JqZWN0c0FkZGVkKHRoaXMsIG5ldyBPYmplY3RbXSB7IGNoYW5nZSB9KTsKLQl9Ci0KLQkvKioKLQkgKiBVbnJlZ2lzdGVyIGEgcGVuZGluZyBvcGVyYXRpb24uCi0JICogQHBhcmFtIG9wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVQZW5kaW5nT3BlcmF0aW9uKElPcGVyYXRpb24gb3BlcmF0aW9uKSB7Ci0JCXBlbmRpbmdPcGVyYXRpb25zLnJlbW92ZShvcGVyYXRpb24pOwotCQkvL2ZpcmVPYmplY3RzUmVtb3ZlZCh0aGlzLCBuZXcgT2JqZWN0W10geyBjaGFuZ2UgfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1vZGVsIGNoYW5nZWQgbGlzdGVuZXIuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFuIG1vZGVsIGNoYW5nZWQgbGlzdGVuZXIuCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIG1vZGVsIGNoYW5nZWQgbGlzdGVuZXJzIHdoZW4gZmVhdHVyZXMvc2l0ZXMvZXRjLiBhcmUgYWRkZWQuCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBjaGlsZHJlbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmaXJlT2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9Ci0JCQkJKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5vYmplY3RzQWRkZWQocGFyZW50LCBjaGlsZHJlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBtb2RlbCBjaGFuZ2VkIGxpc3RlbmVycyB3aGVuIGZlYXR1cmVzL3NpdGVzL2V0YyBhcmUgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGNoaWxkcmVuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpcmVPYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPQotCQkJCShJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIub2JqZWN0c1JlbW92ZWQocGFyZW50LCBjaGlsZHJlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBtb2RlbCBjaGFuZ2VkIGxpc3RlbmVycyB3aGVuIGZlYXR1cmVzL3NpdGVzL2V0Yy4gaGF2ZSBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcGFyYW0gcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlyZU9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9Ci0JCQkJKElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcikgaXRlci5uZXh0KCk7Ci0JCQlsaXN0ZW5lci5vYmplY3RDaGFuZ2VkKG9iamVjdCwgcHJvcGVydHkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIHdoZW4gYW55IG9mIHRoZSBpbnN0YWxsIG9wZXJhdGlvbnMgcmVxdWlyZXMgYSBsaWNlbmNlIGFncmVlbWVudC4KLQkgKiBAcGFyYW0gam9icwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlVXRpbHMuaGFzTGljZW5zZShqb2JzW2ldLmdldEZlYXR1cmUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSB3aGVuIGFueSBvZiB0aGUgZmVhdHVyZXMgdG8gaW5zdGFsbCBoYXMgb3B0aW9uYWwgZmVhdHVyZXMuCi0JICogQHBhcmFtIGpvYnMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGhhc1NlbGVjdGVkSm9ic1dpdGhPcHRpb25hbEZlYXR1cmVzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlVXRpbHMuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2JzW2ldLmdldEZlYXR1cmUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2Ygb3BlcmF0aW9ucyB0aGF0IG5lZWQgYSBsaWNlbmNlIGFncmVlbWVudC4KLQkgKiBAcGFyYW0gam9icwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGdldFNlbGVjdGVkSm9ic1dpdGhMaWNlbnNlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVVdGlscy5oYXNMaWNlbnNlKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKSkKLQkJCQlsaXN0LmFkZChqb2JzW2ldKTsKLQkJfQotCQlyZXR1cm4gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdKSBsaXN0LnRvQXJyYXkoCi0JCQluZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBvcGVyYXRpb25zIHRoYXQgaGF2ZSBvcHRpb25hbCBmZWF0dXJlcyB0byBpbnN0YWxsLgotCSAqIEBwYXJhbSBqb2JzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gZ2V0U2VsZWN0ZWRKb2JzV2l0aE9wdGlvbmFsRmVhdHVyZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9icykgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlVXRpbHMuaGFzT3B0aW9uYWxGZWF0dXJlcyhqb2JzW2ldLmdldEZlYXR1cmUoKSkpCi0JCQkJbGlzdC5hZGQoam9ic1tpXSk7Ci0JCX0KLQkJcmV0dXJuIChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSkgbGlzdC50b0FycmF5KAotCQkJbmV3IElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltsaXN0LnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgYW55IG9wZXJhdGlvbnMgaXMgaW4gcHJvZ3Jlc3MuCi0JICogQHBhcmFtIGluUHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldEluUHJvZ3Jlc3MoYm9vbGVhbiBpblByb2dyZXNzKSB7Ci0JCU9wZXJhdGlvbnNNYW5hZ2VyLmluUHJvZ3Jlc3MgPSBpblByb2dyZXNzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgd2hlbiBzb21lIG9wZXJhdGlvbiBpcyBiZWluZyBleGVjdXRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzSW5Qcm9ncmVzcygpIHsKLQkJcmV0dXJuIGluUHJvZ3Jlc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3BlcmF0aW9ucyB2YWxpZGF0b3IuCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU9wZXJhdGlvblZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh2YWxpZGF0b3IgPT0gbnVsbCkKLQkJCXZhbGlkYXRvciA9IG5ldyBPcGVyYXRpb25WYWxpZGF0b3IoKTsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyBhIGN1c3RvbSBvcGVyYXRpb24gdmFsaWRhdG9yCi0JICogQHBhcmFtIHZhbGlkYXRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWYWxpZGF0b3IoSU9wZXJhdGlvblZhbGlkYXRvciB2YWxpZGF0b3IpIHsKLQkJT3BlcmF0aW9uc01hbmFnZXIudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQkKLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gCi0JICogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gdXNpbmcgdGhpcyBtZXRob2QuIE5vcm1hbGx5LCBpZiB5b3UgaW5zdGFsbCBhIG5ldwotCSAqIHBsdWdpbiBpdCBpcyBzYWZlIHRvIGRvIGl0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhcHBseUNoYW5nZXNOb3coKSB7Ci0JCUluc3RhbGxDb25maWd1cmF0aW9uLmFwcGx5Q2hhbmdlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL29wZXJhdGlvbnMvcGFja2FnZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3N2Y2MTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvb3BlcmF0aW9ucy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgdmFyaW91cyBpbnN0YWxsL3VwZGF0ZSBvcGVyYXRpb25zLgotPGgyPgotUGFja2FnZSBTcGVjaWZpY2F0aW9uPC9oMj4KLVRoaXMgcGFja2FnZSBjb250YWlucyBpbnRlcmZhY2VzIGZvciBwZXJmb3JtaW5nIHVwZGF0ZS9pbnN0YWxsIG9wZXJhdGlvbnMgCi13aXRob3V0IHVzaW5nIHRoZSBVcGRhdGUgTWFuYWdlciB1c2VyIGludGVyZmFjZS4gCi08cD4KLTxiPk5vdGU6PC9iPiBUaGlzIHBhY2thZ2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi1mcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9CYWNrTGV2ZWxGaWx0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9CYWNrTGV2ZWxGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjM2QwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvQmFja0xldmVsRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgYWRkZWQgdG8gdGhlIHVwZGF0ZSBzZWFyY2ggcmVxdWVzdAotICogdG8gZmlsdGVyIG91dCBmZWF0dXJlcyB0aGF0IGFyZSBiYWNrLWxldmVsIChhcmUKLSAqIG9sZGVyIG9yIHRoZSBzYW1lIGFzIHRoZSBmZWF0dXJlcyBhbHJlYWR5IGluc3RhbGxlZCkuCi0gKiAKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2VlIFVwZGF0ZVNlYXJjaFJlcXVlc3QKLSAqIEBzZWUgSVVwZGF0ZVNlYXJjaEZpbHRlcgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQmFja0xldmVsRmlsdGVyIGV4dGVuZHMgQmFzZUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElGZWF0dXJlUmVmZXJlbmNlIG1hdGNoKSB7Ci0JCXRyeSB7Ci0JCQlQbHVnaW5WZXJzaW9uSWRlbnRpZmllciBtYXRjaFZpZCA9IG1hdGNoLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCk7Ci0JCQlJRmVhdHVyZSBbXSBpbnN0YWxsZWQgPSBVcGRhdGVVdGlscy5nZXRJbnN0YWxsZWRGZWF0dXJlcyhtYXRjaC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCksIGZhbHNlKTsKLQkJCWlmIChpbnN0YWxsZWQubGVuZ3RoPT0wKSByZXR1cm4gdHJ1ZTsKLQkJCQotCQkJZm9yIChpbnQgaT0wOyBpPGluc3RhbGxlZC5sZW5ndGg7IGkrKykgewotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIGl2aWQgPSBpbnN0YWxsZWRbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCQlpZiAobWF0Y2hWaWQuaXNHcmVhdGVyVGhhbihpdmlkKSkKLQkJCQkJY29udGludWU7Ci0JCQkJLy8gaW5zdGFsbGVkIHZlcnNpb24gaXMgdGhlIHNhbWUgb3IgbmV3ZXIgdGhhbgotCQkJCS8vIHRoZSBtYXRjaCAtIGZpbHRlciBvdXQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvQmFzZUZpbHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0Jhc2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3OGMyMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvQmFzZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBCYXNlIGZpbHRlciBjbGFzcwotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBVcGRhdGVTZWFyY2hSZXF1ZXN0Ci0gKiBAc2VlIElVcGRhdGVTZWFyY2hGaWx0ZXIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2VGaWx0ZXIgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSUZlYXR1cmUgbWF0Y2gpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJRmVhdHVyZVJlZmVyZW5jZSBtYXRjaCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0Vudmlyb25tZW50RmlsdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvRW52aXJvbm1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE3M2U5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvRW52aXJvbm1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSBhZGRlZCB0byB0aGUgdXBkYXRlIHNlYXJjaCByZXF1ZXN0Ci0gKiB0byBmaWx0ZXIgb3V0IGZlYXR1cmVzIHRoYXQgZG8gbm90IG1hdGNoIHRoZSBjdXJyZW50Ci0gKiBlbnZpcm9ubWVudCBzZXR0aW5ncy4KLSAqIAotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgVXBkYXRlU2VhcmNoUmVxdWVzdAotICogQHNlZSBJVXBkYXRlU2VhcmNoRmlsdGVyCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnZpcm9ubWVudEZpbHRlciBleHRlbmRzIEJhc2VGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJRmVhdHVyZSBtYXRjaCkgewotCQlyZXR1cm4gVXBkYXRlTWFuYWdlclV0aWxzLmlzVmFsaWRFbnZpcm9ubWVudChtYXRjaCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lRdWVyeVVwZGF0ZVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdhNzUzYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGZvciB1cGRhdGUgc2l0ZSBhZGFwdGVyIHVzZWQgCi0gKiBmb3Igc3BlY2lmaWMgcXVlcnkgc2VyY2hlcy4gSXQgYWRkcyBhIG1hcHBpbmcgSUQgCi0gKiB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gbWFwcGluZyBmaWxlIGlzIHNwZWNpZmllZC4KLSAqIElmIGEgbWF0Y2hpbmcgbWFwcGluZyBpcyBmb3VuZCBmb3IgdGhpcyBJRCwgCi0gKiB0aGUgcmVwbGFjZW1lbnQgVVJMIGZvdW5kIGluIHRoZSBtYXBwaW5nIGZpbGUgd2lsbCBiZQotICogdXNlZCBpbnN0ZWFkIG9mIHRoaXMgYWRhcHRlci4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZXh0ZW5kcyBJVXBkYXRlU2l0ZUFkYXB0ZXIgewotLyoqCi0gKiBSZXR1cm5zIGFuIElEIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1hdGNoaW5nIGFnYWluc3QgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBhZGRyZXNzIG1hcHBpbmcgZmlsZS4KLSAqIEByZXR1cm4gYSBtYXBwaW5nIElkIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgYWRkcmVzcyBtYXBwaW5nIGZpbGUuCi0gKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdJZCgpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaENhdGVnb3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaENhdGVnb3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4OGZlZWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hDYXRlZ29yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgYSBwYXJ0aWN1bGFyIFVwZGF0ZQotICogc2VhcmNoIHBhdHRlcm4uIEVhY2ggc2VhcmNoIGNhdGVnb3J5IGlzIGZyZWUgdG8gc2NhbgotICogc2l0ZXMgdXNpbmcgYSBzcGVjaWZpYyBhbGdvcml0aG0uIFNlYXJjaCBjYXRlZ29yeSBtdXN0Ci0gKiBoYXZlIGEgdW5pcXVlIElELiBUaGUgYWN0dWFsIHNlYXJjaCBpcyBwZXJmb3JtZWQgaW4KLSAqIHNlYXJjaCBxdWVyaWVzLiBBIGNhdGVnb3J5IGNhbiBwcm92aWRlIG9uZSBvciBtb3JlCi0gKiBxdWVyaWVzIHRvIHJ1biBkdXJpbmcgdGhlIHNlYXJjaC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVXBkYXRlU2VhcmNoQ2F0ZWdvcnkgewotLyoqCi0gKiBSZXR1cm5zIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHNlYXJjaCBjYXRlZ29yeS4KLSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLS8qKgotICogQWNjZXB0cyB0aGUgaWRlbnRpZmllciBhc3NpZ25lZCB0byB0aGlzIGNhdGVnb3J5IGR1cmluZwotICogdGhlIHJlZ2lzdHJ5IHJlYWRpbmcuCi0gKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpOwotCi0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgdXBkYXRlIHNlYXJjaCBxdWVyaWVzIHRoYXQgbmVlZCB0byAKLSAqIGJlIHJ1biBkdXJpbmcgdGhlIHNlYXJjaC4KLSAqIEByZXR1cm4gYW4gYXJyeSBvZiB1cGRhdGUgc2VhcmNoIHF1ZXJpZXMKLSAqLwkKLQlJVXBkYXRlU2VhcmNoUXVlcnkgW10gZ2V0UXVlcmllcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoRmlsdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaEZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3MGFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotCi0vKioKLSAqIENsYXNzZXMgdGhhdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIHRoZQotICogcmVzdWx0cyBvZiB0aGUgdXBkYXRlIHNlYXJjaC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZVNlYXJjaEZpbHRlciB7Ci0JLyoqCi0JICogVGVzdHMgYSBmZWF0dXJlIGFjY29yZGluZyB0byB0aGlzIGZpbHRlcidzIGNyaXRlcmlhLgotCSAqIEBwYXJhbSBtYXRjaCB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICogQHJldHVybiA8c2FtcD50cnVlPC9zYW1wPiBpZiB0aGUgZmVhdHVyZSBoYXMgYmVlbiBhY2NlcHRlZCwgPHNhbXA+ZmFsc2U8L3NhbXA+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGFjY2VwdChJRmVhdHVyZSBtYXRjaCk7Ci0KLQkvKioKLQkgKiBUZXN0cyBhIGZlYXR1cmUgcmVmZXJlbmNlIGFjY29yZGluZyB0byB0aGlzIGZpbHRlcidzIGNyaXRlcmlhLiAKLQkgKiBUaGlzIGlzIGEgcHJlZmlsdGVyIHRoYXQgYWxsb3dzIHJlamVjdGluZyBhIGZlYXR1cmUgYmVmb3JlIGEgcG90ZW50aWFsbHkgbGVuZ3RoeSBkb3dubG9hZC4KLQkgKiBAcGFyYW0gbWF0Y2ggdGhlIGZlYXR1cmUgcmVmZXJlbmNlIHRvIHRlc3QKLQkgKiBAcmV0dXJuIDxzYW1wPnRydWU8L3NhbXA+IGlmIHRoZSBmZWF0dXJlIHJlZmVyZW5jZSBoYXMgYmVlbiBhY2NlcHRlZCwgPHNhbXA+ZmFsc2U8L3NhbXA+IG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGFjY2VwdChJRmVhdHVyZVJlZmVyZW5jZSBtYXRjaCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaFF1ZXJ5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWNhOTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLQotLyoqCi0gKiBBIHNlYXJjaCBxdWVyeS4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVXBkYXRlU2VhcmNoUXVlcnkgewotLyoqCi0gKiBSZXR1cm5zIGFuIHVwZGF0ZSBzaXRlIGFkYXB0ZXIgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHNjb3BlCi0gKiB3aGlsZSBydW5uaW5nIHRoaXMgcXVlcnkuIFNvbWUgc2VhcmNoIGNhdGVnb3J5IG1heSBuZWVkIHRvIAotICogc2NhbiBzcGVjaWZpYyBzaXRlIGFkYXB0ZXIgaW4gYWRkaXRpb24gdG8gdGhvc2Ugc3BlY2lmaWVkIGluIAotICogdGhlIHNlYXJjaCBzY29wZS4KLSAqIAotICogQHJldHVybiB0aGUgcXVlcnktc3BlY2lmaWMgc2l0ZSBhZGFwdGVyIG9yIDxzYW1wPm51bGw8L3NhbXA+IGlmCi0gKiBub3Qgc3BlY2lmaWVkLgotICogCi0gKi8KLQlwdWJsaWMgSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0UXVlcnlTZWFyY2hTaXRlKCk7Ci0KLS8qKgotICogRXhlY3V0ZXMgdGhlIHF1ZXJ5LiBUaGUgaW1wbGVtZW50b3JzIHNob3VsZCBzY2FuIHRoZSBwcm92aWRlZAotICogdXBkYXRlIHNpdGUgKHNjaXBwaW5nIGNlcnRhaW4gY2F0ZWdvcmllcyBpZiBwcm92aWRlZCkgYW5kCi0gKiBwYXNzIHRoZSBtYXRjaGVzIHRvIHRoZSByZXN1bHQgY29sbGVjdG9yLiBUaGUgcXVlcnkgaXMgYWxzbwotICogcmVzcG9uc2libGUgb2Ygc2NvcGluZyBhbmQgbW92aW5nIHRoZSBwcm92aWRlZCBwcm9ncmVzcyBtb25pdG9yLgotICogCi0gKiBAcGFyYW0gc2l0ZSB0aGUgdXBkYXRlIHNpdGUgdG8gc2NhbgotICogQHBhcmFtIGNhdGVnb3JpZXNUb1NraXAgYW4gYXJyYXkgb2YgY2F0ZWdvcnkgbmFtZXMgdGhhdCBuZWVkIHRvIGJlIHNraXBwZWQgb3IgPHNhbXA+bnVsbDwvc2FtcD4gaWYgY2F0ZWdvcmllcyBzaG91bGQgbm90IGJlIHRha2VuIGludG8gYWNjb3VudC4KLSAqIEBwYXJhbSBmaWx0ZXIgYSBmaWx0ZXIgdG8gYXBwbHkgYmVmb3JlIHBhc3NpbmcgdGhlIG1hdGNoIHRvIGNvbGxlY3RvcgotICogQHBhcmFtIGNvbGxlY3RvciBhbiBvYmplY3QgdGhhdCBpcyB1c2VkIGZvciByZXBvcnRpbmcgc2VhcmNoIHJlc3VsdHMKLSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciB0byByZXBvcnQgc2VhcmNoIHByb2dyZXNzIHdpdGhpbiB0aGUgcHJvdmlkZWQgc2l0ZQotICovCi0JcHVibGljIHZvaWQgcnVuKElTaXRlIHNpdGUsIFN0cmluZyBbXSBjYXRlZ29yaWVzVG9Ta2lwLCBJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlciwgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGIxZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLS8qKgotICogU2VhcmNoIHJlc3VsdHMgYXJlIGNvbGxlY3RlZCBieSBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UKLSAqIGFuZCBwYXNzaW5nIGl0IHRvIHRoZSBzZWFyY2ggcmVxdWVzdC4gSWYgdGhlIGltcGxlbWVudGF0aW9uIGlzCi0gKiB2aXN1YWwsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhlIG1hdGNoIGlzIHNob3duIGFzIHNvb24KLSAqIGFzIGl0IGlzIGNvbGxlY3RlZCAocmF0aGVyIHRoYW4ga2VwdCBpbiBhIGxpc3QgYW5kIHByZXNlbnRlZAotICogYXQgdGhlIGVuZCBvZiB0aGUgc2VhcmNoKS4KLSAgKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewotLyoqCi0gKiBDYWxsZWQgd2hlbiBhIG1hdGNoaW5nIGZlYXR1cmUgaGFzIGJlZW4gZm91bmQgZHVyaW5nCi0gKiB0aGUgc2VhcmNoLgotICogQHBhcmFtIG1hdGNoIHRoZSBtYXRjaGluZyBmZWF0dXJlCi0gKi8KLSAgIHZvaWQgYWNjZXB0KElGZWF0dXJlIG1hdGNoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvSVVwZGF0ZVNlYXJjaFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc2M2M4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2VhcmNoU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHNpdGVzIHRoYXQgbmVlZCB0byBiZQotICogc2VhcmNoZWQgd2l0aGluIHRoZSBzZWFyY2ggc2NvcGUuIEluIGFkZGl0aW9uIHRvIGJlaW5nIGFuCi0gKiB1cGRhdGUgc2l0ZSBhZGFwdGVyLCBpdCBhbHNvIHJldHVybnMgYW4gYXJyYXkgb2YgY2F0ZWdvcmllcwotICogd2l0aGluIHRoZSBzaXRlIHRoYXQgbmVlZCBub3QgYmUgc2VhcmNoZWQgKHNraXBwaW5nIGNhdGVnb3JpZXMKLSAqIG1ha2VzIHRoZSBzZWFyY2ggZmFzdGVyIGJlY2F1c2UgZmV3ZXIgZmVhdHVyZXMgbmVlZCB0bwotICogYmUgY2hlY2tlZCBhbmQgcG90ZW50aWFsbHkgZG93bmxvYWRlZCBmcm9tIHRoZSBzZXJ2ZXIpLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVXBkYXRlU2VhcmNoU2l0ZSBleHRlbmRzIElVcGRhdGVTaXRlQWRhcHRlciB7Ci0vKioKLSAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0ZWdvcmllcyB0aGF0IG5lZWQgbm90IGJlIHNlYXJjaGVkCi0gKiB3aGVuIHNjYW5uaW5nIHRoaXMgc2l0ZSBvciA8c2FtcD5udWxsPC9zYW1wPiBpZiBhbGwgdGhlCi0gKiBmZWF0dXJlcyBtdXN0IGJlIHRlc3RlZC4KLSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2F0ZWdvcnkgbmFtZXMgb3IgPHNhbXA+bnVsbDwvc2FtcD4gaWYKLSAqIGFsbCB0aGUgZmVhdHVyZXMgbXVzdCBiZSB0ZXN0ZWQuCi0gKi8KLQlTdHJpbmdbXSBnZXRDYXRlZ29yaWVzVG9Ta2lwKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTaXRlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL0lVcGRhdGVTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmFkNGYzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9JVXBkYXRlU2l0ZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaDsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2Ugd3JhcHMgYW4gdXBkYXRlIHNpdGUgVVJMIGFuZCBhZGRzIAotICogYSBwcmVzZW50YXRpb24gbGFiZWwuIEl0IGlzIHVzZWQgdG8gZW5jYXBzdWxhdGUgc2l0ZXMgdGhhdCBuZWVkCi0gKiB0byBiZSB2aXNpdGVkIGR1cmluZyB0aGUgdXBkYXRlIHNlYXJjaC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXNlbnRhdGlvbiBzdHJpbmcgdGhhdCBjYW4gYmUgdXNlZAotCSAqIGZvciB0aGlzIHNpdGUuCi0JICogQHJldHVybiB0aGUgdXBkYXRlIHNpdGUgbGFiZWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSB1cGRhdGUgc2l0ZS4KLQkgKiBAcmV0dXJuIHRoZSBVUkwgb2YgdGhlIHVwZGF0ZSBzaXRlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1VwZGF0ZVNlYXJjaFJlcXVlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9VcGRhdGVTZWFyY2hSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YjA1ZmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1VwZGF0ZVNlYXJjaFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoLlVwZGF0ZVBvbGljeTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGNlbnRyYWwgdG8gdXBkYXRlIHNlYXJjaC4gVGhlIHNlYXJjaCBwYXR0ZXJuCi0gKiBpcyBlbmNhcHN1bGF0ZWQgaW4gdXBkYXRlIHNlYXJjaCBjYXRlZ29yeSwgd2hpbGUgdGhlIHNlYXJjaAotICogc2NvcGUgaXMgZGVmaW5lZCBpbiB0aGUgc2NvcGUgb2JqZWN0LiBXaGVuIHRoZXNlIHR3byBvYmplY3RzCi0gKiBhcmUgZGVmaW5lZCBhbmQgc2V0LCBzZWFyY2ggY2FuIGJlIHBlcmZvcm1lZCB1c2luZyB0aGUgCi0gKiBwcm92aWRlZCBtZXRob2QuIFNlYXJjaCByZXN1bHRzIGFyZSByZXBvcnRlZCB0byB0aGUKLSAqIHJlc3VsdCBjb2xsZWN0b3IsIHdoaWxlIHNlYXJjaCBwcm9ncmVzcyBpcyB0cmFja2VkIHVzaW5nCi0gKiB0aGUgcHJvZ3Jlc3MgbW9uaXRvci4KLSAqIDxwPkNsYXNzZXMgdGhhdCBpbXBsZW1lbnQgPHNhbXA+SVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3Rvcjwvc2FtcD4KLSAqIHNob3VsZCBjYWxsICdmaWx0ZXInIHRvIHRlc3QgaWYgdGhlIG1hdGNoIHNob3VsZCBiZQotICogYWNjZXB0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmaWx0ZXJzIGFkZGVkIHRvIHRoZSByZXF1ZXN0LgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBVcGRhdGVTZWFyY2hTY29wZQotICogQHNlZSBJVXBkYXRlU2VhcmNoQ2F0ZWdvcnkKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNlYXJjaFJlcXVlc3QgewotCXByaXZhdGUgSVVwZGF0ZVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5OwotCXByaXZhdGUgVXBkYXRlU2VhcmNoU2NvcGUgc2NvcGU7Ci0JcHJpdmF0ZSBib29sZWFuIHNlYXJjaEluUHJvZ3Jlc3MgPSBmYWxzZTsKLQlwcml2YXRlIEFnZ3JlZ2F0ZUZpbHRlciBhZ2dyZWdhdGVGaWx0ZXIgPSBuZXcgQWdncmVnYXRlRmlsdGVyKCk7Ci0KLQljbGFzcyBBZ2dyZWdhdGVGaWx0ZXIgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoRmlsdGVyIHsKLQkJcHJpdmF0ZSBBcnJheUxpc3QgZmlsdGVyczsKLQkJcHVibGljIHZvaWQgYWRkRmlsdGVyKElVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyKSB7Ci0JCQlpZiAoZmlsdGVycyA9PSBudWxsKQotCQkJCWZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoZmlsdGVycy5jb250YWlucyhmaWx0ZXIpID09IGZhbHNlKQotCQkJCWZpbHRlcnMuYWRkKGZpbHRlcik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUZpbHRlcihJVXBkYXRlU2VhcmNoRmlsdGVyIGZpbHRlcikgewotCQkJaWYgKGZpbHRlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlmaWx0ZXJzLnJlbW92ZShmaWx0ZXIpOwotCQl9Ci0JCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChJRmVhdHVyZSBtYXRjaCkgewotCQkJaWYgKGZpbHRlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyID0gKElVcGRhdGVTZWFyY2hGaWx0ZXIpIGZpbHRlcnMuZ2V0KGkpOwotCQkJCWlmIChmaWx0ZXIuYWNjZXB0KG1hdGNoKSA9PSBmYWxzZSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChJRmVhdHVyZVJlZmVyZW5jZSBtYXRjaCkgewotCQkJaWYgKGZpbHRlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5zaXplKCk7IGkrKykgewotCQkJCUlVcGRhdGVTZWFyY2hGaWx0ZXIgZmlsdGVyID0gKElVcGRhdGVTZWFyY2hGaWx0ZXIpIGZpbHRlcnMuZ2V0KGkpOwotCQkJCWlmIChmaWx0ZXIuYWNjZXB0KG1hdGNoKSA9PSBmYWxzZSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IgdGhhdCBhY2NlcHRzIHRoZSBzZWFyY2ggY2F0ZWdvcnkgYW5kIAotCSAqIHNjb3BlIG9iamVjdHMuCi0JICogQHBhcmFtIGNhdGVnb3J5IHRoZSBhY3R1YWwgc2VhcmNoIHBhdHRlcm4gdGhhdCBzaG91bGQgYmUgYXBwbGllZAotCSAqIEBwYXJhbSBzY29wZSBhIGxpc3Qgb2Ygc2l0ZXMgdGhhdCBuZWVkIHRvIGJlIHNjYW5uZWQgZHVyaW5nIHRoZSBzZWFyY2gKLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCgKLQkJSVVwZGF0ZVNlYXJjaENhdGVnb3J5IGNhdGVnb3J5LAotCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSkgewotCQl0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VhcmNoIGNhdGFnb3J5IHVzZWQgaW4gdGhpcyByZXF1ZXN0LgotCSAqIEByZXR1cm4gdGhlIHNlYXJjaCBjYXRlZ29yeQotCSAqLwotCQotCXB1YmxpYyBJVXBkYXRlU2VhcmNoQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7Ci0JCXJldHVybiBjYXRlZ29yeTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NvcGUgb2YgdGhpcyBzZWFyY2ggcmVxdWVzdC4KLQkgKiBAcmV0dXJuIHNlYXJjaCBzY29wZQotCSAqLwotCQotCXB1YmxpYyBVcGRhdGVTZWFyY2hTY29wZSBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkvKioKLQkgKiBBZGRzIGEgZmlsdGVyIHRvIHRoaXMgcmVxdWVzdC4gVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nCi0JICogaWYgc2VhcmNoIGlzIGFscmFkeSBpbiBwcm9ncmVzcy4gCi0JICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIAotCSAqIEBzZWUgVXBkYXRlU2VhcmNoUmVxdWVzdCNyZW1vdmVGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGaWx0ZXIoSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIpIHsKLQkJaWYgKHNlYXJjaEluUHJvZ3Jlc3MpCi0JCQlyZXR1cm47Ci0JCWFnZ3JlZ2F0ZUZpbHRlci5hZGRGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZmlsdGVyIGZyb20gdGhpcyByZXF1ZXN0LiBUaGlzIG1ldGhvZCBkb2VzCi0JICogbm90aGluZyBpZiBzZWFyY2ggaXMgYWxyYWR5IGluIHByb2dyZXNzLgotCSAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciB0byByZW1vdmUKLQkgKiBAc2VlIFVwZGF0ZVNlYXJjaFJlcXVlc3QjYWRkRmlsdGVyCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVGaWx0ZXIoSVVwZGF0ZVNlYXJjaEZpbHRlciBmaWx0ZXIpIHsKLQkJaWYgKHNlYXJjaEluUHJvZ3Jlc3MpCi0JCQlyZXR1cm47Ci0JCWFnZ3JlZ2F0ZUZpbHRlci5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzY29wZSBvYmplY3QuIEl0IGlzIHBvc3NpYmxlIHRvIHJldXNlIHRoZSBzZWFyY2ggcmVxdWVzdAotCSAqIG9iamVjdCBieSBtb2RpZnlpbmcgdGhlIHNjb3BlIGFuZCByZS1ydW5uaW5nIHRoZSBzZWFyY2guCi0JICogQHBhcmFtIHNjb3BlIHRoZSBuZXcgc2VhcmNoIHNjb3BlCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoVXBkYXRlU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCX0KLQkvKioKLQkgKiBUZXN0cyB3aGV0aGVyIHRoaXMgc2VhcmNoIHJlcXVlc3QgaXMgY3VycmVudCBydW5uaW5nLgotCSAqIEByZXR1cm4gPHNhbXA+dHJ1ZTwvc2FtcD4gaWYgdGhlIHNlYXJjaCBpcyBjdXJyZW50bHkgcnVubmluZywgPHNhbXA+ZmFsc2U8L3NhbXA+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NlYXJjaEluUHJvZ3Jlc3MoKSB7Ci0JCXJldHVybiBzZWFyY2hJblByb2dyZXNzOwotCX0KLQotCS8qKgotCSAqIFJ1bnMgdGhlIHNlYXJjaCB1c2luZyB0aGUgY2F0ZWdvcnkgYW5kIHNjb3BlIGNvbmZpZ3VyZWQgaW50bwotCSAqIHRoaXMgcmVxdWVzdC4gQXMgcmVzdWx0cyBhcnJpdmUsIHRoZXkgYXJlIHBhc3NlZCB0byB0aGUKLQkgKiBzZWFyY2ggcmVzdWx0IGNvbGxlY3RvciBvYmplY3QuCi0JICogQHBhcmFtIGNvbGxlY3RvciBtYXRjaGVkIGZlYXR1cmVzIGFyZSBwYXNzZWQgdG8gdGhpcyBvYmplY3QKLQkgKiBAcGFyYW0gbW9uaXRvciB1c2VkIHRvIHRyYWNrIHRoZSBzZWFyY2ggcHJvZ3Jlc3MKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtU2VhcmNoKAotCQlJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdCBzdGF0dXNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXNlYXJjaEluUHJvZ3Jlc3MgPSB0cnVlOwotCQlJVXBkYXRlU2VhcmNoUXVlcnlbXSBxdWVyaWVzID0gY2F0ZWdvcnkuZ2V0UXVlcmllcygpOwotCQlJVXBkYXRlU2VhcmNoU2l0ZVtdIGNhbmRpZGF0ZXMgPSBzY29wZS5nZXRTZWFyY2hTaXRlcygpOwotCQlVUkwgdXBkYXRlTWFwVVJMID0gc2NvcGUuZ2V0VXBkYXRlTWFwVVJMKCk7Ci0JCWJvb2xlYW4gc2VhcmNoRmVhdHVyZVByb3ZpZGVkU2l0ZXMgPSBzY29wZS5pc0ZlYXR1cmVQcm92aWRlZFNpdGVzRW5hYmxlZCgpOwotCi0JCWlmICghbW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCWludCBuc2VhcmNoc2l0ZXMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBxdWVyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHF1ZXJpZXNbaV0uZ2V0UXVlcnlTZWFyY2hTaXRlKCkgIT0gbnVsbCkKLQkJCQkJbnNlYXJjaHNpdGVzKys7Ci0JCQl9Ci0JCQlpbnQgbnRhc2tzID0gbnNlYXJjaHNpdGVzICsgcXVlcmllcy5sZW5ndGggKiBjYW5kaWRhdGVzLmxlbmd0aDsKLQkJCWlmICh1cGRhdGVNYXBVUkwhPW51bGwpIG50YXNrcysrOwotCi0JCQltb25pdG9yLmJlZ2luVGFzayhQb2xpY3kuYmluZCgiVXBkYXRlU2VhcmNoUmVxdWVzdC5zZWFyY2hpbmciKSwgbnRhc2tzKTsgLy8kTk9OLU5MUy0xJAotCi0JCQl0cnkgewotCQkJCVVwZGF0ZVBvbGljeSB1cGRhdGVQb2xpY3k9bnVsbDsKLQkJCQlpZiAodXBkYXRlTWFwVVJMIT1udWxsKSB7Ci0JCQkJCXVwZGF0ZVBvbGljeSA9IG5ldyBVcGRhdGVQb2xpY3koKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPWxvYWRVcGRhdGVQb2xpY3kodXBkYXRlUG9saWN5LCB1cGRhdGVNYXBVUkwsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOwotCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJCQlzdGF0dXNMaXN0LmFkZChzdGF0dXMpOwotCQkJCX0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSVVwZGF0ZVNlYXJjaFF1ZXJ5IHF1ZXJ5ID0gcXVlcmllc1tpXTsKLQkJCQkJSVF1ZXJ5VXBkYXRlU2l0ZUFkYXB0ZXIgcXNpdGUgPSBxdWVyeS5nZXRRdWVyeVNlYXJjaFNpdGUoKTsKLQkJCQkJaWYgKHFzaXRlICE9IG51bGwgJiYgc2VhcmNoRmVhdHVyZVByb3ZpZGVkU2l0ZXMpIHsKLQkJCQkJCS8vIGNoZWNrIGZvciBtYXBwaW5nCi0JCQkJCQlJVXBkYXRlU2l0ZUFkYXB0ZXIgbWFwcGVkU2l0ZSA9IGdldE1hcHBlZFNpdGUodXBkYXRlUG9saWN5LCBxc2l0ZSk7Ci0JCQkJCQkvLyB3aGVuIHRoZXJlIGlzIG5vIG1hcHBlZCBzaXRlIHRoZSBmZWF0dXJlIGlzIG5vdCB1cGRhdGFibGUKLQkJCQkJCWlmIChtYXBwZWRTaXRlID09IG51bGwgfHwgbWFwcGVkU2l0ZS5nZXRVUkwoKSA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHN1Yk1vbml0b3IgPQotCQkJCQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJCQkJc2VhcmNoT25lU2l0ZSgKLQkJCQkJCQkJbWFwcGVkU2l0ZSwKLQkJCQkJCQkJbnVsbCwKLQkJCQkJCQkJcXVlcnksCi0JCQkJCQkJCWNvbGxlY3RvciwKLQkJCQkJCQkJc3ViTW9uaXRvcik7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJCQkJc3RhdHVzTGlzdC5hZGQoc3RhdHVzKTsKLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJSVVwZGF0ZVNlYXJjaFNpdGUgc291cmNlID0gY2FuZGlkYXRlc1tqXTsKLQkJCQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0KLQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPQotCQkJCQkJCXNlYXJjaE9uZVNpdGUoCi0JCQkJCQkJCXNvdXJjZSwKLQkJCQkJCQkJc291cmNlLmdldENhdGVnb3JpZXNUb1NraXAoKSwKLQkJCQkJCQkJcXVlcnksCi0JCQkJCQkJCWNvbGxlY3RvciwKLQkJCQkJCQkJc3ViTW9uaXRvcik7Ci0JCQkJCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJCQkJc3RhdHVzTGlzdC5hZGQoc3RhdHVzKTsKLQkJCQkJfQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlzZWFyY2hJblByb2dyZXNzID0gZmFsc2U7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJdGhyb3cgZTsKLQkJCX0KLQkJfQotCQlzZWFyY2hJblByb2dyZXNzID0gZmFsc2U7Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JCWlmIChzdGF0dXNMaXN0LnNpemUoKSA+IDApIHsKLQkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9Ci0JCQkJKElTdGF0dXNbXSkgc3RhdHVzTGlzdC50b0FycmF5KG5ldyBJU3RhdHVzW3N0YXR1c0xpc3Quc2l6ZSgpXSk7Ci0JCQlNdWx0aVN0YXR1cyBtdWx0aVN0YXR1cyA9Ci0JCQkJbmV3IE11bHRpU3RhdHVzKAotCQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLCAvLyROT04tTkxTLTEkCi0JCQkJCUlTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwKLQkJCQkJY2hpbGRyZW4sCi0JCQkJCVBvbGljeS5iaW5kKCJTZWFyY2gubmV0d29ya1Byb2JsZW1zIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCk7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihtdWx0aVN0YXR1cyk7Ci0JCX0KLQl9Ci0KLS8qCi0gKiBMb2FkIHRoZSB1cGRhdGUgbWFwIHVzaW5nIHRoZSBtYXAgVVJMIGZvdW5kIGluIHRoZSBzY29wZS4KLSAqLwkKLQlwcml2YXRlIElTdGF0dXMgbG9hZFVwZGF0ZVBvbGljeShVcGRhdGVQb2xpY3kgbWFwLCBVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5zdWJUYXNrKFBvbGljeS5iaW5kKCJVcGRhdGVTZWFyY2hSZXF1ZXN0LmxvYWRpbmdQb2xpY3kiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCW1hcC5sb2FkKHVybCwgbW9uaXRvcik7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwKLQkJCQl8fCBzdGF0dXMuZ2V0Q29kZSgpICE9IElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTikKLQkJCQl0aHJvdyBlOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLS8qCi0gKiBTZWUgaWYgdGhpcyBxdWVyeSBzaXRlIGFkYXB0ZXIgaXMgbWFwcGVkIGluIHRoZSBtYXAgZmlsZQotICogdG8gYSBkaWZmZXJlbnQgVVJMLgotICovCi0JcHJpdmF0ZSBJVXBkYXRlU2l0ZUFkYXB0ZXIgZ2V0TWFwcGVkU2l0ZShVcGRhdGVQb2xpY3kgcG9saWN5LCBJUXVlcnlVcGRhdGVTaXRlQWRhcHRlciBxc2l0ZSkgewotCQlpZiAocG9saWN5IT1udWxsICYmIHBvbGljeS5pc0xvYWRlZCgpKSB7Ci0JCQlJVXBkYXRlU2l0ZUFkYXB0ZXIgbWFwcGVkU2l0ZSA9IHBvbGljeS5nZXRNYXBwZWRTaXRlKHFzaXRlLmdldE1hcHBpbmdJZCgpKTsKLQkJCWlmIChtYXBwZWRTaXRlIT1udWxsKSByZXR1cm4gbWFwcGVkU2l0ZTsKLQkJCS8vIG5vIG1hdGNoIC0gdXNlIG9yaWdpbmFsIHNpdGUgaWYgZmFsbGJhY2sgYWxsb3dlZCwgb3Igbm90aGluZy4KLQkJCXJldHVybiBwb2xpY3kuaXNGYWxsYmFja0FsbG93ZWQoKT8gcXNpdGUgOiBudWxsOwotCQl9Ci0JCXJldHVybiBxc2l0ZTsKLQl9Ci0KLS8qCi0gKiBTZWFyY2ggb25lIHNpdGUgdXNpbmcgdGhlIHByb3ZpZGVkIHF1ZXJ5LgotICovCi0JcHJpdmF0ZSBJU3RhdHVzIHNlYXJjaE9uZVNpdGUoCi0JCUlVcGRhdGVTaXRlQWRhcHRlciBzaXRlQWRhcHRlciwKLQkJU3RyaW5nW10gY2F0ZWdvcmllc1RvU2tpcCwKLQkJSVVwZGF0ZVNlYXJjaFF1ZXJ5IHF1ZXJ5LAotCQlJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvciwKLQkJU3ViUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRleHQgPSBQb2xpY3kuYmluZCgiVXBkYXRlU2VhcmNoUmVxdWVzdC5jb250YWN0aW5nIikgKyBzaXRlQWRhcHRlci5nZXRMYWJlbCgpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQltb25pdG9yLnN1YlRhc2sodGV4dCk7Ci0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCAxMCk7IC8vJE5PTi1OTFMtMSQKLQkJVVJMIHNpdGVVUkwgPSBzaXRlQWRhcHRlci5nZXRVUkwoKTsKLQotCQlJU2l0ZSBzaXRlOwotCQl0cnkgewotCQkJc2l0ZSA9Ci0JCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZSgKLQkJCQkJc2l0ZVVSTCwKLQkJCQkJbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gVGVzdCB0aGUgZXhjZXB0aW9uLiBJZiB0aGUgZXhjZXB0aW9uIGlzCi0JCQkvLyBkdWUgdG8gdGhlIHNpdGUgY29ubmVjdGlvbiBwcm9ibGVtcywKLQkJCS8vIGFsbG93IHRoZSBzZWFyY2ggdG8gbW92ZSBvbiB0byAKLQkJCS8vIHRoZSBuZXh0IHNpdGUuIE90aGVyd2lzZSwKLQkJCS8vIHJldGhyb3cgdGhlIGV4Y2VwdGlvbiwgY2F1c2luZyB0aGUgc2VhcmNoCi0JCQkvLyB0byB0ZXJtaW5hdGUuCi0JCQlJU3RhdHVzIHN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzID09IG51bGwpCi0vLwkJCQl8fCBzdGF0dXMuZ2V0Q29kZSgpICE9IElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTikKLQkJCQl0aHJvdyBlOwotCQkJbW9uaXRvci53b3JrZWQoMTApOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkvLyBJZiBmcm96ZW4gY29ubmVjdGlvbiB3YXMgY2FuY2VsZWQsIHRoZXJlIHdpbGwgYmUgbm8gc2l0ZS4KLQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJbW9uaXRvci53b3JrZWQoOSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRleHQgPSBQb2xpY3kuYmluZCgiVXBkYXRlU2VhcmNoUmVxdWVzdC5jaGVja2luZyIpICsgc2l0ZUFkYXB0ZXIuZ2V0TGFiZWwoKSArICIuLi4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJbW9uaXRvci5nZXRXcmFwcGVkUHJvZ3Jlc3NNb25pdG9yKCkuc3ViVGFzayh0ZXh0KTsKLQotCQlxdWVyeS5ydW4oCi0JCQlzaXRlLAotCQkJY2F0ZWdvcmllc1RvU2tpcCwKLQkJCWFnZ3JlZ2F0ZUZpbHRlciwKLQkJCWNvbGxlY3RvciwKLQkJCW5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgOSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1VwZGF0ZVNlYXJjaFNjb3BlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVXBkYXRlU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhOThjNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvVXBkYXRlU2VhcmNoU2NvcGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHVwZGF0ZSBzY29wZSBvZiB0aGUgdXBkYXRlIHNlYXJjaC4KLSAqIFNpdGVzIHRoYXQgbmVlZCB0byBiZSB2aXNpdGVkIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgc2NvcGUuCi0gKiBJZiBzb21lIGNhdGVnb3JpZXMgc2hvdWxkIGJlIHNraXBwZWQsIHRoZWlyIG5hbWVzIG11c3QgYmUKLSAqIHBhc3NlZCBhcyBhcnJheSBvZiBzdHJpbmdzIHRvIHRoZSBtZXRob2QuCi0gKgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzZWUgVXBkYXRlU2VhcmNoUmVxdWVzdAotICogQHNpbmNlIDMuMAotICovCi0KLXB1YmxpYyBjbGFzcyBVcGRhdGVTZWFyY2hTY29wZSB7Ci0JcHJpdmF0ZSBWZWN0b3Igc2l0ZXM7Ci0JcHJpdmF0ZSBVUkwgdXBkYXRlTWFwVVJMOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZlYXR1cmVQcm92aWRlZFNpdGVzRW5hYmxlZCA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXBkYXRlU2VhcmNoU2l0ZQotCQlleHRlbmRzIFVwZGF0ZVNpdGVBZGFwdGVyCi0JCWltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFNpdGUgewotCQlwcml2YXRlIFN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXA7Ci0KLQkJcHVibGljIFVwZGF0ZVNlYXJjaFNpdGUoCi0JCQlTdHJpbmcgbGFiZWwsCi0JCQlVUkwgc2l0ZVVSTCwKLQkJCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXApIHsKLQkJCXN1cGVyKGxhYmVsLCBzaXRlVVJMKTsKLQkJCXRoaXMuY2F0ZWdvcmllc1RvU2tpcCA9IGNhdGVnb3JpZXNUb1NraXA7Ci0JCX0KLQkJcHVibGljIFN0cmluZ1tdIGdldENhdGVnb3JpZXNUb1NraXAoKSB7Ci0JCQlyZXR1cm4gY2F0ZWdvcmllc1RvU2tpcDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVTZWFyY2hTY29wZSgpIHsKLQkJc2l0ZXMgPSBuZXcgVmVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgb3B0aW9uYWwgVVJMIG9mIHRoZSB1cGRhdGUgbWFwIGZpbGUuIFRoaXMgZmlsZQotCSAqIGlzIHVzZWQgdG8gcmVkaXJlY3Qgc2VhcmNoIGZvciBuZXcgdXBkYXRlcyB0byBvdGhlcgotCSAqIHNlcnZlcnMgYW5kIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gYSBsb2NhbAotCSAqIHVwZGF0ZSBzaXRlIHByb3h5IChwb3NzaWJseSBiZWhpbmQgdGhlIGZpcmV3YWxsKSBpcwotCSAqIHNldCB1cC4KLQkgKiBAcGFyYW0gdXJsIHRoZSB1cmwgb2YgdGhlIEphdmEgcHJvcGVydGllcyBmaWxlIHRoYXQKLQkgKiBjb250YWlucyB0aGUgcmVkaXJlY3Rpb24gaW5mb3JtYXRpb24uCi0JICovCi0JCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlTWFwVVJMKFVSTCB1cmwpIHsKLQkJdGhpcy51cGRhdGVNYXBVUkwgPSB1cmw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9wdGlvbmFsIFVSTCBvZiB0aGUgdXBkYXRlIG1hcCBmaWxlLiBCeSAKLQkgKiBkZWZhdWx0LCBubyBtYXAgZmlsZSBpcyBzZXQuCi0JICogQHJldHVybiB0aGUgVVJMIG9mIHRoZSBtYXAgZmlsZSBvciA8c2FtcD5udWxsPC9zYW1wPgotCSAqIGlmIG5vdCBzZXQuCi0JICovCi0JCi0JcHVibGljIFVSTCBnZXRVcGRhdGVNYXBVUkwoKSB7Ci0JCXJldHVybiB1cGRhdGVNYXBVUkw7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgc2l0ZSB0byBzY2FuIHRvIHRoZSBzZWFyY2ggc2NvcGUuCi0JICogQHBhcmFtIGxhYmVsIHRoZSBwcmVzZW50YXRpb24gbmFtZSBvZiB0aGUgc2l0ZSB0byB2aXNpdC4KLQkgKiBAcGFyYW0gc2l0ZVVSTCB0aGUgVVJMIG9mIHRoZSBzaXRlIHRvIHZpc2l0LgotCSAqIEBwYXJhbSBjYXRlZ29yaWVzVG9Ta2lwIGFuIGFycmF5IG9mIGNhdGVnb3J5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgb3IgPHNhbXA+bnVsbDwvc2FtcD4gaWYgYWxsIGZlYXR1cmVzIHNob3VsZCBiZSBjb25zaWRlcmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlYXJjaFNpdGUoCi0JCVN0cmluZyBsYWJlbCwKLQkJVVJMIHNpdGVVUkwsCi0JCVN0cmluZ1tdIGNhdGVnb3JpZXNUb1NraXApIHsKLQkJc2l0ZXMuYWRkKG5ldyBVcGRhdGVTZWFyY2hTaXRlKGxhYmVsLCBzaXRlVVJMLCBjYXRlZ29yaWVzVG9Ta2lwKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l0ZXMgdGhhdCBzaG91bGQgYmUgdmlzaXRlZCBkdXJpbmcgdGhlIHNlYXJjaC4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHNpdGUgYWRhcHRlcnMKLQkgKi8KLQlwdWJsaWMgSVVwZGF0ZVNlYXJjaFNpdGVbXSBnZXRTZWFyY2hTaXRlcygpIHsKLQkJcmV0dXJuIChVcGRhdGVTZWFyY2hTaXRlW10pIHNpdGVzLnRvQXJyYXkoCi0JCQluZXcgVXBkYXRlU2VhcmNoU2l0ZVtzaXRlcy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogSW4gYWRkaXRpb24gdG8gdGhlIHNpdGVzIGFkZGVkIGJ5IGFkZFNlYXJjaFNpdGUoKSwgZmVhdHVyZXMgY29udHJpYnV0ZSB0aGVpciBvd24gdXBkYXRlIHVybCdzLgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aG9zZSBzaXRlcyBhcmUgYWxzbyBzZWFyY2hlZC4KLQkgKiBAcmV0dXJuIHRydWUgaWYgdXBkYXRlIHNpdGUgcHJvdmlkZWQgYnkgZmVhdHVyZXMgYXJlIGFsc28gc2VhcmNoZWQuIERlZmF1bHQgaXMgdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZlYXR1cmVQcm92aWRlZFNpdGVzRW5hYmxlZCgpewotCQlyZXR1cm4gaXNGZWF0dXJlUHJvdmlkZWRTaXRlc0VuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIG9yIGRpc2FibGUgc2VhcmNoaW5nIG9mIGZlYXR1cmUgcHJvdmlkZWQgdXBkYXRlIHNpdGVzLiAKLQkgKiBJZiBkaXNhYmxlZCwgb25seSBzaXRlcyBhZGRlZCBieSBhZGRTZWFyY2hTaXRlKCkgYXJlIHNlYXJjaGVkLgotCSAqIEBwYXJhbSBlbmFibGUgZmFsc2UgdG8gZGlzYWJsZSBzZWFyY2hpbmcgb2YgZmVhdHVyZSBwcm92aWRlZCBzaXRlcy4gQnkgZGVmYXVsdCwgdGhlc2Ugc2l0ZXMgYXJlIHNlYXJjaGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVQcm92aWRlZFNpdGVzRW5hYmxlZChib29sZWFuIGVuYWJsZSl7Ci0JCXRoaXMuaXNGZWF0dXJlUHJvdmlkZWRTaXRlc0VuYWJsZWQgPSBlbmFibGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9WZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1ZlcnNpb25lZElkZW50aWZpZXJzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNWFkMGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc2VhcmNoL1ZlcnNpb25lZElkZW50aWZpZXJzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSBhZGRlZCB0byB0aGUgdXBkYXRlIHNlYXJjaCByZXF1ZXN0Ci0gKiB0byBmaWx0ZXIgb3V0IGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzcGVjaWZpZWQgc2V0LgotICogCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNlZSBVcGRhdGVTZWFyY2hSZXF1ZXN0Ci0gKiBAc2VlIElVcGRhdGVTZWFyY2hGaWx0ZXIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25lZElkZW50aWZpZXJzRmlsdGVyIGV4dGVuZHMgQmFzZUZpbHRlciB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgdmlkczsKLQkKLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIoKSB7Ci0JCXRoaXMobmV3IFZlcnNpb25lZElkZW50aWZpZXJbMF0pOwotCX0KLQkKLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIoVmVyc2lvbmVkSWRlbnRpZmllcltdIHZpZHMpIHsKLQkJdGhpcy52aWRzID0gbmV3IEFycmF5TGlzdCh2aWRzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGk9MDsgaTx2aWRzLmxlbmd0aDsgaSsrKQotCQkJdGhpcy52aWRzLmFkZCh2aWRzW2ldKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKFZlcnNpb25lZElkZW50aWZpZXIgdmlkKSB7Ci0JCXZpZHMuYWRkKHZpZCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGFjY2VwdChJRmVhdHVyZVJlZmVyZW5jZSBtYXRjaCkgewotCQl0cnkgewotCQkJZm9yIChpbnQgaT0wOyBpPHZpZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IChWZXJzaW9uZWRJZGVudGlmaWVyKXZpZHMuZ2V0KGkpOwotCQkJCS8vIGluc3RhbGxlZCB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBtYXRjaCAtIGFjY2VwdAotCQkJCWlmICh2aWQuZXF1YWxzKG1hdGNoLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9wYWNrYWdlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zZWFyY2gvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmU4ZjIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3NlYXJjaC9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgc2VhcmNoZXMgYW5kIGZpbHRlcmluZyBvZiBmZWF0dXJlcy4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW50ZXJmYWNlcyBhbmQgaGVscGVyIGNsYXNzZXMgZm9yIGNyZWF0aW5nIGFuZCBleGVjdXRpbmcgc2VhcmNoIG9wZXJhdGlvbnMuIAotCi08cD4KLTxiPk5vdGU6PC9iPiBUaGlzIHBhY2thZ2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi1mcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLTwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvQWRkU2l0ZUNvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvQWRkU2l0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlZjc1Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0FkZFNpdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBBZGRzIGEgbmV3IHNpdGUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQWRkU2l0ZUNvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCXByaXZhdGUgSVNpdGUgc2l0ZTsKLQlwcml2YXRlIEZpbGUgc2l0ZVBhdGg7Ci0JCi0JLyoqCi0JICogQHBhcmFtIGZyb21TaXRlIGlmIHNwZWNpZmllZCwgbGlzdCBvbmx5IHRoZSBmZWF0dXJlcyBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYWwgaW5zdGFsbCBzaXRlCi0JICovCi0JcHVibGljIEFkZFNpdGVDb21tYW5kKFN0cmluZyBmcm9tU2l0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAoZnJvbVNpdGUgIT0gbnVsbCkgewotCQkJCXNpdGVQYXRoID0gbmV3IEZpbGUoZnJvbVNpdGUpOwotCQkJCWlmICghc2l0ZVBhdGguZXhpc3RzKCkpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlIikgKyBmcm9tU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJVVJMIGZyb21TaXRlVVJMID0gc2l0ZVBhdGgudG9VUkwoKTsKLQkJCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShmcm9tU2l0ZVVSTCwgbnVsbCk7Ci0JCQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgZnJvbVNpdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJaWYgKGNzaXRlICE9IG51bGwpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuc2l0ZUNvbmZpZ3VyZWQiKSArIGZyb21TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZTMiKSApOyAvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlnIGZpbGUgaGFzIGJlZW4gbW9kaWZlZCB3aGlsZSB3ZSB3ZXJlIHJ1bm5pbmcKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCXRyeSB7Ci0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBnZXRDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29uZmlndXJlZFNpdGUoc2l0ZVBhdGgpOwotCQkJZ2V0Q29uZmlndXJhdGlvbigpLmFkZENvbmZpZ3VyZWRTaXRlKGNzaXRlKTsKLQkJCS8vIHVwZGF0ZSB0aGUgc2l0ZXMgYXJyYXkgdG8gcGljayB1cCBuZXcgc2l0ZQotCQkJZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0NtZExpbmVBcmdzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0NtZExpbmVBcmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxN2JiOTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9DbWRMaW5lQXJncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubWlycm9yLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIHVwZGF0ZSBzdGFuZGFsb25lIGNvbW1hbmRzCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgQ21kTGluZUFyZ3MgewotCXByaXZhdGUgSGFzaE1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlwdWJsaWMgQ21kTGluZUFyZ3MoU3RyaW5nW10gYXJncykgewotLy8JCS8vIGRlZmF1bHQgY29tbWFuZAotLy8JCW9wdGlvbnMucHV0KCItY29tbWFuZCIsICJpbnN0YWxsIik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aCAtIDE7IGkrKykgewotCQkJaWYgKCItY29tbWFuZCIuZXF1YWxzKGFyZ3NbaV0pKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoaXNWYWxpZENvbW1hbmQoYXJnc1tpICsgMV0pKSB7Ci0JCQkJCW9wdGlvbnMucHV0KCItY29tbWFuZCIsIGFyZ3NbaSArIDFdKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpKys7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCQlVcGRhdGVDb3JlLmxvZygKLQkJCQkJCVV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKAotCQkJCQkJCVBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmludmFsaWRDbWQiKSArIGFyZ3NbaSArIDFdLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJbnVsbCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzVmFsaWRQYXJhbShhcmdzW2ldKSkgewotCQkJCW9wdGlvbnMucHV0KGFyZ3NbaV0sIGFyZ3NbaSArIDFdKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQkvLyAtdG8gc2hvdWxkIHNwZWNpZnkgYSBkaXJlY3RvcnkKLQkJCS8vIGlmIC10byBzcGVjaWZpZXMgZmlsZSBVUkwsIGNoYW5nZSBpdCB0byBhIGRpcmVjdG9yeQotCQkJU3RyaW5nIHRvID0gKFN0cmluZykgb3B0aW9ucy5nZXQoIi10byIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodG8gIT0gbnVsbCAmJiB0by5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlVUkwgdXJsID0gbmV3IFVSTCh0byk7Ci0JCQkJCW9wdGlvbnMucHV0KCItdG8iLCB1cmwuZ2V0RmlsZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtdWUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBhcmFtKFN0cmluZyBwYXJhbSkgewotCQlyZXR1cm4gcGFyYW0uZXF1YWxzKCItY29tbWFuZCIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHBhcmFtLmVxdWFscygiLXZlcnNpb24iKSAvLyROT04tTkxTLTEkCi0JCQl8fCBwYXJhbS5lcXVhbHMoIi10byIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IHBhcmFtLmVxdWFscygiLWZyb20iKSAvLyROT04tTkxTLTEkCi0JCQl8fCBwYXJhbS5lcXVhbHMoIi1mZWF0dXJlSWQiKSAvLyROT04tTkxTLTEkCi0JCQl8fCBwYXJhbS5lcXVhbHMoIi12ZXJpZnlPbmx5IikgLy8kTk9OLU5MUy0xJAotCQkJfHwgcGFyYW0uZXF1YWxzKCItbWlycm9yVVJMIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZENvbW1hbmQoU3RyaW5nIGNtZCkgewotCQlpZiAoY21kID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiBjbWQuZXF1YWxzKCJpbnN0YWxsIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygiZW5hYmxlIikgLy8kTk9OLU5MUy0xJAotCQkJfHwgY21kLmVxdWFscygiZGlzYWJsZSIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoInNlYXJjaCIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoInVwZGF0ZSIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoIm1pcnJvciIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoInVuaW5zdGFsbCIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoImxpc3RGZWF0dXJlcyIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IGNtZC5lcXVhbHMoImFkZFNpdGUiKSAvLyROT04tTkxTLTEkCi0JCQl8fCBjbWQuZXF1YWxzKCJyZW1vdmVTaXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU2NyaXB0ZWRDb21tYW5kIGdldENvbW1hbmQoKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY21kID0gKFN0cmluZykgb3B0aW9ucy5nZXQoIi1jb21tYW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChjbWQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjbWQuZXF1YWxzKCJpbnN0YWxsIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEluc3RhbGxDb21tYW5kKAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLWZlYXR1cmVJZCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyc2lvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZnJvbSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdG8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXZlcmlmeU9ubHkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGNtZC5lcXVhbHMoImVuYWJsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBFbmFibGVDb21tYW5kKAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLWZlYXR1cmVJZCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyc2lvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdG8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXZlcmlmeU9ubHkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGNtZC5lcXVhbHMoImRpc2FibGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgRGlzYWJsZUNvbW1hbmQoCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZmVhdHVyZUlkIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJzaW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi10byIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyaWZ5T25seSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygic2VhcmNoIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IFNlYXJjaENvbW1hbmQoKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mcm9tIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChjbWQuZXF1YWxzKCJ1cGRhdGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgVXBkYXRlQ29tbWFuZCgKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mZWF0dXJlSWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXZlcnNpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLXZlcmlmeU9ubHkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKGNtZC5lcXVhbHMoIm1pcnJvciIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBNaXJyb3JDb21tYW5kKAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLWZlYXR1cmVJZCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyc2lvbiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZnJvbSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdG8iKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkoU3RyaW5nKSBvcHRpb25zLmdldCgiLW1pcnJvclVSTCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygidW5pbnN0YWxsIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IFVuaW5zdGFsbENvbW1hbmQoCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZmVhdHVyZUlkIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi12ZXJzaW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJKFN0cmluZykgb3B0aW9ucy5nZXQoIi10byIpLCAvLyROT04tTkxTLTEkCi0JCQkJCShTdHJpbmcpIG9wdGlvbnMuZ2V0KCItdmVyaWZ5T25seSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygibGlzdEZlYXR1cmVzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IExpc3RGZWF0dXJlc0NvbW1hbmQoKFN0cmluZykgb3B0aW9ucy5nZXQoIi1mcm9tIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmIChjbWQuZXF1YWxzKCJhZGRTaXRlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IEFkZFNpdGVDb21tYW5kKChTdHJpbmcpIG9wdGlvbnMuZ2V0KCItZnJvbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSBpZiAoY21kLmVxdWFscygicmVtb3ZlU2l0ZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5ldyBSZW1vdmVTaXRlQ29tbWFuZCgoU3RyaW5nKSBvcHRpb25zLmdldCgiLXRvIikpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0Rpc2FibGVDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0Rpc2FibGVDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NGY3OGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9EaXNhYmxlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBDb21tYW5kIHRvIGRpc2FibGUgKHVuY29uZmlndXJlKSBhIGZlYXR1cmUKLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXNhYmxlQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQotCXB1YmxpYyBEaXNhYmxlQ29tbWFuZCgKLQkJU3RyaW5nIGZlYXR1cmVJZCwKLQkJU3RyaW5nIHZlcnNpb24sCi0JCVN0cmluZyB0b1NpdGUsCi0JCVN0cmluZyB2ZXJpZnlPbmx5KQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdXBlcih2ZXJpZnlPbmx5KTsKLQotCQl0cnkgewotCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJCS8vIEdldCBzaXRlIGNvbnRhaW5pbmcgdGhlIGZlYXR1cmUgdG8gZGlzYWJsZQotCQkJaWYgKHRvU2l0ZSAhPSBudWxsKSB7Ci0JCQkJVVJMIHRvU2l0ZVVSTCA9IG5ldyBGaWxlKHRvU2l0ZSkudG9VUkwoKTsKLQkJCQlpZiAoU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh0b1NpdGVVUkwsIG51bGwpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1NpdGUiKSArIHRvU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdGFyZ2V0U2l0ZSA9Ci0JCQkJCVNpdGVNYW5hZ2VyCi0JCQkJCQkuZ2V0U2l0ZSh0b1NpdGVVUkwsIG51bGwpCi0JCQkJCQkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2l0ZXNbaV0uaXNQcm9kdWN0U2l0ZSgpKSB7Ci0JCQkJCQl0YXJnZXRTaXRlID0gc2l0ZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9Ci0JCQkJVXBkYXRlVXRpbHMuc2VhcmNoU2l0ZShmZWF0dXJlSWQsIHRhcmdldFNpdGUsIHRydWUpOwotCQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vRmVhdHVyZXMzIiwgZmVhdHVyZUlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQlmZWF0dXJlID0gZmVhdHVyZXNbMF07IC8vIHBpY2sgdGhlIGZpcnN0IGZlYXR1cmUKLQkJCWVsc2UKLQkJCQlmb3IgKGludCBpID0gMDsgZmVhdHVyZXMgIT0gbnVsbCAmJiBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGZlYXR1cmVzW2ldCi0JCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkudG9TdHJpbmcoKQotCQkJCQkJLmVxdWFscyh2ZXJzaW9uKSkgewotCQkJCQkJZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0ZlYXR1cmVzNCIsIGZlYXR1cmVJZCwgdmVyc2lvbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZyBmaWxlIGhhcyBiZWVuIG1vZGlmZWQgd2hpbGUgd2Ugd2VyZSBydW5uaW5nCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS5sb2coc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXNWZXJpZnlPbmx5KCkpIHsKLQkJCXN0YXR1cyA9Ci0JCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nVW5jb25maWcoCi0JCQkJCWZlYXR1cmUpOwotCQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKQotCQkJCVVwZGF0ZUNvcmUubG9nKHN0YXR1cyk7Ci0JCQlyZXR1cm4gc3RhdHVzID09IG51bGwgfHwgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkc7Ci0JCX0KLQotCQlmaW5hbCBJVW5jb25maWdGZWF0dXJlT3BlcmF0aW9uIGNvbmZpZ09wZXJhdGlvbiA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlVW5jb25maWdPcGVyYXRpb24oCi0JCQkJdGFyZ2V0U2l0ZSwKLQkJCQlmZWF0dXJlKTsKLQotCQl0cnkgewotCQkJY29uZmlnT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgdGhpcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9FbmFibGVDb21tYW5kLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0VuYWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4N2JlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0VuYWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogQ29tbWFuZCB0byBlbmFibGUgKGNvbmZpZ3VyZSkgYSBmZWF0dXJlLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEVuYWJsZUNvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZTsKLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwdWJsaWMgRW5hYmxlQ29tbWFuZCgKLQkJU3RyaW5nIGZlYXR1cmVJZCwKLQkJU3RyaW5nIHZlcnNpb24sCi0JCVN0cmluZyB0b1NpdGUsCi0JCVN0cmluZyB2ZXJpZnlPbmx5KQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdXBlcih2ZXJpZnlPbmx5KTsKLQotCQl0cnkgewotCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJCS8vIEdldCBzaXRlIHRvIGVuYWJsZSB0bwotCQkJaWYgKHRvU2l0ZSAhPSBudWxsKSB7Ci0JCQkJVVJMIHRvU2l0ZVVSTCA9IG5ldyBGaWxlKHRvU2l0ZSkudG9VUkwoKTsKLQkJCQlpZiAoU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh0b1NpdGVVUkwsIG51bGwpID09IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1NpdGUiKSArIHRvU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdGFyZ2V0U2l0ZSA9Ci0JCQkJCVNpdGVNYW5hZ2VyCi0JCQkJCQkuZ2V0U2l0ZSh0b1NpdGVVUkwsIG51bGwpCi0JCQkJCQkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQl9Ci0JCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2l0ZXNbaV0uaXNQcm9kdWN0U2l0ZSgpKSB7Ci0JCQkJCQl0YXJnZXRTaXRlID0gc2l0ZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9Ci0JCQkJVXBkYXRlVXRpbHMuc2VhcmNoU2l0ZShmZWF0dXJlSWQsIHRhcmdldFNpdGUsIGZhbHNlKTsKLQkJCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0ZlYXR1cmVzMSIsIGZlYXR1cmVJZCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAodmVyc2lvbiA9PSBudWxsIHx8IHZlcnNpb24udHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJZmVhdHVyZSA9IGZlYXR1cmVzWzBdOyAvLyBwaWNrIHRoZSBmaXJzdCBmZWF0dXJlCi0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGZlYXR1cmVzICE9IG51bGwgJiYgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChmZWF0dXJlc1tpXQotCQkJCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJLmdldFZlcnNpb24oKQotCQkJCQkJLnRvU3RyaW5nKCkKLQkJCQkJCS5lcXVhbHModmVyc2lvbikKLQkJCQkJCSYmICF0YXJnZXRTaXRlLmlzQ29uZmlndXJlZChmZWF0dXJlc1tpXSkpIHsKLQkJCQkJCWZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9GZWF0dXJlczIiLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIGNoZWNrIGlmIHRoZSBjb25maWcgZmlsZSBoYXMgYmVlbiBtb2RpZmVkIHdoaWxlIHdlIHdlcmUgcnVubmluZwotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKHN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCWlmIChpc1ZlcmlmeU9ubHkoKSkgewotCQkJc3RhdHVzID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDb25maWcoZmVhdHVyZSk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwgJiYgc3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkcpCi0JCQkJVXBkYXRlQ29yZS5sb2coc3RhdHVzKTsKLQkJCXJldHVybiBzdGF0dXMgPT0gbnVsbCB8fCBzdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORzsKLQkJfQotCi0JCWZpbmFsIElDb25maWdGZWF0dXJlT3BlcmF0aW9uIGNvbmZpZ09wZXJhdGlvbiA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlQ29uZmlnT3BlcmF0aW9uKAotCQkJCXRhcmdldFNpdGUsCi0JCQkJZmVhdHVyZSk7Ci0KLQkJdHJ5IHsKLQkJCWNvbmZpZ09wZXJhdGlvbi5leGVjdXRlKG1vbml0b3IsIHRoaXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvSW5zdGFsbENvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvSW5zdGFsbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMyOTBjOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL0luc3RhbGxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi0vKioKLSAqIENvbW1hbmQgdG8gaW5zdGFsbCBhIGZlYXR1cmUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZTsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3I7Ci0JcHJpdmF0ZSBVUkwgcmVtb3RlU2l0ZVVSTDsKLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQotCXB1YmxpYyBJbnN0YWxsQ29tbWFuZCgKLQkJU3RyaW5nIGZlYXR1cmVJZCwKLQkJU3RyaW5nIHZlcnNpb24sCi0JCVN0cmluZyBmcm9tU2l0ZSwKLQkJU3RyaW5nIHRvU2l0ZSwKLQkJU3RyaW5nIHZlcmlmeU9ubHkpCi0JCXRocm93cyBFeGNlcHRpb24gewotCi0JCXN1cGVyKHZlcmlmeU9ubHkpOwotCi0JCXRyeSB7Ci0JCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKLQkJCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0KLQkJCXRoaXMucmVtb3RlU2l0ZVVSTCA9IG5ldyBVUkwoVVJMRGVjb2Rlci5kZWNvZGUoZnJvbVNpdGUsICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBHZXQgc2l0ZSB0byBpbnN0YWxsIHRvCi0JCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWlmICh0b1NpdGUgIT0gbnVsbCkgewotCQkJCUZpbGUgc2l0ZVBhdGggPSBuZXcgRmlsZSh0b1NpdGUpOwotCQkJCWlmICghc2l0ZVBhdGguZXhpc3RzKCkpCi0JCQkJCXNpdGVQYXRoLm1rZGlycygpOwotCQkJCVVSTCB0b1NpdGVVUkwgPSBzaXRlUGF0aC50b1VSTCgpOwotCQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCk7Ci0JCQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgdG9TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0YXJnZXRTaXRlID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCQlpZiAodGFyZ2V0U2l0ZSA9PSBudWxsKSB7Ci0JCQkJCXRhcmdldFNpdGUgPSBnZXRDb25maWd1cmF0aW9uKCkuY3JlYXRlQ29uZmlndXJlZFNpdGUoc2l0ZVBhdGgpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IHRhcmdldFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0JCQkJCWlmIChzdGF0dXMuaXNPSygpKQotCQkJCQkJZ2V0Q29uZmlndXJhdGlvbigpLmFkZENvbmZpZ3VyZWRTaXRlKHRhcmdldFNpdGUpOwotCQkJCQllbHNlIAotCQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQotCQkJCQkvLyB1cGRhdGUgdGhlIHNpdGVzIGFycmF5IHRvIHBpY2sgdXAgbmV3IHNpdGUKLQkJCQkJc2l0ZXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNpdGVzW2ldLmlzUHJvZHVjdFNpdGUoKSkgewotCQkJCQkJdGFyZ2V0U2l0ZSA9IHNpdGVzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlVcGRhdGVTZWFyY2hTY29wZSBzZWFyY2hTY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOwotCQkJc2VhcmNoU2NvcGUuYWRkU2VhcmNoU2l0ZSgKLQkJCQkicmVtb3RlU2l0ZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdGVTaXRlVVJMLAotCQkJCW5ldyBTdHJpbmdbMF0pOwotCi0JCQlzZWFyY2hSZXF1ZXN0ID0KLQkJCQluZXcgVXBkYXRlU2VhcmNoUmVxdWVzdChuZXcgU2l0ZVNlYXJjaENhdGVnb3J5KCksIHNlYXJjaFNjb3BlKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0KLQkJCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcihmZWF0dXJlSWQsIHZlcnNpb24pOwotCQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIoCi0JCQkJbmV3IFZlcnNpb25lZElkZW50aWZpZXJzRmlsdGVyKAotCQkJCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcltdIHsgdmlkIH0pKTsKLQkJCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBFbnZpcm9ubWVudEZpbHRlcigpKTsKLQkJCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBCYWNrTGV2ZWxGaWx0ZXIoKSk7Ci0KLQkJCWNvbGxlY3RvciA9IG5ldyBVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJbW9uaXRvci5iZWdpblRhc2soUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuaW5zdGFsbGluZyIpLCA0KTsgLy8kTk9OLU5MUy0xJAotCQkJc2VhcmNoUmVxdWVzdC5wZXJmb3JtU2VhcmNoKGNvbGxlY3RvciwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLDEpKTsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPSBjb2xsZWN0b3IuZ2V0T3BlcmF0aW9ucygpOwotCQkJaWYgKG9wZXJhdGlvbnMgPT0gbnVsbCB8fCBvcGVyYXRpb25zLmxlbmd0aCA9PSAwKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCVBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmZlYXR1cmUiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGZlYXR1cmVJZAotCQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyB2ZXJzaW9uCi0JCQkJCQkrIFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vdEZvdW5kIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyByZW1vdGVTaXRlVVJMCi0JCQkJCQkrIFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5ld2VySW5zdGFsbGVkIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCk7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGZvciBkdXBsaWNhdGlvbiBjb25mbGljdHMKLQkJCUFycmF5TGlzdCBjb25mbGljdHMgPQotCQkJCUR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5jb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotCQkJCQlvcGVyYXRpb25zLAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJaWYgKGNvbmZsaWN0cyAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuZHVwbGljYXRlIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChpc1ZlcmlmeU9ubHkoKSkgewotCQkJCXJldHVybiAob3BlcmF0aW9ucyAhPSBudWxsICYmIG9wZXJhdGlvbnMubGVuZ3RoID4gMSk7Ci0JCQl9Ci0KLQkJCUlCYXRjaE9wZXJhdGlvbiBpbnN0YWxsT3BlcmF0aW9uID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlcgotCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCS5jcmVhdGVCYXRjaEluc3RhbGxPcGVyYXRpb24oCi0JCQkJCW9wZXJhdGlvbnMpOwotCQkJdHJ5IHsKLQkJCQlpbnN0YWxsT3BlcmF0aW9uLmV4ZWN1dGUobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLDMpLCB0aGlzKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oCi0JCQkJCVBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmZlYXR1cmUiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGZlYXR1cmVJZAotCQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyB2ZXJzaW9uCi0JCQkJCQkrIFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmluc3RhbGxlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigKLQkJCQkJUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY2Fubm90SW5zdGFsbCIpICsgZmVhdHVyZUlkICsgIiAiICsgdmVyc2lvbiwgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWUpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhjZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCi0JY2xhc3MgVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGltcGxlbWVudHMgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciB7Ci0JCXByaXZhdGUgQXJyYXlMaXN0IG9wZXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIHZvaWQgYWNjZXB0KElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCWlmIChmZWF0dXJlCi0JCQkJLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCS5nZXRJZGVudGlmaWVyKCkKLQkJCQkuZXF1YWxzKGZlYXR1cmVJZCkKLQkJCQkmJiBmZWF0dXJlCi0JCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkKLQkJCQkJLmdldFZlcnNpb24oKQotCQkJCQkudG9TdHJpbmcoKQotCQkJCQkuZXF1YWxzKAotCQkJCQl2ZXJzaW9uKSkgewotCQkJCW9wZXJhdGlvbnMuYWRkKAotCQkJCQlPcGVyYXRpb25zTWFuYWdlcgotCQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkJLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24oCi0JCQkJCQl0YXJnZXRTaXRlLAotCQkJCQkJZmVhdHVyZSwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsLAotCQkJCQkJbnVsbCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRPcGVyYXRpb25zKCkgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BzQXJyYXkgPQotCQkJCW5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bb3BlcmF0aW9ucy5zaXplKCldOwotCQkJb3BlcmF0aW9ucy50b0FycmF5KG9wc0FycmF5KTsKLQkJCXJldHVybiBvcHNBcnJheTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvTGlzdEZlYXR1cmVzQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9MaXN0RmVhdHVyZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDI5MTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9MaXN0RmVhdHVyZXNDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLQotLyoqCi0gKiBMaXN0cyBpbnN0YWxsZWQgZmVhdHVyZXMuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgTGlzdEZlYXR1cmVzQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZnJvbVNpdGUgaWYgc3BlY2lmaWVkLCBsaXN0IG9ubHkgdGhlIGZlYXR1cmVzIGZyb20gdGhlIHNwZWNpZmllZCBsb2NhbCBpbnN0YWxsIHNpdGUKLQkgKi8KLQlwdWJsaWMgTGlzdEZlYXR1cmVzQ29tbWFuZChTdHJpbmcgZnJvbVNpdGUpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKGZyb21TaXRlICE9IG51bGwpIHsKLQkJCQlGaWxlIHNpdGVQYXRoID0gbmV3IEZpbGUoZnJvbVNpdGUpOwotCQkJCWlmICghc2l0ZVBhdGguZXhpc3RzKCkpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlIikgKyBmcm9tU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJVVJMIGZyb21TaXRlVVJMID0gc2l0ZVBhdGgudG9VUkwoKTsKLQkJCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShmcm9tU2l0ZVVSTCwgbnVsbCk7Ci0JCQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgZnJvbVNpdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJaWYgKGNzaXRlID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9Db25maWd1cmVkU2l0ZSIpICsgZnJvbVNpdGUpOyAvLyROT04tTkxTLTEkCi0JCQkJc2l0ZXMgPSBuZXcgSUNvbmZpZ3VyZWRTaXRlW10geyBjc2l0ZSB9OwotCQkJfSAKLQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBlOwotCQl9IAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWlmIChzaXRlcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNpdGU6ICIgKyBzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBzaXRlc1tpXQotCQkJCQkJCS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJCQlmb3IgKGludCBmID0gMDsgZiA8IGZlYXR1cmVzLmxlbmd0aDsgZisrKSB7Ci0JCQkJCQlib29sZWFuIGNvbmZpZ3VyZWQgPSBzaXRlc1tpXS5pc0NvbmZpZ3VyZWQoZmVhdHVyZXNbZl0KLQkJCQkJCQkJLmdldEZlYXR1cmUobnVsbCkpOwotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIEZlYXR1cmU6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGZlYXR1cmVzW2ZdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkJCS5nZXRJZGVudGlmaWVyKCkKLQkJCQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrIGZlYXR1cmVzW2ZdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKQotCQkJCQkJCQkJCS5nZXRWZXJzaW9uKCkgKyAiICAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJKyAoY29uZmlndXJlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQlVcGRhdGVDb3JlLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvUmVtb3ZlU2l0ZUNvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvUmVtb3ZlU2l0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgzMzg2Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1JlbW92ZVNpdGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotLyoqCi0gKiBSZW1vdmVzIGEgY29uZmlndXJlZCBzaXRlLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZVNpdGVDb21tYW5kIGV4dGVuZHMgU2NyaXB0ZWRDb21tYW5kIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBjc2l0ZTsKLQlwcml2YXRlIEZpbGUgc2l0ZVBhdGg7Ci0JCi0JLyoqCi0JICogQHBhcmFtIHRvU2l0ZSBpZiBzcGVjaWZpZWQsIGxpc3Qgb25seSB0aGUgZmVhdHVyZXMgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2FsIGluc3RhbGwgc2l0ZQotCSAqLwotCXB1YmxpYyBSZW1vdmVTaXRlQ29tbWFuZChTdHJpbmcgdG9TaXRlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmICh0b1NpdGUgIT0gbnVsbCkgewotCQkJCXNpdGVQYXRoID0gbmV3IEZpbGUodG9TaXRlKTsKLQkJCQlpZiAoIXNpdGVQYXRoLmdldE5hbWUoKS5lcXVhbHMoImVjbGlwc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlzaXRlUGF0aCA9IG5ldyBGaWxlKHNpdGVQYXRoLCAiZWNsaXBzZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKCFzaXRlUGF0aC5leGlzdHMoKSkKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1NpdGUiKSArIHRvU2l0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCi0JCQkJSUNvbmZpZ3VyZWRTaXRlW10gY3NpdGVzID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCQlmb3IgKGludCBpPTA7IGk8Y3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUZpbGUgZiA9IG5ldyBGaWxlKGNzaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJCQkJaWYgKGYuZXF1YWxzKHNpdGVQYXRoKSkgewotCQkJCQkJY3NpdGUgPSBjc2l0ZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQlpZiAoY3NpdGUgPT0gbnVsbCkKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0NvbmZpZ3VyZWRTaXRlIikgKyB0b1NpdGUpOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9TaXRlMyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlnIGZpbGUgaGFzIGJlZW4gbW9kaWZlZCB3aGlsZSB3ZSB3ZXJlIHJ1bm5pbmcKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9CQotCQl0cnkgewotCQkJZ2V0Q29uZmlndXJhdGlvbigpLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKGNzaXRlKTsKLQkJCS8vIHVwZGF0ZSB0aGUgc2l0ZXMgYXJyYXkKLQkJCWdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLnNhdmUoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TY3JpcHRlZENvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvU2NyaXB0ZWRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWEwNjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TY3JpcHRlZENvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLS8qKgotICogUGFyZW50IGNsYXNzIGZvciBhbGwgdGhlIHVwZGF0ZSBtYW5hZ2VyIHN0YW5kYWxvbmUgY29tbWFuZHMuCi0gKiBTdWJjbGFzc2VzIHdpbGwgcHJvdmlkZSBzcGVjaWZpYyBvcGVyYXRpb25zIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJ1bigpIG1ldGhvZC4KLSAqIDxwPgotICogPGI+Tm90ZTo8L2I+IFRoaXMgY2xhc3MvaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8KLSAqIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjawotICogZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4KLSAqIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8L3A+Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTY3JpcHRlZENvbW1hbmQgaW1wbGVtZW50cyBJT3BlcmF0aW9uTGlzdGVuZXIgewotCi0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByb3RlY3RlZCBib29sZWFuIHZlcmlmeU9ubHk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqCi0JICovCi0JcHVibGljIFNjcmlwdGVkQ29tbWFuZCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKiAKLQkgKiBAcGFyYW0gdmVyaWZ5T25seSBpZiB0cnVlLCB0aGUgY29tbWFuZCBpcyBub3QgZXhlY3V0ZWQsIGJ1dCB3aWxsIG9ubHkgYXR0ZW1wdCB0byBydW4gdGhlIGNvbW1hbmQuIAotCSAqIFRoaXMgaXMgbW9zdGx5IHVzZWQgd2hlbiB3YW50ZWQgdG8ga25vdyBpZiB0aGUgY29tbWFuZCB3b3VsZCBmYWlsLgotCSAqLwotCXB1YmxpYyBTY3JpcHRlZENvbW1hbmQoU3RyaW5nIHZlcmlmeU9ubHkpIHsKLQkJdGhpcy52ZXJpZnlPbmx5ID0gInRydWUiLmVxdWFscyh2ZXJpZnlPbmx5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGNvbW1hbmQgc2hvdWxkIG9ubHkgYmUgcnVuIGluIHNpbXVsYXRpb24gbW9kZSwKLQkgKiB0byB2ZXJpZnkgaWYgaXQgY2FuIGV4ZWN1dGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNWZXJpZnlPbmx5KCkgewotCQlyZXR1cm4gdmVyaWZ5T25seTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRoIGEgbnVsbCBwcm9ncmVzcyBtb25pdG9yLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIHJ1bigpIHsKLQkJcmV0dXJuIHJ1bihuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZXMgdGhlIGNvbW1hbmQuIFN1YmNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhpcyBtZXRob2QuCi0JICogSWYgdGhlIGNvbW1hbmQgd2FzIGNvbnN0cnVjdGVkIHdpdGggdmVyaWZ5T25seT10cnVlLCB0aGUgY29tbWFuZCBzaG91bGQgbm90IGV4ZWN1dGUsIGJ1dCBvbmx5IHZlcmlmeSBpdCBjYW4gZXhlY3V0ZS4KLQkgKiBAcGFyYW0gbW9uaXRvciBwcm9ncmVzcyBtb25pdG9yIGR1cmluZyBjb21tYW5kIGV4ZWN1dGlvbi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIGNoYW5nZXMgbWFkZSB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5Q2hhbmdlc05vdygpIHsKLQkJSW5zdGFsbENvbmZpZ3VyYXRpb24uYXBwbHlDaGFuZ2VzKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lciNhZnRlckV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZnRlckV4ZWN1dGUoSU9wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lciNiZWZvcmVFeGVjdXRlKG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gYmVmb3JlRXhlY3V0ZShJT3BlcmF0aW9uIG9wZXJhdGlvbiwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgaW5zdGFsbGF0aW9uIGNvbmZpZ3VyYXRpb24gYWZmZWN0ZWQgYnkgdGhlIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgZmluYWwgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJY29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJVXBkYXRlQ29yZS5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvU2VhcmNoQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TZWFyY2hDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNDNmOTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TZWFyY2hDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogQ29tbWFuZCB0byBzZWFyY2ggYW4gdXBkYXRlIHNpdGUgYW5kIGxpc3QgaXRzIGZlYXR1cmVzLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaENvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCi0JcHJpdmF0ZSBVUkwgcmVtb3RlU2l0ZVVSTDsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKLQlwcml2YXRlIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yOwotCi0JcHVibGljIFNlYXJjaENvbW1hbmQoU3RyaW5nIGZyb21TaXRlKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnJlbW90ZVNpdGVVUkwgPSBuZXcgVVJMKFVSTERlY29kZXIuZGVjb2RlKGZyb21TaXRlLCAiVVRGLTgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7Ci0JCQlzZWFyY2hTY29wZS5hZGRTZWFyY2hTaXRlKAotCQkJCSJyZW1vdGVTaXRlIiwgLy8kTk9OLU5MUy0xJAotCQkJCXJlbW90ZVNpdGVVUkwsCi0JCQkJbmV3IFN0cmluZ1swXSk7Ci0JCQlzZWFyY2hSZXF1ZXN0ID0KLQkJCQluZXcgVXBkYXRlU2VhcmNoUmVxdWVzdChuZXcgU2l0ZVNlYXJjaENhdGVnb3J5KCksIHNlYXJjaFNjb3BlKTsKLQkJCWNvbGxlY3RvciA9IG5ldyBVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLnNlYXJjaGluZyIpICsgcmVtb3RlU2l0ZVVSTC50b0V4dGVybmFsRm9ybSgpLCA0KTsgLy8kTk9OLU5MUy0xJAotCQkJc2VhcmNoUmVxdWVzdC5wZXJmb3JtU2VhcmNoKGNvbGxlY3RvciwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbAotCQkJCSYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVNpdGUuU0lURV9BQ0NFU1NfRVhDRVBUSU9OKSB7Ci0JCQkJLy8gSnVzdCBzaG93IHRoaXMgYnV0IGRvIG5vdCB0aHJvdyBleGNlcHRpb24KLQkJCQkvLyBiZWNhdXNlIHRoZXJlIG1heSBiZSByZXN1bHRzIGFueXdheS4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY29ubmVjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uZXhjZXB0aW9uTG9nZ2VkKCk7Ci0JCQkJVXBkYXRlQ29yZS5sb2coY2UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQl9Ci0KLQotCWNsYXNzIFVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgewotCQlwdWJsaWMgdm9pZCBhY2NlcHQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSJcIiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmUuZ2V0TGFiZWwoKQotCQkJCQkrICJcIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCkKLQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1N0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9TdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwYjFkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1N0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci0KLS8qKgotICogVGhlIGFwcGxpY2F0aW9uIGNsYXNzIHVzZWQgdG8gbGF1bmNoIHN0YW5kYWxvbmUgdXBkYXRlIGNvbW1hbmRzLgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElQbGF0Zm9ybVJ1bm5hYmxlIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSW50ZWdlciBFWElUX0VSUk9SID0gbmV3IEludGVnZXIoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBsb2dnZWRFeGNlcHRpb24gPSBmYWxzZTsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuYm9vdC5JUGxhdGZvcm1SdW5uYWJsZSNydW4oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJ1bihPYmplY3QgYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm4gRVhJVF9FUlJPUjsKLQkJaWYgKGFyZ3MgaW5zdGFuY2VvZiBTdHJpbmdbXSkgewotCQkJU3RyaW5nW10gcGFyYW1zID0gKFN0cmluZ1tdKSBhcmdzOwotCQkJQ21kTGluZUFyZ3MgY21kTGluZUFyZ3MgPSBuZXcgQ21kTGluZUFyZ3MocGFyYW1zKTsKLQkJCVNjcmlwdGVkQ29tbWFuZCBjbWQgPSBjbWRMaW5lQXJncy5nZXRDb21tYW5kKCk7Ci0JCQlpZiAoY21kID09IG51bGwpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY21kRmFpbGVkIiwgUGxhdGZvcm0uZ2V0TG9nRmlsZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gRVhJVF9FUlJPUjsKLQkJCX0KLQkJCWxvZ2dlZEV4Y2VwdGlvbiA9IGZhbHNlOwotCQkJYm9vbGVhbiByZXN1bHQgPSBjbWQucnVuKCk7Ci0JCQlpZiAocmVzdWx0KSB7Ci0JCQkJaWYgKGxvZ2dlZEV4Y2VwdGlvbikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY21kQ29tcGxldGVXaXRoRXJyb3JzIiwgUGxhdGZvcm0uZ2V0TG9nRmlsZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKSk7Ly8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5jbWRPSyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSzsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGxvZ2dlZEV4Y2VwdGlvbikgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY21kRmFpbGVkIiwgUGxhdGZvcm0uZ2V0TG9nRmlsZUxvY2F0aW9uKCkudG9PU1N0cmluZygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUuY21kRmFpbGVkTm9Mb2ciKSk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm4gRVhJVF9FUlJPUjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRVhJVF9FUlJPUjsKLQl9Ci0JcHVibGljIHN0YXRpYyB2b2lkIGV4Y2VwdGlvbkxvZ2dlZCgpIHsKLQkJbG9nZ2VkRXhjZXB0aW9uID0gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvVW5pbnN0YWxsQ29tbWFuZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9Vbmluc3RhbGxDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTUwMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9Vbmluc3RhbGxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuc3RhbmRhbG9uZTsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIENvbW1hbmQgdG8gdW5pbnN0YWxsIGEgZmVhdHVyZS4gVGhlIGZlYXR1cmUgbXVzdCBiZSBkaXNhYmxlZCBiZWZvcmUgdW5pbnN0YWxsaW5nIGl0LgotICogPHA+Ci0gKiA8Yj5Ob3RlOjwvYj4gVGhpcyBjbGFzcy9pbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0bwotICogY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrCi0gKiBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbgotICogKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwvcD4KLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIFVuaW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBTY3JpcHRlZENvbW1hbmQgewotCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGUgdGFyZ2V0U2l0ZTsKLQlwcml2YXRlIElGZWF0dXJlIGZlYXR1cmU7Ci0KLQlwdWJsaWMgVW5pbnN0YWxsQ29tbWFuZCgKLQkJU3RyaW5nIGZlYXR1cmVJZCwKLQkJU3RyaW5nIHZlcnNpb24sCi0JCVN0cmluZyB0b1NpdGUsCi0JCVN0cmluZyB2ZXJpZnlPbmx5KQotCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdXBlcih2ZXJpZnlPbmx5KTsKLQotCQl0cnkgewotCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0KLQkJCS8vIEdldCBzaXRlIHRoYXQgY29udGFpbnMgdGhlIGZlYXR1cmUgdG8gdW5pbnN0YWxsCi0JCQlpZiAodG9TaXRlICE9IG51bGwpIHsKLQkJCQlVUkwgdG9TaXRlVVJMID0gbmV3IEZpbGUodG9TaXRlKS50b1VSTCgpOwotCQkJCWlmIChTaXRlTWFuYWdlci5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCkgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vU2l0ZSIpICsgdG9TaXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0YXJnZXRTaXRlID0KLQkJCQkJU2l0ZU1hbmFnZXIKLQkJCQkJCS5nZXRTaXRlKHRvU2l0ZVVSTCwgbnVsbCkKLQkJCQkJCS5nZXRDdXJyZW50Q29uZmlndXJlZFNpdGUoKTsKLQkJCX0KLQkJCWlmICh0YXJnZXRTaXRlID09IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChzaXRlc1tpXS5pc1Byb2R1Y3RTaXRlKCkpIHsKLQkJCQkJCXRhcmdldFNpdGUgPSBzaXRlc1tpXTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlJRmVhdHVyZVtdIGZlYXR1cmVzID0KLQkJCQlVcGRhdGVVdGlscy5zZWFyY2hTaXRlKGZlYXR1cmVJZCwgdGFyZ2V0U2l0ZSwgZmFsc2UpOwotCQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vRmVhdHVyZXMxIiwgZmVhdHVyZUlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICh2ZXJzaW9uID09IG51bGwgfHwgdmVyc2lvbi50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJCQlmZWF0dXJlID0gZmVhdHVyZXNbMF07IC8vIHBpY2sgdGhlIGZpcnN0IGZlYXR1cmUKLQkJCWVsc2UKLQkJCQlmb3IgKGludCBpID0gMDsgZmVhdHVyZXMgIT0gbnVsbCAmJiBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGZlYXR1cmVzW2ldCi0JCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkuZ2V0VmVyc2lvbigpCi0JCQkJCQkudG9TdHJpbmcoKQotCQkJCQkJLmVxdWFscyh2ZXJzaW9uKQotCQkJCQkJJiYgIXRhcmdldFNpdGUuaXNDb25maWd1cmVkKGZlYXR1cmVzW2ldKSkgewotCQkJCQkJZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQlpZiAoZmVhdHVyZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub0ZlYXR1cmVzMiIsIGZlYXR1cmVJZCwgdmVyc2lvbikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGU7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gY2hlY2sgaWYgdGhlIGNvbmZpZyBmaWxlIGhhcyBiZWVuIG1vZGlmZWQgd2hpbGUgd2Ugd2VyZSBydW5uaW5nCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJVXBkYXRlQ29yZS5sb2coc3RhdHVzKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoSW5zdGFsbFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0KCJmZWF0dXJlXyIrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSA9PSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJVbmluc3RhbGxDb21tYW5kLmZlYXR1cmVOb3RJbnN0YWxsZWRCeVVNIiwgZmVhdHVyZS50b1N0cmluZygpKSxudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkJCQkJCi0JCWlmIChpc1ZlcmlmeU9ubHkoKSkgewotCQkJLy8gaWYgcmVhY2hlZCB0aGlzIHBvaW50LCBpdCBpcyBzYWZlIHRvIHVuaW5zdGFsbAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlmaW5hbCBJVW5pbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiB1bmluc3RhbGxPcGVyYXRpb24gPQotCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpLmNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbigKLQkJCQl0YXJnZXRTaXRlLAotCQkJCWZlYXR1cmUpOwotCi0JCXRyeSB7Ci0JCQl1bmluc3RhbGxPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCB0aGlzKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9zdGFuZGFsb25lL1VwZGF0ZUNvbW1hbmQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvVXBkYXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzUwYzc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvVXBkYXRlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmU7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogQ29tbWFuZCB0byB1ZHBhdGUgYW5kIGV4aXN0aW5nIGZlYXR1cmUuCi0gKiA8cD4KLSAqIDxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzL2ludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi0gKiBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLSAqIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0gKiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPC9wPgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ29tbWFuZCBleHRlbmRzIFNjcmlwdGVkQ29tbWFuZCB7Ci0KLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlOwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0OwotCXByaXZhdGUgVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIGNvbGxlY3RvcjsKLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQlwcml2YXRlIElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlOwotCi0JLyoqCi0JICogVXBkYXRlIGNvbW1hbmQgZm9yIHVwZGF0aW5nIGEgZmVhdHVyZSB0byBhIG5ld2VyIHZlcnNpb24uCi0JICogQHBhcmFtIGZlYXR1cmVJZAotCSAqIEBwYXJhbSB2ZXJpZnlPbmx5Ci0JICogQHRocm93cyBFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgVXBkYXRlQ29tbWFuZChTdHJpbmcgZmVhdHVyZUlkLCBTdHJpbmcgdmVyaWZ5T25seSkKLQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcyhmZWF0dXJlSWQsIG51bGwsIHZlcmlmeU9ubHkpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgY29tbWFuZCBmb3IgdXBkYXRpbmcgYSBmZWF0dXJlIHRvIGEgc3BlY2lmaWVkIG5ld2VyIHZlcnNpb24uCi0JICogQHBhcmFtIGZlYXR1cmVJZAotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogQHBhcmFtIHZlcmlmeU9ubHkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBVcGRhdGVDb21tYW5kKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgdmVyaWZ5T25seSkKLQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3VwZXIodmVyaWZ5T25seSk7Ci0KLQkJdHJ5IHsKLQkJCXRoaXMuZmVhdHVyZUlkID0gZmVhdHVyZUlkOwotCQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJCWlmIChmZWF0dXJlSWQgIT0gbnVsbCkgewotCQkJCXRoaXMudGFyZ2V0U2l0ZSA9Ci0JCQkJCVVwZGF0ZVV0aWxzLmdldFNpdGVXaXRoRmVhdHVyZSgKLQkJCQkJCWdldENvbmZpZ3VyYXRpb24oKSwKLQkJCQkJCWZlYXR1cmVJZCk7Ci0JCQkJaWYgKHRhcmdldFNpdGUgPT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLm5vQ29uZmlnU2l0ZUZvckZlYXR1cmUiLCBmZWF0dXJlSWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlJRmVhdHVyZVtdIGN1cnJlbnRGZWF0dXJlcyA9Ci0JCQkJCVVwZGF0ZVV0aWxzLnNlYXJjaFNpdGUoZmVhdHVyZUlkLCB0YXJnZXRTaXRlLCB0cnVlKTsKLQkJCQlpZiAoY3VycmVudEZlYXR1cmVzID09IG51bGwgfHwgY3VycmVudEZlYXR1cmVzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJCXRocm93IG5ldyBFeGNlcHRpb24oUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9GZWF0dXJlczMiLCBmZWF0dXJlSWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQl0aGlzLmN1cnJlbnRGZWF0dXJlID0gY3VycmVudEZlYXR1cmVzWzBdOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBHZXQgc2l0ZSB0byBpbnN0YWxsIHRvCi0JCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPQotCQkJCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2l0ZXNbaV0uaXNQcm9kdWN0U2l0ZSgpKSB7Ci0JCQkJCQl0YXJnZXRTaXRlID0gc2l0ZXNbaV07Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjdXJyZW50RmVhdHVyZSA9PSBudWxsKQotCQkJCXNlYXJjaFJlcXVlc3QgPSBVcGRhdGVVdGlscy5jcmVhdGVOZXdVcGRhdGVzUmVxdWVzdChudWxsKTsKLQkJCWVsc2UgewotCQkJCXNlYXJjaFJlcXVlc3QgPQotCQkJCQlVcGRhdGVVdGlscy5jcmVhdGVOZXdVcGRhdGVzUmVxdWVzdCgKLQkJCQkJCW5ldyBJRmVhdHVyZVtdIHsgY3VycmVudEZlYXR1cmUgfSk7Ci0JCQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIoCi0JCQkJCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcnNGaWx0ZXIoCi0JCQkJCQkJbmV3IFZlcnNpb25lZElkZW50aWZpZXJbXSB7IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGZlYXR1cmVJZCwgdmVyc2lvbikgfSkpOwotCQkJfQotCi0JCQljb2xsZWN0b3IgPSBuZXcgVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCVVwZGF0ZUNvcmUubG9nKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBjaGVjayBpZiB0aGUgY29uZmlnIGZpbGUgaGFzIGJlZW4gbW9kaWZlZCB3aGlsZSB3ZSB3ZXJlIHJ1bm5pbmcKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlVcGRhdGVDb3JlLmxvZyhzdGF0dXMpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS51cGRhdGluZyIpLCA0KTsgIC8vJE5PTi1OTFMtMSQKLQkJCXNlYXJjaFJlcXVlc3QucGVyZm9ybVNlYXJjaChjb2xsZWN0b3IsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwxKSk7Ci0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBvcGVyYXRpb25zID0gY29sbGVjdG9yLmdldE9wZXJhdGlvbnMoKTsKLQkJCWlmIChvcGVyYXRpb25zID09IG51bGwgfHwgb3BlcmF0aW9ucy5sZW5ndGggPT0gMCkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZyhVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS5ub1VwZGF0ZSIsIGZlYXR1cmVJZCksCW51bGwpKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIENoZWNrIGZvciBkdXBsaWNhdGlvbiBjb25mbGljdHMKLQkJCUFycmF5TGlzdCBjb25mbGljdHMgPQotCQkJCUR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5jb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotCQkJCQlvcGVyYXRpb25zLAotCQkJCQlnZXRDb25maWd1cmF0aW9uKCkpOwotCQkJaWYgKGNvbmZsaWN0cyAhPSBudWxsKSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmR1cGxpY2F0ZSIpLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCWlmIChpc1ZlcmlmeU9ubHkoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJSUJhdGNoT3BlcmF0aW9uIGluc3RhbGxPcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUJhdGNoSW5zdGFsbE9wZXJhdGlvbigKLQkJCQkJb3BlcmF0aW9ucyk7Ci0JCQl0cnkgewotCQkJCWluc3RhbGxPcGVyYXRpb24uZXhlY3V0ZShuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsMyksIHRoaXMpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkJCVBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmZlYXR1cmUiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGZlYXR1cmVJZAotCQkJCQkJKyAiICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBQb2xpY3kuYmluZCgiU3RhbmRhbG9uZS51cGRhdGVkIikpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbi5leGNlcHRpb25Mb2dnZWQoKTsKLQkJCQlVcGRhdGVDb3JlLmxvZygKLQkJCQkJVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oCi0JCQkJCQkJUG9saWN5LmJpbmQoIlN0YW5kYWxvbmUubm9VcGRhdGUiLCBmZWF0dXJlSWQpLCAgLy8kTk9OLU5MUy0xJAotCQkJCQkJZSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJc3RhdHVzID0gY2UuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwKLQkJCQkmJiBzdGF0dXMuZ2V0Q29kZSgpID09IElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTikgewotCQkJCS8vIEp1c3Qgc2hvdyB0aGlzIGJ1dCBkbyBub3QgdGhyb3cgZXhjZXB0aW9uCi0JCQkJLy8gYmVjYXVzZSB0aGVyZSBtYXkgYmUgcmVzdWx0cyBhbnl3YXkuCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKFBvbGljeS5iaW5kKCJTdGFuZGFsb25lLmNvbm5lY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uLmV4Y2VwdGlvbkxvZ2dlZCgpOwotCQkJCVVwZGF0ZUNvcmUubG9nKGNlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotCi0KLQljbGFzcyBVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHsKLQkJcHJpdmF0ZSBBcnJheUxpc3Qgb3BlcmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgdm9pZCBhY2NlcHQoSUZlYXR1cmUgZmVhdHVyZSkgewotCi0JCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gb3AgPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVJbnN0YWxsT3BlcmF0aW9uKAotCQkJCQludWxsLAotCQkJCQlmZWF0dXJlLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQludWxsKTsKLQotCQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUgPQotCQkJCVVwZGF0ZVV0aWxzLmdldERlZmF1bHRUYXJnZXRTaXRlKGdldENvbmZpZ3VyYXRpb24oKSwgb3ApOwotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCQlzaXRlID0gVXBkYXRlVXRpbHMuZ2V0QWZmaW5pdHlTaXRlKGdldENvbmZpZ3VyYXRpb24oKSwgZmVhdHVyZSk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXNpdGUgPSB0YXJnZXRTaXRlOwotCi0JCQlvcC5zZXRUYXJnZXRTaXRlKHNpdGUpOwotCQkJb3BlcmF0aW9ucy5hZGQob3ApOwotCQl9Ci0JCXB1YmxpYyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBnZXRPcGVyYXRpb25zKCkgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3BzQXJyYXkgPQotCQkJCW5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bb3BlcmF0aW9ucy5zaXplKCldOwotCQkJb3BlcmF0aW9ucy50b0FycmF5KG9wc0FycmF5KTsKLQkJCXJldHVybiBvcHNBcnJheTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3N0YW5kYWxvbmUvcGFja2FnZS5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYThkYjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvc3RhbmRhbG9uZS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci08aGVhZD4KLSAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotICAgPG1ldGEgbmFtZT0iQXV0aG9yIiBjb250ZW50PSJJQk0iPgotICAgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJNb3ppbGxhLzQuNzIgW2VuXSAoV2luZG93cyBOVCA1LjA7IFUpIFtOZXRzY2FwZV0iPgotICAgPHRpdGxlPlBhY2thZ2UtbGV2ZWwgSmF2YWRvYzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLVByb3ZpZGVzIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgdmFyaW91cyBpbnN0YWxsL3VwZGF0ZSBvcGVyYXRpb25zIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLTxoMj4KLVBhY2thZ2UgU3BlY2lmaWNhdGlvbjwvaDI+Ci1UaGlzIHBhY2thZ2UgY29udGFpbnMgaW50ZXJmYWNlcyBmb3IgcGVyZm9ybWluZyB1cGRhdGUvaW5zdGFsbCBvcGVyYXRpb25zIAotd2l0aG91dCB1c2luZyB0aGUgVXBkYXRlIE1hbmFnZXIgdXNlciBpbnRlcmZhY2UuIEluIGdlbmVyYWwsIGl0IGlzIGJlc3QgdG8gdXNlIHRoZXNlCi1jbGFzc2VzIGZvciBjb21tYW5kIGxpbmUgaW52b2NhdGlvbiwgYnV0IGl0IGlzIHBvc3NpYmxlIHRvIGFsc28gdXNlIHRoZW0gcHJvZ3JhbW1hdGljYWxseS4KLTxwPgotPGI+Tm90ZTo8L2I+IFRoaXMgcGFja2FnZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvCi1jaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sKLWZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuCi0ocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDhmZTJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5hcGFjaGUueGVyY2VzIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51cGRhdGUuY29yZSIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Y2I1NGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzPC9uYW1lPg0KLQk8Y29tbWVudD48L2NvbW1lbnQ+DQotCTxwcm9qZWN0cz4NCi0JCTxwcm9qZWN0Pm9yZy5hcGFjaGUueGVyY2VzPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLnVpLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS51aS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS51aS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZS5jdnNuYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvU2NyYXBib29rMi5qcGFnZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvU2NyYXBib29rMi5qcGFnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkYTk5YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL1NjcmFwYm9vazIuanBhZ2UKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotU2l0ZU1hbmFnZXIuZ2V0U2l0ZShVUkwpdGhyb3dzIENvcmVFeGNlcHRpb24NCi0gIFN0cmluZyB0eXBlID0gZ2V0VHlwZUZvcnByb3RvY29sKFVSTC5nZXRwcm90b2NvbCk7DQotICB0cnkgew0KLSAgICBpZiAodHlwZSAhPSBudWxsKXsNCi0JYXR0ZW1wdENyZWF0aW9uU2l0ZSh0eXBlLFVSTCk7DQotICAgIH0gZWxzZSB7DQotCWF0dGVtcHRDcmVhdGlvblNpdGUoImh0dHAiLFVSTCk7DQotICAgIH0NCi0gIH0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7DQotICAgIHRocm93IG5ldyBDb3JlRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIHNpdGUiLGUuZ2V0TWVzc2FnZSgpKTsNCi0gIH0NCi0NCi1TaXRlTWFuYWdlci5hdHRlbXB0Q3JlYXRpb25TaXRlKHR5cGUsVVJMKXRocm93cyBDb3JlRXhjZXB0aW9uDQotICB0cnkgew0KLSAgICBjcmVhdGVTaXRlKHR5cGUsVVJMKTsNCi0gIH0gY2F0Y2ggKEludmFsaWRUeXBlRXhjZXB0aW9uIGUpew0KLSAgICB0cnkgew0KLSAgICAgIGNyZWF0ZVNpdGUoZS5nZXRSZWFsVHlwZSgpLFVSTCk7DQotICAgIH0gY2F0Y2ggKEludmFsaWRTaXRlRXhlcHRpb24gZSl7DQotICAgICAgdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oIldyb25nIHNpdGUgdHlwZSIpOw0KLSAgICB9DQotICB9DQotDQotU2l0ZU1hbmFnZXIuY3JlYXRlU2l0ZSh0eXBlLFVSTCkgdGhyb3dzIENvcmVFeGVwdGlvbiwgSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uDQotDQotDQotdHJ5IHsNCi0JCQkNCi0JZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCQ0KLX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JLy8gaWYgdGhlIFVSTCBpcyBwb2ludGluZyB0byBlaXRoZXIgYSBmaWxlIA0KLS8vIG9yIGEgZGlyZWN0b3J5LCB3aXRob3V0IHJlZmVyZW5jZQkJCQ0KLWlmICh1cmwuZ2V0UmVmKCkgIT0gbnVsbCkgew0KLQkvLyA0IG5vdGhpbmcgd2UgY2FuIGRvDQotCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyB1cmw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7DQotfSBlbHNlIGlmICh1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIvIikpIHsNCi0JLy8gMSB0cnkgdG8gYWRkIHNpdGUueG1sDQotCXRyeSB7DQotCQl1cmwgPSBuZXcgVVJMKHVybCxTaXRlLlNJVEVfWE1MKTsNCi0JfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KLQl9DQotCXRyeSB7DQotCQlzaXRlID0gZmFjdG9yeS5jcmVhdGVTaXRlKHVybCwgZm9yY2VDcmVhdGlvbik7DQotCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSxlMSk7CQkJCQkNCi0JfQ0KLX0gZWxzZSBpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChTaXRlLlNJVEVfWE1MKSkgew0KLQkvLyAzIG5vdGhpbmcgd2UgY2FuIGRvDQotCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyB1cmw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZS5nZXRNZXNzYWdlKCksZSk7DQotfSBlbHNlIHsNCi0JLy8gMiB0cnkgdG8gYWRkIC9zaXRlLnhtbA0KLQl0cnkgew0KLQkJdXJsID0gbmV3IFVSTCh1cmwuZ2V0UHJvdG9jb2woKSx1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCB1cmwuZ2V0RmlsZSgpKyIvIitTaXRlLlNJVEVfWE1MKTsNCi0JfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIisiK1NpdGUuU0lURV9YTUwsZTEpOw0KLQl9DQotCQ0KLQl0cnkgew0KLQkJc2l0ZSA9IGZhY3RvcnkuY3JlYXRlU2l0ZSh1cmwsIGZvcmNlQ3JlYXRpb24pOw0KLQl9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgVVJMOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSsiXHJcblByZXZpb3VzIElucHV0L091dHB1dCBFcnJvcjoiK2UuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBhY2Nlc3NpbmcgdXJsOiIrdXJsLnRvRXh0ZXJuYWxGb3JtKCkrIlxyXG4iK2UxLmdldE1lc3NhZ2UoKSsiXHJcblByZXZpb3VzIElucHV0L091dHB1dCBFcnJvcjoiK2UuZ2V0TWVzc2FnZSgpLGUxKTsJCQkJCQ0KLQkJCQl9CQkJCQ0KLQkJCX0NCi0NCi0JCX0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gZSkgew0KLQkJCQ0KLQkJCS8vIGlmIHRoZSBVUkwgaXMgcG9pbnRpbmcgdG8gZWl0aGVyIGEgZmlsZSANCi0vLyBvciBhIGRpcmVjdG9yeSwgd2l0aG91dCByZWZlcmVuY2UJCQkNCi1pZiAodXJsLmdldFJlZigpICE9IG51bGwpIHsNCi0JLy8gNCBub3RoaW5nIHdlIGNhbiBkbw0KLQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlLmdldE1lc3NhZ2UoKSxlKTsNCi19IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoIi8iKSkgew0KLQkvLyAxIHRyeSB0byBhZGQgc2l0ZS54bWwNCi0JdHJ5IHsNCi0JCXVybCA9IG5ldyBVUkwodXJsLFNpdGUuU0lURV9YTUwpOw0KLQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiKyIrU2l0ZS5TSVRFX1hNTCxlMSk7DQotCX0NCi0JdHJ5IHsNCi0JCXNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCi0JfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyB1cmw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpLGUxKTsNCi0JCQkJfQkJCQkNCi0NCi0JCQl9IGVsc2UgaWYgKHVybC5nZXRGaWxlKCkuZW5kc1dpdGgoU2l0ZS5TSVRFX1hNTCkpIHsNCi0JCQkJLy8gMyBub3RoaW5nIHdlIGNhbiBkbw0KLQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlLmdldE1lc3NhZ2UoKSxlKTsJCQkJCQ0KLX0gZWxzZSB7DQotCS8vIDIgdHJ5IHRvIGFkZCAvc2l0ZS54bWwNCi0JDQotCXRyeSB7DQotCQl1cmwgPSBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLHVybC5nZXRIb3N0KCksIHVybC5nZXRQb3J0KCksIHVybC5nZXRGaWxlKCkrIi8iK1NpdGUuU0lURV9YTUwpOw0KLQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpew0KLQkJdGhyb3cgbmV3Q29yZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBVUkw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiKyIrU2l0ZS5TSVRFX1hNTCxlMSk7DQotCX0NCi0JdHJ5IHsNCi0JCXNpdGUgPSBmYWN0b3J5LmNyZWF0ZVNpdGUodXJsLCBmb3JjZUNyZWF0aW9uKTsNCi0JfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiBlMSl7DQotCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJFcnJvciBwYXJzaW5nIFVSTDoiK3VybC50b0V4dGVybmFsRm9ybSgpKyJcclxuIitlMS5nZXRNZXNzYWdlKCkrIlxyXG5QcmV2aW91cyBQYXJzaW5nIGVycm9yOiIrZS5nZXRNZXNzYWdlKCksZTEpOwkJCQkJDQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKXsNCi0JCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIkVycm9yIGFjY2Vzc2luZyB1cmw6Iit1cmwudG9FeHRlcm5hbEZvcm0oKSsiXHJcbiIrZTEuZ2V0TWVzc2FnZSgpKyJcclxuUHJldmlvdXMgUGFyc2luZyBlcnJvcjoiK2UuZ2V0TWVzc2FnZSgpLGUxKTsNCi0JDQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjgzMjRlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi1wLCB0YWJsZSwgdGQsIHRoIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQ0KLXByZSB7IGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9DQotaDIgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkIDsgbGluZS1oZWlnaHQ6IDE0cHh9DQotY29kZSB7IGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9DQotc3VwIHsgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxnZW5ldmE7IGZvbnQtc2l6ZTogMTBweH0NCi1oMyB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGR9DQotbGkgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9DQotaDEgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDI4cHg7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KLWJvZHkgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHQ7IGNsaXA6IHJlY3QoICAgKTsgbWFyZ2luLXRvcDogNW1tOyBtYXJnaW4tbGVmdDogM21tfQ0KLTwvc3R5bGU+DQotPC9oZWFkPg0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2bGluaz0icHVycGxlIj4NCi08dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iNSIgY2VsbHBhZGRpbmc9IjIiIHdpZHRoPSIxMDAlIiA+DQotICA8dHI+IA0KLSAgICA8dGQgYWxpZ249IkxFRlQiIHZhbGlnbj0iVE9QIiBjb2xzcGFuPSIyIiBiZ2NvbG9yPSIjMDA4MEMwIj48Yj48Zm9udCBjb2xvcj0iI0ZGRkZGRiI+QWJvdXQgVGhpcyBDb250ZW50PC9mb250PjwvYj48L3RkPg0KLSAgPC90cj4NCi0gIDx0cj4gDQotICAgIDx0ZD4gDQotPHA+MTF0aCBEZWNlbWJlciwgMjAwMTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gJnF1b3Q7Q29udGVudCZxdW90Oy4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sIj5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAwLjU8L2E+ICZxdW90O0NQTCZxdW90Oy4gIEZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+DQotDQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPg0KLQ0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQ0KLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gNCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+DQotDQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7LCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcg0KLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OyB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQ0KLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUNCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbw0KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mDQotdGhlIENQTC48L3A+DQotPC90ZD48L3RyPjwvdGFibGU+DQotPC9ib2R5Pg0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYTIxYTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zb3VyY2UudXBkYXRlZXhhbXBsZXNjb3JlLmphciA9IHNyYy8NCi1zcmMuaW5jbHVkZXM9YWJvdXQuaHRtbA0KLWJpbi5pbmNsdWRlcz1wbHVnaW4ueG1sLHBsdWdpbi5wcm9wZXJ0aWVzLCouamFyLGFib3V0Lmh0bWwNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzMWY4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0NCi1uYW1lID0gSW5zdGFsbC9VcGRhdGUgQnVpbGRaaXAgRXhhbXBsZQ0KLXByb3ZpZGVyLW5hbWUgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiNDA5Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbHVnaW4NCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzIg0KLSAgIG5hbWU9IiVuYW1lIg0KLSAgIHZlcnNpb249IjIuMC4wIg0KLSAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlci1uYW1lIj4NCi0NCi0gICA8cnVudGltZT4NCi0gICAgICA8bGlicmFyeSBuYW1lPSJ1cGRhdGVleGFtcGxlcy5qYXIiPg0KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICAgIDwvbGlicmFyeT4NCi0gICA8L3J1bnRpbWU+DQotICAgPHJlcXVpcmVzPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmFwYWNoZS54ZXJjZXMiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ib290Ii8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InppcCINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZVR5cGVzIj4NCi0gICAgICA8ZmVhdHVyZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcC5CdWlsZFppcEZlYXR1cmVGYWN0b3J5Ij4NCi0gICAgICA8L2ZlYXR1cmUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9InNpdGUuemlwIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zaXRlVHlwZXMiPg0KLSAgICAgIDxzaXRlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwLkJ1aWxkWmlwU2l0ZUZhY3RvcnkiPg0KLSAgICAgIDwvc2l0ZS1mYWN0b3J5Pg0KLSAgIDwvZXh0ZW5zaW9uPg0KLSAgIDxleHRlbnNpb24NCi0gICAgICAgICBpZD0ic2l0ZS5mcmVlZm9ybSINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzIj4NCi0gICAgICA8c2l0ZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5mcmVlZm9ybS5GcmVlRm9ybVNpdGVGYWN0b3J5Ij4NCi0gICAgICA8L3NpdGUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1MDdhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9mZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMzY4MTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2ZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9pbmZvL2ltYWdlcy9yZWREb3QuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vaW1hZ2VzL3JlZERvdC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZmI1YzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vaW1hZ2VzL3JlZERvdC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjYTk3ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvaW5mby9zaXRlSW5mby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDApaHR0cDovL2RlamFuL3Rlc3RTaXRlL2luZm8vc2l0ZUluZm8uaHRtbCAtLT4KLTxIVE1MPjxIRUFEPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNS41MC40ODA3LjIzMDAiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZPgotPEgxIGFsaWduPWxlZnQ+PElNRyBoZWlnaHQ9NTUgc3JjPSJpbWFnZXMvcmVkRG90LmpwZyIgd2lkdGg9NTYgCi1hbGlnbj1jZW50ZXIgYm9yZGVyPTA+IDxGT05UIGNvbG9yPSNjMGMwYzA+Rm9sbG93IHRoZSBSZWQgRG90Jm5ic3A7PC9GT05UPjwvSDE+Ci08UD5XZWxjb21lIHRvIHRoZSA8Qj48Rk9OVCBjb2xvcj0jODAwMDAwPlJlZCBEb3Q8L0ZPTlQ+IDwvQj51cGRhdGUgc2l0ZS4gVXNlIAoteW91ciBFY2xpcHNlIDxCPlVwZGF0ZSBTaXRlczwvQj4gdmlldyB0byBsb2NhdGUgdGhlIGZlYXR1cmUgdmVyc2lvbiB5b3Ugd2FudCB0byAKLWluc3RhbGwgb3IgdXBkYXRlIHRvLjwvUD4KLTxIMj5BYm91dCBSZWQgRG90IEZlYXR1cmU8L0gyPgotPFA+T3VyIHJldm9sdXRpb25hcnkgUmVkIERvdCBFY2xpcHNlIGZlYXR1cmUgY2hhbmdlZCBhbGwgcHJlY29uY2VwdGlvbnMgYWJvdXQgCi13aGF0IEVjbGlwc2UgZmVhdHVyZXMgY2FuIGFuZCBjYW5ub3QgZG8uIFVzaW5nIG91ciBzdHJpa2luZ2x5IHNpbXBsZSBjb25jZXB0IG9mIAotYWRkaW5nIGJ1dHRvbnMgdG8gdGhlIEVjbGlwc2UgdG9vbCBiYXIsIHdlIGFsbG93IHlvdSB0byBvcGVuIGRpYWxvZ3MgdGhhdCBzaG93IAoteW91IHRoZSB2ZXJzaW9uIG9mIHRoZSBSZWQgRG90IGZlYXR1cmUuIFRoZSBiZWF1dHkgb2YgdGhlIGNvbmNlcHQgc3RlbXMgZnJvbSBpdHMgCi1zaW1wbGljaXR5LCBlYXNlIG9mIHVzZSwgaGlnaCBwZXJmb3JtYW5jZSBhbmQgc21hbGwgZm9vdHByaW50LiBOZXZlciBiZWZvcmUgd2FzIAotaXQgc28gZWFzeSB0byBwcmVzcyBhIGJ1dHRvbiBvbiB0aGUgdG9vbCBiYXIgdG8gZ2V0IHNvbWUgdGV4dCBzaG93biBpbiB0aGUgCi1kaWFsb2cuPC9QPgotPEgyPk5ld3M8L0gyPgotPFVMPgotICA8TEk+PEI+Tm92ZW1iZXIgMjAwMTwvQj4gLSB2ZXJzaW9uIDIuMC4wIG9mIHRoZSBSZWQgRG90IGZlYXR1cmUgaXMgYXZhaWxhYmxlIAotICBmb3IgZG93bmxvYWQuIFRoaXMgdmVyc2lvbiBicmluZ3MgaW1wcm92ZW1lbnRzIGFjcm9zcyB0aGUgYm9hcmQsIGZ1cnRoZXIgCi0gIHN0cmVuZ3RoZW5pbmcgYW4gYWxyZWFkeSBlc3RhYmxpc2hlZCBFY2xpcHNlIGZlYXR1cmUgY2xhc3NpYy4gSW1wcm92ZW1lbnRzIAotICB3aWxsIGJlIHZpc2libGUgdGhlIG1vbWVudCB5b3UgdXBkYXRlIHlvdXIgZmVhdHVyZSAtIG91ciBmYW1vdXMgcmVkIGRvdCB0b29sIAotICBiYXIgYnV0dG9uIGlzIG5vdyA8Qj4yNSUgbW9yZSByZWQ8L0I+LCBtYWtpbmcgaXQgZXZlbiBlYXNpZXIgdG8gc3BvdCBhbW9uZyAKLSAgb3RoZXIgYnV0dG9ucy4gCi0gIDxMST48Qj5PY3RvYmVyIDIwMDE8L0I+IC0gdmVyc2lvbiAxLjAuMCBvZiB0aGUgUmVkIERvdCBmZWF0dXJlIGlzIGF2YWlsYWJsZSAKLSAgZm9yIGRvd25sb2FkLiBTZWxlY3QgaXQgaW4gdGhlICdTaXRlcycgdmlldyBvZiB0aGUgVXBkYXRlIE1hbmFnZXIgYW5kIHByZXNzIAotICAnSW5zdGFsbCcgYnV0dG9uLiA8L0xJPjwvVUw+Ci08SFI+Ci08ST5Db3B5cmlnaHQgMjAwMSBSZWQgRG90IENvcnBvcmF0aW9uIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC48L0k+IAotPC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9wbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4Yjc5My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NpdGUvcGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzFhZDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3BsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDkxMzI0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPHNpdGU+Ci0gICA8ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4KLQotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPgotICAgPC9mZWF0dXJlPgotCi0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5yZWRkb3QucmVkZG90XzIuMC4wLmphciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0KLSAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlZCBEb3QgVmVyc2lvbnMiIG5hbWU9InJlZGRvdCI+Ci0gICAgICA8ZGVzY3JpcHRpb24gdXJsPSJpbmZvL1JlZERvdFZlcnNpb25zLmh0bWwiPgotICAgICAgICAgVGhpcyBjYXRlZ29yeSBjb250YWlucyBhbGwgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotCi08L3NpdGU+ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwQ29udmVydGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEwNGMxOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsKLQotLyoKLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovIAotIAotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nQnVmZmVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkNvbnRlbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkphckNvbnRlbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247Ci0NCi0vKioNCi0gKiBDb252ZXJ0cyBlY2xpcHNlIGJ1aWxkIC56aXAgZmlsZXMgaW50byBwYWNrYWdlZCBmZWF0dXJlDQotICovDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwQ29udmVydGVyIHsNCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPD0wKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiAgICAgQnVpbGRaaXBDb252ZXJ0ZXIgPHBhdGggdG8gdGhlIHppcCBmaWxlPi5cclxuRXhhbXBsZTogQnVpbGRaaXBDb252ZXJ0ZXIgZDovZG93bmxvYWQvaW50ZWdyYXRpb24tZWNsaXBzZS1TREstMjAwMjAxMDktd2luMzIuemlwIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCVVSTCBidWlsZHppcCA9IG5ldyBVUkwoKCJmaWxlOiIrYXJnc1swXSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJykpOwotCQkJQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoYnVpbGR6aXAsIG51bGwpOwotCQkJSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKTsKLQkJCQotCQkJQ29udGVudFJlZmVyZW5jZVtdIHJlZnMgPSBwcm92aWRlci5nZXRGZWF0dXJlRW50cnlDb250ZW50UmVmZXJlbmNlcyhudWxsKTsKLQkJCQotCQkJRmlsZSBzaXRlID0gbmV3IEZpbGUoKGFyZ3NbMF0rIi5wYWNrYWdlZC8iKS5yZXBsYWNlKCcvJyxGaWxlLnNlcGFyYXRvckNoYXIpKTsKLQkJCXNpdGUubWtkaXJzKCk7Ci0JCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUoc2l0ZSwiZmVhdHVyZXMiKTsKLQkJCWZlYXR1cmVzRGlyLm1rZGlycygpOwotCQkJRmlsZSBwbHVnaW5zRGlyID0gbmV3IEZpbGUoc2l0ZSwgInBsdWdpbnMiKTsKLQkJCXBsdWdpbnNEaXIubWtkaXJzKCk7Ci0JCQkKLQkJCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmVzRGlyLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIndyaXRpbmcgZmVhdHVyZSBhcmNoaXZlOiAiK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKyIuamFyIik7Ci0JCQl3cml0ZUphcihqYXJGaWxlLCByZWZzLCBmZWF0dXJlLCBudWxsLCBudWxsKTsKLQkJCUphckNvbnRlbnRSZWZlcmVuY2UgamFyID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoImJ1aWxkLnppcCIsYnVpbGR6aXApOwotCQkJUHJvcGVydGllcyBtYW5pZmVzdCA9IGdldEJ1aWxkTWFuaWZlc3QoamFyKTsKLQkJCQotCQkJSVBsdWdpbkVudHJ5W10gcGx1Z2lucyA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWZzID0gcHJvdmlkZXIuZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhwbHVnaW5zW2ldLCBudWxsKTsKLQkJCQlqYXJGaWxlID0gbmV3IEZpbGUocGx1Z2luc0RpcixwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLmphciIpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigid3JpdGluZyBwbHVnaW4gYXJjaGl2ZTogIitwbHVnaW5zW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLmphciIpOwotCQkJCXdyaXRlSmFyKGphckZpbGUsIHJlZnMsIGZlYXR1cmUsIHBsdWdpbnNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSwgbWFuaWZlc3QpOwotCQkJfQotCQkJCi0JCQl3cml0ZVNpdGVNYW5pZmVzdChzaXRlLCBmZWF0dXJlKTsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQ0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlSmFyKEZpbGUgamFyRmlsZSxDb250ZW50UmVmZXJlbmNlW10gcmVmcywgSUZlYXR1cmUgZmVhdHVyZSwgU3RyaW5nIHBsdWdpbklkLCBQcm9wZXJ0aWVzIG1hbmlmZXN0KSB7Ci0JCQkKLQkJSmFyT3V0cHV0U3RyZWFtIGpvcyA9IG51bGw7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7Ci0JCQotCQl0cnkgewotCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShqYXJGaWxlKTsKLQkJCWpvcyA9IG5ldyBKYXJPdXRwdXRTdHJlYW0ob3MpOwotCQkJSmFyRW50cnkgZW50cnkgPSBudWxsOwotCQkJU3RyaW5nIGJ1ZiA9IG51bGw7Ci0JCQlTdHJpbmdCdWZmZXJJbnB1dFN0cmVhbSBzYmlzID0gbnVsbDsKLQkJCQotCQkJLy8gd3JpdGUgamFyIG1hbmlmZXN0IChmaXJzdCBlbnRyeSBpbiBvdXRwdXQgc3RyZWFtKQotCQkJYnVmID0gIk1hbmlmZXN0LVZlcnNpb246IDEuMFxuQ3JlYXRlZC1CeTogMi4wLjAgKHd3dy5lY2xpcHNlLm9yZyBGZWF0dXJlIFBhY2thZ2VyKVxuIjsKLQkJCXNiaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oYnVmKTsKLQkJCWVudHJ5ID0gbmV3IEphckVudHJ5KCJNRVRBLUlORi9NQU5JRkVTVC5NRiIpOwotCQkJam9zLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQlVdGlsaXRpZXMuY29weShzYmlzLGpvcyxudWxsKTsKLQkJCXNiaXMuY2xvc2UoKTsKLQkJCQotCQkJLy8gamFyIHVwIHRoZSByZWZlcmVuY2VzCi0JCQlmb3IgKGludCBpPTA7IGk8cmVmcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBpZCA9IHJlZnNbaV0uZ2V0SWRlbnRpZmllcigpOwotCQkJCWVudHJ5ID0gbmV3IEphckVudHJ5KGlkKTsKLQkJCQlqb3MucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCQlpcyA9IHJlZnNbaV0uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQlVdGlsaXRpZXMuY29weShpcyxqb3MsbnVsbCk7Ci0JCQkJaXMuY2xvc2UoKTsgaXMgPSBudWxsOwotCQkJfQotCQkJCi0JCQkvLyBmb3IgcGx1Z2luIGphcnMsIHdyaXRlIGJ1aWxkIG1hbmlmZXN0Ci0JCQlpZiAocGx1Z2luSWQgIT0gbnVsbCAmJiBtYW5pZmVzdCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGtleSA9ICJwbHVnaW5AIitwbHVnaW5JZDsKLQkJCQlTdHJpbmcgdmFsdWUgPSBtYW5pZmVzdC5nZXRQcm9wZXJ0eShrZXkpOwotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmICh2YWx1ZS5lcXVhbHMoIkhFQUQiKSkgewotCQkJCQkJdmFsdWUgKz0gIi0iICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLmdldE1ham9yQ29tcG9uZW50KCk7Ci0JCQkJCX0KLQkJCQkJYnVmID0ga2V5ICsgIj0iICsgdmFsdWU7Ci0JCQkJCXNiaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oYnVmKTsKLQkJCQkJZW50cnkgPSBuZXcgSmFyRW50cnkoImJ1aWxkbWFuaWZlc3QucHJvcGVydGllcyIpOwotCQkJCQlqb3MucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJCQkJVXRpbGl0aWVzLmNvcHkoc2Jpcyxqb3MsbnVsbCk7Ci0JCQkJCXNiaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCS8vIGNsb3NlIGphcgotCQkJam9zLmNsb3NlKCk7IGpvcyA9IG51bGw7IG9zID0gbnVsbDsKLQkJfSBjYXRjaChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKSAKLQkJCQl0cnkge2lzLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQotCQkJaWYgKGpvcyAhPSBudWxsKSAKLQkJCQl0cnkge2pvcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KLQkJCWVsc2UgaWYgKG9zICE9IG51bGwpCi0JCQkJdHJ5IHtvcy5jbG9zZSgpO30gY2F0Y2goSU9FeGNlcHRpb24gZSkge30KLQkJfQkJCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVNpdGVNYW5pZmVzdChGaWxlIHNpdGUsIElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24gewotCQlGaWxlIG1hbmlmZXN0ID0gbmV3IEZpbGUoc2l0ZSwgInNpdGUueG1sIik7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShtYW5pZmVzdCk7Ci0JCVN0cmluZyBzaXRlWE1MID0gIjxzaXRlPlxuICAgPGZlYXR1cmUgdXJsPVwiZmVhdHVyZXMvIitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKyIuamFyXCIvPlxuPC9zaXRlPiI7Ci0JCVN0cmluZ0J1ZmZlcklucHV0U3RyZWFtIHNiaXMgPSBuZXcgU3RyaW5nQnVmZmVySW5wdXRTdHJlYW0oc2l0ZVhNTCk7Ci0JCVV0aWxpdGllcy5jb3B5KHNiaXMsb3MsbnVsbCk7Ci0JCW9zLmNsb3NlKCk7Ci0JCXNiaXMuY2xvc2UoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldEJ1aWxkTWFuaWZlc3QoSmFyQ29udGVudFJlZmVyZW5jZSBqYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUNvbnRlbnRSZWZlcmVuY2UgbWFuaWZlc3RFbnRyeSA9IGphci5wZWVrKCJlY2xpcHNlL2J1aWxkbWFuaWZlc3QucHJvcGVydGllcyIsbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCWlzID0gbWFuaWZlc3RFbnRyeS5nZXRJbnB1dFN0cmVhbSgpOwotCQkJcHJvcHMubG9hZChpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoaXMgIT0gbnVsbCkgdHJ5eyBpcy5jbG9zZSgpOyB9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQkJcmV0dXJuIHByb3BzOwotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGYxYzBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8gDQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQ29udGVudFJlZmVyZW5jZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZUNvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmVDb250ZW50UHJvdmlkZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklOb25QbHVnaW5FbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JVmVyaWZpZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkluc3RhbGxNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5KYXJDb250ZW50UmVmZXJlbmNlLkNvbnRlbnRTZWxlY3RvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5JbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbjsNCi0NCi0vKioNCi0gKiBBbiBleGFtcGxlIGZlYXR1cmUgY29udGVudCBwcm92aWRlci4gSXQgaGFuZGxlcyBmZWF0dXJlcyBwYWNrYWdlZCBhcw0KLSAqIGJ1aWxkIHppcCdzIHVzaW5nIHRoZSBmb3JtYXQgdXNlZCBmb3IgaW50ZWdyYXRpb24gYW5kIHN0YWJsZSBidWlsZHMNCi0gKiBwb3N0ZWQgb24gdGhlIGRvd25sb2FkcyBwYWdlcyBhdCB3d3cuZWNsaXBzZS5vcmcNCi0gKiA8L3A+DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgZXh0ZW5kcyBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQlwcml2YXRlIEphckNvbnRlbnRSZWZlcmVuY2UgYmFzZVJlZmVyZW5jZTsNCi0JcHJpdmF0ZSBDb250ZW50UmVmZXJlbmNlIGdlbmVyYXRlZEZlYXR1cmVNYW5pZmVzdDsJDQotCXByaXZhdGUgQ29udGVudFJlZmVyZW5jZVtdIGZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzOw0KLQlwcml2YXRlIElQbHVnaW5FbnRyeSBjdXJyZW50UGx1Z2luRW50cnk7DQotCXByaXZhdGUgSU5vblBsdWdpbkVudHJ5IGN1cnJlbnROb25QbHVnaW5FbnRyeTsNCi0JDQotCXB1YmxpYyBCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIoVVJMIGJhc2UpIHsNCi0JCXN1cGVyKGJhc2UpOw0KLQkJdGhpcy5iYXNlUmVmZXJlbmNlID0gbmV3IEphckNvbnRlbnRSZWZlcmVuY2UoImJ1aWxkLnppcCIsYmFzZSk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZU1hbmlmZXN0KCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlIGdldEZlYXR1cmVNYW5pZmVzdFJlZmVyZW5jZShJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAoZ2VuZXJhdGVkRmVhdHVyZU1hbmlmZXN0ID09IG51bGwpIHsNCi0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJGZWF0dXJlIG1hbmlmZXN0IGlzIG5vdCBhdmFpbGFibGUiLG51bGwpOw0KLQkJfQ0KLQkJZWxzZQ0KLQkJCXJldHVybiBnZW5lcmF0ZWRGZWF0dXJlTWFuaWZlc3Q7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRBcmNoaXZlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgQ29udGVudFJlZmVyZW5jZVtdIGdldEFyY2hpdmVSZWZlcmVuY2VzKEluc3RhbGxNb25pdG9yIG1vbml0b3IpIHsNCi0JCS8vIHRoZSBmZWF0dXJlIGFuZCBhbGwgaXRzIHBsdWdpbnMgZmlsZXMgYXJlIHBhY2thZ2VkIGluIGEgc2luZ2xlIGFyY2hpdmUNCi0JCXJldHVybiBuZXcgQ29udGVudFJlZmVyZW5jZVtdIHsgYmFzZVJlZmVyZW5jZSB9Ow0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIjZ2V0RmVhdHVyZUVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoKQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRGZWF0dXJlRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJbnN0YWxsTW9uaXRvciBtb25pdG9yKSB7DQotCQkvLyB0aGUgZmVhdHVyZSBhbmQgYWxsIGl0cyBwbHVnaW5zIGZpbGVzIGFyZSBwYWNrYWdlZCBpbiBhIHNpbmdsZSBhcmNoaXZlDQotCQlyZXR1cm4gbmV3IENvbnRlbnRSZWZlcmVuY2VbXSB7IGJhc2VSZWZlcmVuY2UgfTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIENvbnRlbnRSZWZlcmVuY2VbXSBnZXRQbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgew0KLQkJLy8gdGhlIGZlYXR1cmUgYW5kIGFsbCBpdHMgcGx1Z2lucyBmaWxlcyBhcmUgcGFja2FnZWQgaW4gYSBzaW5nbGUgYXJjaGl2ZQ0KLQkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlW10geyBiYXNlUmVmZXJlbmNlIH07DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXROb25QbHVnaW5FbnRyeUFyY2hpdmVSZWZlcmVuY2VzKElOb25QbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0Tm9uUGx1Z2luRW50cnlBcmNoaXZlUmVmZXJlbmNlcyhJTm9uUGx1Z2luRW50cnkgbm9uUGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpIA0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdHJ5IHsNCi0JCQlyZXR1cm4gcGVla05vblBsdWdpbkVudHJ5Q29udGVudChub25QbHVnaW5FbnRyeSxtb25pdG9yKTsNCi0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byByZXR1cm4gY29udGVudCBmb3Igbm9uIHBsdWdpbiBlbnRyeSAiK25vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKSxlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldEZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMoSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgew0KLQkJaWYgKGZlYXR1cmVFbnRyeUNvbnRlbnRSZWZlcmVuY2VzID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBDb250ZW50UmVmZXJlbmNlWzBdOw0KLQkJZWxzZQ0KLQkJCXJldHVybiAgZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXM7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUNvbnRlbnRQcm92aWRlciNnZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBDb250ZW50UmVmZXJlbmNlW10gZ2V0UGx1Z2luRW50cnlDb250ZW50UmVmZXJlbmNlcyhJUGx1Z2luRW50cnkgcGx1Z2luRW50cnksIEluc3RhbGxNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBwZWVrUGx1Z2luRW50cnlDb250ZW50KHBsdWdpbkVudHJ5LCBtb25pdG9yKTsNCi0JCX0gY2F0Y2goSU9FeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byByZXR1cm4gY29udGVudCBmb3IgcGx1Z2luIGVudHJ5ICIrcGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLGUpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgVVJMIGdldEZlYXR1cmVCYXNlVVJMKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCXJldHVybiBnZXRXb3JraW5nRGlyZWN0b3J5KCkudG9VUkwoKTsNCi0JCQkNCi0JfQ0KLQ0KLQlDb250ZW50UmVmZXJlbmNlIGdldEZlYXR1cmVCdWlsZE1hbmlmZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gYmFzZVJlZmVyZW5jZS5wZWVrKCJlY2xpcHNlL2J1aWxkbWFuaWZlc3QucHJvcGVydGllcyIsbnVsbC8qQ29udGVudFNlbGVjdG9yKi8sIG51bGwvKlByb2dyZXNzTW9uaXRvciovKTsNCi0JfQ0KLQ0KLQlDb250ZW50UmVmZXJlbmNlIGdldFBsdWdpbk1hbmlmZXN0KFN0cmluZyBwbHVnaW5JZCwgYm9vbGVhbiBpc0ZyYWdtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsJCQkNCi0JCVN0cmluZyBtYW5pZmVzdE5hbWUgPSAiZWNsaXBzZS9wbHVnaW5zLyIgKyBwbHVnaW5JZCArICIvIiArIChpc0ZyYWdtZW50ID8gImZyYWdtZW50LnhtbCIgOiAicGx1Z2luLnhtbCIpOw0KLQkJcmV0dXJuIGJhc2VSZWZlcmVuY2UucGVlayhtYW5pZmVzdE5hbWUsIG51bGwvKkNvbnRlbnRTZWxlY3RvciovLCBudWxsLypQcm9ncmVzc01vbml0b3IqLyk7DQotCX0NCi0JDQotCXZvaWQgdW5wYWNrRmVhdHVyZUVudHJ5Q29udGVudChGZWF0dXJlTW9kZWwgZmVhdHVyZSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiB7DQotCQkJDQotCQkvLyBkZWZpbmUgc2VsZWN0b3IgZm9yIGZlYXR1cmUgZW50cnkgZmlsZXMNCi0JCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlpZiAoamFyRW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCXJldHVybiBmYWxzZTsJCQkJCQ0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlL3JlYWRtZS8iKSkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQllbHNlIGlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlL3NwbGFzaC8iKSkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQllbHNlIGlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlLyIpICYmIGVudHJ5LmluZGV4T2YoIi8iLDgpPT0tMSAmJiBlbnRyeS5lbmRzV2l0aCgiLmh0bWwiKSkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQllbHNlDQotCQkJCQlyZXR1cm4gZmFsc2U7CQ0KLQkJCX0NCi0JCQlwdWJsaWMgU3RyaW5nIGRlZmluZUlkZW50aWZpZXIoSmFyRW50cnkgamFyRW50cnkpIHsNCi0JCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KLQkJCQlpZiAoZW50cnkuc3RhcnRzV2l0aCgiZWNsaXBzZS8iKSkNCi0JCQkJCXJldHVybiBlbnRyeS5zdWJzdHJpbmcoOCk7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBlbnRyeTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQkvLyB1bnBhY2sgZmVhdHVyZSBlbnRyeSBmaWxlcw0KLQkJRmlsZSB0bXBEaXIgPSBnZXRXb3JraW5nRGlyZWN0b3J5KCk7DQotCQlDb250ZW50UmVmZXJlbmNlW10gcmVmcyA9IGJhc2VSZWZlcmVuY2UudW5wYWNrKHRtcERpciwgc2VsZWN0b3IsIG1vbml0b3IpOw0KLQkJDQotCQkvLyB3cml0ZSBvdXQgZmVhdHVyZSBtYW5pZmVzdCAoZmVhdHVyZS54bWwpOw0KLQkJRmlsZSBtYW5pZmVzdCA9IFV0aWxpdGllcy5jcmVhdGVMb2NhbEZpbGUodG1wRGlyLCJmZWF0dXJlLnhtbCIpOw0KLQkJQ29udGVudFJlZmVyZW5jZSBtYW5pZmVzdFJlZmVyZW5jZSA9IG5ldyBDb250ZW50UmVmZXJlbmNlKCJmZWF0dXJlLnhtbCIsIG1hbmlmZXN0KTsNCi0JCURlZmF1bHRNb2RlbFdyaXRlciB3ID0gbmV3IERlZmF1bHRNb2RlbFdyaXRlcihmZWF0dXJlKTsNCi0JCUZpbGVPdXRwdXRTdHJlYW0gb3MgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1hbmlmZXN0KTsNCi0JCQl3LndyaXRlRmVhdHVyZU1hbmlmZXN0KG9zKTsNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKG9zICE9IG51bGwpIHRyeSB7IG9zLmNsb3NlKCk7IH0gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCi0JCX0NCi0JCXRoaXMuZ2VuZXJhdGVkRmVhdHVyZU1hbmlmZXN0ID0gbWFuaWZlc3RSZWZlcmVuY2U7DQotCQkNCi0JCS8vIHNhdmUgcmVmZXJlbmNlcyAobmV3bHktd3JpdHRlbiBmZWF0dXJlLnhtbCBwbHVzIHJlc3Qgb2Ygc2VsZWN0ZWQgZmVhdHVyZSBmaWxlcykNCi0JCUNvbnRlbnRSZWZlcmVuY2VbXSBhbGxSZWZzID0gbmV3IENvbnRlbnRSZWZlcmVuY2VbcmVmcy5sZW5ndGgrMV07DQotCQlhbGxSZWZzWzBdID0gbWFuaWZlc3RSZWZlcmVuY2U7DQotCQlTeXN0ZW0uYXJyYXljb3B5KHJlZnMsMCxhbGxSZWZzLDEscmVmcy5sZW5ndGgpOw0KLQkJZmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMgPSBhbGxSZWZzOw0KLQl9DQotCQkNCi0JQ29udGVudFJlZmVyZW5jZVtdIHBlZWtQbHVnaW5FbnRyeUNvbnRlbnQoSVBsdWdpbkVudHJ5IHBsdWdpbiwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCQ0KLQkJLy8gZGVmaW5lIHNlbGVjdG9yIGZvciBwbHVnaW4gZW50cnkgZmlsZXMNCi0JCUNvbnRlbnRTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDb250ZW50U2VsZWN0b3IoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlpZiAoamFyRW50cnkuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KLQkJCQlTdHJpbmcgaWQgPSBjdXJyZW50UGx1Z2luRW50cnkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKTsNCi0JCQkJaWYgKGlkPT1udWxsKQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCQllbHNlIGlmIChlbnRyeS5zdGFydHNXaXRoKCJlY2xpcHNlL3BsdWdpbnMvIitpZCsiLyIpKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBmYWxzZTsJDQotCQkJfQ0KLQkJCXB1YmxpYyBTdHJpbmcgZGVmaW5lSWRlbnRpZmllcihKYXJFbnRyeSBqYXJFbnRyeSkgew0KLQkJCQlTdHJpbmcgZW50cnkgPSBqYXJFbnRyeS5nZXROYW1lKCk7DQotCQkJCWludCBpeCA9IGVudHJ5LmluZGV4T2YoIi8iLDE2KTsNCi0JCQkJaWYgKGl4ICE9IC0xKSB7DQotCQkJCQlyZXR1cm4gZW50cnkuc3Vic3RyaW5nKGl4KzEpOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJcmV0dXJuIGVudHJ5Ow0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0JCQ0KLQkJLy8gdW5wYWNrIHBsdWdpbiBlbnRyeSBmaWxlcw0KLQkJY3VycmVudFBsdWdpbkVudHJ5ID0gcGx1Z2luOw0KLQkJcmV0dXJuIGJhc2VSZWZlcmVuY2UucGVlayhzZWxlY3RvciwgbW9uaXRvcik7DQotCX0NCi0JCQ0KLQlDb250ZW50UmVmZXJlbmNlW10gcGVla05vblBsdWdpbkVudHJ5Q29udGVudChJTm9uUGx1Z2luRW50cnkgZGF0YSwgSW5zdGFsbE1vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCQ0KLQkJLy8gZGVmaW5lIHNlbGVjdG9yIGZvciBub24gcGx1Z2luIGVudHJ5IGZpbGVzDQotCQlDb250ZW50U2VsZWN0b3Igc2VsZWN0b3IgPSBuZXcgQ29udGVudFNlbGVjdG9yKCkgew0KLQkJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoSmFyRW50cnkgamFyRW50cnkpIHsNCi0JCQkJaWYgKGphckVudHJ5LmlzRGlyZWN0b3J5KCkpDQotCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCVN0cmluZyBlbnRyeSA9IGphckVudHJ5LmdldE5hbWUoKTsNCi0JCQkJU3RyaW5nIGlkID0gY3VycmVudE5vblBsdWdpbkVudHJ5LmdldElkZW50aWZpZXIoKTsNCi0JCQkJaWYgKCFpZC5lcXVhbHMoInJvb3QiKSkNCi0JCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJZWxzZSBpZiAoIWVudHJ5LnN0YXJ0c1dpdGgoImVjbGlwc2UvcGx1Z2lucy8iKSkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCQllbHNlDQotCQkJCQlyZXR1cm4gZmFsc2U7CQ0KLQkJCX0NCi0JCQlwdWJsaWMgU3RyaW5nIGRlZmluZUlkZW50aWZpZXIoSmFyRW50cnkgamFyRW50cnkpIHsNCi0JCQkJU3RyaW5nIGVudHJ5ID0gamFyRW50cnkuZ2V0TmFtZSgpOw0KLQkJCQlpZiAoZW50cnkuc3RhcnRzV2l0aCgiZWNsaXBzZS8iKSkNCi0JCQkJCXJldHVybiBlbnRyeS5zdWJzdHJpbmcoOCk7DQotCQkJCWVsc2UNCi0JCQkJCXJldHVybiBlbnRyeTsNCi0JCQl9DQotCQl9Ow0KLQkJDQotCQkvLyB1bnBhY2sgbm9uIHBsdWdpbiBlbnRyeSBmaWxlcw0KLQkJY3VycmVudE5vblBsdWdpbkVudHJ5ID0gZGF0YTsNCi0JCXJldHVybiBiYXNlUmVmZXJlbmNlLnBlZWsoc2VsZWN0b3IsIG1vbml0b3IpOw0KLQl9DQotCQ0KLQlwcml2YXRlIENvcmVFeGNlcHRpb24gbmV3Q29yZUV4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcyIsMCxzLGUpKTsNCi0JfQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlQ29udGVudFByb3ZpZGVyI2dldFZlcmlmaWVyKCkNCi0JICovDQotCXB1YmxpYyBJVmVyaWZpZXIgZ2V0VmVyaWZpZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwRmVhdHVyZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxNTBiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovIA0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VGZWF0dXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsNCi0NCi0vKioNCi0gKiBBbiBleGFtcGxlIGZlYXR1cmUgZmFjdG9yeSBiYXNlZCBvbiB0aGUgcGFja2FnaW5nIA0KLSAqIGZvcm1hdCB1c2VkIGZvciBpbnRlZ3JhdGlvbiBhbmQgc3RhYmxlIGJ1aWxkcw0KLSAqIHBvc3RlZCBvbiB0aGUgZG93bmxvYWRzIHBhZ2VzIGF0IHd3dy5lY2xpcHNlLm9yZw0KLSAqIDwvcD4NCi0gKiBAc2luY2UgMi4wDQotICovDQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkNCi0JZXh0ZW5kcyBCYXNlRmVhdHVyZUZhY3RvcnkNCi0JaW1wbGVtZW50cyBJRmVhdHVyZUZhY3Rvcnkgew0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlRmFjdG9yeSNjcmVhdGVGZWF0dXJlKFVSTCwgSVNpdGUsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShVUkwgdXJsLCBJU2l0ZSBzaXRlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXRyeSB7DQotCQkJLy8gY3JlYXRlIGNvbnRlbnQgcHJvdmlkZXIgZm9yIGZlYXR1cmUNCi0JCQlCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3AgPSBuZXcgQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyKHVybCk7DQotCQkJRmVhdHVyZSBmZWF0dXJlID0gbnVsbDsNCi0JCQkNCi0JCQkvLyBwYXJzZSB0aGUgZmVhdHVyZQ0KLQkJCWZlYXR1cmUgPSAoRmVhdHVyZSkgcGFyc2VGZWF0dXJlKGNwKTsNCi0JCQkNCi0JCQkvLyBpbml0aWFsaXplIGZlYXR1cmUNCi0JCQlmZWF0dXJlLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY3ApOw0KLQkJCWZlYXR1cmUuc2V0U2l0ZShzaXRlKTsNCi0JCQlmZWF0dXJlLnJlc29sdmUoY3AuZ2V0RmVhdHVyZUJhc2VVUkwoKSwgbnVsbCk7IA0KLQkJCWZlYXR1cmUubWFya1JlYWRPbmx5KCk7DQotCQkJcmV0dXJuIGZlYXR1cmU7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmJ1aWxkemlwIiwwLCJVbmFibGUgdG8gY3JlYXRlIGZlYXR1cmUiLGUpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKg0KLQkgKiBwYXJzZSB0aGUgYnVpbGQgemlwIHRvIHJlY29uc3RydWN0IGEgZmVhdHVyZSBtb2RlbA0KLQkgKi8NCi0JcHVibGljIEZlYXR1cmVNb2RlbCBwYXJzZUZlYXR1cmUoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCXJldHVybiAobmV3IEJ1aWxkWmlwRmVhdHVyZVBhcnNlcih0aGlzKSkucGFyc2UoY3ApOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVQYXJzZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcEZlYXR1cmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0OGRlZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBGZWF0dXJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovIA0KLSANCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsNCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpblZlcnNpb25JZGVudGlmaWVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5Db250ZW50UmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5GZWF0dXJlTW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlBsdWdpbkVudHJ5TW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlVSTEVudHJ5TW9kZWw7DQotDQotLyoqDQotICogQW4gZXhhbXBsZSBmZWF0dXJlIHBhcnNlci4gSXQgaGFuZGxlcyBmZWF0dXJlcyBwYWNrYWdlZCBhcw0KLSAqIGJ1aWxkIHppcCdzIHVzaW5nIHRoZSBmb3JtYXQgdXNlZCBmb3IgaW50ZWdyYXRpb24gYW5kIHN0YWJsZSBidWlsZHMNCi0gKiBwb3N0ZWQgb24gdGhlIGRvd25sb2FkcyBwYWdlcyBhdCB3d3cuZWNsaXBzZS5vcmcNCi0gKiA8L3A+DQotICogQHNpbmNlIDIuMA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcEZlYXR1cmVQYXJzZXIgewkNCi0JDQotCXByaXZhdGUgQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5Ow0KLQlwcml2YXRlIEJ1aWxkWmlwUGx1Z2luUGFyc2VyIHBsdWdpblBhcnNlcjsNCi0JDQotCXB1YmxpYyBCdWlsZFppcEZlYXR1cmVQYXJzZXIoQnVpbGRaaXBGZWF0dXJlRmFjdG9yeSBmYWN0b3J5KSB7DQotCQl0aGlzLmZhY3RvcnkgPSBmYWN0b3J5Ow0KLQl9DQotCQ0KLQlwdWJsaWMgRmVhdHVyZU1vZGVsIHBhcnNlKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkJCQ0KLQkJcmV0dXJuIHBhcnNlRmVhdHVyZShjcCk7DQotCX0NCi0JDQotCXByaXZhdGUgRmVhdHVyZU1vZGVsIHBhcnNlRmVhdHVyZShCdWlsZFppcEZlYXR1cmVDb250ZW50UHJvdmlkZXIgY3ApIHRocm93cyBFeGNlcHRpb24gewkJDQotCQkNCi0JCS8vIGdldCByZWZlcmVuY2UgdG8gdGhlIGJ1aWxkIG1hbmlmZXN0DQotCQlDb250ZW50UmVmZXJlbmNlIG1hbmlmZXN0UmVmID0gY3AuZ2V0RmVhdHVyZUJ1aWxkTWFuaWZlc3QoKTsNCi0JCUlucHV0U3RyZWFtIGlzID0gbWFuaWZlc3RSZWYuZ2V0SW5wdXRTdHJlYW0oKTsJCQ0KLQkJDQotCQkvLyBsb2FkIGJ1aWxkbWFuaWZlc3QucHJvcGVydGllcw0KLQkJUHJvcGVydGllcyBtYW5pZmVzdCA9IG5ldyBQcm9wZXJ0aWVzKCk7DQotCQl0cnkgew0KLQkJCW1hbmlmZXN0LmxvYWQoaXMpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlpZiAoaXMhPW51bGwpIHRyeSB7IGlzLmNsb3NlKCk7IH0gY2F0Y2goSU9FeGNlcHRpb24gZSkge30NCi0JCX0NCi0JCQ0KLQkJLy8gcG9wdWxhdGUgZmVhdHVyZSBtb2RlbA0KLQkJRmVhdHVyZU1vZGVsIGZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmVNb2RlbCgpOw0KLQkJcGFyc2VGZWF0dXJlRW50cnkoY3AsIGZlYXR1cmUsIG1hbmlmZXN0KTsNCi0JCQ0KLQkJLy8gcGFyc2UgcGx1Z2luIGVudHJpZXMNCi0JCXBhcnNlUGx1Z2luRW50cmllcyhjcCwgZmVhdHVyZSwgbWFuaWZlc3QpOyANCi0JCQ0KLQkJLy8gcGFyc2Ugbm9uLXBsdWdpbiBlbnRyaWVzDQotCQlwYXJzZU5vblBsdWdpbkVudHJpZXMoY3AsIGZlYXR1cmUsIG1hbmlmZXN0KTsNCi0JCQ0KLQkJLy8gdW5wYWNrIGZlYXR1cmUgZW50cnkgY29udGVudA0KLQkJY3AudW5wYWNrRmVhdHVyZUVudHJ5Q29udGVudChmZWF0dXJlLCBudWxsLypJUHJvZ3Jlc3NNb25pdG9yKi8pOw0KLQkJDQotCQlyZXR1cm4gZmVhdHVyZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhcnNlRmVhdHVyZUVudHJ5KEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUsIFByb3BlcnRpZXMgbWFuaWZlc3QpIHRocm93cyBFeGNlcHRpb24gew0KLQkJDQotCQkvLyBwYXJzZSBvdXQgYnVpbGQgemlwIGZpbGUgbmFtZS4gSXQgaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUNCi0JCS8vIGZvcm0gPHBhY2thZ2UgaWRlbnRpZmllcj4tPGJ1aWxkIGRhdGU+LTx0YXJnZXQgcGxhdGZvcm0+LnppcCwNCi0JCS8vIHdoZXJlDQotCQkvLwkJPHBhY2thZ2UgaWRlbnRpZmllcj4gaXMgaHlwaGVuICgtKSBzZXBhcmF0ZXJkIHRva2VuIGxpc3QNCi0JCS8vCQk8YnVpbGQgZGF0ZT4gaXMgc2luZ2xlIGFsbC1udW1lcmljIHRva2VuDQotCQkvLwkJPHRhcmdldCBwbGF0Zm9ybT4gaXMgaHlwaGVuICgtKSBzZXBhcmF0ZXJkIHRva2VuIGxpc3QNCi0JCQ0KLQkJU3RyaW5nIHBrZ0lkID0gIiI7DQotCQlTdHJpbmcgdGFyZ2V0ID0gIiI7DQotCQlTdHJpbmcgYnVpbGQgPSAiIjsNCi0JCVN0cmluZyBzdGF0ZSA9ICJJRCI7DQotCQlib29sZWFuIGZpcnN0VG9rZW4gPSB0cnVlOw0KLQkJU3RyaW5nIHppcE5hbWUgPSBVUkxEZWNvZGVyLmRlY29kZShjcC5nZXRVUkwoKS5nZXRGaWxlKCkpOw0KLQkJaW50IGl4ID0gemlwTmFtZS5sYXN0SW5kZXhPZigiLyIpOw0KLQkJaWYgKGl4ICE9IC0xKQ0KLQkJCXppcE5hbWUgPSB6aXBOYW1lLnN1YnN0cmluZyhpeCsxKTsNCi0JCWlmICh6aXBOYW1lLmVuZHNXaXRoKCIuemlwIikpIHsNCi0JCQl6aXBOYW1lID0gemlwTmFtZS5zdWJzdHJpbmcoMCx6aXBOYW1lLmxlbmd0aCgpLTQpOw0KLQkJfQ0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoemlwTmFtZSwiLSIsZmFsc2UpOw0KLQkJU3RyaW5nIHRva2VuOw0KLQkJd2hpbGUodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgew0KLQkJCXRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigpOw0KLQkJCXRyeSB7DQotCQkJCUxvbmcucGFyc2VMb25nKHRva2VuKTsNCi0JCQkJc3RhdGUgPSAiVEFSR0VUIjsNCi0JCQkJdGFyZ2V0ID0gIiI7DQotCQkJCWZpcnN0VG9rZW4gPSB0cnVlOw0KLQkJCQlidWlsZCA9IHRva2VuKyIuMC4wIjsNCi0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJCQlpZiAoc3RhdGUuZXF1YWxzKCJJRCIpKSB7DQotCQkJCQlwa2dJZCArPSAoZmlyc3RUb2tlbiA/ICIiIDogIiAiKSArIHRva2VuOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJdGFyZ2V0ICs9IChmaXJzdFRva2VuID8gIiIgOiAiICIpICsgdG9rZW47DQotCQkJCX0NCi0JCQkJZmlyc3RUb2tlbiA9IGZhbHNlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJLy8gZ2VuZXJhdGUgYmFzZSBmZWF0dXJlIGF0dHJpYnV0ZXMNCi0JCWZlYXR1cmUuc2V0RmVhdHVyZUlkZW50aWZpZXIocGtnSWQucmVwbGFjZSgnICcsJy4nKSk7DQotCQlmZWF0dXJlLnNldEZlYXR1cmVWZXJzaW9uKGJ1aWxkKTsNCi0JCWZlYXR1cmUuc2V0TGFiZWwocGtnSWQuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIHBrZ0lkLnN1YnN0cmluZygxKSArICIgZm9yICIgKyB0YXJnZXQpOw0KLQkJZmVhdHVyZS5zZXRQcm92aWRlcigid3d3LmVjbGlwc2Uub3JnIik7DQotCQlmZWF0dXJlLnNldEltYWdlVVJMU3RyaW5nKCJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIik7DQotCQlmZWF0dXJlLnNldE9TKHRhcmdldC5yZXBsYWNlKCcgJywnLScpKTsJDQotCQkNCi0JCS8vIGFkZCBkZXNjcmlwdGlvbg0KLQkJVVJMRW50cnlNb2RlbCBkZXNjcmlwdGlvbiA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJZGVzY3JpcHRpb24uc2V0VVJMU3RyaW5nKCJyZWFkbWUvcmVhZG1lLmh0bWwiKTsNCi0JCWRlc2NyaXB0aW9uLnNldEFubm90YXRpb24oIngiKTsNCi0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb25Nb2RlbChkZXNjcmlwdGlvbik7DQotCQkNCi0JCS8vIGFkZCBsaWNlbnNlDQotCQlVUkxFbnRyeU1vZGVsIGxpY2Vuc2UgPSBmYWN0b3J5LmNyZWF0ZVVSTEVudHJ5TW9kZWwoKTsNCi0JCWxpY2Vuc2Uuc2V0VVJMU3RyaW5nKCJhYm91dC5odG1sIik7DQotCQlsaWNlbnNlLnNldEFubm90YXRpb24oIllvdSBtdXN0IHZpZXcgdGhlIGZ1bGwgbGljZW5zZSBieSBmb2xsb3dpbmcgdGhlIFwiTGljZW5zZVwiIGxpbmsgaW4gdGhlIGZlYXR1cmUgcHJldmlldy5cblNlbGVjdGluZyBcIkFjY2VwdFwiIGluZGljYXRlcyB0aGF0IHlvdSBoYXZlIHZpZXdlZCBhbmQgYWNjZXB0ZWQgdGhlIGZlYXR1cmUgbGljZW5zZS4iKTsNCi0JCWZlYXR1cmUuc2V0TGljZW5zZU1vZGVsKGxpY2Vuc2UpOw0KLQkJDQotCQkvLyBhZGQgY29weXJpZ2h0DQotCQlVUkxFbnRyeU1vZGVsIGNvcHlyaWdodCA9IGZhY3RvcnkuY3JlYXRlVVJMRW50cnlNb2RlbCgpOw0KLQkJY29weXJpZ2h0LnNldFVSTFN0cmluZygibm90aWNlLmh0bWwiKTsNCi0JCWNvcHlyaWdodC5zZXRBbm5vdGF0aW9uKCJ4Iik7DQotCQlmZWF0dXJlLnNldENvcHlyaWdodE1vZGVsKGNvcHlyaWdodCk7DQotCX0JDQotCQ0KLQlwcml2YXRlIHZvaWQgcGFyc2VQbHVnaW5FbnRyaWVzKEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUsIFByb3BlcnRpZXMgbWFuaWZlc3QpIHRocm93cyBFeGNlcHRpb24gew0KLQkJDQotCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gbWFuaWZlc3Qua2V5cygpOw0KLQkJU3RyaW5nIHBsdWdpbjsNCi0JCVN0cmluZyBwbHVnaW5JZDsNCi0JCVN0cmluZyBwbHVnaW5WZXJzaW9uOw0KLQkJU3RyaW5nIHBsdWdpbkJ1aWxkVmVyc2lvbjsNCi0JCVBsdWdpbkVudHJ5TW9kZWwgcGx1Z2luRW50cnk7DQotCQl3aGlsZShlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7DQotCQkJcGx1Z2luID0gKFN0cmluZykgZW50cmllcy5uZXh0RWxlbWVudCgpOw0KLQkJCWlmIChwbHVnaW4uc3RhcnRzV2l0aCgicGx1Z2luQCIpKSB7DQotCQkJCXBsdWdpbklkID0gcGx1Z2luLnN1YnN0cmluZyg3KTsNCi0JCQkJcGx1Z2luQnVpbGRWZXJzaW9uID0gbWFuaWZlc3QuZ2V0UHJvcGVydHkocGx1Z2luKTsNCi0JCQkJaWYgKHBsdWdpbkJ1aWxkVmVyc2lvbi5lcXVhbHMoIkhFQUQiKSkgew0KLQkJCQkJU3RyaW5nIGZlYXR1cmVWZXJzaW9uID0gZmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpOw0KLQkJCQkJaW50IGl4ID0gZmVhdHVyZVZlcnNpb24uaW5kZXhPZigiLiIpOw0KLQkJCQkJU3RyaW5nIGZlYXR1cmVNYWpvciA9IGl4PT0tMSA/IGZlYXR1cmVWZXJzaW9uIDogZmVhdHVyZVZlcnNpb24uc3Vic3RyaW5nKDAsaXgpOw0KLQkJCQkJcGx1Z2luQnVpbGRWZXJzaW9uICs9ICItIiArIGZlYXR1cmVNYWpvcjsNCi0JCQkJfQ0KLQkJCQlwbHVnaW5FbnRyeSA9IGZhY3RvcnkuY3JlYXRlUGx1Z2luRW50cnlNb2RlbCgpOw0KLQkJCQlwbHVnaW5WZXJzaW9uID0gcGFyc2VQbHVnaW5WZXJzaW9uSW5NYW5pZmVzdChjcCwgcGx1Z2luSWQsIHBsdWdpbkVudHJ5KTsNCi0JCQkJaWYgKHBsdWdpblZlcnNpb24gIT0gbnVsbCkgew0KLQkJCQkJcGx1Z2luRW50cnkuc2V0UGx1Z2luSWRlbnRpZmllcihwbHVnaW5JZCk7DQotCQkJCQlwbHVnaW5FbnRyeS5zZXRQbHVnaW5WZXJzaW9uKChuZXcgUGx1Z2luVmVyc2lvbklkZW50aWZpZXIocGx1Z2luVmVyc2lvbikpLnRvU3RyaW5nKCkrIi4iK3BsdWdpbkJ1aWxkVmVyc2lvbik7DQotCQkJCQlmZWF0dXJlLmFkZFBsdWdpbkVudHJ5TW9kZWwocGx1Z2luRW50cnkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQkJDQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBwYXJzZU5vblBsdWdpbkVudHJpZXMoQnVpbGRaaXBGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSwgUHJvcGVydGllcyBtYW5pZmVzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCS8vCU5vblBsdWdpbkVudHJ5TW9kZWwgbm9uUGx1Z2luRW50cnkgPSBmYWN0b3J5LmNyZWF0ZU5vblBsdWdpbkVudHJ5TW9kZWwoKTsNCi0JLy8Jbm9uUGx1Z2luRW50cnkuc2V0SWRlbnRpZmllcigicm9vdCIpOw0KLQkvLwlmZWF0dXJlLmFkZE5vblBsdWdpbkVudHJ5TW9kZWwobm9uUGx1Z2luRW50cnkpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBwYXJzZVBsdWdpblZlcnNpb25Jbk1hbmlmZXN0KEJ1aWxkWmlwRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjcCwgU3RyaW5nIHBsdWdpbklkLCBQbHVnaW5FbnRyeU1vZGVsIHBsdWdpbkVudHJ5KSB7DQotDQotCQlpZiAocGx1Z2luUGFyc2VyID09IG51bGwpDQotCQkJcGx1Z2luUGFyc2VyID0gbmV3IEJ1aWxkWmlwUGx1Z2luUGFyc2VyKCk7DQotCQkJCQ0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwkJCQkNCi0JCUNvbnRlbnRSZWZlcmVuY2UgcGx1Z2luTWFuaWZlc3Q7DQotCQl0cnkgew0KLQkJCS8vIHRyeSBwbHVnaW4ueG1sDQotCQkJcGx1Z2luTWFuaWZlc3QgID0gY3AuZ2V0UGx1Z2luTWFuaWZlc3QocGx1Z2luSWQsIGZhbHNlKTsNCi0JCQlpcyA9IHBsdWdpbk1hbmlmZXN0LmdldElucHV0U3RyZWFtKCk7DQotCQkJcmV0dXJuIHBsdWdpblBhcnNlci5wYXJzZShpcyk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCXRyeSB7DQotCQkJCS8vIHJldHJ5IHdpdGggZmVhdHVyZS54bWwNCi0JCQkJcGx1Z2luTWFuaWZlc3QgID0gY3AuZ2V0UGx1Z2luTWFuaWZlc3QocGx1Z2luSWQsIHRydWUpOw0KLQkJCQlpcyA9IHBsdWdpbk1hbmlmZXN0LmdldElucHV0U3RyZWFtKCk7DQotCQkJCVN0cmluZyByZXN1bHQgPSBwbHVnaW5QYXJzZXIucGFyc2UoaXMpOw0KLQkJCQlwbHVnaW5FbnRyeS5pc0ZyYWdtZW50KHRydWUpOw0KLQkJCQlyZXR1cm4gcmVzdWx0Ow0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMikgew0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyAhPSBudWxsKSB0cnkgeyBpcy5jbG9zZSgpOyB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9CdWlsZFppcFBsdWdpblBhcnNlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwUGx1Z2luUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZTFkMWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwUGx1Z2luUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy5idWlsZHppcDsNCi0NCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDIuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsNCi0NCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXI7DQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7DQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOw0KLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247DQotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7DQotDQotLyoqDQotICogUGFyc2UgZGVmYXVsdCBmZWF0dXJlLnhtbA0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcFBsdWdpblBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsNCi0NCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOw0KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOw0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJwbHVnaW4iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlQgPSAiZnJhZ21lbnQiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaWQiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsJDQotCQ0KLQlwcml2YXRlIGNsYXNzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gZXh0ZW5kcyBTQVhFeGNlcHRpb24gew0KLQkJcHVibGljIFBhcnNlQ29tcGxldGVFeGNlcHRpb24oU3RyaW5nIGFyZzApIHsNCi0JCQlzdXBlcihhcmcwKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIERlZmF1bHRGZWF0dXJlUGFyc2VyDQotCSAqLw0KLQlwdWJsaWMgQnVpbGRaaXBQbHVnaW5QYXJzZXIoKSB7DQotCQlzdXBlcigpOw0KLQkJdGhpcy5wYXJzZXIgPSBuZXcgU0FYUGFyc2VyKCk7DQotCQl0aGlzLnBhcnNlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEBzaW5jZSAyLjANCi0JICovDQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXZlcnNpb24gPSBudWxsOw0KLQkJCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pKTsNCi0JCX0gY2F0Y2goUGFyc2VDb21wbGV0ZUV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCQlyZXR1cm4gdmVyc2lvbjsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSxTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7DQotCQkNCi0JCVN0cmluZyB0YWcgPSBsb2NhbE5hbWUudHJpbSgpOw0KLQkNCi0JCWlmICh0YWcuZXF1YWxzSWdub3JlQ2FzZShQTFVHSU4pKSB7DQotCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQ0KLQkJaWYgKHRhZy5lcXVhbHNJZ25vcmVDYXNlKEZSQUdNRU5UKSkgew0KLQkJCXByb2Nlc3NQbHVnaW4oYXR0cmlidXRlcyk7DQotCQkJcmV0dXJuOw0KLQkJfQ0KLQl9DQotCQ0KLQkvKiogDQotCSAqIHByb2Nlc3MgcGx1Z2luIGVudHJ5IGluZm8NCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFBhcnNlQ29tcGxldGVFeGNlcHRpb24gew0KLQkJdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsNCi0JCXRocm93IG5ldyBQYXJzZUNvbXBsZXRlRXhjZXB0aW9uKCIiKTsNCi0JfQ0KLX0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZWMwMzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIEJ1aWxkWmlwU2l0ZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXIuDQotCSAqLw0KLQlwdWJsaWMgQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQkvLyBidWlsZCB6aXAgZmVhdHVyZXMgZG8gbm90IGhhdmUgYXNzb2NpYXRlZCBhcmNoaXZlcw0KLQkJLy8gdGhlIHppcCBmaWxlIGFsc28gY29udGFpbnMgdGhlIGFyY2hpdmVzIGZpbGVzDQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL0J1aWxkWmlwU2l0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5MTk2Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvQnVpbGRaaXBTaXRlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsNCi1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuQmFzZVNpdGVGYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC5DYXRlZ29yeU1vZGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBCdWlsZFppcFNpdGVGYWN0b3J5IGV4dGVuZHMgQmFzZVNpdGVGYWN0b3J5IHsNCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQ0KLQkJU2l0ZSBzaXRlID0gbnVsbDsNCi0NCi0JCS8vIGNyZWF0ZSBzaXRlIGFuZCBhZGQgY2F0ZWdvcnkNCi0JCXNpdGUgPSAoU2l0ZSkgY3JlYXRlU2l0ZU1hcE1vZGVsKCk7DQotCQlDYXRlZ29yeU1vZGVsIGNhdGVnb3J5ID0gY3JlYXRlU2l0ZUNhdGVnb3J5TW9kZWwoKTsNCi0JCWNhdGVnb3J5LnNldE5hbWUoImVjbGlwc2UtYnVpbGRzIik7DQotCQljYXRlZ29yeS5zZXRMYWJlbCgiRWNsaXBzZSBCdWlsZHMiKTsNCi0JCXNpdGUuYWRkQ2F0ZWdvcnlNb2RlbChjYXRlZ29yeSk7DQotDQotCQkvLyBzZXQgY29udGVudCBwcm92aWRlcg0KLQkJQnVpbGRaaXBTaXRlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBCdWlsZFppcFNpdGVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCXNpdGUuc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOw0KLQ0KLQkJLy8gZ2V0IGFsbCBtYXRjaGluZyB6aXAgZmlsZXMgb24gdGhlIHNpdGUNCi0JCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgew0KLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkgew0KLQkJCQkJdHJ5IHsNCi0JCQkJCQlaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOw0KLQkJCQkJCVppcEVudHJ5IGVudHJ5ID0gemlwLmdldEVudHJ5KCJlY2xpcHNlL2J1aWxkbWFuaWZlc3QucHJvcGVydGllcyIpOw0KLQkJCQkJCWlmIChlbnRyeSA9PSBudWxsKQ0KLQkJCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQkJZWxzZQ0KLQkJCQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0gZWxzZQ0KLQkJCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0NCi0JCX07DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShVUkxEZWNvZGVyLmRlY29kZSh1cmwuZ2V0RmlsZSgpKSk7DQotCQlGaWxlW10gemlwcyA9IGZpbGUubGlzdEZpbGVzKGZpbHRlcik7DQotDQotCQkvLyBjcmVhdGUgYSByZWZlcmVuY2UgZm9yIGVhY2ggbWF0Y2hpbmcgemlwDQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsIHJlZiA9IG51bGw7DQotCQlmb3IgKGludCBpID0gMDsgemlwcyAhPSBudWxsICYmIGkgPCB6aXBzLmxlbmd0aDsgaSsrKSB7DQotCQkJcmVmID0gY3JlYXRlRmVhdHVyZVJlZmVyZW5jZU1vZGVsKCk7DQotCQkJcmVmLnNldFR5cGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy56aXAiKTsNCi0JCQlyZWYuc2V0U2l0ZU1vZGVsKHNpdGUpOw0KLQkJCXJlZi5zZXRVUkxTdHJpbmcoImZpbGU6IiArIHppcHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOw0KLQkJCXJlZi5zZXRDYXRlZ29yeU5hbWVzKG5ldyBTdHJpbmdbXSB7ICJlY2xpcHNlLWJ1aWxkcyIgfSk7DQotCQkJc2l0ZS5hZGRGZWF0dXJlUmVmZXJlbmNlTW9kZWwocmVmKTsNCi0JCX0NCi0JCXRyeSB7DQotCQkJc2l0ZS5yZXNvbHZlKHVybCwgbnVsbCk7IC8vIHJlc29sdmUgYW55IFVSTHMgcmVsYXRpdmUgdG8gdGhlIHNpdGUNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiIixlKTsNCi0JCX0NCi0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9EZWZhdWx0TW9kZWxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhOGJjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvRGVmYXVsdE1vZGVsV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7Ci0KLS8qCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLgotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLyAKLSAKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLQotLyoqCi0gKiBXcml0ZSBzdGFuZGFyZCBmZWF0dXJlIG1hbmlmZXN0IChmZWF0dXJlLnhtbCkgZnJvbSBtb2RlbC4KLSAqIDwvcD4KLSAqIEBzaW5jZSAyLjAKLSAqLwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdE1vZGVsV3JpdGVyIHsKLQkKLQlwcml2YXRlIEZlYXR1cmVNb2RlbCBmZWF0dXJlOwotCQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgRGVmYXVsdE1vZGVsV3JpdGVyKEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7Ci0JfQotCQotCS8qKgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUZlYXR1cmVNYW5pZmVzdChPdXRwdXRTdHJlYW0gb3MpIHsKLQkJUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihvcyk7Ci0JCXdyaXRlRmVhdHVyZSh3LDAsZmVhdHVyZSk7Ci0JCXcuZmx1c2goKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRmVhdHVyZShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCXcucHJpbnRsbihpbisiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7Ci0JCQotCQl3LnByaW50bG4oaW4rIjxmZWF0dXJlIik7Ci0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrImlkPVwiIitmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCkrIlwiIik7Ci0JCWlmIChmZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCkhPW51bGwpCi0JCQl3LnByaW50bG4oaW4rIiAgICIrInZlcnNpb249XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSsiXCIiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0TGFiZWxOb25Mb2NhbGl6ZWQoKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisibGFiZWw9XCIiK2ZlYXR1cmUuZ2V0TGFiZWxOb25Mb2NhbGl6ZWQoKSsiXCIiKTsKLQkJaWYgKGZlYXR1cmUuZ2V0UHJvdmlkZXJOb25Mb2NhbGl6ZWQoKSE9bnVsbCkKLQkJCXcucHJpbnRsbihpbisiICAgIisicHJvdmlkZXItbmFtZT1cIiIrZmVhdHVyZS5nZXRQcm92aWRlck5vbkxvY2FsaXplZCgpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRJbWFnZVVSTFN0cmluZygpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJpbWFnZT1cIiIrZmVhdHVyZS5nZXRJbWFnZVVSTFN0cmluZygpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRPUygpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrZmVhdHVyZS5nZXRPUygpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRXUygpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrZmVhdHVyZS5nZXRXUygpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXROTCgpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrZmVhdHVyZS5nZXROTCgpKyJcIiIpOwotCQlpZiAoZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpIT1udWxsKQotCQkJdy5wcmludGxuKGluKyIgICAiKyJhcHBsaWNhdGlvbj1cIiIrZmVhdHVyZS5nZXRBcHBsaWNhdGlvbigpKyJcIiIpOwotCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsKLQkJCi0JCXdyaXRlRGVzY3JpcHRpb24odywgbGV2ZWwrMSwgZmVhdHVyZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkpOwotCQl3cml0ZUNvcHlyaWdodCh3LCBsZXZlbCsxLCBmZWF0dXJlLmdldENvcHlyaWdodE1vZGVsKCkpOwotCQl3cml0ZUxpY2Vuc2UodywgbGV2ZWwrMSwgZmVhdHVyZS5nZXRMaWNlbnNlTW9kZWwoKSk7Ci0JCXdyaXRlVVJMcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLQkJd3JpdGVQcmVyZXFzKHcsIGxldmVsKzEsIGZlYXR1cmUpOwotCQl3cml0ZVBsdWdpbkVudHJpZXModywgbGV2ZWwrMSwgZmVhdHVyZSk7Ci0JCXdyaXRlTm9uUGx1Z2luRW50cmllcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsKLSAgICAgICAgIAotICAgICAgICB3LnByaW50bG4oIiIpOwotICAgICAgICB3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRGVzY3JpcHRpb24oUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBVUkxFbnRyeU1vZGVsIHVlKSB7Ci0JCXdyaXRlRGVzY3JpcHRpb25FbnRyeSh3LGxldmVsLCB1ZSwgImRlc2NyaXB0aW9uIik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZUNvcHlyaWdodChQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsKLQkJd3JpdGVEZXNjcmlwdGlvbkVudHJ5KHcsbGV2ZWwsIHVlLCAiY29weXJpZ2h0Iik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZUxpY2Vuc2UoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBVUkxFbnRyeU1vZGVsIHVlKSB7Ci0JCXdyaXRlRGVzY3JpcHRpb25FbnRyeSh3LGxldmVsLCB1ZSwgImxpY2Vuc2UiKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRGVzY3JpcHRpb25FbnRyeShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUsIFN0cmluZyB0YWcpIHsKLQkJaWYgKHVlID09IG51bGwpIHJldHVybjsKLQkJU3RyaW5nIHVybCA9IHVlLmdldFVSTFN0cmluZygpOwotCQlTdHJpbmcgdHh0ID0gdWUuZ2V0QW5ub3RhdGlvbk5vbkxvY2FsaXplZCgpOwotCQlpZiAodXJsPT1udWxsICYmIHR4dD09bnVsbCkgcmV0dXJuOwotCQkKLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsKLQkJdy5wcmludGxuKCIiKTsKLQkJaWYgKHVybD09bnVsbCkKLQkJCXcucHJpbnRsbihpbisiPCIrdGFnKyI+Iik7Ci0JCWVsc2UgewotCQkJdy5wcmludChpbisiPCIrdGFnKyIgdXJsPVwiIit1ZS5nZXRVUkxTdHJpbmcoKSsiXCIiKTsKLQkJCWlmICh0eHQ9PW51bGwpCi0JCQkJdy5wcmludGxuKCIvPiIpOwotCQkJZWxzZQotCQkJCXcucHJpbnRsbigiPiIpOwotCQl9Ci0JCWlmICh0eHQhPW51bGwpIHsKLQkJCXcucHJpbnRsbihpbiArIHR4dCk7Ci0JCQl3LnByaW50bG4oaW4rIjwvIit0YWcrIj4iKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVVUkxzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsJCi0JCVVSTEVudHJ5TW9kZWwgdXBkYXRlID0gZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnlNb2RlbCgpOwotCQlVUkxFbnRyeU1vZGVsW10gZGlzY292ZXJ5ID0gZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbHMoKTsJCQotCQlpZiAodXBkYXRlID09IG51bGwgJiYgKGRpc2NvdmVyeSA9PSBudWxsIHx8IGRpc2NvdmVyeS5sZW5ndGg9PTApKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQlTdHJpbmcgaW4yID0gZ2V0SW5kZW50KGxldmVsKzEpOwkJCi0JCXcucHJpbnRsbigiIik7Ci0JCXcucHJpbnRsbihpbisiPHVybD4iKTsKLQkJCi0JCWlmICh1cGRhdGUgIT0gbnVsbCkgewotCQkJdy5wcmludGxuKGluMisiPHVwZGF0ZSIpOwotCQkJaWYgKHVwZGF0ZS5nZXRVUkxTdHJpbmcoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4yKyIgICAiKyJ1cmw9XCIiK3VwZGF0ZS5nZXRVUkxTdHJpbmcoKSsiXCIiKTsKLQkJCWlmICh1cGRhdGUuZ2V0QW5ub3RhdGlvbk5vbkxvY2FsaXplZCgpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrImxhYmVsPVwiIit1cGRhdGUuZ2V0QW5ub3RhdGlvbk5vbkxvY2FsaXplZCgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaT0wOyBkaXNjb3ZlcnkhPW51bGwgJiYgaTxkaXNjb3ZlcnkubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbjIrIjxkaXNjb3ZlcnkiKTsKLQkJCWlmIChkaXNjb3ZlcnlbaV0uZ2V0VVJMU3RyaW5nKCkhPW51bGwpCQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInVybD1cIiIrZGlzY292ZXJ5W2ldLmdldFVSTFN0cmluZygpKyJcIiIpOwotCQkJaWYgKGRpc2NvdmVyeVtpXS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluMisiICAgIisibGFiZWw9XCIiK2Rpc2NvdmVyeVtpXS5nZXRBbm5vdGF0aW9uTm9uTG9jYWxpemVkKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOwotCQl9Ci0JCQotCQl3LnByaW50bG4oaW4rIjwvdXJsPiIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgd3JpdGVQcmVyZXFzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsJCi0JCUltcG9ydE1vZGVsW10gaW1wID0gZmVhdHVyZS5nZXRJbXBvcnRNb2RlbHMoKTsJCi0JCWlmIChpbXAgPT0gbnVsbCB8fCBpbXAubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCXcucHJpbnRsbihpbisiPHJlcXVpcmVzPiIpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpbXAhPW51bGwgJiYgaTxpbXAubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbjIrIjxpbXBvcnQiKTsKLQkJCWlmIChpbXBbaV0uZ2V0SWRlbnRpZmllcigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInBsdWdpbj1cIiIraW1wW2ldLmdldElkZW50aWZpZXIoKSsiXCIiKTsKLQkJCWlmIChpbXBbaV0uZ2V0VmVyc2lvbigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbjIrIiAgICIrInZlcnNpb249XCIiK2ltcFtpXS5nZXRWZXJzaW9uKCkrIlwiIik7Ci0JCQlpZiAoaW1wW2ldLmdldE1hdGNoaW5nUnVsZU5hbWUoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4yKyIgICAiKyJtYXRjaD1cIiIraW1wW2ldLmdldE1hdGNoaW5nUnVsZU5hbWUoKSsiXCIiKTsKLQkJCXcucHJpbnRsbihpbjIrIiAgICIrIi8+Iik7Ci0JCX0KLQkJCi0JCXcucHJpbnRsbihpbisiPC9yZXF1aXJlcz4iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7Ci0JCVBsdWdpbkVudHJ5TW9kZWxbXSBwbHVnaW4gPSBmZWF0dXJlLmdldFBsdWdpbkVudHJ5TW9kZWxzKCk7Ci0JCWlmIChwbHVnaW4gPT0gbnVsbCB8fCBwbHVnaW4ubGVuZ3RoID09IDApIHJldHVybjsKLQkJCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7Ci0JCXcucHJpbnRsbigiIik7Ci0JCQotCQlmb3IgKGludCBpPTA7IGk8cGx1Z2luLmxlbmd0aDsgaSsrKSB7Ci0JCQl3LnByaW50bG4oaW4rIjxwbHVnaW4iKTsKLQkJCWlmIChwbHVnaW5baV0uZ2V0UGx1Z2luSWRlbnRpZmllcigpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK3BsdWdpbltpXS5nZXRQbHVnaW5JZGVudGlmaWVyKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmdldFBsdWdpblZlcnNpb24oKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrInZlcnNpb249XCIiK3BsdWdpbltpXS5nZXRQbHVnaW5WZXJzaW9uKCkrIlwiIik7Ci0JCQlpZiAocGx1Z2luW2ldLmlzRnJhZ21lbnQoKSkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImZyYWdtZW50PVwiIitwbHVnaW5baV0uaXNGcmFnbWVudCgpKyJcIiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXRPUygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisib3M9XCIiK3BsdWdpbltpXS5nZXRPUygpKyJcIiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXRXUygpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK3BsdWdpbltpXS5nZXRXUygpKyJcIiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXROTCgpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisibmw9XCIiK3BsdWdpbltpXS5nZXROTCgpKyJcIiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXREb3dubG9hZFNpemUoKSE9Q29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiZG93bmxvYWQtc2l6ZT1cIiIrcGx1Z2luW2ldLmdldERvd25sb2FkU2l6ZSgpKyJcIiIpOwotCQkJaWYgKHBsdWdpbltpXS5nZXRJbnN0YWxsU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK3BsdWdpbltpXS5nZXRJbnN0YWxsU2l6ZSgpKyJcIiIpOwotCQkJdy5wcmludGxuKGluKyIgICAiKyIvPiIpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZU5vblBsdWdpbkVudHJpZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgewotCQlOb25QbHVnaW5FbnRyeU1vZGVsW10gZGF0YSA9IGZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCA9PSAwKSByZXR1cm47Ci0JCQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOwotCQl3LnByaW50bG4oIiIpOwotCQkKLQkJZm9yIChpbnQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCXcucHJpbnRsbihpbisiPGRhdGEiKTsKLQkJCWlmIChkYXRhW2ldLmdldElkZW50aWZpZXIoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrImlkPVwiIitkYXRhW2ldLmdldElkZW50aWZpZXIoKSsiXCIiKTsKLQkJCWlmIChkYXRhW2ldLmdldE9TKCkhPW51bGwpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJvcz1cIiIrZGF0YVtpXS5nZXRPUygpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0V1MoKSE9bnVsbCkKLQkJCQl3LnByaW50bG4oaW4rIiAgICIrIndzPVwiIitkYXRhW2ldLmdldFdTKCkrIlwiIik7Ci0JCQlpZiAoZGF0YVtpXS5nZXROTCgpIT1udWxsKQotCQkJCXcucHJpbnRsbihpbisiICAgIisibmw9XCIiK2RhdGFbaV0uZ2V0TkwoKSsiXCIiKTsKLQkJCWlmIChkYXRhW2ldLmdldERvd25sb2FkU2l6ZSgpIT1Db250ZW50RW50cnlNb2RlbC5VTktOT1dOX1NJWkUpCi0JCQkJdy5wcmludGxuKGluKyIgICAiKyJkb3dubG9hZC1zaXplPVwiIitkYXRhW2ldLmdldERvd25sb2FkU2l6ZSgpKyJcIiIpOwotCQkJaWYgKGRhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSE9Q29udGVudEVudHJ5TW9kZWwuVU5LTk9XTl9TSVpFKQotCQkJCXcucHJpbnRsbihpbisiICAgIisiaW5zdGFsbC1zaXplPVwiIitkYXRhW2ldLmdldEluc3RhbGxTaXplKCkrIlwiIik7Ci0JCQl3LnByaW50bG4oaW4rIiAgICIrIi8+Iik7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50KGludCBsZXZlbCkgewotCQlTdHJpbmcgaW5kZW50ID0gIiI7Ci0JCWZvciAoaW50IGk9MDsgaTxsZXZlbDsgaSsrKSAKLQkJCWluZGVudCArPSAiICAgIjsKLQkJcmV0dXJuIGluZGVudDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2J1aWxkemlwL1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxODlkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuYnVpbGR6aXA7DQotDQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAyLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovIA0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotIA0KLS8qKg0KLSAqIHVuaXQgdGVzdCBoYXJuZXNzDQotICovDQotDQotcHVibGljIGNsYXNzIFRlc3Qgew0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotCQkNCi0JCXRyeSB7DQotCQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGU6ZDovZG93bmxvYWRzL2VjbGlwc2UgMi4wL2ludGVncmF0aW9uLWVjbGlwc2UtU0RLLTIwMDIwMTA5LXdpbjMyLnppcCIpOw0KLQkJCUJ1aWxkWmlwRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBCdWlsZFppcEZlYXR1cmVGYWN0b3J5KCk7DQotCQkJRmVhdHVyZSBmZWF0dXJlID0gKEZlYXR1cmUpIGZhY3RvcnkuY3JlYXRlRmVhdHVyZSh1cmwsbnVsbC8qSVNpdGUqLyk7DQotCQkJRGVmYXVsdE1vZGVsV3JpdGVyIHcgPSBuZXcgRGVmYXVsdE1vZGVsV3JpdGVyKGZlYXR1cmUpOw0KLQkJCXcud3JpdGVGZWF0dXJlTWFuaWZlc3QoU3lzdGVtLm91dCk7DQotCQkJDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkZlYXR1cmUgZW50cnkgcmVmZXJlbmNlcyIpOw0KLQkJCUNvbnRlbnRSZWZlcmVuY2VbXSByZWZzID0gZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkuZ2V0RmVhdHVyZUVudHJ5Q29udGVudFJlZmVyZW5jZXMobnVsbCk7DQotCQkJZm9yIChpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIityZWZzW2ldLmdldElkZW50aWZpZXIoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQbHVnLWluIGVudHJ5IHJlZmVyZW5jZXMiKTsNCi0JCQlJUGx1Z2luRW50cnlbXSBlbnRyeSA9IGZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJCXJlZnMgPSBmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKS5nZXRQbHVnaW5FbnRyeUNvbnRlbnRSZWZlcmVuY2VzKGVudHJ5WzBdLCBudWxsKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAiK3JlZnNbaV0uZ2V0SWRlbnRpZmllcigpKTsNCi0JCQl9CQkJDQotCQkJDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vbi1wbHVnLWluIGVudHJ5IHJlZmVyZW5jZXMiKTsNCi0JCQlJTm9uUGx1Z2luRW50cnlbXSBkYXRhID0gZmVhdHVyZS5nZXROb25QbHVnaW5FbnRyaWVzKCk7DQotCQkJcmVmcyA9IGZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpLmdldE5vblBsdWdpbkVudHJ5QXJjaGl2ZVJlZmVyZW5jZXMoZGF0YVswXSwgbnVsbCk7DQotCQkJZm9yIChpbnQgaT0wOyBpPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIityZWZzW2ldLmdldElkZW50aWZpZXIoKSk7DQotCQkJfQkJCQ0KLQkJCQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRG9uZSAuLi4iKTsNCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0JCQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9qYXZhLnBhZ2UuanBhZ2UgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvYnVpbGR6aXAvamF2YS5wYWdlLmpwYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjNjYTMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9idWlsZHppcC9qYXZhLnBhZ2UuanBhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvZXhhbXBsZXMvZnJlZWZvcm0vRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYmVhYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMuZnJlZWZvcm07DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGVDb250ZW50UHJvdmlkZXI7DQotDQotcHVibGljIGNsYXNzIEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIFNpdGVDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFNpdGVDb250ZW50UHJvdmlkZXIuDQotCSAqLw0KLQlwdWJsaWMgRnJlZUZvcm1TaXRlQ29udGVudFByb3ZpZGVyKFVSTCB1cmwpIHsNCi0JCXN1cGVyKHVybCk7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSVNpdGVDb250ZW50UHJvdmlkZXIjZ2V0QXJjaGl2ZVJlZmVyZW5jZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgVVJMIGdldEFyY2hpdmVSZWZlcmVuY2UoU3RyaW5nIGlkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCXJldHVybiBuZXcgVVJMKGdldFVSTCgpLGlkKTsNCi0JCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBuZXdDb3JlRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV0dXJuIGFyY2hpdmUgVVJMIixlKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBDb3JlRXhjZXB0aW9uIG5ld0NvcmVFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCJvcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMiLDAscyxlKSk7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuZXhhbXBsZXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9leGFtcGxlcy9mcmVlZm9ybS9GcmVlRm9ybVNpdGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2M3ZmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5leGFtcGxlcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2V4YW1wbGVzL2ZyZWVmb3JtL0ZyZWVGb3JtU2l0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLmZyZWVmb3JtOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkJhc2VTaXRlRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLlNpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCi0NCi1wdWJsaWMgY2xhc3MgRnJlZUZvcm1TaXRlRmFjdG9yeSBleHRlbmRzIEJhc2VTaXRlRmFjdG9yeSB7DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGVGYWN0b3J5I2NyZWF0ZVNpdGUoVVJMKQ0KLQkgKi8NCi0JcHVibGljIElTaXRlIGNyZWF0ZVNpdGUoVVJMIHVybCkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZhbGlkU2l0ZVR5cGVFeGNlcHRpb24gew0KLQ0KLQkJLy8gQ3JlYXRlIHNpdGUNCi0JCVNpdGUgc2l0ZSA9IG51bGw7DQotCQlJbnB1dFN0cmVhbSBpcyA9IG51bGw7DQotCQl0cnkgew0KLQkJCWlzID0gdXJsLm9wZW5TdHJlYW0oKTsNCi0JCQlzaXRlID0gKFNpdGUpIHBhcnNlU2l0ZShpcyk7DQotDQotCQkJVVJMRW50cnlNb2RlbCByZWFsU2l0ZVJlZiA9IHNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpOw0KLQkJCWlmIChyZWFsU2l0ZVJlZiA9PSBudWxsKQ0KLQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigNCi0JCQkJCSJVbmFibGUgdG8gb2J0YWluIHVwZGF0ZSBzaXRlIHJlZmVyZW5jZSIsDQotCQkJCQludWxsKTsNCi0JCQlTdHJpbmcgc2l0ZVVSTFN0cmluZyA9IHJlYWxTaXRlUmVmLmdldFVSTFN0cmluZygpOw0KLQkJCWlmIChzaXRlVVJMU3RyaW5nID09IG51bGwpDQotCQkJCXRocm93IFV0aWxpdGllcy5uZXdDb3JlRXhjZXB0aW9uKA0KLQkJCQkJIlVuYWJsZSB0byBvYnRhaW4gdXBkYXRlIHNpdGUgcmVmZXJlbmNlIiwNCi0JCQkJCW51bGwpOw0KLQkJCVVSTCBzaXRlVVJMID0gbmV3IFVSTChzaXRlVVJMU3RyaW5nKTsNCi0JCQlGcmVlRm9ybVNpdGVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyID0NCi0JCQkJbmV3IEZyZWVGb3JtU2l0ZUNvbnRlbnRQcm92aWRlcihzaXRlVVJMKTsNCi0JCQlzaXRlLnNldFNpdGVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQlzaXRlLnJlc29sdmUoc2l0ZVVSTCwgbnVsbCk7IC8vIHJlc29sdmUgYW55IFVSTHMgcmVsYXRpdmUgdG8gdGhlIHNpdGUNCi0NCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBVUkwiLGUpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7DQotCQkJdGhyb3cgVXRpbGl0aWVzLm5ld0NvcmVFeGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgVVJMIixlKTsNCi0JCX0gZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpDQotCQkJCXRyeSB7DQotCQkJCQlpcy5jbG9zZSgpOw0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgU2l0ZU1vZGVsRmFjdG9yeSNjYW5QYXJzZVNpdGVUeXBlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGNhblBhcnNlU2l0ZVR5cGUoU3RyaW5nIHR5cGUpIHsNCi0JCXJldHVybiB0eXBlICE9IG51bGwNCi0JCQkmJiB0eXBlLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLmV4YW1wbGVzLnNpdGUuZnJlZWZvcm0iKTsNCi0JfQ0KLQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMyMWQ4Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmpmYWNlLnRleHQ8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5lZGl0b3JzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS5pZGU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLnZpZXdzPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4PC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmNTEyNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAqLmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLXNvdXJjZS5zY2hlZHVsZXIuamFyID0gc3JjLwpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvcGx1Z2luLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2OWZjMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIFVwZGF0ZSBTY2hlZHVsZXIgcGx1Z2luLnhtbCByZXNvdXJjZXMKLSMKLXBsdWdpbk5hbWUgPSBBdXRvbWF0aWMgVXBkYXRlcyBTY2hlZHVsZXIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCi1hdXRvbWF0aWNVcGRhdGVzUHJlZlBhZ2UgPSBBdXRvbWF0aWMgVXBkYXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGY5YWQ2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIiCi0gICBuYW1lPSIlcGx1Z2luTmFtZSIKLSAgIHZlcnNpb249IjMuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZVNjaGVkdWxlciI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0ic2NoZWR1bGVyLmphciI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgICAgIDxwYWNrYWdlcyBwcmVmaXhlcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlciIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aS52aWV3cyIgb3B0aW9uYWw9InRydWUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5qZmFjZS50ZXh0IiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIiBvcHRpb25hbD0idHJ1ZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiIG9wdGlvbmFsPSJ0cnVlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuU2NoZWR1bGVyU3RhcnR1cCI+Ci0gICAgICA8L3N0YXJ0dXA+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVhdXRvbWF0aWNVcGRhdGVzUHJlZlBhZ2UiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLk1haW5QcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLnByZWZlcmVuY2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZSI+Ci0gICAgICA8L3BhZ2U+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVzSm9iLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9BdXRvbWF0aWNVcGRhdGVzSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzE5ZDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvQXV0b21hdGljVXBkYXRlc0pvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy5VcGRhdGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi1wdWJsaWMgY2xhc3MgQXV0b21hdGljVXBkYXRlc0pvYiBleHRlbmRzIEpvYiB7Ci0JCi0JcHJpdmF0ZSBjbGFzcyBBdXRvbWF0aWNTZWFyY2hSZXN1bHRDb2xsZWN0b3IgaW1wbGVtZW50cyBJVXBkYXRlU2VhcmNoUmVzdWx0Q29sbGVjdG9yIHsKLQkJcHVibGljIHZvaWQgYWNjZXB0KElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBvcGVyYXRpb24gPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZUluc3RhbGxPcGVyYXRpb24obnVsbCwgZmVhdHVyZSwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0JCQl1cGRhdGVzLmFkZChvcGVyYXRpb24pOwotCQl9Ci0JfQotCQotCS8vIGpvYiBmYW1pbHkJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgZmFtaWx5ID0gbmV3IE9iamVjdCgpOwotCXByaXZhdGUgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciByZXN1bHRDb2xsZWN0b3I7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSVN0YXR1cyBPS19TVEFUVVMgPQotCQluZXcgU3RhdHVzKAotCQkJSVN0YXR1cy5PSywKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRQbHVnaW5JZCgpLAotCQkJSVN0YXR1cy5PSywKLQkJCSIiLCAvLyROT04tTkxTLTEkCi0JCQludWxsKTsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKLQlwcml2YXRlIEFycmF5TGlzdCB1cGRhdGVzOwotCi0JcHVibGljIEF1dG9tYXRpY1VwZGF0ZXNKb2IoKSB7Ci0JCXN1cGVyKFVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNKb2IuQXV0b21hdGljVXBkYXRlU2VhcmNoIikpOyAvLyROT04tTkxTLTEkCi0JCXVwZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXNldFByaW9yaXR5KEpvYi5ERUNPUkFURSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkaXNwbGF5IHRvIGJlIHVzZWQuIFRoZSBtZXRob2QgZmlyc3QgY2hlY2tzLCBpZgotCSAqIHRoZSB0aHJlYWQgY2FsbGluZyB0aGlzIG1ldGhvZCBoYXMgYW4gYXNzb2NpYXRlZCBkaXNhcGx5LiBJZiBzbywgdGhpcwotCSAqIGRpc3BsYXkgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgZGlzcGxheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERpc3BsYXkgZ2V0U3RhbmRhcmREaXNwbGF5KCkgewotCQlEaXNwbGF5IGRpc3BsYXk7Ci0JCWRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCWRpc3BsYXkgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGRpc3BsYXk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpIHsKLQkJcmV0dXJuIEF1dG9tYXRpY1VwZGF0ZXNKb2IuZmFtaWx5ID09IGZhbWlseTsKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoVXBkYXRlQ29yZS5ERUJVRykgewotCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQXV0b21hdGljIHVwZGF0ZSBzZWFyY2ggc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNlYXJjaFJlcXVlc3QgPSBVcGRhdGVVdGlscy5jcmVhdGVOZXdVcGRhdGVzUmVxdWVzdChudWxsKTsKLQkJdHJ5IHsKLQkJCWlmIChyZXN1bHRDb2xsZWN0b3IgPT0gbnVsbCkKLQkJCQlyZXN1bHRDb2xsZWN0b3IgPSBuZXcgQXV0b21hdGljU2VhcmNoUmVzdWx0Q29sbGVjdG9yKCk7Ci0JCQlzZWFyY2hSZXF1ZXN0LnBlcmZvcm1TZWFyY2gocmVzdWx0Q29sbGVjdG9yLCBtb25pdG9yKTsKLQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHKSB7Ci0JCQkJVXBkYXRlQ29yZS5kZWJ1ZygiQXV0b21hdGljIHVwZGF0ZSBzZWFyY2ggZmluaXNoZWQgLSAiIC8vJE5PTi1OTFMtMSQKLQkJCQkrIHVwZGF0ZXMuc2l6ZSgpCi0JCQkJKyAiIHJlc3VsdHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmICh1cGRhdGVzLnNpemUoKSA+IDApIHsKLQkJCQlib29sZWFuIGRvd25sb2FkID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyLlBfRE9XTkxPQUQpOwotCQkJCS8vIHNpbGVudGx5IGRvd25sb2FkIGlmIGRvd25sb2FkIGVuYWJsZWQgCi0JCQkJaWYgKGRvd25sb2FkKQotCQkJCXsKLQkJCQkJaWYgKFVwZGF0ZUNvcmUuREVCVUcpIHsKLQkJCQkJCVVwZGF0ZUNvcmUuZGVidWcoIkF1dG9tYXRpYyBkb3dubG9hZCBvZiB1cGRhdGVzIHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlmb3IgKGludCBpPTA7IGk8dXBkYXRlcy5zaXplKCk7IGkrKykgewotCQkJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIG9wID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbil1cGRhdGVzLmdldChpKTsKLQkJCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBvcC5nZXRGZWF0dXJlKCk7Ci0JCQkJCQlVcGRhdGVVdGlscy5kb3dubG9hZEZlYXR1cmVDb250ZW50KGZlYXR1cmUsIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWlmIChVcGRhdGVDb3JlLkRFQlVHKSB7Ci0JCQkJCQlVcGRhdGVDb3JlLmRlYnVnKCJBdXRvbWF0aWMgZG93bmxvYWQgb2YgdXBkYXRlcyBmaW5pc2hlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHByb21wdCB0aGUgdXNlcgotCQkJCWlmICghSW5zdGFsbFdpemFyZC5pc1J1bm5pbmcoKSkgewotCQkJCQlpZiAoZG93bmxvYWQpIHsKLQkJCQkJCWdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlhc3luY05vdGlmeURvd25sb2FkVXNlcigpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZ2V0U3RhbmRhcmREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWFzeW5jTm90aWZ5VXNlcigpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwkKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gSm9iLkFTWU5DX0ZJTklTSDsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3luY05vdGlmeVVzZXIoKSB7Ci0JCS8vIGFzayB0aGUgdXNlciB0byBpbnN0YWxsIHVwZGF0ZXMKLQkJZ2V0U3RhbmRhcmREaXNwbGF5KCkuYmVlcCgpOwotCQlpZiAoTWVzc2FnZURpYWxvZwotCQkJLm9wZW5RdWVzdGlvbigKLQkJCQlVcGRhdGVTY2hlZHVsZXIuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzSm9iLkVjbGlwc2VVcGRhdGVzMSIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc0pvYi5VcGRhdGVzQXZhaWxhYmxlIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFN0YW5kYXJkRGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlvcGVuSW5zdGFsbFdpemFyZCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCS8vIG5vdGlmeSB0aGUgbWFuYWdlciB0aGF0IHRoZSBqb2IgaXMgZG9uZQotCQlkb25lKE9LX1NUQVRVUyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhc3luY05vdGlmeURvd25sb2FkVXNlcigpIHsKLQkJLy8gYXNrIHRoZSB1c2VyIHRvIGluc3RhbGwgdXBkYXRlcwotCQlnZXRTdGFuZGFyZERpc3BsYXkoKS5iZWVwKCk7Ci0JCWlmIChNZXNzYWdlRGlhbG9nCi0JCQkub3BlblF1ZXN0aW9uKAotCQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNKb2IuRWNsaXBzZVVwZGF0ZXMyIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzSm9iLlVwZGF0ZXNEb3dubG9hZGVkIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFN0YW5kYXJkRGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlvcGVuSW5zdGFsbFdpemFyZCgpOwotCQkJCX0KLQkJCX0pOwotCQl9IGVsc2UgewotCQkJLy8gRG9uJ3QgZGlzY2FyZCBkb3dubG9hZGVkIGRhdGEsIGFzIG5leHQgdGltZSB3ZSBjb21wYXJlIHRpbWVzdGFtcHMuCi0JCQkKLQkJCS8vIGRpc2NhcmQgYWxsIHRoZSBkb3dubG9hZGVkIGRhdGEgZnJvbSBjYWNoZSAobWF5IGluY2x1ZGUgb2xkIGRhdGEgYXMgd2VsbCkKLQkJCS8vVXRpbGl0aWVzLmZsdXNoTG9jYWxGaWxlKCk7Ci0JCX0KLQkJLy8gbm90aWZ5IHRoZSBtYW5hZ2VyIHRoYXQgdGhlIGpvYiBpcyBkb25lCi0JCWRvbmUoT0tfU1RBVFVTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Blbkluc3RhbGxXaXphcmQoKSB7Ci0JCWlmIChJbnN0YWxsV2l6YXJkLmlzUnVubmluZygpKQotCQkJLy8gam9iIGVuZHMgYW5kIGEgbmV3IG9uZSBpcyByZXNjaGVkdWxlZAotCQkJcmV0dXJuOwotCQkJCi0JCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoc2VhcmNoUmVxdWVzdCwgdXBkYXRlcyk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPQotCQkJbmV3IFJlc2l6YWJsZUluc3RhbGxXaXphcmREaWFsb2coCi0JCQkJVXBkYXRlU2NoZWR1bGVyLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJd2l6YXJkLAotCQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNKb2IuVXBkYXRlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlclN0YXJ0dXAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL1NjaGVkdWxlclN0YXJ0dXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI2NDdmYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9TY2hlZHVsZXJTdGFydHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci0KLQotLyoqCi0gKiBUaGlzIHBsdWctaW4gaXMgbG9hZGVkIG9uIHN0YXJ0dXAgdG8gZm9yayBhIGpvYiB0aGF0Ci0gKiBzZWFyY2hlcyBmb3IgbmV3IHBsdWctaW5zLgotICovCi1wdWJsaWMgY2xhc3MgU2NoZWR1bGVyU3RhcnR1cCBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQkvLyBQcmVmZXJlbmNlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9TQ0hFRFVMRSA9ICJzY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PTl9TVEFSVFVQID0gIm9uLXN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT05fU0NIRURVTEUgPSAib24tc2NoZWR1bGUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9ET1dOTE9BRCA9ICJkb3dubG9hZCI7IC8vIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UsIGRlZmF1bHQgaXMgZmFsc2UgLy8kTk9OLU5MUy0xJAotCi0JLy8gdmFsdWVzIGFyZSB0byBiZSBwaWNrZWQgdXAgZnJvbSB0aGUgYXJyeWFzIERBWVMgYW5kIEhPVVJTIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfREFZID0gImRheSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQX0hPVVIgPSAiaG91ciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEtlZXBzIHRyYWNrIG9mIHJ1bm5pbmcgam9iCi0JcHJpdmF0ZSBKb2Igam9iOwotCS8vIExpc3RlbmVyIGZvciBqb2IgY2hhbmdlcwotCXByaXZhdGUgVXBkYXRlSm9iQ2hhbmdlQWRhcHRlciBqb2JMaXN0ZW5lcjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREFZUyA9Ci0JCXsKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuZGF5IiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuTW9uZGF5IiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuVHVlc2RheSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLldlZG5lc2RheSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLlRodXJzZGF5IiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuRnJpZGF5IiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuU2F0dXJkYXkiKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC5TdW5kYXkiKSB9OyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhPVVJTID0KLQkJewotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4xQU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4yQU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4zQU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC40QU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC41QU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC42QU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC43QU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC44QU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC45QU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4xMEFNIiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuMTFBTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjEyUE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4xUE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4yUE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4zUE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC40UE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC41UE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC42UE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC43UE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC44UE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC45UE0iKSwgLy8kTk9OLU5MUy0xJAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiU2NoZWR1bGVyU3RhcnR1cC4xMFBNIiksIC8vJE5PTi1OTFMtMSQKLQkJCVVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIlNjaGVkdWxlclN0YXJ0dXAuMTFQTSIpLCAvLyROT04tTkxTLTEkCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJTY2hlZHVsZXJTdGFydHVwLjEyQU0iKSwgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQotCXByaXZhdGUgY2xhc3MgVXBkYXRlSm9iQ2hhbmdlQWRhcHRlciBleHRlbmRzIEpvYkNoYW5nZUFkYXB0ZXIgewotCQlwdWJsaWMgdm9pZCBkb25lKEpvYiBqb2IsIElTdGF0dXMgcmVzdWx0KSB7Ci0JCQlpZiAoam9iID09IFNjaGVkdWxlclN0YXJ0dXAudGhpcy5qb2IpIHsKLQkJCQlzY2hlZHVsZVVwZGF0ZUpvYigpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgU2NoZWR1bGVyU3RhcnR1cCgpIHsKLQkJVXBkYXRlU2NoZWR1bGVyLnNldFNjaGVkdWxlcih0aGlzKTsKLQkJam9iTGlzdGVuZXIgPSBuZXcgVXBkYXRlSm9iQ2hhbmdlQWRhcHRlcigpOwotCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoam9iTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpIHsKLQkJc2NoZWR1bGVVcGRhdGVKb2IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzY2hlZHVsZVVwZGF0ZUpvYigpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVNjaGVkdWxlci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJLy8gU2VlIGlmIGF1dG9tYXRpYyBzZWFyY2ggaXMgZW5hYmxlZCBhdCBhbGwKLQkJaWYgKHByZWYuZ2V0Qm9vbGVhbihQX0VOQUJMRUQpID09IGZhbHNlKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBzY2hlZHVsZSA9IHByZWYuZ2V0U3RyaW5nKFBfU0NIRURVTEUpOwotCQlsb25nIGRlbGF5ID0gLTFMOwotCQlpZiAoc2NoZWR1bGUuZXF1YWxzKFZBTFVFX09OX1NUQVJUVVApKQotCQkJLy8gaGF2ZSB3ZSBhbHJlYWR5IHN0YXJ0ZWQgYSBqb2IgPwotCQkJaWYgKGpvYiA9PSBudWxsKQotCQkJCWRlbGF5ID0gMEw7Ci0JCQllbHNlCi0JCQkJZGVsYXkgPSAtMUw7Ci0JCWVsc2UKLQkJCWRlbGF5ID0gY29tcHV0ZURlbGF5KHByZWYpOwotCQlpZiAoZGVsYXkgPT0gLTFMKQotCQkJcmV0dXJuOwotCQlzdGFydFNlYXJjaChkZWxheSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RGF5KFByZWZlcmVuY2VzIHByZWYpIHsKLQkJU3RyaW5nIGRheSA9IHByZWYuZ2V0U3RyaW5nKFBfREFZKTsKLQkJZm9yIChpbnQgZCA9IDA7IGQgPCBEQVlTLmxlbmd0aDsgZCsrKQotCQkJaWYgKERBWVNbZF0uZXF1YWxzKGRheSkpCi0JCQkJc3dpdGNoIChkKSB7Ci0JCQkJCWNhc2UgMCA6Ci0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWNhc2UgMSA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuTU9OREFZOwotCQkJCQljYXNlIDIgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLlRVRVNEQVk7Ci0JCQkJCWNhc2UgMyA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuV0VETkVTREFZOwotCQkJCQljYXNlIDQgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLlRIVVJTREFZOwotCQkJCQljYXNlIDUgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLkZSSURBWTsKLQkJCQkJY2FzZSA2IDoKLQkJCQkJCXJldHVybiBDYWxlbmRhci5TQVRVUkRBWTsKLQkJCQkJY2FzZSA3IDoKLQkJCQkJCXJldHVybiBDYWxlbmRhci5TVU5EQVk7Ci0JCQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SG91cihQcmVmZXJlbmNlcyBwcmVmKSB7Ci0JCVN0cmluZyBob3VyID0gcHJlZi5nZXRTdHJpbmcoUF9IT1VSKTsKLQkJZm9yIChpbnQgaCA9IDA7IGggPCBIT1VSUy5sZW5ndGg7IGgrKykKLQkJCWlmIChIT1VSU1toXS5lcXVhbHMoaG91cikpCi0JCQkJcmV0dXJuIGggKyAxOwotCQlyZXR1cm4gMTsKLQl9Ci0JLyoKLQkgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tIHRoaXMgbW9tZW50Ci0JICogdG8gdGhlIG5leHQgc2NoZWR1bGVkIHNlYXJjaC4gSWYgdGhhdCBtb21lbnQgaGFzCi0JICogYWxyZWFkeSBwYXNzZWQsIHJldHVybnMgMEwgKHN0YXJ0IGltbWVkaWF0ZWx5KS4KLQkgKi8KLQlwcml2YXRlIGxvbmcgY29tcHV0ZURlbGF5KFByZWZlcmVuY2VzIHByZWYpIHsKLQotCQlpbnQgdGFyZ2V0X2QgPSBnZXREYXkocHJlZik7Ci0JCWludCB0YXJnZXRfaCA9IGdldEhvdXIocHJlZik7Ci0KLQkJQ2FsZW5kYXIgY2FsZW5kYXIgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkvLyBtYXkgbmVlZCB0byB1c2UgdGhlIEJvb3RMb2FkZXIgbG9jYWxlCi0JCWludCBjdXJyZW50X2QgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuREFZX09GX1dFRUspOwotCQkvLyBzdGFydHMgd2l0aCBTVU5EQVkKLQkJaW50IGN1cnJlbnRfaCA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5IT1VSX09GX0RBWSk7Ci0JCWludCBjdXJyZW50X20gPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlOVVRFKTsKLQkJaW50IGN1cnJlbnRfcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5TRUNPTkQpOwotCQlpbnQgY3VycmVudF9tcyA9IGNhbGVuZGFyLmdldChDYWxlbmRhci5NSUxMSVNFQ09ORCk7Ci0KLQkJbG9uZyBkZWxheSA9IDBMOyAvLyBtaWxsaXNlY29uZHMKLQotCQlpZiAodGFyZ2V0X2QgPT0gLTEpIHsKLQkJCS8vIENvbXB1dGUgdGhlIGRlbGF5IGZvciAiZXZlcnkgZGF5IGF0IHggbydjbG9jayIKLQkJCS8vIElzIGl0IG5vdyA/Ci0JCQlpZiAodGFyZ2V0X2ggPT0gY3VycmVudF9oICYmIGN1cnJlbnRfbSA9PSAwICYmIGN1cnJlbnRfcyA9PSAwKQotCQkJCXJldHVybiBkZWxheTsKLQotCQkJaW50IGRlbHRhX2ggPSB0YXJnZXRfaCAtIGN1cnJlbnRfaDsKLQkJCWlmICh0YXJnZXRfaCA8PSBjdXJyZW50X2gpCi0JCQkJZGVsdGFfaCArPSAyNDsKLQkJCWRlbGF5ID0KLQkJCQkoKGRlbHRhX2ggKiA2MCAtIGN1cnJlbnRfbSkgKiA2MCAtIGN1cnJlbnRfcykgKiAxMDAwIC0gY3VycmVudF9tczsKLQkJCXJldHVybiBkZWxheTsKLQkJfSBlbHNlIHsKLQkJCS8vIENvbXB1dGUgdGhlIGRlbGF5IGZvciAiZXZlcnkgWGRheSBhdCB4IG8nY2xvY2siCi0JCQkvLyBJcyBpdCBub3cgPwotCQkJaWYgKHRhcmdldF9kID09IGN1cnJlbnRfZAotCQkJCSYmIHRhcmdldF9oID09IGN1cnJlbnRfaAotCQkJCSYmIGN1cnJlbnRfbSA9PSAwCi0JCQkJJiYgY3VycmVudF9zID09IDApCi0JCQkJcmV0dXJuIGRlbGF5OwotCi0JCQlpbnQgZGVsdGFfZCA9IHRhcmdldF9kIC0gY3VycmVudF9kOwotCQkJaWYgKHRhcmdldF9kIDwgY3VycmVudF9kCi0JCQkJfHwgdGFyZ2V0X2QgPT0gY3VycmVudF9kCi0JCQkJJiYgKHRhcmdldF9oIDwgY3VycmVudF9oCi0JCQkJCXx8IHRhcmdldF9oID09IGN1cnJlbnRfaAotCQkJCQkmJiBjdXJyZW50X20gPiAwKSkKLQkJCQlkZWx0YV9kICs9IDc7Ci0KLQkJCWRlbGF5ID0KLQkJCQkoKChkZWx0YV9kICogMjQgKyB0YXJnZXRfaCAtIGN1cnJlbnRfaCkgKiA2MCAtIGN1cnJlbnRfbSkgKiA2MCAtIGN1cnJlbnRfcykqIDEwMDAgLSBjdXJyZW50X21zOwotCi0JCQlyZXR1cm4gZGVsYXk7Ci0JCX0KLQkJLy9yZXR1cm4gLTFMOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNlYXJjaChsb25nIGRlbGF5KSB7Ci0JCWlmIChqb2IgIT0gbnVsbCkgewotCQkJLy8gY2FuY2VsIG9sZCBqb2IuCi0JCQkvLyBXZSBuZWVkIHRvIGRlcmVnaXN0ZXIgdGhlIGxpc3RlbmVyIGZpcnN0LHNvIHdlIHdvbid0IGF1dG9tYXRpY2FsbHkgc3RhcnQgYW5vdGhlciBqb2IKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7Ci0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuY2FuY2VsKEF1dG9tYXRpY1VwZGF0ZXNKb2IuZmFtaWx5KTsKLQkJCVBsYXRmb3JtLmdldEpvYk1hbmFnZXIoKS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihqb2JMaXN0ZW5lcik7Ci0JCX0KLQkJam9iID0gbmV3IEF1dG9tYXRpY1VwZGF0ZXNKb2IoKTsKLQkJam9iLnNjaGVkdWxlKGRlbGF5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3OTNiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBUaGlzIHBsdWctaW4gaXMgbG9hZGVkIG9uIHN0YXJ0dXAgdG8gZm9yayBhIGpvYiB0aGF0Ci0gKiBzZWFyY2hlcyBmb3IgbmV3IHBsdWctaW5zLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2NoZWR1bGVyIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbnsKLQkvLyBQcmVmZXJlbmNlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRU5BQkxFRCA9ICJlbmFibGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfU0NIRURVTEUgPSAic2NoZWR1bGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfT05fU1RBUlRVUCA9ICJvbi1zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX09OX1NDSEVEVUxFID0gIm9uLXNjaGVkdWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfRE9XTkxPQUQgPSAiZG93bmxvYWQiOyAvLyB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlLCBkZWZhdWx0IGlzIGZhbHNlIC8vJE5PTi1OTFMtMSQKLQotCS8vVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBVcGRhdGVTY2hlZHVsZXIgcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgU2NoZWR1bGVyU3RhcnR1cCBzY2hlZHVsZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFVwZGF0ZVNjaGVkdWxlcigpIHsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJaWYgKHJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQl0cnkgewotCQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2NoZWR1bGVyLlVwZGF0ZVNjaGVkdWxlclJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJCX0KLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVNjaGVkdWxlciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9Ci0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIGFyZ3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIG5ldyBTdHJpbmdbXSB7IGFyZyB9KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlKSB7Ci0JCWxvZ0V4Y2VwdGlvbihlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBlLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoZSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCWUgPSAoKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGUpLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQlpZiAoZSBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24pIHsKLQkJCXN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgZSkuZ2V0U3RhdHVzKCk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IGUuZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgPT0gbnVsbCkKLQkJCQltZXNzYWdlID0gZS50b1N0cmluZygpOwotCQkJc3RhdHVzID0KLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCQlnZXRQbHVnaW5JZCgpLAotCQkJCQlJU3RhdHVzLk9LLAotCQkJCQltZXNzYWdlLAotCQkJCQllKTsKLQkJfQotCQlsb2coc3RhdHVzLCBzaG93RXJyb3JEaWFsb2cpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLklORk8pIHsKLQkJCWlmIChzaG93RXJyb3JEaWFsb2cpCi0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotLy8JCQkgU2hvdWxkIGxvZyBvbiB0aGUgdXBkYXRlIHBsdWdpbidzIGxvZwotLy8JCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOyAvLyROT04tTkxTLTEkCi0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyIik7ICAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJVXBkYXRlU2NoZWR1bGVyIHBsdWdpbiA9IGdldERlZmF1bHQoKTsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPQotCQkJcGx1Z2luLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpCi0JCQlyZXR1cm4gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBnZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlwcmVmLnNldERlZmF1bHQoUF9FTkFCTEVELCBmYWxzZSk7Ci0JCXByZWYuc2V0RGVmYXVsdChQX1NDSEVEVUxFLCBWQUxVRV9PTl9TVEFSVFVQKTsKLQkJcHJlZi5zZXREZWZhdWx0KFBfRE9XTkxPQUQsIGZhbHNlKTsKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCWluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTY2hlZHVsZXJTdGFydHVwIGdldFNjaGVkdWxlcigpIHsKLQkJLy8gSWYgdGhlIHNjaGVkdWxlciB3YXMgZGlzYWJsZWQsIGl0IGRvZXMgbm90IGdldCBpbml0aWFsaXplZAotCQlpZiAoc2NoZWR1bGVyID09IG51bGwpCi0JCQlzY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVyU3RhcnR1cCgpOwotCQlyZXR1cm4gc2NoZWR1bGVyOwotCX0KLQkKLQlzdGF0aWMgdm9pZCBzZXRTY2hlZHVsZXIoU2NoZWR1bGVyU3RhcnR1cCBzY2hlZHVsZXIpIHsKLQkJVXBkYXRlU2NoZWR1bGVyLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9zY2hlZHVsZXIvVXBkYXRlU2NoZWR1bGVyUmVzb3VyY2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4Zjk2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9VcGRhdGVTY2hlZHVsZXJSZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSNNZXNzYWdlcyBmb3IgVXBkYXRlIFNjaGVkdWxlciBwbHVnLWluCi0KLVNjaGVkdWxlclN0YXJ0dXAuZGF5PUV2ZXJ5IGRheQotU2NoZWR1bGVyU3RhcnR1cC5Nb25kYXk9RXZlcnkgTW9uZGF5Ci1TY2hlZHVsZXJTdGFydHVwLlR1ZXNkYXk9RXZlcnkgVHVlc2RheQotU2NoZWR1bGVyU3RhcnR1cC5XZWRuZXNkYXk9RXZlcnkgV2VkbmVzZGF5Ci1TY2hlZHVsZXJTdGFydHVwLlRodXJzZGF5PUV2ZXJ5IFRodXJzZGF5Ci1TY2hlZHVsZXJTdGFydHVwLkZyaWRheT1FdmVyeSBGcmlkYXkKLVNjaGVkdWxlclN0YXJ0dXAuU2F0dXJkYXk9RXZlcnkgU2F0dXJkYXkKLVNjaGVkdWxlclN0YXJ0dXAuU3VuZGF5PUV2ZXJ5IFN1bmRheQotU2NoZWR1bGVyU3RhcnR1cC4xQU09MTowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC4yQU09MjowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC4zQU09MzowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC40QU09NDowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC41QU09NTowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC42QU09NjowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC43QU09NzowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC44QU09ODowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC45QU09OTowMCBBTQotU2NoZWR1bGVyU3RhcnR1cC4xMEFNPTEwOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwLjExQU09MTE6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXAuMTJQTT0xMjowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC4xUE09MTowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC4yUE09MjowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC4zUE09MzowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC40UE09NDowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC41UE09NTowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC42UE09NjowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC43UE09NzowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC44UE09ODowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC45UE09OTowMCBQTQotU2NoZWR1bGVyU3RhcnR1cC4xMFBNPTEwOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwLjExUE09MTE6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXAuMTJBTT0xMjowMCBBTQotQXV0b21hdGljVXBkYXRlc0pvYi5BdXRvbWF0aWNVcGRhdGVTZWFyY2g9QXV0b21hdGljIFVwZGF0ZSBTZWFyY2gKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5maW5kVXBkYXRlcz1BdXRvbWF0aWNhbGx5ICZmaW5kIG5ldyB1cGRhdGVzIGFuZCBub3RpZnkgbWUKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5VcGRhdGVTY2hlZHVsZT1VcGRhdGUgJlNjaGVkdWxlCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZmluZE9uU3RhcnQ9TG9vayBmb3IgdXBkYXRlcyBlYWNoIHRpbWUgcGxhdGZvcm0gaXMgc3RhcnRlZAotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmZpbmRPblNjaGVkdWxlPUxvb2sgZm9yIHVwZGF0ZXMgb24gdGhlIGZvbGxvd2luZyBzY2hlZHVsZToKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5kb3dubG9hZE9wdGlvbnM9JkRvd25sb2FkIE9wdGlvbnMKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5zZWFyY2hBbmROb3RpZnk9U2VhcmNoIGZvciB1cGRhdGVzIGFuZCBub3RpZnkgbWUgd2hlbiB0aGV5IGFyZSBhdmFpbGFibGUKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5kb3dubG9hZEFuZE5vdGlmeT1Eb3dubG9hZCBuZXcgdXBkYXRlcyBhdXRvbWF0aWNhbGx5IGFuZCBub3RpZnkgbWUgd2hlbiByZWFkeSB0byBpbnN0YWxsIHRoZW0KLUF1dG9tYXRpY1VwZGF0ZXNKb2IuRWNsaXBzZVVwZGF0ZXMxPUVjbGlwc2UgVXBkYXRlcwotQXV0b21hdGljVXBkYXRlc0pvYi5VcGRhdGVzQXZhaWxhYmxlPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KLUF1dG9tYXRpY1VwZGF0ZXNKb2IuRWNsaXBzZVVwZGF0ZXMyPUVjbGlwc2UgVXBkYXRlcwotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmF0PWF0Ci1BdXRvbWF0aWNVcGRhdGVzSm9iLlVwZGF0ZXNEb3dubG9hZGVkPU5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUgYW5kIGRvd25sb2FkZWQuIERvIHlvdSB3YW50IHRvIHJldmlldyBhbmQgaW5zdGFsbCB0aGVtIG5vdz8KLUF1dG9tYXRpY1VwZGF0ZXNKb2IuVXBkYXRlcz1VcGRhdGVzCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlci9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3NjaGVkdWxlci9wcmVmZXJlbmNlcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFkYjE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvc2NoZWR1bGVyL3ByZWZlcmVuY2VzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNjaGVkdWxlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zY2hlZHVsZXIuVXBkYXRlU2NoZWR1bGVyOwotCi1wdWJsaWMgY2xhc3MgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIGVuYWJsZWRDaGVjazsKLQlwcml2YXRlIEJ1dHRvbiBvblN0YXJ0dXBSYWRpbzsKLQlwcml2YXRlIEJ1dHRvbiBvblNjaGVkdWxlUmFkaW87Ci0JcHJpdmF0ZSBDb21ibyBkYXlDb21ibzsKLQlwcml2YXRlIENvbWJvIGhvdXJDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBzZWFyY2hPbmx5UmFkaW87Ci0JcHJpdmF0ZSBCdXR0b24gc2VhcmNoQW5kRG93bmxvYWRSYWRpbzsKLQlwcml2YXRlIEdyb3VwIHVwZGF0ZVNjaGVkdWxlR3JvdXA7Ci0JcHJpdmF0ZSBHcm91cCBkb3dubG9hZEdyb3VwOwotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQllbmFibGVkQ2hlY2sgPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJZW5hYmxlZENoZWNrLnNldFRleHQoVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLmZpbmRVcGRhdGVzIikpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlU3BhY2VyKGNvbnRhaW5lciwgMSk7Ci0KLQkJdXBkYXRlU2NoZWR1bGVHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5VcGRhdGVTY2hlZHVsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJb25TdGFydHVwUmFkaW8gPSBuZXcgQnV0dG9uKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldFRleHQoCi0JCQlVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZmluZE9uU3RhcnQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvblN0YXJ0dXBSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJb25TdGFydHVwUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJb25TY2hlZHVsZVJhZGlvID0gbmV3IEJ1dHRvbih1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuUkFESU8pOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0VGV4dChVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZmluZE9uU2NoZWR1bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW9uU2NoZWR1bGVSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlkYXlDb21ibyA9IG5ldyBDb21ibyh1cGRhdGVTY2hlZHVsZUdyb3VwLCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF5Q29tYm8uc2V0SXRlbXMoU2NoZWR1bGVyU3RhcnR1cC5EQVlTKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMzA7Ci0JCWRheUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwodXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVNjaGVkdWxlci5nZXRTdHJpbmcoIkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5hdCIpKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJaG91ckNvbWJvID0gbmV3IENvbWJvKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlob3VyQ29tYm8uc2V0SXRlbXMoU2NoZWR1bGVyU3RhcnR1cC5IT1VSUyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IDEwMDsKLQkJaG91ckNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQotCQljcmVhdGVTcGFjZXIoY29udGFpbmVyLCAxKTsKLQkJCi0JCWRvd25sb2FkR3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWRvd25sb2FkR3JvdXAuc2V0VGV4dChVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZG93bmxvYWRPcHRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZG93bmxvYWRHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZG93bmxvYWRHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlzZWFyY2hPbmx5UmFkaW8gPSBuZXcgQnV0dG9uKGRvd25sb2FkR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRUZXh0KAotCQkJVXBkYXRlU2NoZWR1bGVyLmdldFN0cmluZygiQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlLnNlYXJjaEFuZE5vdGlmeSIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VhcmNoT25seVJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8gPSBuZXcgQnV0dG9uKGRvd25sb2FkR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0VGV4dChVcGRhdGVTY2hlZHVsZXIuZ2V0U3RyaW5nKCJBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuZG93bmxvYWRBbmROb3RpZnkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQkJCi0JCWluaXRpYWxpemUoKTsKLQotCQllbmFibGVkQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZVNjaGVkdWxlci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZW5hYmxlZENoZWNrLnNldFNlbGVjdGlvbihwcmVmLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyLlBfRU5BQkxFRCkpOwotCQlzZXRTY2hlZHVsZShwcmVmLmdldFN0cmluZyhVcGRhdGVTY2hlZHVsZXIuUF9TQ0hFRFVMRSkpOwotCi0JCWRheUNvbWJvLnNldFRleHQoU2NoZWR1bGVyU3RhcnR1cC5EQVlTW2dldERheShwcmVmKV0pOwotCQlob3VyQ29tYm8uc2V0VGV4dChTY2hlZHVsZXJTdGFydHVwLkhPVVJTW2dldEhvdXIocHJlZildKTsKLQkJCi0JCXNlYXJjaE9ubHlSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXIuUF9ET1dOTE9BRCkpOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFNlbGVjdGlvbihwcmVmLmdldEJvb2xlYW4oVXBkYXRlU2NoZWR1bGVyLlBfRE9XTkxPQUQpKTsKLQotCQlwYWdlQ2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTY2hlZHVsZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmVxdWFscyhVcGRhdGVTY2hlZHVsZXIuVkFMVUVfT05fU1RBUlRVUCkpCi0JCQlvblN0YXJ0dXBSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWVsc2UKLQkJCW9uU2NoZWR1bGVSYWRpby5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgewotCQlib29sZWFuIG1hc3RlciA9IGVuYWJsZWRDaGVjay5nZXRTZWxlY3Rpb24oKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJb25TY2hlZHVsZVJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJZGF5Q29tYm8uc2V0RW5hYmxlZChtYXN0ZXIgJiYgb25TY2hlZHVsZVJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJaG91ckNvbWJvLnNldEVuYWJsZWQobWFzdGVyICYmIG9uU2NoZWR1bGVSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0JCWRvd25sb2FkR3JvdXAuc2V0RW5hYmxlZChtYXN0ZXIpOwotCQlzZWFyY2hPbmx5UmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCQlQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlU2NoZWR1bGVyLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQllbmFibGVkQ2hlY2suc2V0U2VsZWN0aW9uKAotCQkJcHJlZi5nZXREZWZhdWx0Qm9vbGVhbihVcGRhdGVTY2hlZHVsZXIuUF9FTkFCTEVEKSk7Ci0JfQotCi0JLyoqIAotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBJUHJlZmVyZW5jZVBhZ2UuCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVTY2hlZHVsZXIuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWYuc2V0VmFsdWUoVXBkYXRlU2NoZWR1bGVyLlBfRU5BQkxFRCwgZW5hYmxlZENoZWNrLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKG9uU3RhcnR1cFJhZGlvLmdldFNlbGVjdGlvbigpKQotCQkJcHJlZi5zZXRWYWx1ZShVcGRhdGVTY2hlZHVsZXIuUF9TQ0hFRFVMRSwgVXBkYXRlU2NoZWR1bGVyLlZBTFVFX09OX1NUQVJUVVApOwotCQllbHNlIAotCQkJcHJlZi5zZXRWYWx1ZShVcGRhdGVTY2hlZHVsZXIuUF9TQ0hFRFVMRSwgVXBkYXRlU2NoZWR1bGVyLlZBTFVFX09OX1NDSEVEVUxFKTsKLQkJCQotCQlwcmVmLnNldFZhbHVlKFNjaGVkdWxlclN0YXJ0dXAuUF9EQVksIGRheUNvbWJvLmdldFRleHQoKSk7Ci0JCXByZWYuc2V0VmFsdWUoU2NoZWR1bGVyU3RhcnR1cC5QX0hPVVIsIGhvdXJDb21iby5nZXRUZXh0KCkpOwotCQkKLQkJcHJlZi5zZXRWYWx1ZShVcGRhdGVTY2hlZHVsZXIuUF9ET1dOTE9BRCwgc2VhcmNoQW5kRG93bmxvYWRSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0JCQotCQlVcGRhdGVTY2hlZHVsZXIuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkKLQkJVXBkYXRlU2NoZWR1bGVyLmdldFNjaGVkdWxlcigpLnNjaGVkdWxlVXBkYXRlSm9iKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcml2YXRlIGludCBnZXREYXkoUHJlZmVyZW5jZXMgcHJlZikgewotCQlTdHJpbmcgZGF5ID0gcHJlZi5nZXRTdHJpbmcoU2NoZWR1bGVyU3RhcnR1cC5QX0RBWSk7Ci0JCWZvciAoaW50IGk9MDsgaTxTY2hlZHVsZXJTdGFydHVwLkRBWVMubGVuZ3RoOyBpKyspCi0JCQlpZiAoU2NoZWR1bGVyU3RhcnR1cC5EQVlTW2ldLmVxdWFscyhkYXkpKQotCQkJCXJldHVybiBpOwotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHJpdmF0ZSBpbnQgZ2V0SG91cihQcmVmZXJlbmNlcyBwcmVmKSB7Ci0JCVN0cmluZyBob3VyID0gcHJlZi5nZXRTdHJpbmcoU2NoZWR1bGVyU3RhcnR1cC5QX0hPVVIpOwotCQlmb3IgKGludCBpPTA7IGk8U2NoZWR1bGVyU3RhcnR1cC5IT1VSUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY2hlZHVsZXJTdGFydHVwLkhPVVJTW2ldLmVxdWFscyhob3VyKSkKLQkJCQlyZXR1cm4gaTsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Y2xhc3NwYXRoPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFjYTdmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3REZXNjcmlwdGlvbj4NCi0JPG5hbWU+b3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmU8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmhlbHAuYXBwc2VydmVyPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudG9tY2F0PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXg8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuanVuaXQ8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLnVpLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS51aS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS51aS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODYxZDY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zb3VyY2UudXBkYXRldGVzdHMuamFyPXNyYy8NCi1iaW4uaW5jbHVkZXM9Ki5qYXIsYWJvdXQuaHRtbCx0ZXN0LnhtbCxwbHVnaW4ueG1sLGRhdGEvLHdlYnNlcnZlci8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM4MGRlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgPC91cmw+Ci0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0iZW4iIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMy41LjYiIHdzPSJXSU4zMixNT1RJRixHVEsiLz4KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA1ZDgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+DQotICA8cnVudGltZT4NCi0gICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4NCi0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgPC9saWJyYXJ5Pg0KLSAgPC9ydW50aW1lPg0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA2ZDY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIiA+Ci0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+Ci0gIDxsaWNlbnNlPmxpY2Vuc2U8L2xpY2Vuc2U+Ci0gIDx1cmw+Ci0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgPC91cmw+Ci0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiBpbnN0YWxsLXNpemU9IjEwMDAiIGZyYWdtZW50PSJmYWxzZSIgbmw9ImVuLGZyIiBvcz0iV0lOMzIsTElOVVgiIHZlcnNpb249IjEuMS4xIiB3cz0iV0lOMzIsR1RLLE1PVElGIi8+Ci08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFlZDc3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyM2NhYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE3YmI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvd2VsX21sLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vaW1nL3dlbF9tbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTMzZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vc2l0ZUluZm8uaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NWFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9oZWxwLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvanVuaXRfMy43LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDVkODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRXhlY3V0YWJsZUZlYXR1cmVQYWNrYWdlZFNpdGUvZGF0YTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwbHVnaW4gbmFtZT0iSlVuaXQgVGVzdCBGcmFtZXdvcmsiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiB2ZXJzaW9uPSIzLjUuNiIgdmVuZG9yLW5hbWU9Imp1bml0Lm9yZyI+DQotICA8cnVudGltZT4NCi0gICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4NCi0gICAgICA8ZXhwb3J0IG5hbWU9IioiLz4NCi0gICAgPC9saWJyYXJ5Pg0KLSAgPC9ydW50aW1lPg0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9FeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjIxMWE4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0V4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy8iIG9zPSJMSU5VWCI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlIi8+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvaGVscC5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMvUGRlX2NvcmUuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucy9qdW5pdF8zLjcuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICANCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IklCTSBXU0FEIFRvb2xzIiBuYW1lPSJlY2xpcHNlIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4gIA0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GVFBMaWtlU2l0ZS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZUUExpa2VTaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTYyZTJlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZUUExpa2VTaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZ0cCI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzk4ZjQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMyIgaW1hZ2U9ImZlYXR1cmUxLmdpZiIgbGFiZWw9IlRoaXJkIEZlYXR1cmUiIHByb3ZpZGVyLW5hbWU9IlNtYXJ0IENvbXBhbnkiIHZlcnNpb249IjEuMC4wIj4NCi0gIDxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0Pg0KLSAgPGxpY2Vuc2U+bGljZW5zZTwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBvcz0iV0lOMzIsTElOVVgiIHZlcnNpb249IjEuMS4xIiB3cz0iV0lOMzIsTU9USUYsR1RLIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUxL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODZkMTE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUzIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mZWF0dXJlMSIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYWI0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNWZlMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDBhYjRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL0ZlYXR1cmVUeXBlRXhhbXBsZXMvc2l0ZTMvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMy9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmMzcyZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9GZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudW5rbm93bnR5cGUuamFyIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjFhYmRlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9mZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3M2ZiZjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE3YmI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTMzZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NWFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5mby9zaXRlSW5mby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPC9oZWFkPg0KLSAgPGJvZHk+DQotPGltZyBzcmM9ImltZy90b3BfdGl0bHNtLmdpZiIgYWx0PSIiIHdpZHRoPSI0NjAiIGhlaWdodD0iNTAiPg0KLTxicj4NCi08YnI+DQotICAgICBJdCBzdGFydGVkIHdpdGggU21hbGx0YWxrPGJyPg0KLSAgICBPVEkgaGFzIGJlZW4gYnVpbGRpbmcgdG9vbHMgZm9yIHBsYXRmb3JtLWluZGVwZW5kZW50IE9PIGRldmVsb3BtZW50IHNpbmNlDQotICAxOTg4LiBPdXIgRU5WWSZyZWc7IHRlY2hub2xvZ3kgZmlyc3QgYnJvdWdodCBjb2xsYWJvcmF0aXZlIHNvZnR3YXJlIGRldmVsb3BtZW50LA0KLSAgdmVyc2lvbiBtYW5hZ2VtZW50IGFuZCBzaGFyZWQgcmVwb3NpdG9yaWVzIHRvIFNtYWxsdGFsay4gSUJNIGlzIG9uZSBvZg0KLW1hbnkgICBjb21wYW5pZXMgdG8gbGljZW5zZSBFTlZZLCB3aGljaCBjb250aW51ZXMgdG8gYmUgdGhlIGZvdW5kYXRpb24gb2YNCi1WaXN1YWxBZ2UmcmVnOyAgIFNtYWxsdGFsay48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTmV4dCBjYW1lIEphdmEmIzg0ODI7PGJyPg0KLSAgICBCZWNhdXNlIG9mIG91ciBleHBlcnRpc2UgaW4gT08gdGVjaG5vbG9neSwgSUJNIHR1cm5lZCB0byBPVEkgZm9yIGEgbmV4dC1nZW5lcmF0aW9uDQotICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgSmF2YS4gVGhlIHJlc3VsdCBpcyBWaXN1YWxBZ2UgZm9yIEphdmEsIHdoaWNoDQotICBjb250aW51ZXMgdG8gd2luIGF3YXJkcyBmb3IgaXRzIGlubm92YXRpdmUgSURFIGFuZCB0ZWFtIHN1cHBvcnQuIEluZm9Xb3JsZA0KLSAgaGFzIGNob3NlbiBWaXN1YWxBZ2UgZm9yIEphdmEgYXMgZGV2ZWxvcG1lbnQgdG9vbCBvZiB0aGUgeWVhciAtIHllYXIgYWZ0ZXINCi0gIHllYXIgYWZ0ZXIgeWVhciE8YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgVGhlbiBwZXJ2YXNpdmUgY29tcHV0aW5nPGJyPg0KLSAgICBPVEkgY29udGludWVzIGl0cyBkZXZlbG9wbWVudCBvZiBJQk0ncyBWaXN1YWxBZ2UgTWljcm8gRWRpdGlvbiwgYSBzdGF0ZS1vZi10aGUtYXJ0DQotICBwbGF0Zm9ybSBmb3IgY29sbGFib3JhdGl2ZSBkZXZlbG9wbWVudCBvZiBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kIHN5c3RlbXMNCi0gIHRoYXQgYXJlIHZlcnkgbGVhbi4gQXMgdGhlIHN0ZWFkeSBzdHJlYW0gb2YgcHJlc3MgcmVsZWFzZXMgYXR0ZXN0cywgVmlzdWFsQWdlDQotICBNaWNybyBFZGl0aW9uIGlzIGFscmVhZHkgbGljZW5zZWQgdG8gdGhlIGxlYWRpbmcgbWljcm9jaGlwIG1hbnVmYWN0dXJlcnMsDQotICBtaWNyb2tlcm5lbCBkZXZlbG9wZXJzLCBhbmQgcHJvZHVjZXJzIG9mIGhhbmRoZWxkIGFuZCBjb25zdW1lciBkZXZpY2VzLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOb3cgaXQncyBFY2xpcHNlPGJyPg0KLSAgICBPVEkgaGFzIGJ1aWx0IHRoZSBuZXh0IGdlbmVyYXRpb24gSUJNIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHRvb2xzIHBsYXRmb3JtLg0KLSAgRWNsaXBzZSBpcyBhIGtpbmQgb2YgdW5pdmVyc2FsIHRvb2wgcGxhdGZvcm0gLSBhbiBvcGVuIGV4dGVuc2libGUgSURFIGZvcg0KLSAgYW55dGhpbmcgYW5kIG5vdGhpbmcgaW4gcGFydGljdWxhci4gVGhlIHJlYWwgdmFsdWUgY29tZXMgZnJvbSB0b29sIHBsdWctaW5zDQotICB0aGF0ICJ0ZWFjaCIgRWNsaXBzZSBob3cgdG8gd29yayB3aXRoIHRoaW5ncyAtIGphdmEgZmlsZXMsIHdlYiBjb250ZW50LA0KLWdyYXBoaWNzLCAgdmlkZW8gLSBhbG1vc3QgYW55dGhpbmcgeW91IGNhbiBpbWFnaW5lLiBFY2xpcHNlIGFsbG93cyB5b3UgdG8NCi1pbmRlcGVuZGVudGx5ICBkZXZlbG9wIHRvb2xzIHRoYXQgaW50ZWdyYXRlIHdpdGggb3RoZXIgcGVvcGxlJ3MgdG9vbHMgc28NCi1zZWFtbGVzc2x5IHlvdSB3b24ndCBrbm93IHdoZXJlIG9uZSB0b29sIGVuZHMgYW5kIGFub3RoZXIgc3RhcnRzLiBUaGUgSUJNDQotc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhpcyB0ZWNobm9sb2d5LCBXZWJTcGhlcmUgU3R1ZGlvIFdvcmtiZW5jaCwgd2lsbCBiZQ0KLXRoZSBjb3JlIG9mIHRoZSBuZXh0ICBnZW5lcmF0aW9uIG9mIElCTSBhbmQgSUJNIEJ1c2luZXNzIFBhcnRuZXIgZS1idXNpbmVzcw0KLXRvb2xzIG9wdGltaXplZCBmb3IgIHRoZSBXZWJTcGhlcmUgc29mdHdhcmUgcGxhdGZvcm0uPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFNvIHdoYXQncyBuZXh0Pzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyB0byBkZWxpdmVyIG9iamVjdC1vcmllbnRlZCB0ZWNobm9sb2d5IHRoYXQgc2NhbGVzIGFjcm9zcw0KLSBwbGF0Zm9ybXMsICBhY3Jvc3MgdGVhbXMgYW5kIGFjcm9zcyBwcm9qZWN0IHNpemUuIEZyb20gYSBtYWluZnJhbWUgdG8gYQ0KLXdhdGNoICAtIHdlJ3JlICBjbG9zaW5nIGluIG9uIHRoYXQgdmlzaW9uLjxicj4NCi08YnI+DQotPGltZyBzcmM9ImltZy93ZWxfbWwuanBnIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjQ2MCIgYWx0PSIiPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL2luc3RhbGwvZmVhdHVyZXMgc3BhY2UvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5zdGFsbC9mZWF0dXJlcyBzcGFjZS9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyZWMzMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvaW5zdGFsbC9mZWF0dXJlcyBzcGFjZS9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPgotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gIDwvdXJsPgotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJlbixmciIgb3M9IldJTjMyLExJTlVYIiB2ZXJzaW9uPSIxLjEuMSIgd3M9IldJTjMyLE1PVElGLEdUSyIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL1BkZV9jb3JlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwNzIxNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9oZWxwLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTg0ZjY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2p1bml0XzMuNy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NTg3YjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE4NDZjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDkyOGZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnBhY2thZ2VkIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJpbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzLyI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlIi8+DQotICA8L2ZlYXR1cmU+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvaGVscC5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xLmphciIgdXJsPSJwbHVnaW5zIHNwYWNlL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIi8+ICANCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IklCTSBXU0FEIFRvb2xzIiBuYW1lPSJlY2xpcHNlIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4gIA0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwYWI0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVHlwZUV4YW1wbGVzL3NpdGUxL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmVzMi5qYXJmaWxlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNzE2NWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5odHRwIj4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZXMyLmphcmZpbGUiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODA5NzEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5MmMxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL1BkZV9jb3JlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvUGRlX2NvcmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9oZWxwLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvcGx1Z2lucy9oZWxwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvanVuaXRfMy43LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2FydGlmYWN0cy9wbHVnaW5zL2p1bml0XzMuNy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxN2JiNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL2ltZy93ZWxfbWwuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWUzM2RmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL1NpdGVVUkxUZXN0L2RhdGEvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL3NpdGVJbmZvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjVhYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvU2l0ZVVSTFRlc3QvZGF0YS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlYTY4NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9TaXRlVVJMVGVzdC9kYXRhL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIHVybCA9ICJhcnRpZmFjdHMvIj4KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2hlbHBGZWF0dXJlLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL1VNTCIvPgotICA8L2ZlYXR1cmU+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPgotICA8L2ZlYXR1cmU+Ci0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UuaGVscF8xLjAuMC5qYXIiIHVybD0icGx1Z2lucy9oZWxwLmphciIvPgotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL1BkZV9jb3JlLmphciIvPgotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucy9qdW5pdF8zLjcuamFyIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IklCTSBXU0FEIFRvb2xzIiBuYW1lPSJlY2xpcHNlIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFSkIgVG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRS9FSkIiLz4KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvZmlsZTEuemlwIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvZmlsZTEuemlwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTcwYjdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2ZpbGUxLnppcAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjQ1NGVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL2luc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzIiBpbWFnZT0iZmVhdHVyZTEuZ2lmIiBsYWJlbD0iVGhpcmQgRmVhdHVyZSIgcHJvdmlkZXItbmFtZT0iU21hcnQgQ29tcGFueSIgdmVyc2lvbj0iMS4wLjAiPg0KLQk8aW5zdGFsbC1oYW5kbGVyIGhhbmRsZXI9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkRlZmF1bHRJbnN0YWxsSGFuZGxlciIvPg0KLSAgCTxkYXRhIGRvd25sb2FkLXNpemU9IjE1MDAiIGlkPSJmaWxlLnppcCIgaW5zdGFsbC1zaXplPSIxMDAwIi8+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MWYyMWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9Imluc3RhbGwvZmVhdHVyZXMvZmVhdHVyZTMiPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTNfMS4wLjAvZmlsZS56aXAiIHVybD0iZmlsZTEuemlwIi8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmVzMy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9mZWF0dXJlcy9mZWF0dXJlczMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGM2ZWNhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2RhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL2ZlYXR1cmVzL2ZlYXR1cmVzMy5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9ub24gZGF0YS9hbm90aGVyIGZpbGUuemlwIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvbm9uIGRhdGEvYW5vdGhlciBmaWxlLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3MGI3ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9ub24gZGF0YS9hbm90aGVyIGZpbGUuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZGF0YUVudHJ5U2l0ZVRlc3Qvc2l0ZTIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwOTQzYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9kYXRhRW50cnlTaXRlVGVzdC9zaXRlMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMzLmphciIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUucGFja2FnZWQiPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTNfMS4wLjAvZmlsZS56aXAiIHVybD0ibm9uIGRhdGEvYW5vdGhlciBmaWxlLnppcCIvPg0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlczIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThkMDA0ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9mZWF0dXJlczIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MGE3MGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjOTQ2My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4ZGRjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9mZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1MjA2OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnVwZGF0ZS1zaXRlMTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9idWlsZC5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiY2UxOTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9idWlsZC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSwzMTggKzAsMCBAQAotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4zLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMy5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjQuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW40Lmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUzXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTcwMGI5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4wIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMyIgdmVyc2lvbj0iMS4wLjAiLz4KLTwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODEyYjBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJmMTc1NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUzXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlM18xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODJhNjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUzXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYmM3ZjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDQyNTgzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luM18xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4zXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE5NGU1Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9wbHVnaW5zL2NvbS5wbHVnaW4zXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3BsdWdpbnMvY29tLnBsdWdpbjRfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luNF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Y2NhMjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTEvcGx1Z2lucy9jb20ucGx1Z2luNF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjNmN2JiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUxL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkxIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTIiIHZlcnNpb249IjEuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMS1DYXRlZ29yeTIiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUzXzEuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMyIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUxLUNhdGVnb3J5MyIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlMS1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlMS1DYXRlZ29yeTEtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTEtQ2F0ZWdvcnkyIiBsYWJlbD0iU2l0ZTEtQ2F0ZWdvcnkyLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUxLUNhdGVnb3J5MyIgbGFiZWw9IlNpdGUxLUNhdGVnb3J5My1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRiNjg3ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnVwZGF0ZS1zaXRlMjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9idWlsZC5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Nzc4NTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvLnNpdGVidWlsZC9idWlsZC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMl8xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLUJ1aWxkIGZpbmlzaGVkLg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyLy5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1ODgyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUtYnVpbGQKLSAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgotICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgotICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKLSAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCi0gICAgICB1c2UtY29uc29sZT0idHJ1ZSI+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxIiB2ZXJzaW9uPSIxLjAuMSIvPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMiIgdmVyc2lvbj0iMS4wLjEiLz4KLTwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTc1YjRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2NjBiOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgxNWYyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzVmNGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTIvcGx1Z2lucy9jb20ucGx1Z2luMl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMi9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWQ0YjcxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTEiIHZlcnNpb249IjEuMC4xIi8+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMS5qYXIiIGlkPSJ1cGRhdGUuZmVhdHVyZTIiIHZlcnNpb249IjEuMC4xIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGRiNmI3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+dXBkYXRlLXNpdGUzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9idWlsZC5sb2cgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL2J1aWxkLmxvZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEyZWUwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL2J1aWxkLmxvZworKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjJhLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMmEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMi5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTEwYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlLWJ1aWxkCi0gICAgICBmZWF0dXJlLWxvY2F0aW9uPSJmZWF0dXJlcyIKLSAgICAgIHBsdWdpbi1sb2NhdGlvbj0icGx1Z2lucyIKLSAgICAgIGF1dG9idWlsZD0iZmFsc2UiCi0gICAgICBzY3J1Yi1vdXRwdXQ9ImZhbHNlIgotICAgICAgdXNlLWNvbnNvbGU9InRydWUiPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMWIiIHZlcnNpb249IjIuMC4wIi8+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUyYiIgdmVyc2lvbj0iMi4wLjAiLz4KLTwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOWE4NzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2JiNzBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZDQxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxODNjNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlMy9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzFiMjhlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTdiYTVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGUzL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyODUwNmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTMvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxYiIgdmVyc2lvbj0iMi4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGUzLUNhdGVnb3J5MSIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJiXzIuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMmIiIHZlcnNpb249IjIuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlMy1DYXRlZ29yeTIiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTMtQ2F0ZWdvcnkxIiBsYWJlbD0iU2l0ZTMtQ2F0ZWdvcnkxLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGUzLUNhdGVnb3J5MiIgbGFiZWw9IlNpdGUzLUNhdGVnb3J5Mi1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwN2FhZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPnVwZGF0ZS1zaXRlNDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlVwZGF0ZVNpdGVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0Ly5zaXRlYnVpbGQvYnVpbGQubG9nIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9idWlsZC5sb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZmU4ZTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9idWlsZC5sb2cKKysrIC9kZXYvbnVsbApAQCAtMSw3OTEgKzAsMCBAQAotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4xLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXZhYw0KLU1lc3NhZ2UgbG9nZ2VkOiBDb21waWxlIGZhaWxlZDsgc2VlIHRoZSBjb21waWxlciBlcnJvciBvdXRwdXQgZm9yIGRldGFpbHMuDQotVGFzayBmaW5pc2hlZDogamF2YWMNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogcGx1Z2luMS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMS5qYXINCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjEuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjEuamFyDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4xLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMWEuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphdmFjDQotTWVzc2FnZSBsb2dnZWQ6IENvbXBpbGUgZmFpbGVkOyBzZWUgdGhlIGNvbXBpbGVyIGVycm9yIG91dHB1dCBmb3IgZGV0YWlscy4NCi1UYXNrIGZpbmlzaGVkOiBqYXZhYw0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4xYS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC5qYXJzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogemlwDQotVGFzayBmaW5pc2hlZDogemlwDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUxY18zLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUxXzEuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMV8xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTFiXzIuMC4wfSBkb2VzIG5vdCBleGlzdCBhbmQgY2Fubm90IGJlIHJlZnJlc2hlZC4NCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1CdWlsZCBmaW5pc2hlZC4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC8uc2l0ZWJ1aWxkL3NpdGVidWlsZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3Y2IwMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUtYnVpbGQKLSAgICAgIGZlYXR1cmUtbG9jYXRpb249ImZlYXR1cmVzIgotICAgICAgcGx1Z2luLWxvY2F0aW9uPSJwbHVnaW5zIgotICAgICAgYXV0b2J1aWxkPSJmYWxzZSIKLSAgICAgIHNjcnViLW91dHB1dD0iZmFsc2UiCi0gICAgICB1c2UtY29uc29sZT0idHJ1ZSI+Ci0gICA8ZmVhdHVyZSBpZD0idXBkYXRlLmZlYXR1cmUxYyIgdmVyc2lvbj0iMy4wLjAiLz4KLTwvc2l0ZS1idWlsZD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQyZjI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWViMGI2Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNmJjYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTMzMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxY18zLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNC9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTA3NjBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvcGx1Z2lucy9jb20ucGx1Z2luMWFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRlYjA3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU0L3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNzNjYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTQvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxYyIgdmVyc2lvbj0iMy4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGU0LUNhdGVnb3J5MSIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJTaXRlNC1DYXRlZ29yeTEiIGxhYmVsPSJTaXRlNC1DYXRlZ29yeTEtTGFiZWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgZWNldGVyYS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2NhdGVnb3J5LWRlZj4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOTMzMDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT51cGRhdGUtc2l0ZTU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS8uc2l0ZWJ1aWxkL2J1aWxkLmxvZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvYnVpbGQubG9nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQ0ZmFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvYnVpbGQubG9nCisrKyAvZGV2L251bGwKQEAgLTEsNzkxICswLDAgQEAKLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMi5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjIuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC5qYXJzDQotVGFzayBzdGFydGVkOiBhdmFpbGFibGUNCi1UYXNrIGZpbmlzaGVkOiBhdmFpbGFibGUNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHBsdWdpbjIuamFyDQotVGFyZ2V0IGZpbmlzaGVkOiBwbHVnaW4yLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBjaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5pZFJlcGxhY2VyDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFyZ2V0IGZpbmlzaGVkOiBST09URklMRVMqXypfKg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBqYXINCi1UYXNrIGZpbmlzaGVkOiBqYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYnVpbGQuamFycw0KLVRhc2sgc3RhcnRlZDogYXZhaWxhYmxlDQotVGFzayBmaW5pc2hlZDogYXZhaWxhYmxlDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBwbHVnaW4yYS5qYXINCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamF2YWMNCi1NZXNzYWdlIGxvZ2dlZDogQ29tcGlsZSBmYWlsZWQ7IHNlZSB0aGUgY29tcGlsZXIgZXJyb3Igb3V0cHV0IGZvciBkZXRhaWxzLg0KLVRhc2sgZmluaXNoZWQ6IGphdmFjDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjJhLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBta2Rpcg0KLVRhc2sgZmluaXNoZWQ6IG1rZGlyDQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXJnZXQgZmluaXNoZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiB6aXANCi1UYXNrIGZpbmlzaGVkOiB6aXANCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQudXBkYXRlLmphcg0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGJ1aWxkLmphcnMNCi1UYXNrIHN0YXJ0ZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgZmluaXNoZWQ6IGF2YWlsYWJsZQ0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcGx1Z2luMi5qYXINCi1UYXJnZXQgZmluaXNoZWQ6IHBsdWdpbjIuamFyDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogYnVpbGQuamFycw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogcHJvcGVydGllcw0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogcHJvcGVydGllcw0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBjb3B5DQotVGFzayBmaW5pc2hlZDogY29weQ0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHppcA0KLVRhc2sgZmluaXNoZWQ6IHppcA0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBjaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IG1rZGlyDQotVGFzayBmaW5pc2hlZDogbWtkaXINCi1UYXNrIHN0YXJ0ZWQ6IGNvcHkNCi1UYXNrIGZpbmlzaGVkOiBjb3B5DQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmlkUmVwbGFjZXINCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXJnZXQgZmluaXNoZWQ6IFJPT1RGSUxFUypfKl8qDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogZ2F0aGVyLmJpbi5wYXJ0cw0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IGphcg0KLVRhc2sgZmluaXNoZWQ6IGphcg0KLVRhc2sgc3RhcnRlZDogZGVsZXRlDQotVGFzayBmaW5pc2hlZDogZGVsZXRlDQotVGFyZ2V0IGZpbmlzaGVkOiBidWlsZC51cGRhdGUuamFyDQotVGFzayBmaW5pc2hlZDogYW50DQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IGRlbGV0ZQ0KLVRhc2sgZmluaXNoZWQ6IGRlbGV0ZQ0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IGdhdGhlci5iaW4ucGFydHMNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogbWtkaXINCi1UYXNrIGZpbmlzaGVkOiBta2Rpcg0KLVRhc2sgc3RhcnRlZDogY29weQ0KLVRhc2sgZmluaXNoZWQ6IGNvcHkNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuaWRSZXBsYWNlcg0KLVRhc2sgc3RhcnRlZDogYW50Y2FsbA0KLVRhcmdldCBzdGFydGVkOiBST09URklMRVMqXypfKg0KLVRhcmdldCBmaW5pc2hlZDogUk9PVEZJTEVTKl8qXyoNCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiBnYXRoZXIuYmluLnBhcnRzDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhc2sgc3RhcnRlZDogamFyDQotVGFzayBmaW5pc2hlZDogamFyDQotVGFzayBzdGFydGVkOiBkZWxldGUNCi1UYXNrIGZpbmlzaGVkOiBkZWxldGUNCi1UYXJnZXQgZmluaXNoZWQ6IGJ1aWxkLnVwZGF0ZS5qYXINCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFzayBzdGFydGVkOiBhbnQNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1NZXNzYWdlIGxvZ2dlZDogUHJvamVjdCAke3VwZGF0ZS5mZWF0dXJlMl8xLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotTWVzc2FnZSBsb2dnZWQ6IFByb2plY3QgJHt1cGRhdGUuZmVhdHVyZTJfMS4wLjB9IGRvZXMgbm90IGV4aXN0IGFuZCBjYW5ub3QgYmUgcmVmcmVzaGVkLg0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBzdGFydGVkOiBhbnRjYWxsDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgc3RhcnRlZDogYWxsLnBsdWdpbnMNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBwcm9wZXJ0aWVzDQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBwcm9wZXJ0aWVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGluaXQNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IGluaXQNCi1UYXJnZXQgc3RhcnRlZDogcmVmcmVzaA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgZmluaXNoZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UucmVmcmVzaExvY2FsDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IHN0YXJ0ZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IGZpbmlzaGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBzdGFydGVkOiBhbGwuY2hpbGRyZW4NCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5jaGlsZHJlbg0KLVRhc2sgZmluaXNoZWQ6IGFudGNhbGwNCi1UYXJnZXQgZmluaXNoZWQ6IHJlZnJlc2gNCi1UYXNrIGZpbmlzaGVkOiBhbnQNCi1UYXNrIHN0YXJ0ZWQ6IGFudA0KLVRhcmdldCBzdGFydGVkOiBpbml0DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFzayBzdGFydGVkOiBwcm9wZXJ0eQ0KLVRhc2sgZmluaXNoZWQ6IHByb3BlcnR5DQotVGFyZ2V0IGZpbmlzaGVkOiBpbml0DQotVGFyZ2V0IHN0YXJ0ZWQ6IHJlZnJlc2gNCi1UYXNrIHN0YXJ0ZWQ6IGVjbGlwc2UuY29udmVydFBhdGgNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLU1lc3NhZ2UgbG9nZ2VkOiBQcm9qZWN0ICR7dXBkYXRlLmZlYXR1cmUyYl8yLjAuMH0gZG9lcyBub3QgZXhpc3QgYW5kIGNhbm5vdCBiZSByZWZyZXNoZWQuDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIHN0YXJ0ZWQ6IGFudGNhbGwNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiBhbGwuZmVhdHVyZXMNCi1UYXJnZXQgZmluaXNoZWQ6IGFsbC5mZWF0dXJlcw0KLVRhcmdldCBzdGFydGVkOiBhbGwucGx1Z2lucw0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhc2sgc3RhcnRlZDogYW50DQotVGFyZ2V0IHN0YXJ0ZWQ6IHByb3BlcnRpZXMNCi1UYXNrIHN0YXJ0ZWQ6IHByb3BlcnR5DQotVGFzayBmaW5pc2hlZDogcHJvcGVydHkNCi1UYXJnZXQgZmluaXNoZWQ6IHByb3BlcnRpZXMNCi1UYXJnZXQgc3RhcnRlZDogaW5pdA0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhc2sgc3RhcnRlZDogcHJvcGVydHkNCi1UYXNrIGZpbmlzaGVkOiBwcm9wZXJ0eQ0KLVRhcmdldCBmaW5pc2hlZDogaW5pdA0KLVRhcmdldCBzdGFydGVkOiByZWZyZXNoDQotVGFzayBzdGFydGVkOiBlY2xpcHNlLmNvbnZlcnRQYXRoDQotVGFzayBmaW5pc2hlZDogZWNsaXBzZS5jb252ZXJ0UGF0aA0KLVRhc2sgc3RhcnRlZDogZWNsaXBzZS5yZWZyZXNoTG9jYWwNCi1UYXNrIGZpbmlzaGVkOiBlY2xpcHNlLnJlZnJlc2hMb2NhbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLnBsdWdpbnMNCi1UYXJnZXQgc3RhcnRlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgZmluaXNoZWQ6IHVwZGF0ZS5mZWF0dXJlDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5jaGlsZHJlbg0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmNoaWxkcmVuDQotVGFzayBmaW5pc2hlZDogYW50Y2FsbA0KLVRhcmdldCBmaW5pc2hlZDogcmVmcmVzaA0KLVRhc2sgZmluaXNoZWQ6IGFudA0KLVRhcmdldCBmaW5pc2hlZDogYWxsLmZlYXR1cmVzDQotVGFyZ2V0IHN0YXJ0ZWQ6IGFsbC5wbHVnaW5zDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwucGx1Z2lucw0KLVRhcmdldCBzdGFydGVkOiB1cGRhdGUuZmVhdHVyZQ0KLVRhcmdldCBmaW5pc2hlZDogdXBkYXRlLmZlYXR1cmUNCi1UYXJnZXQgc3RhcnRlZDogYWxsLmNoaWxkcmVuDQotVGFyZ2V0IGZpbmlzaGVkOiBhbGwuY2hpbGRyZW4NCi1UYXNrIGZpbmlzaGVkOiBhbnRjYWxsDQotVGFyZ2V0IGZpbmlzaGVkOiByZWZyZXNoDQotQnVpbGQgZmluaXNoZWQuDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvLnNpdGVidWlsZC9zaXRlYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTI0M2QzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1Ly5zaXRlYnVpbGQvc2l0ZWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZS1idWlsZAotICAgICAgZmVhdHVyZS1sb2NhdGlvbj0iZmVhdHVyZXMiCi0gICAgICBwbHVnaW4tbG9jYXRpb249InBsdWdpbnMiCi0gICAgICBhdXRvYnVpbGQ9ImZhbHNlIgotICAgICAgc2NydWItb3V0cHV0PSJmYWxzZSIKLSAgICAgIHVzZS1jb25zb2xlPSJ0cnVlIj4KLSAgIDxmZWF0dXJlIGlkPSJ1cGRhdGUuZmVhdHVyZTFjIiB2ZXJzaW9uPSIzLjAuMCIvPgotICAgPGZlYXR1cmUgaWQ9InVwZGF0ZS5mZWF0dXJlMmMiIHZlcnNpb249IjMuMC4wIi8+Ci08L3NpdGUtYnVpbGQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyZDllMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMV8xLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYjBiNmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWJfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YjA3NjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDI2Zjg2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNzBjY2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmJfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGFjMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvZmVhdHVyZXMvdXBkYXRlLmZlYXR1cmUyYl8yLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9mZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAzN2RmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L2ZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMmNfMy4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0Mzc0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjFhXzEuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyY2MzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4xYV8xLjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9taXJyb3JzL3VwZGF0ZS1zaXRlNS9wbHVnaW5zL2NvbS5wbHVnaW4yXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmM4YTg4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvcGx1Z2lucy9jb20ucGx1Z2luMmFfMS4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2NkMGZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3BsdWdpbnMvY29tLnBsdWdpbjJhXzEuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL21pcnJvcnMvdXBkYXRlLXNpdGU1L3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMjZkYjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbWlycm9ycy91cGRhdGUtc2l0ZTUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3VwZGF0ZS5mZWF0dXJlMWNfMy4wLjAuamFyIiBpZD0idXBkYXRlLmZlYXR1cmUxYyIgdmVyc2lvbj0iMy4wLjAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9IlNpdGU1LUNhdGVnb3J5MSIvPgotICAgPC9mZWF0dXJlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy91cGRhdGUuZmVhdHVyZTJjXzMuMC4wLmphciIgaWQ9InVwZGF0ZS5mZWF0dXJlMmMiIHZlcnNpb249IjMuMC4wIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJTaXRlNS1DYXRlZ29yeTIiLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0iU2l0ZTUtQ2F0ZWdvcnkxIiBsYWJlbD0iU2l0ZTUtQ2F0ZWdvcnkxLUxhYmVsIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIGVjZXRlcmEuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9IlNpdGU1LUNhdGVnb3J5MiIgbGFiZWw9IlNpdGU1LUNhdGVnb3J5Mi1MYWJlbCI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBlY2V0ZXJhLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvY2F0ZWdvcnktZGVmPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmNoaWxkcmVuZmVhdHVyZV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY1ODAzNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDExMDUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlmNWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YjA0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjA4ZmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2NiMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIi8+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTA1N2U2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTBhM2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9mZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOWY1YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjRiMDRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDhmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0Mi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc1MmRhMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIi8+Ci0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciIvPiAgCi0gIAotICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4xLjAuamFyIiB1cmw9ImZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIiLz4gIAotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvY2hpbGRyZW5mZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJlZTRiYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL2ZlYXR1cmVzL2NoaWxkcmVuZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTliZGRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlmNWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YjA0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QzL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjA4ZmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL25lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjk2YmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvbmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphciIvPgotICAKLSAgPGFyY2hpdmUgcGF0aD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMS4wLmphciIgdXJsPSJmZWF0dXJlcy9jaGlsZHJlbmZlYXR1cmUuamFyIi8+ICAKLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDcwODAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICB2ZXJzaW9uPSIyLjEuMCIKLSAgIGxhYmVsPSJFY2xpcHNlIFBsYXRmb3JtIgotICAgcHJvdmlkZXItbmFtZT0id3d3LmVjbGlwc2Uub3JnIgotICAgaW1hZ2U9InNwbGFzaC9zcGxhc2hfZnVsbC5ibXAiCi0gICA+Ci0KLQk8bGljZW5zZT4KLSAgICAJIGxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0KLSAgIDxjb3B5cmlnaHQgdXJsPSJub3RpY2UuaHRtbCIvPgotICAgeAotCQotICAgPGxpY2Vuc2UgdXJsPSJhYm91dC5odG1sIj4KLSAgIHgKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgdXJsPSJmaWxlOi9EOi8iIGxhYmVsPSJFY2xpcHNlIFVwZGF0ZSBTaXRlIi8+Ci0gICA8L3VybD4KLQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUxYmlzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg1NWY5Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9mZWF0dXJlMWJpcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIKLSAgIHZlcnNpb249IjIuMS4wIgotICAgbGFiZWw9IkVjbGlwc2UgUGxhdGZvcm0iCi0gICBwcm92aWRlci1uYW1lPSJ3d3cuZWNsaXBzZS5vcmciCi0gICBpbWFnZT0ic3BsYXNoL3NwbGFzaF9mdWxsLmJtcCIKLSAgID4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgRWNsaXBzZSBwbGF0Zm9ybSBmZWF0dXJlLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Im5vdGljZS5odG1sIi8+Ci0gICA8YmxhaCAvPgotCQotICAgPGxpY2Vuc2UgdXJsPSJhYm91dC5odG1sIj4KLQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTIueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJkZjliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKLSAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKLSAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgotICAgYmxhaD0iYmxhaCIKLSAgID4KLQotICAgPGRlc2NyaXB0aW9uIGJsYWg9ImJsYWgiPgotICAgRWNsaXBzZSBwbGF0Zm9ybSBmZWF0dXJlLgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Im5vdGljZS5odG1sIiBibGFoPSJibGFoIi8+Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiIGJsYWg9ImJsYWgiPgotICAgPC9saWNlbnNlPgotCi0gICA8dXJsIGJsYWg9ImJsYWgiPgotICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiIGJsYWg9ImJsYWgiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTMueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTY2MGJlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmUzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKLSAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKLSAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgotICAgPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICBFY2xpcHNlIHBsYXRmb3JtIGZlYXR1cmUuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iJG9zJC8kd3MkL25vdGljZS5odG1sIi8+Ci0gICB4Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgotICAgeAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiLz4KLSAgIDwvdXJsPgotCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvZmVhdHVyZTQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE4N2M5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL2ZlYXR1cmU0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBsYWJlbD0iRWNsaXBzZSBQbGF0Zm9ybSIKLSAgIHByb3ZpZGVyLW5hbWU9Ind3dy5lY2xpcHNlLm9yZyIKLSAgIGltYWdlPSJzcGxhc2gvc3BsYXNoX2Z1bGwuYm1wIgotICAgPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICBFY2xpcHNlIHBsYXRmb3JtIGZlYXR1cmUuCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iJG9zJC8kd3MkL25vdGljZS5odG1sIi8+Ci0gICB4Ci0JCi0gICA8bGljZW5zZSB1cmw9ImFib3V0Lmh0bWwiPgotICAgeAotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSB1cmw9ImZpbGU6L0Q6LyIgbGFiZWw9IkVjbGlwc2UgVXBkYXRlIFNpdGUiLz4KLSAgICAgIDxkaXNjb3ZlcnkgdXJsPSJmaWxlOi9jOi8iIGxhYmVsID0gIkRpc2NvdmVyeSIgdHlwZT0id2ViIi8+Ci0gICA8L3VybD4KLQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YxNzAxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4NCi08c2l0ZSB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCI+DQotPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMS4wLjAuamFyIj4gDQotPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPg0KLTwvZmVhdHVyZT4NCi08ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3JlZGRvdF8yLjEuMC5qYXIiPg0KLTxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCi08L2ZlYXR1cmU+DQotPGFyY2hpdmUgcGF0aD0iY29tLnJlZGRvdC5yZWRvdF8xLjAuMCIgdXJsPSJwbHVnaW5zL2NvbS5yZWRkb3QucmVkZG90XzEuMC4wLmphciIvPg0KLTxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMi4xLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8yLjEuMC5qYXIiLz4NCi08Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPg0KLTxkZXNjcmlwdGlvbiB1cmw9IlJlZERvdFZlcnNpb25zLmh0bWwiPg0KLVRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSAmbHQ7Y3VycmVudGx5Jmd0OyBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLg0KLTwhW0NEQVRBWzxncmVldGluZz5IZWxsbywgd29ybGQhPC9ncmVldGluZz5dXT4NCi08L2Rlc2NyaXB0aW9uPg0KLTwvY2F0ZWdvcnktZGVmPg0KLTwvc2l0ZT4NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9yZWRkb3QxLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdDEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQ0OTBlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3JlZGRvdDEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQotPHNpdGUgdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiPg0KLTxmZWF0dXJlIHVybD0iZmVhdHVyZXMvcmVkZG90XzEuMC4wLmphciI+IA0KLTxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4NCi08L2ZlYXR1cmU+DQotPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yZWRkb3RfMi4xLjAuamFyIj4NCi08Y2F0ZWdvcnkgbmFtZT0icmVkZG90Ii8+DQotPC9mZWF0dXJlPg0KLTxhcmNoaXZlIHBhdGg9ImNvbS5yZWRkb3QucmVkb3RfMS4wLjAiIHVybD0icGx1Z2lucy9jb20ucmVkZG90LnJlZGRvdF8xLjAuMC5qYXIiLz4NCi08YXJjaGl2ZSBwYXRoPSJjb20ucmVkZG90LnJlZG90XzIuMS4wIiB1cmw9InBsdWdpbnMvY29tLnJlZGRvdC5yZWRkb3RfMi4xLjAuamFyIi8+DQotPGNhdGVnb3J5LWRlZiBsYWJlbD0iUmVkIERvdCBWZXJzaW9ucyIgbmFtZT0icmVkZG90Ij4NCi08ZGVzY3JpcHRpb24gdXJsPSJSZWREb3RWZXJzaW9ucy5odG1sIj4NCi1UaGlzIGNhdGVnb3J5IGNvbnRhaW5zIGFsbCBvZiB0aGUgJmx0O2N1cnJlbnRseSZndDsgYXZhaWxhYmxlIHZlcnNpb25zIG9mIFJlZCBEb3QgZmVhdHVyZS4NCi08L2Rlc2NyaXB0aW9uPg0KLTwvY2F0ZWdvcnktZGVmPg0KLTwvc2l0ZT4NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMWNlZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1kcml2ZXJzPVJlcXVpcmVkIERyaXZlcnMNCi1zZWN1cml0eT1TZWN1cml0eSBGaXhlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MGQ4MzEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxoYW5kbGVyPg0KLSAgCTxib28gY2xhc3MgPSJ1bmtub3duIi8+DQotICA8L2hhbmRsZXI+DQotICANCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4NCi0gICAgPGJsYWgvPg0KLSAgPC9mZWF0dXJlPg0KLSAgDQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiLz4NCi0gIA0KLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICA8L2ZlYXR1cmU+DQotICANCi0gIDxmZWF0dXJlIHVybD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMS4wLjAvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTJfMi4yLjIuamFyIj4NCi0gIDwvZmVhdHVyZT4NCi0gIA0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9oZWxsbyIgPg0KLSAgCTxkZWZhdWx0Lz4NCi0gIDwvYXJjaGl2ZT4NCi0NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+DQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxIiBsYWJlbD0iJWRyaXZlcnMiLz4gIA0KLQ0KLQ0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMTAueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTEwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyNjgwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMTAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cyIgbmFtZT0iVGVzdHMiIHZlcnNpb249IjAuMC4xIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIiBibGFoPSJibGFoIj4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciIgYmxhaD0iYmxhaCIgaWQ9Im9yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciIgaWQ9InVua253b24uaWQiIHZlcnNpb249ImJhZCB2ZXJzaW9uIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIgaWQ9Im9ubHkuaWQiLz4KLSAgICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAKLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzU1MGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gIDxmZWF0dXJlIGlkPSJjb20uaWJtLmpkdCIgdXJsPSJodHRwOi8vd3d3Lm5vdC1lY2xpcHNlLm9yZy9mZWF0dXJlMyIgdmVyc2lvbj0iMS4wLjAiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMy54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlMy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYmI2ODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gIDxmZWF0dXJlIGlkPSJjb20uaWJtLmpkdCIgdXJsPSJmZWF0dXJlMy9mZWF0dXJlLmphciIgdmVyc2lvbj0iMS4wLjAiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0idW5rbm93biIvPgotICA8L2ZlYXR1cmU+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWI3ZDE2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPHNpdGU+Ci0gICA8ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4KLQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJSZWQgRG90IFZlcnNpb25zIiBuYW1lPSJyZWRkb3QiPgotICAgICAgPGRlc2NyaXB0aW9uIHVybD0iUmVkRG90VmVyc2lvbnMuaHRtbCI+Ci0gICAgICAgICBUaGlzIGNhdGVnb3J5IGNvbnRhaW5zIGFsbCBvZiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSB2ZXJzaW9ucyBvZiBSZWQgRG90IGZlYXR1cmUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAKLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvY29tLnJlZGRvdC5yZWRkb3RfMS4wLjAuamFyIj4KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJyZWRkb3QiLz4KLSAgIDwvZmVhdHVyZT4KLQotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9jb20ucmVkZG90LnJlZGRvdF8yLjEuMC5qYXIiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9InJlZGRvdCIvPgotICAgPC9mZWF0dXJlPgotCi0gCi08L3NpdGU+ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTcueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGFyc2VydGVzdHMvc2l0ZTcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTkwZDcwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU3LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+Ci0gIDxoYW5kbGVyPgotICAJPGJvbyBjbGFzcyA9InVua25vd24iLz4KLSAgPC9oYW5kbGVyPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvZmVhdHVyZXMyLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8YmxhaC8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgICA8YmxhaC8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiA+Ci0gIAk8ZGVmYXVsdC8+Ci0gIDwvYXJjaGl2ZT4KLQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgCi0KLQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU4LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjYmFhMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiPgotICA8aGFuZGxlcj4KLSAgCTxib28gY2xhc3MgPSJ1bmtub3duIi8+Ci0gIDwvaGFuZGxlcj4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgPC9mZWF0dXJlPgotICB4Y3hnZnNkZmdzZHNkCi0gIAotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4KLSAgICA8YmxhaC8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPgotICAKLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTEiLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL2hlbGxvIiA+Ci0gIAk8ZGVmYXVsdC8+Ci0gIDwvYXJjaGl2ZT4KLQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MiIgbGFiZWw9IiVzZWN1cml0eSIvPgotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEiIGxhYmVsPSIlZHJpdmVycyIvPiAgCi0KLQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU5LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGU5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4YzVhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlOS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzIiBuYW1lPSJUZXN0cyIgdmVyc2lvbj0iMC4wLjEiIHR5cGU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZpbGUiIGJsYWg9ImJsYWgiPgotICA8aGFuZGxlciBibGFoPSJibGFoIj4KLSAgCTxib28gY2xhc3MgPSJ1bmtub3duIiBibGFoPSJibGFoIi8+Ci0gIDwvaGFuZGxlcj4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciIgYmxhaD0iYmxhaCI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIgYmxhaD0iYmxhaCIgLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlczIuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkyIi8+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPgotICAgIDxibGFoLz4KLSAgPC9mZWF0dXJlPgotICAKLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUuamFyIi8+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MSIvPgotICA8L2ZlYXR1cmU+Ci0gIAotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+Ci0gIDwvZmVhdHVyZT4KLSAgCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvaGVsbG8iIGJsYWg9ImJsYWgiPgotICAJPGRlZmF1bHQgYmxhaD0iYmxhaCIvPgotICA8L2FyY2hpdmU+Ci0KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTIiIGxhYmVsPSIlc2VjdXJpdHkiIGJsYWg9ImJsYWgiLz4KLSAgPGNhdGVnb3J5LWRlZiBuYW1lPSJjYXRlZ29yeTEvc3ViY2F0MSIgbGFiZWw9IlNwZWNpYWwgRml4IiBibGFoPSJibGFoIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxIiBsYWJlbD0iJWRyaXZlcnMiLz4gIAotCi0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wYXJzZXJ0ZXN0cy9zaXRlZnRwLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGVmdHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODgzZWMwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BhcnNlcnRlc3RzL3NpdGVmdHAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuZnRwIj4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlczIuamFyZmlsZSIvPgotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxLnBsdWdpbjFfMS4xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzk5NWQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMi5wbHVnaW4yXzIuMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5OTVkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5kdW1teV83LjkuOC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmMTkzZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjc1YWRlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5NThjNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjA1ZDgyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPg0KLSAgPHJ1bnRpbWU+DQotICAgIDxsaWJyYXJ5IG5hbWU9Imp1bml0LmphciI+DQotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgIDwvbGlicmFyeT4NCi0gIDwvcnVudGltZT4NCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNGQ2MDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQxYWY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJPU19XSU4zMiIgdmVyc2lvbj0iMS4xLjEiIHdzPSJXU19XSU4zMiIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9pbnN0YWxsL2ZlYXR1cmVzL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGE3ZGU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvaW5zdGFsbC9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJPU19XSU4zMiIgdmVyc2lvbj0iMi4xLjAiIHdzPSJXU19XSU4zMiIvPgotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMTg0NmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlXzIuMC4wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgdmVyc2lvbj0iMy41LjYiIHZlbmRvci1uYW1lPSJqdW5pdC5vcmciPgotICA8cnVudGltZT4KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPgotICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgPC9saWJyYXJ5PgotICA8L3J1bnRpbWU+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmVfMi4wLjAvc3JjLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDRkNjA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3JlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZV8yLjAuMC9zcmMuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvcmVzb3VyY2VzLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzYWI5MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9yZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotSFRUUF9QQVRIXzE9L29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzL1VwZGF0ZU1hbmFnZXIyLw0KLUhUVFBfUEFUSF8yPS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS51cGRhdGV0ZXN0cy9VcGRhdGVNYW5hZ2VyLw0KLUhUVFBfUEFUSF8zPS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS51cGRhdGV0ZXN0cy9TaXRlIHdpdGggc3BhY2UvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjNjBjNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotPGRlc2NyaXB0aW9uIHVybD0iaW5mby9zaXRlSW5mby5odG1sIi8+DQotICA8ZmVhdHVyZSB1cmw9InRlc3RBUEkvZmVhdHVyZXMvZmVhdHVyZTMiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMiI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMSI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEuamFyIiB1cmw9InBsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gICAgDQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVjbGlwc2UgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZTIvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkMWMxMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSB1cmw9IkluZm8uaHRtbCIgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmUxIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMSIgdXJsPSJwbHVnaW5zL3BsdWdpbjEiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5hcmNoaXZlMiIgdXJsPSJwbHVnaW5zL3BsdWdpbjIiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNfMS4wLjMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyM2U0Zi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4Ci1CdW5kbGUtTmFtZTogVGVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNCVU5ETEVQQVJTRUQKLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyCi1MZWdhY3k6IHRydWUKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0cy5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiAKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjU5ZGRiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzXzEuMC4zL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cGx1Z2luIG5hbWU9IkpVbml0IFRlc3QgRnJhbWV3b3JrIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlQW5kUGx1Z2luTWFuaWZlc3RzIiB2ZXJzaW9uPSIxLjAuMyIgdmVuZG9yLW5hbWU9IkVjbGlwc2Uub3JnIj4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlTWFuaWZlc3RfMS4wLjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2J1bmRsZU1hbmlmZXN0XzEuMC4xL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTZlNjgwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvYnVuZGxlTWFuaWZlc3RfMS4wLjEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2MjYwMzcwOAotQnVuZGxlLU5hbWU6IFRlc3QKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuYnVuZGxlTWFuaWZlc3Q7IHNpbmdsZXRvbj10cnVlCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUNsYXNzUGF0aDogcGx1Z2luLmphcgotTGVnYWN5OiB0cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVNYW5pZmVzdC5BY3RpdmF0b3IKLVJlcXVpcmUtQnVuZGxlOiAKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UudWkKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMC9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODFjNDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIHZlcnNpb249IjUuMC4wIiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4wL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjAvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvZmVhdHVyZTFfcGx1Z2luMl81LjAuMS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNjMjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjIiIHZlcnNpb249IjUuMC4xIiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4NCi0gIDxydW50aW1lPg0KLSAgICA8bGlicmFyeSBuYW1lPSJqdW5pdC5qYXIiPg0KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICA8L2xpYnJhcnk+DQotICA8L3J1bnRpbWU+DQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvc2l0ZVRlc3RMb2NhbFNpdGUvcGx1Z2lucy9mZWF0dXJlMV9wbHVnaW4yXzUuMC4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL2ZlYXR1cmUxX3BsdWdpbjJfNS4wLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS9zaXRlVGVzdExvY2FsU2l0ZS9wbHVnaW5zL25vdEJ1bmRsZU1hbmlmZXN0XzEuMC4yL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjZmYjBmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3NpdGVUZXN0TG9jYWxTaXRlL3BsdWdpbnMvbm90QnVuZGxlTWFuaWZlc3RfMS4wLjIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4Ci1CdW5kbGUtTmFtZTogTm90IFZhbGlkIEJ1bmRsZSBNYW5pZmVzdAotQnVuZGxlLVZlcnNpb246IDEuMC4yCi1CdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZwotQnVuZGxlLUNsYXNzUGF0aDogcGx1Z2luLmphcgotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS51aQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvZmVhdHVyZXMvZmVhdHVyZTMvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NzhkNjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9mZWF0dXJlcy9mZWF0dXJlMy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPgotICA8ZGVzY3JpcHRpb24+RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICA8Y29weXJpZ2h0PmNvcHlyaWdodDwvY29weXJpZ2h0PgotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPgotICA8dXJsPgotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iLz4KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+Ci0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPgotICA8L3VybD4KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJXSU4zMixMSU5VWCIgdmVyc2lvbj0iMS4xLjEiLz4KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE4NDZjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHBsdWdpbiBuYW1lPSJKVW5pdCBUZXN0IEZyYW1ld29yayIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIHZlcnNpb249IjMuNS42IiB2ZW5kb3ItbmFtZT0ianVuaXQub3JnIj4KLSAgPHJ1bnRpbWU+Ci0gICAgPGxpYnJhcnkgbmFtZT0ianVuaXQuamFyIj4KLSAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgIDwvbGlicmFyeT4KLSAgPC9ydW50aW1lPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdGVzdEFQSS9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xL3NyYy5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0ZDYwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEvc3JjLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS90ZXN0QVBJL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzE1ZDQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3Rlc3RBUEkvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGUgdHlwZT0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmlsZSI+Ci08ZGVzY3JpcHRpb24gdXJsPSJpbmZvL3NpdGVJbmZvLmh0bWwiLz4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9mZWF0dXJlMyI+Ci0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvVU1MIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUyIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGZlYXR1cmUgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIj4KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDwvZmVhdHVyZT4KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMS5qYXIiIHVybD0icGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIvPiAgICAKLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSjJFRSB0b29scyIgbmFtZT0iZWNsaXBzZS9KMkVFIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPgotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik1lc3NhZ2luZyBUb29scyIgbmFtZT0iQjJCIi8+Ci0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVjbGlwc2UgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUyLy5lY2xpcHNlcHJvZHVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTIvLmVjbGlwc2Vwcm9kdWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjgyOWFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTIvLmVjbGlwc2Vwcm9kdWN0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1pZD1hbm90aGVyLnByb2R1Y3QuaWQNCi1uYW1lPU5hbWUgb2YgdGhlIHByb2R1Y3QNCi12ZXI9MS4yLjQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlMy8uZWNsaXBzZWV4dGVuc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ3MmRmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGUzLy5lY2xpcHNlZXh0ZW5zaW9uCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaWQ9aWQub2YuZXh0ZW5kZWQucHJvZHVjdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTQvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTQvZWNsaXBzZS8uZWNsaXBzZWV4dGVuc2lvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNjODRlOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU0L2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1kaWZmZXJlbnQucHJvZHVjdC5pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTUvLmVjbGlwc2VVTQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2YzUyMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU1Ly5lY2xpcHNlVU0KKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWlkPW9yZy5lY2xpcHNlLnBsYXRmb3JtDQotbmFtZT1hIFByb2R1Y3QgDQotdmVyc2lvbj0zLjUuNgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvLmVjbGlwc2VVTSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3ZhbGlkYXRpb24vc2l0ZTYvLmVjbGlwc2VVTQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk3ZjlmOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2Ly5lY2xpcHNlVU0KKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1pZD1vcmcuZWNsaXBzZS5zZGsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24gYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS92YWxpZGF0aW9uL3NpdGU2L2NoaWxkcmVuL2NoaWxkcmVuL2VjbGlwc2UvLmVjbGlwc2VleHRlbnNpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5N2Y5ZjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEvdmFsaWRhdGlvbi9zaXRlNi9jaGlsZHJlbi9jaGlsZHJlbi9lY2xpcHNlLy5lY2xpcHNlZXh0ZW5zaW9uCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaWQ9b3JnLmVjbGlwc2Uuc2RrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxMTgwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZlYXR1cmUgaWQ9Im9yZy50ZXN0MS5pZGVudDEiIGxhYmVsPSJGZWF0dXJlIE9uZSIgbmw9ImVuX3VzLGZyLGRlIiBvcz0iT1NfV0lOMzIsT1NfTElOVVgiIHByb3ZpZGVyLW5hbWU9Ik9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiIHZlcnNpb249IjEuMC4wIiB3cz0iV1NfV0lOMzIsV1NfTU9USUYsV1NfR1RLIj4NCi0gIDxkZXNjcmlwdGlvbj5UZXN0IGZlYXR1cmUgZm9yIHRlc3RJZGVudGlmaWVyIHRlc3Q8L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5Db3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT5EbyB5b3UgYWNjZXB0IHRoZSBsaWNlbnNlID88L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRlaCBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjEiIGluc3RhbGwtc2l6ZT0iMTAwMCIgZnJhZ21lbnQ9ImZhbHNlIiBubD0idXMiIG9zPSJPU19XSU4zMiIgdmVyc2lvbj0iMy41LjYiIHdzPSJXU19XSU4zMiIvPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxMjAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiIgaW5zdGFsbC1zaXplPSI5NzgiIGZyYWdtZW50PSJmYWxzZSIgdmVyc2lvbj0iNS4wLjAiLz4NCi08L2ZlYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9hcGl0ZXN0cy9vcmcuZWNsaXBzZV90ZXN0X2ZlYXR1cmUvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNWNkYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2FwaXRlc3RzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZlYXR1cmUgaWQ9Im9yZy50ZXN0MS5pZGVudDIiIGxhYmVsPSJGZWF0dXJlIE9uZSIgbmw9ImVuX3VzLGZyLGRlIiBvcz0iT1NfV0lOMzIsT1NfTElOVVgiIHByb3ZpZGVyLW5hbWU9Ik9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiIHZlcnNpb249IjEuMC4wIiB3cz0iV1NfV0lOMzIsV1NfTU9USUYsV1NfR1RLIj4NCi0gIDxkZXNjcmlwdGlvbj5UZXN0IGZlYXR1cmUgZm9yIHRlc3RJZGVudGlmaWVyIHRlc3Q8L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5Db3B5cmlnaHQgKGMpIHRoZSBjb21wYW55PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT5EbyB5b3UgYWNjZXB0IHRoZSBsaWNlbnNlID88L2xpY2Vuc2U+DQotICA8dXJsPg0KLSAgICA8dXBkYXRlIGxhYmVsPSJVUkwgdG8gdXBkYXRlIHRlaCBmZWF0dXJlIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDEiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMiIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICA8L3VybD4NCi0gIDxwbHVnaW4gZG93bmxvYWQtc2l6ZT0iMTUwMCIgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldTX1dJTjMyIi8+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjEyMDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiBpbnN0YWxsLXNpemU9Ijk3OCIgZnJhZ21lbnQ9ImZhbHNlIiB2ZXJzaW9uPSI1LjAuMCIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ZWUxMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9mZWF0dXJlXzEuMC4wL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJGZWF0dXJlIE9uZSIgbmw9ImVuLGZyLGRlIiBvcz0iT1NfV0lOMzIsT1NfTElOVVgiIHByb3ZpZGVyLW5hbWU9Ik9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiIHZlcnNpb249IjEuMC40IiB3cz0iV1NfV0lOMzIsV1NfTU9USUYsV1NfR1RLIj4NCi0gIDxkZXNjcmlwdGlvbj5JIGJlbGlldmUgdGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgZmVhdHVyZSAxLCB3ZWxsLCBmZWF0dXJlIDEgaXMgYW4gZXhjZXB0aW9uYWwgZmVhdHVyZSB0aGF0IHlvdSBzaG91bGQgaW5zdGFsbCByaWdodCBOT1cgb24geW91ciBtYWNoaW5lLi4uIHRyeSBpdC48L2Rlc2NyaXB0aW9uPg0KLSAgPGNvcHlyaWdodD5Paywgbm93LCB0aGlzIGlzIGEgdmVyeSB2ZXJ5IGNvbXBsZXggQ29weXJpZ2h0ICBub3QgcHJlcGFyZWQgYnkgYSBsYXd5ZXIgQ29weXJpZ2h0IChjKSB0aGUgY29tcGFueTwvY29weXJpZ2h0Pg0KLSAgPGxpY2Vuc2U+IzEgRG8geW91IGFjY2VwdCBpdCAjMiB5b3UgZG8gbnRvIGFjY2VwdCBpdCAuLi5EbyB5b3UgYWNjcHQgaXQgPzwvbGljZW5zZT4NCi0gIDx1cmw+DQotICAgIDx1cGRhdGUgbGFiZWw9IlVSTCB0byB1cGRhdGUgdGhlIGZlYXR1cmUiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9wYXRoL2ZlYXR1cmUxLyIvPg0KLSAgICA8ZGlzY292ZXJ5IGxhYmVsPSJEaXNjb3ZlcnkgMSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAyIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gIDwvdXJsPg0KLSAgPHBsdWdpbiBkb3dubG9hZC1zaXplPSIxNTAwIiBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMSIgaW5zdGFsbC1zaXplPSIxMDAwIiBmcmFnbWVudD0iZmFsc2UiIG5sPSJ1cyIgb3M9Ik9TX1dJTjMyIiB2ZXJzaW9uPSIzLjUuNiIgd3M9IldTX1dJTjMyIi8+DQotICA8cGx1Z2luIGRvd25sb2FkLXNpemU9IjEyMDAiIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIiBpbnN0YWxsLXNpemU9Ijk3OCIgZnJhZ21lbnQ9ImZhbHNlIiB2ZXJzaW9uPSI1LjAuMCIvPg0KLTwvZmVhdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9mZWF0dXJlXzEuMC4wL2ZlYXR1cmUxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlMzBhMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvZGF0YS94bWxzL2ZlYXR1cmVfMS4wLjAvZmVhdHVyZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9zaXRlMS9zaXRlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9kYXRhL3htbHMvc2l0ZTEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ODIzYzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL2RhdGEveG1scy9zaXRlMS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgdXJsPSJpbmZvIiB0eXBlPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5maWxlIj4NCi0gIDxmZWF0dXJlIGlkPSJvcmcuaXN2LmZlYXR1cmUzIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9mZWF0dXJlMyIgdmVyc2lvbj0iMy40LjUiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvZmVhdHVyZTIiIHZlcnNpb249IjMuNC42Ij4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZhdHVyZTEiIHVybD0id3d3LmVjbGlwc2Uub3JnL2ZlYXR1cmUxIiB2ZXJzaW9uPSIyLjMuNSI+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVpZ24xIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51cGRhdGUuYXJjaGl2ZTIiIHVybD0id3d3LmVjbGlwc2Uub3JnL3BsdWdpbjIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9Im9yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4zIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW4zIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51bmtub3duLnBsdWdpbiIgdXJsPSJ3d3cuZWNsaXBzZS5vcmcvcGx1Z2lucy9wbHVnaW40Ii8+DQotICA8YXJjaGl2ZSBwYXRoPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5mb28xIiB1cmw9Ind3dy5lY2xpcHNlLm9yZy9wbHVnaW4xIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJKMkVFIHRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVKQiBUb29scyIgbmFtZT0iZWNsaXBzZS9KMkVFL0VKQiIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iVU1MIHRvb2xzIiBuYW1lPSJlY2xpcHNlL1VNTCIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iTWVzc2FnaW5nIFRvb2xzIiBuYW1lPSJCMkIiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkVjbGlwc2UgdG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2FhNjY0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotDQotbmFtZSA9IEluc3RhbGwvVXBkYXRlIENvcmUgVGVzdHMNCi1wcm92aWRlci1uYW1lID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRlNzJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+DQotPHBsdWdpbg0KLSAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZSINCi0gICBuYW1lPSIlbmFtZSINCi0gICB2ZXJzaW9uPSIzLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXItbmFtZSINCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZVRlc3RzUGx1Z2luIj4NCi0NCi0gICA8cnVudGltZT4NCi0gICAgICA8bGlicmFyeSBuYW1lPSJ1cGRhdGV0ZXN0cy5qYXIiPg0KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICAgIDwvbGlicmFyeT4NCi0gICA8L3J1bnRpbWU+DQotICAgPHJlcXVpcmVzPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmp1bml0Ii8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnRvbWNhdCIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9ImZlYXR1cmUxIg0KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlVHlwZXMiPg0KLSAgICAgIDxmZWF0dXJlLWZhY3RvcnkNCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5Ij4NCi0gICAgICA8L2ZlYXR1cmUtZmFjdG9yeT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgaWQ9ImZ0cCINCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuc2l0ZVR5cGVzIj4NCi0gICAgICA8c2l0ZS1mYWN0b3J5DQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5pbXBsZW1lbnRhdGlvbi5TaXRlRlRQRmFjdG9yeSI+DQotICAgICAgPC9zaXRlLWZhY3Rvcnk+DQotICAgPC9leHRlbnNpb24+DQotDQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvQWxsVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OTQ1ZjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0czsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGkuQWxsQVBJVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5icmFuZGluZy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnMuQWxsQ29uZmlndXJhdGlvbnNUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUuYm9vdC5BbGxQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWwuQWxsTW9kZWxUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm5lc3RlZGZlYXR1cmVzLkFsbE5lc3RlZFRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucGFyc2VyLkFsbFBhcnNlclRlc3RzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVjb25jaWxpYXRpb24uQWxsUmVjb25jaWxpYXRpb25UZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsLkFsbFJlZ3VsYXJJbnN0YWxsVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFyUmVtb3ZlLkFsbFJlZ3VsYXJSZW1vdmVUZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uLkFsbFNpdGVWYWxpZGF0aW9uVGVzdHM7DQotLy9pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzLkFsbFR5cGVzVGVzdHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy51aXZhbHVlcy5BbGxDb3JlVUlUZXN0czsNCi0NCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0U3VpdGUgew0KLQlwdWJsaWMgQWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQkJc3VpdGUuc2V0TmFtZSgiQWxsIFVwZGF0ZSBNYW5hZ2VyIFRlc3RzIik7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbE1pcnJvclRlc3RzLnN1aXRlKCkpOwkNCi0JCXN1aXRlLmFkZFRlc3QoQWxsU2l0ZVZhbGlkYXRpb25UZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbFJlZ3VsYXJJbnN0YWxsVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbEFQSVRlc3RzLnN1aXRlKCkpOw0KLQkJc3VpdGUuYWRkVGVzdChBbGxQYXJzZXJUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsQ29yZVVJVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbENvbmZpZ3VyYXRpb25zVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbFR5cGVzVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbFJlZ3VsYXJSZW1vdmVUZXN0cy5zdWl0ZSgpKTsNCi0JCXN1aXRlLmFkZFRlc3QoQWxsTmVzdGVkVGVzdHMuc3VpdGUoKSk7CQ0KLQkJc3VpdGUuYWRkVGVzdChBbGxSZWNvbmNpbGlhdGlvblRlc3RzLnN1aXRlKCkpOwkJCQkJDQotCQlzdWl0ZS5hZGRUZXN0KEFsbE1vZGVsVGVzdHMuc3VpdGUoKSk7DQotCQlzdWl0ZS5hZGRUZXN0KEFsbEJyYW5kaW5nVGVzdHMuc3VpdGUoKSk7DQotCQkvL3N1aXRlLmFkZFRlc3QoQWxsU3RhbmRhbG9uZVRlc3RzLnN1aXRlKCkpOw0KLQkJcmV0dXJuIHN1aXRlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZU1hbmFnZXJUZXN0Q2FzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlTWFuYWdlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzc2Y2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlTWFuYWdlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzOw0KLQ0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpbkRlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uSUNvbmZpZ3VyZWRTaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSVBsdWdpbkVudHJ5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7DQotLyoqDQotICogQWxsIEhlbHAgU3lzdGVtIFRlc3QgY2FzZXMgbXVzdCBzdWJjbGFzcyB0aGlzIGJhc2UgVGVzdGNhc2UuDQotICogU2VlIFNhbXBsZVRlc3RDYXNlLmphdmEgZm9yIGEgdGVtcGxhdGUuDQotICovDQotDQotcHVibGljIGFic3RyYWN0IGNsYXNzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlIHsNCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBidW5kbGU7DQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGRhdGFQYXRoOw0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBTT1VSQ0VfRklMRV9TSVRFOw0KLQlwcm90ZWN0ZWQgc3RhdGljIFVSTCBTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRDsNCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgU09VUkNFX0hUVFBfU0lURTsNCi0JcHJvdGVjdGVkIHN0YXRpYyBVUkwgVEFSR0VUX0ZJTEVfU0lURTsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUEFUSCA9ICJkYXRhLyI7DQotDQotCS8qKg0KLQkgKiBEZWZhdWx0IENvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgVXBkYXRlTWFuYWdlclRlc3RDYXNlKFN0cmluZyBuYW1lKSB7DQotCQlzdXBlcihuYW1lKTsNCi0JCXRyeSB7DQotCQkJaW5pdCgpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKGUudG9TdHJpbmcoKSk7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdCgpIHRocm93cyBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQ0KLQkJSVBsdWdpbkRlc2NyaXB0b3IgZGF0YURlc2MgPSBQbGF0Zm9ybS5nZXRQbHVnaW5SZWdpc3RyeSgpLmdldFBsdWdpbkRlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlIik7DQotCQlVUkwgcmVzb2x2ZWRVUkwgPSBQbGF0Zm9ybS5hc0xvY2FsVVJMKFBsYXRmb3JtLnJlc29sdmUoZGF0YURlc2MuZ2V0SW5zdGFsbFVSTCgpKSk7DQotCQlVUkwgZGF0YVVSTCA9IG5ldyBVUkwocmVzb2x2ZWRVUkwsIERBVEFfUEFUSCk7DQotCQlkYXRhUGF0aCA9IGRhdGFVUkwuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIGhvbWVQYXRoID0gKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotDQotCQlpZiAoYnVuZGxlID09IG51bGwpIHsNCi0JCQlDbGFzc0xvYWRlciBsID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IGRhdGFVUkwgfSwgbnVsbCk7DQotCQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJyZXNvdXJjZXMiLCBMb2NhbGUuZ2V0RGVmYXVsdCgpLCBsKTsNCi0JCX0NCi0NCi0JCXRyeSB7DQotCQkJU09VUkNFX0ZJTEVfU0lURSA9IG5ldyBGaWxlKGRhdGFQYXRoKS50b1VSTCgpOw0KLQkJCVNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEID0gbmV3IEZpbGUoZGF0YVBhdGggKyAidGVzdEFQSS8iKS50b1VSTCgpOw0KLQkJCVNPVVJDRV9IVFRQX1NJVEUgPSBuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzEiKSk7DQotCQkJVEFSR0VUX0ZJTEVfU0lURSA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCBob21lUGF0aCArICIvdGFyZ2V0LyIpOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKGUudG9TdHJpbmcoKSk7DQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsNCi0JCX0NCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKGhvbWVQYXRoICsgIi90YXJnZXQvIik7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCS8vIGNsZWFudXAgaW5mbyBhYm91dCBqdXN0IGluc3RhbGxlZCBwbHVnaW5zDQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOw0KLQkJDQotCQkvLyBzZXR1cCBjYWNoZSBzaXRlIHRvIGZhbHNlLiANCi0JCS8vIE5vdGU6IHRoZSBzdGFuZGFsb25lIHRlc3RzIHdpbGwgc2V0IGl0IGJhY2sgdG8gdHJ1ZQ0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5nbG9iYWxVc2VDYWNoZSA9IGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTaW1wbGUgaW1wbGVtZW50YXRpb24gb2Ygc2V0VXAuIFN1YmNsYXNzZXMgYXJlIHByZXZlbnRlZCANCi0JICogZnJvbSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIHRvIG1haW50YWluIGxvZ2dpbmcgY29uc2lzdGVuY3kuDQotCSAqIHVtU2V0VXAoKSBzaG91bGQgYmUgb3ZlcnJpZGVuIGluc3RlYWQuDQotCSAqLw0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLSAiICsgdGhpcy5nZXROYW1lKCkpOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuZ2V0TmFtZSgpICsgIjogc2V0VXAuLi4iKTsNCi0JCXVtU2V0VXAoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uDQotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgYSB0ZXN0IGlzIGV4ZWN1dGVkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgdW1TZXRVcCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJLy8gZG8gbm90aGluZy4NCi0JfQ0KLQ0KLQkvKioNCi0JICogU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRlYXJEb3duLiAgU3ViY2xhc3NlcyBhcmUgcHJldmVudGVkIA0KLQkgKiBmcm9tIG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgdG8gbWFpbnRhaW4gbG9nZ2luZyBjb25zaXN0ZW5jeS4NCi0JICogdW1UZWFyRG93bigpIHNob3VsZCBiZSBvdmVycmlkZW4gaW5zdGVhZC4NCi0JICovDQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXROYW1lKCkgKyAiOiB0ZWFyRG93bi4uLlxuIik7DQotCQl1bVRlYXJEb3duKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4NCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgdGVzdCBpcyBleGVjdXRlZC4NCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHVtVGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCS8vIGRvIG5vdGhpbmcuDQotCX0NCi0NCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0SHR0cEhvc3QoKSB7DQotCQlyZXR1cm4gVXBkYXRlVGVzdHNQbHVnaW4uZ2V0V2ViQXBwU2VydmVySG9zdCgpOw0KLQl9DQotDQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldEh0dHBQb3J0KCkgew0KLQkJcmV0dXJuIFVwZGF0ZVRlc3RzUGx1Z2luLmdldFdlYkFwcFNlcnZlclBvcnQoKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCUlTaXRlIHNpdGUgPSBjb25maWdTaXRlLmdldFNpdGUoKTsNCi0JCXJlbW92ZShmZWF0dXJlLCBzaXRlKTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVNpdGUgc2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlKGZlYXR1cmUpOw0KLQkJLy8gcmVtb3ZlIHRoZSBwbHVnaW5zIGFuZCBmZWF0dXJlcyBkaXINCi0JCVN0cmluZyBzaXRlUGF0aCA9IHNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJRmlsZSBmaWxlID0gbnVsbDsNCi0NCi0JCVN0cmluZyBmZWF0dXJlTmFtZSA9IGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpICsgIl8iICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7DQotCQlmaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsICJmZWF0dXJlcyIgKyBGaWxlLnNlcGFyYXRvciArIGZlYXR1cmVOYW1lKTsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlJlbW92aW5nIDoiICsgZmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotDQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gZmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlTdHJpbmcgbmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpICsgIl8iICsgZW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvcjsNCi0JCQlmaWxlID0gbmV3IEZpbGUoc2l0ZVBhdGgsICJwbHVnaW5zIiArIEZpbGUuc2VwYXJhdG9yICsgbmFtZSk7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqUmVtb3ZpbmcgOiIgKyBmaWxlKTsNCi0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotCQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4oZW50cmllc1tpXSk7DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlVGVzdHNQbHVnaW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL1VwZGF0ZVRlc3RzUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMTZjMTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvVXBkYXRlVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmhlbHAuaW50ZXJuYWwuYXBwc2VydmVyLldlYmFwcE1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7DQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOw0KLQ0KLS8qKg0KLSAqIG1hbmFnZXMgdGhlIHN0YXJ0dW8gYW5kIHNodXRvd24gb2YgdGhlIA0KLSAqIHdlYiBzZXJ2ZXINCi0gKi8NCi1wdWJsaWMgY2xhc3MgVXBkYXRlVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gew0KLQ0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgYXBwU2VydmVySG9zdCA9IG51bGw7DQotCXByaXZhdGUgc3RhdGljIGludCBhcHBTZXJ2ZXJQb3J0ID0gMDsNCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlVGVzdHNQbHVnaW4gcGx1Z2luOw0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7DQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5pdGlhbGl6ZWQ9ZmFsc2U7DQotDQotCXB1YmxpYyBzdGF0aWMgVXBkYXRlVGVzdHNQbHVnaW4gZ2V0UGx1Z2luKCkgew0KLQkJcmV0dXJuIHBsdWdpbjsNCi0JfQ0KLQ0KLQkvKiAobm9uLUphdmFkb2MpDQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlzdXBlci5zdGFydChjb250ZXh0KTsNCi0JCXBsdWdpbiA9IHRoaXM7DQotCQlidW5kbGVDb250ZXh0ID0gY29udGV4dDsNCi0JfQ0KLQkNCi0JLyogKG5vbi1KYXZhZG9jKQ0KLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkNCi0JICovDQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCVdlYmFwcE1hbmFnZXIuc3RvcCgib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUudXBkYXRldGVzdHMiKTsNCi0JCXBsdWdpbiA9IG51bGw7DQotCQlidW5kbGVDb250ZXh0ID0gbnVsbDsNCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIGhvc3QgaWRlbnRpZmllciBmb3IgdGhlIHdlYiBhcHAgc2VydmVyDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRXZWJBcHBTZXJ2ZXJIb3N0KCkgew0KLQkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOw0KLQkJcmV0dXJuIGFwcFNlcnZlckhvc3Q7DQotCX0NCi0NCi0JLyoqDQotCSAqIFJldHVybnMgdGhlIHBvcnQgaWRlbnRpZmllciBmb3IgdGhlIHdlYiBhcHAgc2VydmVyDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRXZWJBcHBTZXJ2ZXJQb3J0KCkgew0KLQkJaWYgKCFpbml0aWFsaXplZCkgaW5pdGlhbGl6ZSgpOwkJDQotCQlyZXR1cm4gYXBwU2VydmVyUG9ydDsNCi0JfQ0KLQkvKioNCi0JICogTWV0aG9kIGluaXRpYWxpemUuDQotCSAqLw0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoKSB7DQotCQlTdHJpbmcgdGV4dCA9IG51bGw7DQotCQl0cnkgew0KLQkJCVdlYmFwcE1hbmFnZXIuc3RhcnQoIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzIiwgIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlIiwgbmV3IFBhdGgoIndlYnNlcnZlciIpKTsNCi0JCQlhcHBTZXJ2ZXJIb3N0ID0gV2ViYXBwTWFuYWdlci5nZXRIb3N0KCk7DQotCQkJYXBwU2VydmVyUG9ydCA9IFdlYmFwcE1hbmFnZXIuZ2V0UG9ydCgpOw0KLQ0KLQkJCXRleHQgPSAiVGhlIHdlYlNlcnZlciBkaWQgc3RhcnQgaXA6IiArIGFwcFNlcnZlckhvc3QgKyAiOiIgKyBhcHBTZXJ2ZXJQb3J0Ow0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJdGV4dCA9ICJUaGUgd2ViU2VydmVyIGRpZG4ndCBzdGFydCAiOw0KLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLCBJU3RhdHVzLk9LLCAiV2ViU2VydmVyIG5vdCBzdGFydGVkLiBVcGRhdGUgVGVzdHMgcmVzdWx0cyBhcmUgaW52YWxpZCIsIG51bGwpOw0KLQkJCVVwZGF0ZUNvcmUud2FybigiIixuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpKTsNCi0JCX1maW5hbGx5IHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGV4dCk7DQotCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9BbGxBUElUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiOTZiMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0FsbEFQSVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi0vKioNCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMNCi0gKi8NCi1wdWJsaWMgY2xhc3MgQWxsQVBJVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBbGxBUElUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQkJc3VwZXIobmFtZSk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiBMaXN0IG9mIEFQSSB0ZXN0cw0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCQlzdWl0ZS5zZXROYW1lKCJBUEkgVGVzdHMiKTsNCi0NCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZUFQSS5jbGFzcykpOw0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RMb2NhbFNpdGVBUEkuY2xhc3MpKTsJCQ0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkuY2xhc3MpKTsJCQ0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuY2xhc3MpKTsNCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJLmNsYXNzKSk7DQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFBsdWdpbkNvbnRhaW5lckFQSS5jbGFzcykpOw0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlTWFuYWdlckFQSS5jbGFzcykpOwkJDQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdE5lc3RlZEZlYXR1cmVBUEkuY2xhc3MpKTsNCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJLmNsYXNzKSk7DQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL0RlZmF1bHRGZWF0dXJlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1NmJiMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvRGVmYXVsdEZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5GZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcjsNCi0vKioNCi0gKiBBYnN0cmFjdCBDbGFzcyB0aGF0IGltcGxlbWVudHMgbW9zdCBvZiB0aGUgYmVoYXZpb3Igb2YgYSBmZWF0dXJlDQotICogQSBmZWF0dXJlIEFMV0FZUyBiZWxvbmdzIHRvIGFuIElTaXRlDQotICovDQotcHVibGljIGNsYXNzIERlZmF1bHRGZWF0dXJlIGV4dGVuZHMgRmVhdHVyZSB7DQotDQotDQotCS8qKg0KLQkgKiBDb3B5IGNvbnN0cnVjdG9yDQotCSAqLw0KLQlwdWJsaWMgRGVmYXVsdEZlYXR1cmUoSUZlYXR1cmUgc291cmNlRmVhdHVyZSwgSVNpdGUgdGFyZ2V0U2l0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdGhpcyh0YXJnZXRTaXRlKTsNCi0JCXRoaXMuc2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcihzb3VyY2VGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSk7DQotCQl0aGlzLnNldElkZW50aWZpZXIoc291cmNlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQkJdGhpcy5zZXRMYWJlbChzb3VyY2VGZWF0dXJlLmdldExhYmVsKCkpOw0KLQkJdGhpcy5zZXRVcGRhdGVTaXRlRW50cnkoc291cmNlRmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKSk7DQotCQl0aGlzLnNldERpc2NvdmVyeVNpdGVFbnRyaWVzKHNvdXJjZUZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKSk7DQotCQl0aGlzLnNldFByb3ZpZGVyKHNvdXJjZUZlYXR1cmUuZ2V0UHJvdmlkZXIoKSk7DQotCQl0aGlzLnNldERlc2NyaXB0aW9uKHNvdXJjZUZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSk7DQotCQl0aGlzLnNldENvcHlyaWdodChzb3VyY2VGZWF0dXJlLmdldENvcHlyaWdodCgpKTsNCi0JCXRoaXMuc2V0TGljZW5zZShzb3VyY2VGZWF0dXJlLmdldExpY2Vuc2UoKSk7DQotCQl0aGlzLnNldFBsdWdpbkVudHJpZXMoc291cmNlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCkpOw0KLQkJdGhpcy5zZXRJbWFnZShzb3VyY2VGZWF0dXJlLmdldEltYWdlKCkpOw0KLQl9DQotCQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBEZWZhdWx0RmVhdHVyZShJU2l0ZSB0YXJnZXRTaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlzdXBlcigpOw0KLQkJdGhpcy5zZXRTaXRlKHRhcmdldFNpdGUpOwkJDQotCX0JDQotCQ0KLQkNCi0JLyoqDQotCSAqIFNldHMgdGhlIGlkZW50aWZpZXINCi0JICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGlkZW50aWZpZXIgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJZGVudGlmaWVyKFZlcnNpb25lZElkZW50aWZpZXIgaWRlbnRpZmllcikgew0KLQkJc2V0RmVhdHVyZUlkZW50aWZpZXIoaWRlbnRpZmllci5nZXRJZGVudGlmaWVyKCkpOw0KLQkJc2V0RmVhdHVyZVZlcnNpb24oaWRlbnRpZmllci5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGRpc2NvdmVyeVNpdGVFbnRyaWVzDQotCSAqIEBwYXJhbSBkaXNjb3ZlcnlJbmZvcyBUaGUgZGlzY292ZXJ5SW5mb3MgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlTaXRlRW50cmllcyhJVVJMRW50cnlbXSBkaXNjb3ZlcnlJbmZvcykgew0KLQkJc2V0RGlzY292ZXJ5U2l0ZUVudHJ5TW9kZWxzKChVUkxFbnRyeU1vZGVsW10pIGRpc2NvdmVyeUluZm9zKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgdXBkYXRlU2l0ZUVudHJ5DQotCSAqIEBwYXJhbSB1cGRhdGVJbmZvIFRoZSB1cGRhdGVJbmZvIHRvIHNldA0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU2l0ZUVudHJ5KElVUkxFbnRyeSB1cGRhdGVJbmZvKSB7DQotCQlzZXRVcGRhdGVTaXRlRW50cnlNb2RlbCgoVVJMRW50cnlNb2RlbCkgdXBkYXRlSW5mbyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgYSBkaXNjb3ZlcnlJbmZvDQotCSAqIEBwYXJhbSBkaXNjb3ZlcnlJbmZvIFRoZSBkaXNjb3ZlcnlJbmZvIHRvIGFkZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkRGlzY292ZXJ5U2l0ZUVudHJ5KElVUkxFbnRyeSBkaXNjb3ZlcnlJbmZvKSB7DQotCQlhZGREaXNjb3ZlcnlTaXRlRW50cnlNb2RlbCgoVVJMRW50cnlNb2RlbCkgZGlzY292ZXJ5SW5mbyk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGRlc2NyaXB0aW9uDQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihJVVJMRW50cnkgZGVzY3JpcHRpb24pIHsNCi0JCXNldERlc2NyaXB0aW9uTW9kZWwoKFVSTEVudHJ5TW9kZWwpIGRlc2NyaXB0aW9uKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgY29weXJpZ2h0DQotCSAqIEBwYXJhbSBjb3B5cmlnaHQgVGhlIGNvcHlyaWdodCB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChJVVJMRW50cnkgY29weXJpZ2h0KSB7DQotCQlzZXRDb3B5cmlnaHRNb2RlbCgoVVJMRW50cnlNb2RlbCkgY29weXJpZ2h0KTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbGljZW5zZQ0KLQkgKiBAcGFyYW0gbGljZW5zZSBUaGUgbGljZW5zZSB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldExpY2Vuc2UoSVVSTEVudHJ5IGxpY2Vuc2UpIHsNCi0JCXNldExpY2Vuc2VNb2RlbCgoVVJMRW50cnlNb2RlbCkgbGljZW5zZSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIGltYWdlDQotCSAqIEBwYXJhbSBpbWFnZSBUaGUgaW1hZ2UgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShVUkwgaW1hZ2UpIHsNCi0JCWlmIChpbWFnZT09bnVsbCkgcmV0dXJuOw0KLQkJc2V0SW1hZ2VVUkxTdHJpbmcoaW1hZ2UudG9FeHRlcm5hbEZvcm0oKSk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEFkZHMgYW4gaW1wb3J0DQotCSAqIEBwYXJhbSBhbkltcG9ydCBUaGUgaW1wb3J0IHRvIGFkZA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkSW1wb3J0KElJbXBvcnQgYW5JbXBvcnQpIHsNCi0JCWlmIChhbkltcG9ydCAhPSBudWxsKSB7DQotCQkJYWRkSW1wb3J0TW9kZWwoKEltcG9ydE1vZGVsKSBhbkltcG9ydCk7DQotCQl9DQotCX0NCi0NCi0NCi0JLyoqDQotCSAqIFNldHMgdGhlIHBsdWdpbkVudHJpZXMNCi0JICogQHBhcmFtIHBsdWdpbkVudHJpZXMgVGhlIHBsdWdpbkVudHJpZXMgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRQbHVnaW5FbnRyaWVzKElQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMpIHsNCi0JCWlmIChwbHVnaW5FbnRyaWVzICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cmllc1tpXSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotDQotCS8qKg0KLQkgKiBzZXRzIHRlaCBVUkwgaXNmIG5vdCBhbHJlYWR5IHByZXNlbnQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbnsNCi0JCS8vaWYgKGdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKT09bnVsbCl7DQotCQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIodXJsKTsNCi0JCQl0aGlzLnNldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoY29udGVudFByb3ZpZGVyKTsNCi0JCQljb250ZW50UHJvdmlkZXIuc2V0RmVhdHVyZSh0aGlzKTsNCi0JCS8vfQ0KLQl9DQotCQ0KLQkNCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgew0KLQkJaWYgKHBsdWdpbkVudHJ5ICE9IG51bGwpIHsNCi0JCQlhZGRQbHVnaW5FbnRyeU1vZGVsKChQbHVnaW5FbnRyeU1vZGVsKSBwbHVnaW5FbnRyeSk7DQotCQl9DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNhZGROb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnkpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGROb25QbHVnaW5FbnRyeShJTm9uUGx1Z2luRW50cnkgZGF0YUVudHJ5KSB7DQotCQlpZiAoZGF0YUVudHJ5ICE9IG51bGwpIHsNCi0JCQlhZGROb25QbHVnaW5FbnRyeU1vZGVsKChOb25QbHVnaW5FbnRyeU1vZGVsKSBkYXRhRW50cnkpOw0KLQkJfQ0KLQl9CQ0KLQ0KLQl9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9NeVVSTEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDRkYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL015VVJMRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5VUkxFbnRyeTsNCi0NCi0vKioNCi0gKiBXcmFwcGVyIGFyb3VuZCBVUkxFbnRyeQ0KLSAqLw0KLXB1YmxpYyBjbGFzcyBNeVVSTEVudHJ5IGV4dGVuZHMgVVJMRW50cnkgew0KLQkNCi0JcHVibGljIE15VVJMRW50cnkoU3RyaW5nIGFubm90YXRpb24sIFVSTCB1cmwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJc3VwZXIoKTsNCi0JCXNldEFubm90YXRpb24oYW5ub3RhdGlvbik7DQotCQlpZiAodXJsIT1udWxsKSB7DQotCQkJc2V0VVJMU3RyaW5nKHVybC50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQlyZXNvbHZlKG51bGwsbnVsbCk7DQotCQl9DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YmNmODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQlwcml2YXRlIERlZmF1bHRGZWF0dXJlIHJlbW90ZUZlYXR1cmU9bnVsbDsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3REZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVBUEkoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQkvKioNCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdA0KLQkgKi8NCi0JcHJpdmF0ZSBEZWZhdWx0RmVhdHVyZSBnZXRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQlpZiAocmVtb3RlRmVhdHVyZSA9PSBudWxsKXsNCi0NCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOw0KLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwidGVzdEFQSS8iK1NpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIKyJmZWF0dXJlMy8iLG51bGwpOw0KLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7DQotCQlyZWYuc2V0U2l0ZShzaXRlKTsNCi0JCXJlZi5zZXRVUkwodXJsKTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoZmVhdHVyZSxzaXRlKTsNCi0NCi0JCX0NCi0JCXJldHVybiByZW1vdGVGZWF0dXJlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgaWQxID0gInhtbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLyI7DQotCQlTdHJpbmcgaWQyID0gInhtbHMvYXBpdGVzdHMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlIjsNCi0JCVZlcnNpb25lZElkZW50aWZpZXIgaWRlbnQxID0gbmV3IFZlcnNpb25lZElkZW50aWZpZXIoIm9yZy50ZXN0MS5pZGVudDEiLCIxLjAuMCIpOw0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDIgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MiIsIjEuMC4wIik7CQkNCi0JCQ0KLQ0KLQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7DQotCQkJDQotCQkJVVJMIHVybDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQxLG51bGwpOwkJCQ0KLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50MSk7DQotCQkJYXNzZXJ0RXF1YWxzKGlkZW50MS50b1N0cmluZygpLHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkgCQ0KLQkJCSBVUkwgdXJsMiA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSxpZDIsbnVsbCk7CQkNCi0JCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOw0KLQkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKHVybDIpOw0KLQkJCXJlbW90ZUZlYXR1cmUuc2V0SWRlbnRpZmllcihpZGVudDIpOw0KLQkJCWFzc2VydEVxdWFscyhpZGVudDIudG9TdHJpbmcoKSxyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCQ0KLQ0KLQl9DQotDQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbnsNCi0JCVN0cmluZyBpZGVudDEgPSBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCsiZmVhdHVyZTMvIjsJCQ0KLQ0KLQkJCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7DQotCQkJDQotCQkJVVJMIGlkID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkZW50MSxudWxsKTsJCQkNCi0JCQlyZW1vdGVGZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOw0KLQkJCXJlbW90ZUZlYXR1cmUuc2V0VVJMKGlkKTsNCi0JCQlhc3NlcnRFcXVhbHMoc2l0ZSxyZW1vdGVGZWF0dXJlLmdldFNpdGUoKSk7DQotDQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdExhYmVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVN0cmluZyBsYWJlbCA9ICJkdW1teSBsYWJlbCI7DQotCQlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldExhYmVsKGxhYmVsKTsNCi0JCWFzc2VydEVxdWFscyhsYWJlbCxmZWF0dXJlLmdldExhYmVsKCkpOw0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVUkwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJVVJMIHVybCA9IG51bGw7DQotCQlTdHJpbmcgbGFiZWwgPSAiT1RJIFNpdGUiOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20vIik7DQotCQkJDQotCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fSAvLyBpbXBvc3NpYmxlIGVoICENCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldFVwZGF0ZVNpdGVFbnRyeShuZXcgTXlVUkxFbnRyeShsYWJlbCwgdXJsKSk7DQotCQlhc3NlcnRFcXVhbHModXJsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0VVJMKCkpOw0KLQkJYXNzZXJ0RXF1YWxzKGxhYmVsLGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5KCkuZ2V0QW5ub3RhdGlvbigpKTsNCi0NCi0JfSANCi0NCi0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REaXNjb3ZlcnlVUkxzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCUlVUkxFbnRyeVtdIHVybEluZm8gPSBuZXcgTXlVUkxFbnRyeVsyXTsNCi0JCVVSTFtdIHVybCA9IG5ldyBVUkxbMl07DQotCQlTdHJpbmdbXSBsYWJlbCA9IG5ldyBTdHJpbmdbMl07DQotCQl0cnkgew0KLQkJCXVybFswXSA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsNCi0JCQl1cmxbMV0gPSBuZXcgVVJMKCJodHRwOi8vZWNsaXBzZS5vcmcvIik7DQotCQkJbGFiZWxbMF0gPSAiT1RJIFNpdGUiOw0KLQkJCWxhYmVsWzFdID0gIkVjbGlwc2UgU2l0ZSI7DQotCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7fSAvLyBpbXBvc3NpYmxlIGVoICENCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmb3IgKGludCBpPTA7aTwyO2krKyl7DQotCQkJCXVybEluZm9baV0gPSBuZXcgTXlVUkxFbnRyeShsYWJlbFtpXSx1cmxbaV0pOw0KLQkJfQ0KLQkJZmVhdHVyZS5zZXREaXNjb3ZlcnlTaXRlRW50cmllcyh1cmxJbmZvKTsNCi0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCkubGVuZ3RoO2krKyl7DQotCQkJYXNzZXJ0RXF1YWxzKHVybEluZm9baV0sZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpW2ldKTsNCi0JCX0NCi0NCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbixNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJU3RyaW5nIHByb3ZpZGVyID0gIm5vdCBzbyBkdW1teSBwcm92aWRlciI7DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJKChGZWF0dXJlKWZlYXR1cmUpLnNldFByb3ZpZGVyKHByb3ZpZGVyKTsNCi0JCWFzc2VydEVxdWFscyhwcm92aWRlcixmZWF0dXJlLmdldFByb3ZpZGVyKCkpOw0KLQl9DQotDQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uLE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgZGVzYyA9ICJwcmV0dHkgbG9uZyBkZXNjcmlwdGlvbiBhcyBhIHN0cmluZyB3aXRoIFxyXG4gYW5kIFx0IGFuZCBcbiI7DQotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsbnVsbCk7DQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsNCi0JCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQl9DQotCQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24xKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7LypwcmV0dHkgaW1wb3NzaWJsZSovfQ0KLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShudWxsLHVybCk7DQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsNCi0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsNCi0JfQkNCi0JDQotDQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCQ0KLSAJIFVSTCB1cmwgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQl1cmwgPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20iKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXsvKnByZXR0eSBpbXBvc3NpYmxlKi99DQotCQlTdHJpbmcgZGVzYyA9ICJwcmV0dHkgbG9uZyBkZXNjcmlwdGlvbiBhcyBhIHN0cmluZyB3aXRoIFxyXG4gYW5kIFx0IGFuZCBcbiI7DQotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsdXJsKTsNCi0JCURlZmF1bHRGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKCk7DQotCQlmZWF0dXJlLnNldERlc2NyaXB0aW9uKGluZm8pOw0KLQkJU3RyaW5nIHJlc3VsdCA9IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCk7DQotCQlhc3NlcnRFcXVhbHMoZGVzYyxyZXN1bHQpOw0KLQkJYXNzZXJ0RXF1YWxzKHVybCxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCkpOw0KLQl9CQ0KLQ0KLQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3REZWZhdWx0UGFja2FnZUZlYXR1cmVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkyNjFiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0RGVmYXVsdFBhY2thZ2VGZWF0dXJlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCXByaXZhdGUJRGVmYXVsdEZlYXR1cmUgcmVtb3RlRmVhdHVyZT1udWxsOw0KLQkNCi0JLyoqDQotCSAqIFRlc3QgdGhlIHRlc3RGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdERlZmF1bHRQYWNrYWdlRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCS8qKg0KLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0DQotCSAqLw0KLQlwcml2YXRlIERlZmF1bHRGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChyZW1vdGVGZWF0dXJlID09IG51bGwpew0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7DQotCQlVUkwgaWQgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUxXzEuMC4wLmphciIsbnVsbCk7CQ0KLQkJcmVtb3RlRmVhdHVyZSA9IG5ldyBEZWZhdWx0RmVhdHVyZShzaXRlKTsNCi0JCXJlbW90ZUZlYXR1cmUuc2V0VVJMKGlkKTsNCi0JCX0NCi0JCXJldHVybiByZW1vdGVGZWF0dXJlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGlmaWVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQkNCi0JCVN0cmluZyBpZDEgPSAiZmVhdHVyZXMvb3JnLmVjbGlwc2UudGVzdC5mZWF0dXJlXzEuMC4wLmphciI7DQotCQlTdHJpbmcgaWQyID0gImZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIiOw0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciBpZGVudDEgPSBuZXcgVmVyc2lvbmVkSWRlbnRpZmllcigib3JnLnRlc3QxLmlkZW50MSIsIjEuMC4wIik7DQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIGlkZW50MiA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJvcmcudGVzdDEuaWRlbnQyIiwiMS4wLjAiKTsJCQ0KLQkJDQotDQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7DQotCQkJDQotCQkJVVJMIHVybDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksaWQxLG51bGwpOwkJCQ0KLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50MSk7DQotCQkJYXNzZXJ0RXF1YWxzKGlkZW50MS50b1N0cmluZygpLHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJDQotCQkJIFVSTCB1cmwyID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkMixudWxsKTsJCQ0KLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwodXJsMik7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRJZGVudGlmaWVyKGlkZW50Mik7CQkJDQotCQkJYXNzZXJ0RXF1YWxzKGlkZW50Mi50b1N0cmluZygpLHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgaWRlbnQxID0gIm9yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiOwkJDQotDQotCQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7DQotCQkJDQotCQkJVVJMIGlkID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLGlkZW50MSxudWxsKTsJCQ0KLQkJCXJlbW90ZUZlYXR1cmUgPSBuZXcgRGVmYXVsdEZlYXR1cmUoc2l0ZSk7DQotCQkJcmVtb3RlRmVhdHVyZS5zZXRVUkwoaWQpOwkNCi0JCQlhc3NlcnRFcXVhbHMoc2l0ZSxyZW1vdGVGZWF0dXJlLmdldFNpdGUoKSk7DQotDQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdExhYmVsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgbGFiZWwgPSAiZHVtbXkgbGFiZWwiOw0KLQkJRmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXRMYWJlbChsYWJlbCk7DQotCQlhc3NlcnRFcXVhbHMobGFiZWwsZmVhdHVyZS5nZXRMYWJlbCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVVJMKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCVN0cmluZyBsYWJlbCA9ICJPVEkgU2l0ZSI7DQotCQl0cnkgew0KLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbS8iKTsNCi0JCQkNCi0JCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKXt9IC8vIGltcG9zc2libGUgZWggIQ0KLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZlYXR1cmUuc2V0VXBkYXRlU2l0ZUVudHJ5KG5ldyBNeVVSTEVudHJ5KGxhYmVsLCB1cmwpKTsNCi0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRVUkwoKSk7DQotCQlhc3NlcnRFcXVhbHMobGFiZWwsZmVhdHVyZS5nZXRVcGRhdGVTaXRlRW50cnkoKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQ0KLQl9IA0KLQ0KLQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERpc2NvdmVyeVVSTHMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCUlVUkxFbnRyeVtdIHVybEluZm8gPSBuZXcgVVJMRW50cnlbMl07DQotCQlVUkxbXSB1cmwgPSBuZXcgVVJMWzJdOw0KLQkJU3RyaW5nW10gbGFiZWwgPSBuZXcgU3RyaW5nWzJdOw0KLQkJdHJ5IHsNCi0JCQl1cmxbMF0gPSBuZXcgVVJMKCJodHRwOi8vd3d3Lm90aS5jb20vIik7DQotCQkJdXJsWzFdID0gbmV3IFVSTCgiaHR0cDovL2VjbGlwc2Uub3JnLyIpOw0KLQkJCWxhYmVsWzBdID0gIk9USSBTaXRlIjsNCi0JCQlsYWJlbFsxXSA9ICJFY2xpcHNlIFNpdGUiOw0KLQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpe30gLy8gaW1wb3NzaWJsZSBlaCAhDQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZm9yIChpbnQgaT0wO2k8MjtpKyspew0KLQkJCQl1cmxJbmZvW2ldID0gbmV3IE15VVJMRW50cnkobGFiZWxbaV0sdXJsW2ldKTsNCi0JCX0NCi0JCWZlYXR1cmUuc2V0RGlzY292ZXJ5U2l0ZUVudHJpZXModXJsSW5mbyk7DQotCQlmb3IgKGludCBpPTA7IGk8ZmVhdHVyZS5nZXREaXNjb3ZlcnlTaXRlRW50cmllcygpLmxlbmd0aDtpKyspew0KLQkJCWFzc2VydEVxdWFscyh1cmxJbmZvW2ldLGZlYXR1cmUuZ2V0RGlzY292ZXJ5U2l0ZUVudHJpZXMoKVtpXSk7DQotCQl9DQotDQotDQotCX0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgcHJvdmlkZXIgPSAibm90IHNvIGR1bW15IHByb3ZpZGVyIjsNCi0JCUZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZlYXR1cmUuc2V0UHJvdmlkZXIocHJvdmlkZXIpOw0KLQkJYXNzZXJ0RXF1YWxzKHByb3ZpZGVyLGZlYXR1cmUuZ2V0UHJvdmlkZXIoKSk7DQotCX0NCi0NCi0NCi0NCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlTdHJpbmcgZGVzYyA9ICJwcmV0dHkgbG9uZyBkZXNjcmlwdGlvbiBhcyBhIHN0cmluZyB3aXRoIFxyXG4gYW5kIFx0IGFuZCBcbiI7DQotCQlJVVJMRW50cnkgaW5mbyA9IG5ldyBNeVVSTEVudHJ5KGRlc2MsbnVsbCk7DQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsNCi0JCWFzc2VydEVxdWFscyhkZXNjLGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQl9DQotCQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRpb24xKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJdXJsID0gbmV3IFVSTCgiaHR0cDovL3d3dy5vdGkuY29tIik7DQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSl7LypwcmV0dHkgaW1wb3NzaWJsZSovfQ0KLQkJSVVSTEVudHJ5IGluZm8gPSBuZXcgTXlVUkxFbnRyeShudWxsLHVybCk7DQotCQlEZWZhdWx0RmVhdHVyZSBmZWF0dXJlID0gZ2V0RmVhdHVyZSgpOw0KLQkJZmVhdHVyZS5zZXREZXNjcmlwdGlvbihpbmZvKTsNCi0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsNCi0JfQkNCi0JDQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbjIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCQ0KLQkJVVJMIHVybCA9IG51bGw7DQotCQl0cnkgew0KLQkJCXVybCA9IG5ldyBVUkwoImh0dHA6Ly93d3cub3RpLmNvbSIpOw0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpey8qcHJldHR5IGltcG9zc2libGUqL30NCi0JCVN0cmluZyBkZXNjID0gInByZXR0eSBsb25nIGRlc2NyaXB0aW9uIGFzIGEgc3RyaW5nIHdpdGggXHJcbiBhbmQgXHQgYW5kIFxuIjsNCi0JCUlVUkxFbnRyeSBpbmZvID0gbmV3IE15VVJMRW50cnkoZGVzYyx1cmwpOw0KLQkJRGVmYXVsdEZlYXR1cmUgZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCWZlYXR1cmUuc2V0RGVzY3JpcHRpb24oaW5mbyk7DQotCQlhc3NlcnRFcXVhbHMoZGVzYyxmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0QW5ub3RhdGlvbigpKTsNCi0JCWFzc2VydEVxdWFscyh1cmwsZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpLmdldFVSTCgpKTsNCi0JfQ0KLQ0KLQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RGZWF0dXJlQ29udGVudFByb3ZpZGVyX0ZpbGVGaWx0ZXJBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1OGYxNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdEZlYXR1cmVDb250ZW50UHJvdmlkZXJfRmlsZUZpbHRlckFQSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLkZlYXR1cmVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBUZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQkKLQkvKioKLQkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0RmVhdHVyZUNvbnRlbnRQcm92aWRlcl9GaWxlRmlsdGVyQVBJKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZUZpbHRlcigpewotCQkKLQkJU3RyaW5nIHAxID0gIi9wMS9wMi9hLioiOwotCQlTdHJpbmcgcDIgPSAicDEvcDIvYi4qIjsKLQkJU3RyaW5nIHAzID0gIi9wMS9wMi9hLnR4dCI7Ci0JCVN0cmluZyBwNCA9ICIvcDEvcDIvKi50eHQiOwotCQkKLQkJU3RyaW5nIG5hbWUxID0gIi9wMS9wMi9hLnR4dCI7Ci0JCVN0cmluZyBuYW1lMiA9ICIvcDEvcDIvYi50eHQiOwotCQlTdHJpbmcgbmFtZTMgPSAiL3AzL3AyL2EudHh0IjsKLQkJU3RyaW5nIG5hbWU0ID0gInAxL3AyL2EudHh0IjsKLQkJU3RyaW5nIG5hbWU1ID0gIi9wMS9wMi9iLnR4dCI7Ci0JCVN0cmluZyBuYW1lNiA9ICIvcDEvcDIvYy50eHQiOwotCQlTdHJpbmcgbmFtZTcgPSAiL3AxL3AyL3AzL2EudHh0IjsKLQkJCi0JCQotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyIGNwID0gbmV3IEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKG51bGwpOwotCQkKLQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlci5GaWxlRmlsdGVyIGZpbHRlcjEgPSBjcC5uZXcgRmlsZUZpbHRlcihwMSk7Ci0JCUZlYXR1cmVDb250ZW50UHJvdmlkZXIuRmlsZUZpbHRlciBmaWx0ZXIyID0gY3AubmV3IEZpbGVGaWx0ZXIocDIpOwotCQlGZWF0dXJlQ29udGVudFByb3ZpZGVyLkZpbGVGaWx0ZXIgZmlsdGVyMyA9IGNwLm5ldyBGaWxlRmlsdGVyKHAzKTsKLQkJRmVhdHVyZUNvbnRlbnRQcm92aWRlci5GaWxlRmlsdGVyIGZpbHRlcjQgPSBjcC5uZXcgRmlsZUZpbHRlcihwNCk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiMS4xIixmaWx0ZXIxLmFjY2VwdChuYW1lMSkpOwkJCi0JCWFzc2VydFRydWUoIjEuMiIsIWZpbHRlcjEuYWNjZXB0KG5hbWUyKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwhZmlsdGVyMS5hY2NlcHQobmFtZTMpKTsJCi0JCWFzc2VydFRydWUoIjEuNCIsIWZpbHRlcjEuYWNjZXB0KG5hbWU0KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMS41IiwhZmlsdGVyMS5hY2NlcHQobmFtZTUpKTsJCQotCQlhc3NlcnRUcnVlKCIxLjYiLCFmaWx0ZXIxLmFjY2VwdChuYW1lNikpOwkJCi0JCWFzc2VydFRydWUoIjEuNyIsIWZpbHRlcjEuYWNjZXB0KG5hbWU3KSk7Ci0JCi0JCWFzc2VydFRydWUoIjIuMSIsIWZpbHRlcjIuYWNjZXB0KG5hbWUxKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMi4yIiwhZmlsdGVyMi5hY2NlcHQobmFtZTIpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjMiLCFmaWx0ZXIyLmFjY2VwdChuYW1lMykpOwkKLQkJYXNzZXJ0VHJ1ZSgiMi40IiwhZmlsdGVyMi5hY2NlcHQobmFtZTQpKTsJCQotCQlhc3NlcnRUcnVlKCIyLjUiLCFmaWx0ZXIyLmFjY2VwdChuYW1lNSkpOwkJCi0JCWFzc2VydFRydWUoIjIuNiIsIWZpbHRlcjIuYWNjZXB0KG5hbWU2KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMi43IiwhZmlsdGVyMi5hY2NlcHQobmFtZTcpKTsKLQotCQlhc3NlcnRUcnVlKCIzLjEiLGZpbHRlcjMuYWNjZXB0KG5hbWUxKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMy4yIiwhZmlsdGVyMy5hY2NlcHQobmFtZTIpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjMiLCFmaWx0ZXIzLmFjY2VwdChuYW1lMykpOwkKLQkJYXNzZXJ0VHJ1ZSgiMy40IiwhZmlsdGVyMy5hY2NlcHQobmFtZTQpKTsJCQotCQlhc3NlcnRUcnVlKCIzLjUiLCFmaWx0ZXIzLmFjY2VwdChuYW1lNSkpOwkJCi0JCWFzc2VydFRydWUoIjMuNiIsIWZpbHRlcjMuYWNjZXB0KG5hbWU2KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiMy43IiwhZmlsdGVyMy5hY2NlcHQobmFtZTcpKTsKLQkJCi0JCWFzc2VydFRydWUoIjQuMSIsZmlsdGVyNC5hY2NlcHQobmFtZTEpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjIiLGZpbHRlcjQuYWNjZXB0KG5hbWUyKSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiNC4zIiwhZmlsdGVyNC5hY2NlcHQobmFtZTMpKTsJCi0JCWFzc2VydFRydWUoIjQuNCIsIWZpbHRlcjQuYWNjZXB0KG5hbWU0KSk7CQkKLQkJYXNzZXJ0VHJ1ZSgiNC41IixmaWx0ZXI0LmFjY2VwdChuYW1lNSkpOwkJCi0JCWFzc2VydFRydWUoIjQuNiIsZmlsdGVyNC5hY2NlcHQobmFtZTYpKTsJCQotCQlhc3NlcnRUcnVlKCI0LjciLCFmaWx0ZXI0LmFjY2VwdChuYW1lNykpOwkJCQkJCQkJCi0JCQkJCQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RMb2NhbFNpdGVBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0TG9jYWxTaXRlQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTMzZTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RMb2NhbFNpdGVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLlNpdGVNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdExvY2FsU2l0ZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RMb2NhbFNpdGVBUEkoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZVBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwic2l0ZVRlc3RMb2NhbFNpdGUvIiksIG51bGwpOw0KLQkJSUFyY2hpdmVSZWZlcmVuY2VbXSBpbmZvID0gc2l0ZS5nZXRBcmNoaXZlcygpOw0KLQkJDQotCQlpZiAoaW5mby5sZW5ndGg8PTApew0KLQkJCWZhaWwoIm5vIHBsdWdpbnMgaW4gc2l0ZTogIitzaXRlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJfQ0KLQkJIA0KLQkJYm9vbGVhbiBmb3VuZDEgPSBmYWxzZTsNCi0JCWJvb2xlYW4gZm91bmQyID0gZmFsc2U7DQotCQlTdHJpbmcgbmFtZTE9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIjsNCi0JCVN0cmluZyBuYW1lMiA9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjEuamFyIjsNCi0JCQ0KLQkJZm9yIChpbnQgaSA9MDsgaTxpbmZvLmxlbmd0aDsgaSsrKXsNCi0JCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUxKSkgZm91bmQxID0gdHJ1ZTsNCi0JCQlpZiAoaW5mb1tpXS5nZXRQYXRoKCkuZXF1YWxzKG5hbWUyKSkgZm91bmQyID0gdHJ1ZTsNCi0JCX0NCi0JCQ0KLQkJaWYgKCFmb3VuZDEgfHwgIWZvdW5kMil7DQotCQkJZmFpbCgiQ2Fubm90IGZpbmQgcGx1Z2luIDogb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMiB2ZXJzaW9uIDUuMC4wIGFuZCA1LjAuMSBvbiB0aGUgc2l0ZSwgYnkgcGFyc2luZyBmaWxlIHN5c3RlbSIpOw0KLQkJfQ0KLQkJDQotDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RCdW5kbGVNYW5pZmVzdFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwic2l0ZVRlc3RMb2NhbFNpdGUvIiksbnVsbCk7DQotCQlJQXJjaGl2ZVJlZmVyZW5jZVtdIGluZm8gPSBzaXRlLmdldEFyY2hpdmVzKCk7DQotCQkNCi0JCWlmIChpbmZvLmxlbmd0aDw9MCl7DQotCQkJZmFpbCgibm8gcGx1Z2lucyBpbiBzaXRlOiAiK3NpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCQl9DQotCQkgDQotCQlib29sZWFuIGZvdW5kMSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBmb3VuZDIgPSBmYWxzZTsNCi0JCWJvb2xlYW4gZm91bmQzID0gZmFsc2U7DQotCQlTdHJpbmcgbmFtZTE9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZU1hbmlmZXN0XzEuMC4xLmphciI7DQotCQlTdHJpbmcgbmFtZTIgPSAicGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5idW5kbGVBbmRQbHVnaW5NYW5pZmVzdHNCVU5ETEVQQVJTRURfMS4wLjMuamFyIjsNCi0JCVN0cmluZyBuYW1lMyA9ICJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmJ1bmRsZUFuZFBsdWdpbk1hbmlmZXN0c18xLjAuMy5qYXIiOw0KLQkJDQotCQlmb3IgKGludCBpID0wOyBpPGluZm8ubGVuZ3RoOyBpKyspew0KLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTEpKSBmb3VuZDEgPSB0cnVlOw0KLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTIpKSBmb3VuZDIgPSB0cnVlOw0KLQkJCWlmIChpbmZvW2ldLmdldFBhdGgoKS5lcXVhbHMobmFtZTMpKSBmb3VuZDMgPSB0cnVlOw0KLQkJfQ0KLQkJDQotCQlpZiAoIWZvdW5kMSB8fCAhZm91bmQyKXsNCi0JCQlmYWlsKCJDYW5ub3QgZmluZCBwbHVnaW4gOiBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yIHZlcnNpb24gNS4wLjAgYW5kIDUuMC4xIG9uIHRoZSBzaXRlLCBieSBwYXJzaW5nIGZpbGUgc3lzdGVtIik7DQotCQl9DQotCQlpZiAoZm91bmQzKXsNCi0JCQlmYWlsKCJQbHVnaW4gbWFuaWZlc3QgcGFyc2VkIGluc3RlYWQgb2YgYnVuZGxlIG1hbmlmZXN0LiIpOw0KLQkJfQ0KLQkJDQotDQotCX0NCi0JDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSwgbnVsbCk7DQotCQkNCi0JCUlDYXRlZ29yeSBjYXRlZ29yeSA9IG5ldyBDYXRlZ29yeSgiY2F0ZWdvcnkiLCJMYWJlbCBvZiBjYXRlZ29yeSIpOw0KLQkJDQotCQkoKFNpdGVNb2RlbClzaXRlKS5hZGRDYXRlZ29yeU1vZGVsKChDYXRlZ29yeU1vZGVsKWNhdGVnb3J5KTsNCi0JCQ0KLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHNpdGUuZ2V0Q2F0ZWdvcmllcygpOw0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7DQotCQkJSUNhdGVnb3J5IGVsZW1lbnQgPSBjYXRlZ29yaWVzW2luZGV4XTsNCi0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJjYXRlZ29yeSIpKSBmb3VuZCA9IHRydWU7DQotCQl9DQotCQlpZiAoIWZvdW5kKSBmYWlsKCJjYW5ub3QgZmluZCBjYXRlZ29yeSAnY2F0ZWdvcnknIGluIHNpdGUiKTsNCi0NCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKHNpdGUpOw0KLQkJcmVmLmFkZENhdGVnb3J5KGNhdGVnb3J5KTsJCQ0KLQkJY2F0ZWdvcmllcyA9IHJlZi5nZXRDYXRlZ29yaWVzKCk7DQotCQlmb3VuZCA9IGZhbHNlOw0KLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7DQotCQkJSUNhdGVnb3J5IGVsZW1lbnQgPSBjYXRlZ29yaWVzW2luZGV4XTsNCi0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKCJjYXRlZ29yeSIpKSBmb3VuZCA9IHRydWU7DQotCQl9DQotCQlpZiAoIWZvdW5kKSBmYWlsKCJjYW5ub3QgZmluZCBjYXRlZ29yeSAnY2F0ZWdvcnknIGluIGZlYXR1cmUiKTsNCi0JCQ0KLQkJCX0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3ROZXN0ZWRGZWF0dXJlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY3YzVhNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdE5lc3RlZEZlYXR1cmVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TmVzdGVkRmVhdHVyZUFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSB0ZXN0RmVhdHVyZXMoKQotCSAqLwotCXB1YmxpYyBUZXN0TmVzdGVkRmVhdHVyZUFQSShTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0Ci0JICovCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRSb290RmVhdHVyZSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKSxudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7Ci0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IG5ldyBTaXRlRmVhdHVyZVJlZmVyZW5jZSgpOwotCQlyZWYuc2V0U2l0ZShzaXRlKTsKLQkJcmVmLnNldFVSTCh1cmwpOwotCQlyZWYuc2V0VHlwZShJU2l0ZS5ERUZBVUxUX1BBQ0tBR0VEX0ZFQVRVUkVfVFlQRSk7Ci0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJcmV0dXJuIGZlYXR1cmU7Ci0JfQotCi0JLyoqCi0JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotCSAqLwotCXByaXZhdGUgSUZlYXR1cmUgZ2V0Q2hpbGRGZWF0dXJlKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0LyIpLCBudWxsKTsKLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUlGZWF0dXJlIHJvb3RGZWF0dXJlID0gZ2V0Um9vdEZlYXR1cmUoKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZSgpOwotCQlhc3NlcnRFcXVhbHMoIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsIGNoaWxkRmVhdHVyZSwgcmVmWzBdLmdldEZlYXR1cmUobnVsbCkpOwotCX0KLQotCS8qKgotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlMigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIiksbnVsbCk7Ci0JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgInJvb3RmZWF0dXJlLmphciIsIG51bGwpOwotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsKLQkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0JCXJlZi5zZXRVUkwodXJsKTsKLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOwotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCXJldHVybiBmZWF0dXJlOwotCX0KLQotCS8qKgotCSAqIHRoZSBmZWF0dXJlIHRvIHRlc3QKLQkgKi8KLQlwcml2YXRlIElGZWF0dXJlIGdldENoaWxkRmVhdHVyZTIoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3QyL3NpdGUueG1sIiksbnVsbCk7Ci0JCVVSTCB1cmwgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHNpdGUuZ2V0VVJMKCksIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgImNoaWxkcmVuZmVhdHVyZS5qYXIiLCBudWxsKTsKLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0JCXJlZi5zZXRTaXRlKHNpdGUpOwotCQlyZWYuc2V0VVJMKHVybCk7Ci0JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOwotCQlyZXR1cm4gZmVhdHVyZTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJSUZlYXR1cmUgcm9vdEZlYXR1cmUgPSBnZXRSb290RmVhdHVyZTIoKTsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9IGdldENoaWxkRmVhdHVyZTIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJDaGlsZHJlbiBmZWF0dXJlIGFyZSBub3QgZXF1YWwiLCBjaGlsZEZlYXR1cmUsIHJlZlswXS5nZXRGZWF0dXJlKG51bGwpKTsKLQl9Ci0KLS8vCS8qKgotLy8JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotLy8JICovCi0vLwlwcml2YXRlIElGZWF0dXJlIGdldFJvb3RGZWF0dXJlMygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotLy8JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgIm5lc3RlZEZlYXR1cmVTaXRlVGVzdDMvc2l0ZS54bWwiKSwgbnVsbCk7Ci0vLwkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEggKyAicm9vdGZlYXR1cmUuamFyIiwgbnVsbCk7Ci0vLwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0vLwkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0vLwkJcmVmLnNldFVSTCh1cmwpOwotLy8JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLS8vCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0vLwkJcmV0dXJuIGZlYXR1cmU7Ci0vLwl9Ci0KLS8vCS8qKgotLy8JICogdGhlIGZlYXR1cmUgdG8gdGVzdAotLy8JICovCi0vLwlwcml2YXRlIElGZWF0dXJlIGdldENoaWxkRmVhdHVyZTMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLS8vCi0vLwkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0My9zaXRlLnhtbCIpKTsKLS8vCQlVUkwgdXJsID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChzaXRlLmdldFVSTCgpLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArICJjaGlsZHJlbmZlYXR1cmUuamFyIiwgbnVsbCk7Ci0vLwkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7Ci0vLwkJcmVmLnNldFNpdGUoc2l0ZSk7Ci0vLwkJcmVmLnNldFVSTCh1cmwpOwotLy8JCXJlZi5zZXRUeXBlKElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFKTsKLS8vCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0vLwkJcmV0dXJuIGZlYXR1cmU7Ci0vLwl9Ci0KLQkvKgotCSAqIAotCSAqLwotCS8qCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCQlJRmVhdHVyZSByb290RmVhdHVyZSA9IGdldFJvb3RGZWF0dXJlMygpOwotCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSByb290RmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPSBnZXRDaGlsZEZlYXR1cmUzKCk7Ci0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIkNoaWxkcmVuIGZlYXR1cmUgYXJlIG5vdCBlcXVhbCIsCi0JCQkJY2hpbGRGZWF0dXJlLAotCQkJCXJlZlswXS5nZXRGZWF0dXJlKCkpOwotCQl9Ci0JKi8KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0UGx1Z2luQ29udGFpbmVyQVBJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTc3OTEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RQbHVnaW5Db250YWluZXJBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclV0aWxzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0UGx1Z2luQ29udGFpbmVyQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JcHJpdmF0ZSBTaXRlIHNpdGU7DQotCXByaXZhdGUgRGVmYXVsdEZlYXR1cmUgZmVhdHVyZTsNCi0NCi0JLyoqDQotCSAqIHRoZSBTaXRlIHRvIHRlc3QNCi0JICovDQotCXByaXZhdGUgU2l0ZSBnZXRTaXRlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7DQotCQlpZiAoc2l0ZSA9PSBudWxsKSB7DQotDQotCQkJc2l0ZSA9IChTaXRlKVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCJ0ZXN0QVBJLyIpLCBudWxsKTsNCi0NCi0JCX0NCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qKg0KLQkgKiB0aGUgZmVhdHVyZSB0byB0ZXN0DQotCSAqLw0KLQlwcml2YXRlIERlZmF1bHRGZWF0dXJlIGdldEZlYXR1cmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCWlmIChmZWF0dXJlID09IG51bGwpIHsNCi0JCQlJU2l0ZSBzaXRlID0gZ2V0U2l0ZSgpOw0KLQkJCVVSTCBpZCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTFfMS4wLjAuamFyIixudWxsKTsJCQkJCQkNCi0JCQlmZWF0dXJlID0gbmV3IERlZmF1bHRGZWF0dXJlKHNpdGUpOw0KLQkJCWZlYXR1cmUuc2V0VVJMKGlkKTsJDQotCQl9DQotCQlyZXR1cm4gZmVhdHVyZTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RQbHVnaW5Db250YWluZXJBUEkoU3RyaW5nIGFyZzApIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEZlYXR1cmUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsNCi0JCVBsdWdpbkVudHJ5IHBsdWdpbkVudHJ5ID0gbmV3IFBsdWdpbkVudHJ5KCk7DQotCQlwbHVnaW5FbnRyeS5zZXRWZXJzaW9uZWRJZGVudGlmaWVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKCJpZCIsICI2IikpOw0KLQkJRmVhdHVyZSBfZmVhdHVyZSA9IGdldEZlYXR1cmUoKTsNCi0JCSgoRGVmYXVsdEZlYXR1cmUpX2ZlYXR1cmUpLmFkZFBsdWdpbkVudHJ5KHBsdWdpbkVudHJ5KTsNCi0JCWFzc2VydEVxdWFscyhfZmVhdHVyZS5nZXRQbHVnaW5FbnRyeUNvdW50KCksIDEpOw0KLQkJYXNzZXJ0RXF1YWxzKF9mZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKVswXSwgcGx1Z2luRW50cnkpOw0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0YWN0U2l0ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQkJUGx1Z2luRW50cnkgcGx1Z2luRW50cnkgPSBuZXcgUGx1Z2luRW50cnkoKTsNCi0JCXBsdWdpbkVudHJ5LnNldFZlcnNpb25lZElkZW50aWZpZXIobmV3IFZlcnNpb25lZElkZW50aWZpZXIoImlkIiwgIjYiKSk7DQotCQlTaXRlIF9zaXRlID0gZ2V0U2l0ZSgpOw0KLQkJX3NpdGUuYWRkUGx1Z2luRW50cnkocGx1Z2luRW50cnkpOw0KLQkJYXNzZXJ0RXF1YWxzKF9zaXRlLmdldFBsdWdpbkVudHJ5Q291bnQoKSwgMSk7DQotCQlhc3NlcnRFcXVhbHMoX3NpdGUuZ2V0UGx1Z2luRW50cmllcygpWzBdLCBwbHVnaW5FbnRyeSk7DQotDQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYXBpL1Rlc3RTaXRlQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyYTQyOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5hcGk7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RTaXRlQVBJIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdFNpdGVBUEkoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLCBudWxsKTsNCi0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShzaXRlLmdldFVSTCgpLmdldEZpbGUoKSksbmV3IEZpbGUoU09VUkNFX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsNCi0JCQ0KLQkJSVNpdGUgc2l0ZTIgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsIG51bGwpOw0KLQkJYXNzZXJ0RXF1YWxzKHNpdGUyLmdldFVSTCgpLG5ldyBVUkwoImh0dHAiLCBnZXRIdHRwSG9zdCgpLGdldEh0dHBQb3J0KCksIGJ1bmRsZS5nZXRTdHJpbmcoIkhUVFBfUEFUSF8xIikrInNpdGUueG1sIikpOw0KLQ0KLQl9DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZU1hbmFnZXJBUEkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0U2l0ZU1hbmFnZXJBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMyNjZhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFNpdGVNYW5hZ2VyQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYXBpOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RTaXRlTWFuYWdlckFQSSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RTaXRlTWFuYWdlckFQSShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlJU2l0ZSBmaWxlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCVN0cmluZyBzaXRlID0gZmlsZVNpdGUuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKTsJCQ0KLQkJYXNzZXJ0RXF1YWxzKFRBUkdFVF9GSUxFX1NJVEUudG9FeHRlcm5hbEZvcm0oKSwgc2l0ZSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RVbmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQlVUkwgdXJsID0gbmV3IFVSTCgiZnRwOi8vMjU1LjI1NS4yNTUuMjU1LyIpOw0KLQkJdHJ5IHsNCi0JCVNpdGVNYW5hZ2VyLmdldFNpdGUodXJsLG51bGwpOw0KLQkJZmFpbCgiQ29ubmVjdGVkIHRvIGZ0cDovLzI1NS4yNTUuMjU1LjI1NS8sIHNob3VsZCBub3QgaGFwcGVuIik7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KLQkJCS8vIGV4cGVjdGVkDQotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSl7DQotCQkJLy8gZXhwZWN0ZWQgYXMgdGhlIHZlcnNpb24gb2YgdGhlIFdlYkRhdiBIVFRQIENvbm5lY3Rpb24gcmV0dXJucyBzbw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYWxTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gaW5zdFNpdGVzID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJYXNzZXJ0VHJ1ZShpbnN0U2l0ZXMubGVuZ3RoPjApOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2NhbCBTaXRlOiIraW5zdFNpdGVzWzBdLmdldFNpdGUoKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURV9JTlNUQUxMRUQsbnVsbCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7DQotCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpKTsJCQ0KLQkJaW5zdFNpdGVzWzBdLmdldFNpdGUoKS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsbnVsbCxudWxsKTsNCi0JCQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWFzc2VydFRydWUoZmVhdHVyZXMubGVuZ3RoPjApOw0KLQ0KLQkJLy9jbGVhbnVwDQotCQlhc3NlcnROb3ROdWxsKHJlbW90ZUZlYXR1cmUpOwkJDQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShpbnN0U2l0ZXNbMF0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKStGaWxlLnNlcGFyYXRvcitTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCtyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotCQlmaWxlID0gbmV3IEZpbGUoaW5zdFNpdGVzWzBdLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkrRmlsZS5zZXBhcmF0b3IrU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIKyJvcmcuZWNsaXBzZS51cGRhdGUucGx1Z2luMV8xLjEuMSIpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotDQotCX0NCi0JDQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9hcGkvVGVzdFVwZGF0ZU1hbmFnZXJVdGlsc0FQSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODI0ODhlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2FwaS9UZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmFwaTsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RVcGRhdGVNYW5hZ2VyVXRpbHNBUEkgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkNCi0JLyoqDQotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkNCi0JICovDQotCXB1YmxpYyBUZXN0VXBkYXRlTWFuYWdlclV0aWxzQVBJKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdGdldFVSTCgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJVVJMIHVybDEgPSBuZXcgVVJMKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIik7DQotCQlVUkwgdXJsMiA9IG5ldyBVUkwoImZpbGU6Ly9jOi9oZWxsbyIpOw0KLQkJVVJMIHVybDMgPSBuZXcgVVJMKCJmaWxlOi9ob21lL2VjbGlwc2UvIik7DQotCQlVUkwgdXJsNCA9IG5ldyBVUkwoImZ0cDovaG9zdDo4MDgwL3BhdGgvIik7DQotCQlVUkwgdXJsNSA9IG5ldyBVUkwoImphcjpmaWxlOi90bXAvMTAwMTAwIS8iKTsNCi0JCQ0KLQkJU3RyaW5nIGRlZmF1bHQxID0gImRlZmF1bHQxL2RlZmF1bHQiOw0KLQkJU3RyaW5nIGRlZmF1bHQyID0gIi9kZWZhdWx0Mi8iOw0KLQkJDQotCQlTdHJpbmcgc3RyMSA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCVN0cmluZyBzdHIyID0gInJlbGF0aXZlMS9wYXRoLyI7DQotCQlTdHJpbmcgc3RyMyA9ICIvcmVsYXRpdmUyL3BhdGgiOw0KLQkJDQotCQlTdHJpbmcgcmVzdWx0MT1udWxsOw0KLQkJU3RyaW5nIHJlc3VsdDI9bnVsbDsNCi0JCQ0KLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotCQkvLyAxLjANCi0JCXJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDEsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDEuMQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjEuMSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMS4yDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiMS4yIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAxLjMNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3JlbGF0aXZlMS9wYXRoLyI7DQotCQlhc3NlcnRFcXVhbHMoIjEuMyIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMS40DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9yZWxhdGl2ZTIvcGF0aCI7DQotCQlhc3NlcnRFcXVhbHMoIjEuNCIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMS41DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMSxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kZWZhdWx0MS9kZWZhdWx0IjsNCi0JCWFzc2VydEVxdWFscygiMS41IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAxLjYNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwxLG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2RlZmF1bHQyLyI7DQotCQlhc3NlcnRFcXVhbHMoIjEuNiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotCQkvLyAyLjANCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiMi4wIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAyLjENCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDIuMg0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDIsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjIuMiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMi4zDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L3JlbGF0aXZlMS9wYXRoLyI7DQotCQlhc3NlcnRFcXVhbHMoIjIuMyIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMi40DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L3JlbGF0aXZlMi9wYXRoIjsNCi0JCWFzc2VydEVxdWFscygiMi40IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAyLjUNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwyLG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi8vYzovZGVmYXVsdDEvZGVmYXVsdCI7DQotCQlhc3NlcnRFcXVhbHMoIjIuNSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMi42DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMixudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZmlsZTovL2M6L2RlZmF1bHQyLyI7DQotCQlhc3NlcnRFcXVhbHMoIjIuNiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQ0KLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotCQkvLyAzLjANCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiMy4wIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAzLjENCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDMuMg0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDMsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjMuMiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMy4zDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZmlsZTovaG9tZS9lY2xpcHNlL3JlbGF0aXZlMS9wYXRoLyI7DQotCQlhc3NlcnRFcXVhbHMoIjMuMyIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMy40DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZmlsZTovaG9tZS9lY2xpcHNlL3JlbGF0aXZlMi9wYXRoIjsNCi0JCWFzc2VydEVxdWFscygiMy40IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyAzLjUNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmwzLG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmaWxlOi9ob21lL2VjbGlwc2UvZGVmYXVsdDEvZGVmYXVsdCI7DQotCQlhc3NlcnRFcXVhbHMoIjMuNSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gMy42DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsMyxudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZmlsZTovaG9tZS9lY2xpcHNlL2RlZmF1bHQyLyI7DQotCQlhc3NlcnRFcXVhbHMoIjMuNiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQkJDQotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0JCS8vIDQuMA0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDQsc3RyMSxkZWZhdWx0MSkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCI0LjAiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDQuMQ0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKG51bGwsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjQuMSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNC4yDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIxLG51bGwpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiNC4yIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA0LjMNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LHN0cjIsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmdHA6L2hvc3Q6ODA4MC9wYXRoL3JlbGF0aXZlMS9wYXRoLyI7DQotCQlhc3NlcnRFcXVhbHMoIjQuMyIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNC40DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9yZWxhdGl2ZTIvcGF0aCI7DQotCQlhc3NlcnRFcXVhbHMoIjQuNCIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNC41DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNCxudWxsLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiZnRwOi9ob3N0OjgwODAvcGF0aC9kZWZhdWx0MS9kZWZhdWx0IjsNCi0JCWFzc2VydEVxdWFscygiNC41IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA0LjYNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw0LG51bGwsZGVmYXVsdDIpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJmdHA6L2hvc3Q6ODA4MC9wYXRoL2RlZmF1bHQyLyI7DQotCQlhc3NlcnRFcXVhbHMoIjQuNiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotCQkvLyA1LjANCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LHN0cjEsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJodHRwOi8vZGV2LmVjbGlwc2Uub3JnIjsNCi0JCWFzc2VydEVxdWFscygiNS4wIixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA1LjENCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTChudWxsLHN0cjEsbnVsbCkudG9FeHRlcm5hbEZvcm0oKTsNCi0JCSByZXN1bHQyID0gImh0dHA6Ly9kZXYuZWNsaXBzZS5vcmciOw0KLQkJYXNzZXJ0RXF1YWxzKCI1LjEiLHJlc3VsdDIscmVzdWx0MSk7DQotCQkNCi0JCS8vIDUuMg0KLQkJIHJlc3VsdDEgPSBVcGRhdGVNYW5hZ2VyVXRpbHMuZ2V0VVJMKHVybDUsc3RyMSxudWxsKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiaHR0cDovL2Rldi5lY2xpcHNlLm9yZyI7DQotCQlhc3NlcnRFcXVhbHMoIjUuMiIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNS4zDQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIyLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiamFyOmZpbGU6L3RtcC8xMDAxMDAhL3JlbGF0aXZlMS9wYXRoLyI7DQotCQlhc3NlcnRFcXVhbHMoIjUuMyIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNS40DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxzdHIzLGRlZmF1bHQxKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiamFyOmZpbGU6L3RtcC8xMDAxMDAhL3JlbGF0aXZlMi9wYXRoIjsNCi0JCWFzc2VydEVxdWFscygiNS40IixyZXN1bHQyLHJlc3VsdDEpOw0KLQkJDQotCQkvLyA1LjUNCi0JCSByZXN1bHQxID0gVXBkYXRlTWFuYWdlclV0aWxzLmdldFVSTCh1cmw1LG51bGwsZGVmYXVsdDEpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCQkgcmVzdWx0MiA9ICJqYXI6ZmlsZTovdG1wLzEwMDEwMCEvZGVmYXVsdDEvZGVmYXVsdCI7DQotCQlhc3NlcnRFcXVhbHMoIjUuNSIscmVzdWx0MixyZXN1bHQxKTsNCi0JCQ0KLQkJLy8gNS42DQotCQkgcmVzdWx0MSA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwodXJsNSxudWxsLGRlZmF1bHQyKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJIHJlc3VsdDIgPSAiamFyOmZpbGU6L3RtcC8xMDAxMDAhL2RlZmF1bHQyLyI7DQotCQlhc3NlcnRFcXVhbHMoIjUuNiIscmVzdWx0MixyZXN1bHQxKTsJCQkJDQotDQotCX0NCi0JDQotCQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9BbGxCcmFuZGluZ1Rlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9BbGxCcmFuZGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWYxMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvQWxsQnJhbmRpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLS8qKgotICogTWFuYWdlcyB0aGUgQVBJIHRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxCcmFuZGluZ1Rlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBbGxCcmFuZGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBMaXN0IG9mIEFQSSB0ZXN0cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLnNldE5hbWUoIkJyYW5kaW5nIFRlc3RzIik7Ci0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKEJ1bmRsZVByb3ZpZGVyVGVzdC5jbGFzcykpOwkKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFByb2R1Y3RUZXN0LmNsYXNzKSk7CQotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9icmFuZGluZy9CdW5kbGVQcm92aWRlclRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTc1ZDM5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL0J1bmRsZVByb3ZpZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuYnJhbmRpbmc7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb25maWd1cmF0b3IuYnJhbmRpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQnVuZGxlUHJvdmlkZXJUZXN0IGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCXB1YmxpYyBCdW5kbGVQcm92aWRlclRlc3QoU3RyaW5nIHRlc3RjYXNlKXsKLQkJc3VwZXIodGVzdGNhc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQnVuZGxlR3JvdXBQcm92aWRlcltdIGJ1bmRsZUdyb3VwUHJvdmlkZXJzID0gUGxhdGZvcm0uZ2V0QnVuZGxlR3JvdXBQcm92aWRlcnMoKTsKLQkJZm9yIChpbnQgaT0wOyBpPGJ1bmRsZUdyb3VwUHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkJ1bmRsZUdyb3VwUHJvdmlkZXI6IitidW5kbGVHcm91cFByb3ZpZGVyc1tpXS5nZXROYW1lKCkpOwotCQkJSUJ1bmRsZUdyb3VwW10gYnVuZGxlR3JvdXBzID0gYnVuZGxlR3JvdXBQcm92aWRlcnNbaV0uZ2V0QnVuZGxlR3JvdXBzKCk7Ci0JCQlmb3IgKGludCBqPTA7IGo8YnVuZGxlR3JvdXBzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJCdW5kbGVHcm91cCBuYW1lOiIrYnVuZGxlR3JvdXBzW2pdLmdldE5hbWUoKSArIlxuIiArCi0JCQkJCQkiZGVzY3JpcHRpb246IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXREZXNjcmlwdGlvbigpICsgIlxuIisKLQkJCQkJCSJpZDoiICsgYnVuZGxlR3JvdXBzW2pdLmdldElkZW50aWZpZXIoKSArICJcbiIgKwotCQkJCQkJInByb3ZpZGVyOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvdmlkZXJOYW1lKCkgKyAiXG4iICsKLQkJCQkJCSJ2ZXJzaW9uOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0VmVyc2lvbigpICsgIlxuIiArCi0JCQkJCQkibGljZW5zZToiICsgYnVuZGxlR3JvdXBzW2pdLmdldFByb3BlcnR5KElCdW5kbGVHcm91cENvbnN0YW50cy5MSUNFTlNFX0hSRUYpICsgIlxuIiArCi0JCQkJCQkiZmVhdHVyZUltYWdlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLkZFQVRVUkVfSU1BR0UpICsgIlxuIiArCi0JCQkJCQkidGlwcyBhbmQgdHJpY2tzOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLlRJUFNfQU5EX1RSSUNLU19IUkVGKSArICJcbiIgKwotCQkJCQkJIndlbGNvbWVQYWdlOiIgKyBidW5kbGVHcm91cHNbal0uZ2V0UHJvcGVydHkoSUJ1bmRsZUdyb3VwQ29uc3RhbnRzLldFTENPTUVfUEFHRSkgKyAiXG4iICsKLQkJCQkJCSJ3ZWxjb21lUGVyc3BlY3RpdmU6IiArIGJ1bmRsZUdyb3Vwc1tqXS5nZXRQcm9wZXJ0eShJQnVuZGxlR3JvdXBDb25zdGFudHMuV0VMQ09NRV9QRVJTUEVDVElWRSkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVuZGxlczoiKTsKLQkJCQlCdW5kbGVbXSBidW5kbGVzID0gYnVuZGxlR3JvdXBzW2pdLmdldEJ1bmRsZXMoKTsKLQkJCQlmb3IgKGludCBiPTA7IGI8YnVuZGxlcy5sZW5ndGg7IGIrKykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGJ1bmRsZXNbYl0uZ2V0U3ltYm9saWNOYW1lKCkpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2JyYW5kaW5nL1Byb2R1Y3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGJlNzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvYnJhbmRpbmcvUHJvZHVjdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmJyYW5kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvbmZpZ3VyYXRvci5icmFuZGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy4qOwotCi1wdWJsaWMgY2xhc3MgUHJvZHVjdFRlc3QgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JcHVibGljIFByb2R1Y3RUZXN0KFN0cmluZyB0ZXN0Y2FzZSl7Ci0JCXN1cGVyKHRlc3RjYXNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFpbigpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLQkJaWYgKHByb2R1Y3QgPT0gbnVsbCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gcHJvZHVjdCBkZWZpbmVkIik7Ci0JCWVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvZHVjdCBpczogXG4iICsKLQkJCQkJIm5hbWU9IiArIHByb2R1Y3QuZ2V0TmFtZSgpICsgIlxuIiArCi0JCQkJCSJhcHBsaWNhdGlvbj0iICsgcHJvZHVjdC5nZXRBcHBsaWNhdGlvbigpICsgIlxuIiArCi0JCQkJCSJkZXNjcmlwdGlvbj0iICsgcHJvZHVjdC5nZXREZXNjcmlwdGlvbigpICsgIlxuIiArCi0JCQkJCSJpZD0iKyBwcm9kdWN0LmdldElkKCkgKyAiXG4iICsKLQkJCQkJImFib3V0X3RleHQ6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkFCT1VUX1RFWFQpICsiXG4iICsKLQkJCQkJImFib3V0X2ltYWdlOiIrcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5BQk9VVF9JTUFHRSkgKyJcbiIgKwotCQkJCQkiYXBwX25hbWU6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLkFQUF9OQU1FKSArIlxuIiArCi0JCQkJCSJ3aW5kb3dfaW1hZ2U6Iitwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldJTkRPV19JTUFHRSkgKyJcbiIgKwotCQkJCQkid2luZG93X2ltYWdlczoiK3Byb2R1Y3QuZ2V0UHJvcGVydHkoSVByb2R1Y3RDb25zdGFudHMuV0lORE9XX0lNQUdFUykgKTsKLQkJCQkKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9BbGxDb25maWd1cmF0aW9uc1Rlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9BbGxDb25maWd1cmF0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNmZiZGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvQWxsQ29uZmlndXJhdGlvbnNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQWxsQ29uZmlndXJhdGlvbnNUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotcHVibGljIEFsbENvbmZpZ3VyYXRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0Jc3VwZXIobmFtZSk7DQotfQ0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQlzdWl0ZS5zZXROYW1lKCJSZWd1bGFyIEluc3RhbGwgVGVzdHMiKTsNCi0JDQotLy8Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZXZlcnQuY2xhc3MpKTsNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RCYWNrd2FyZC5jbGFzcykpOw0KLQkJDQotCXJldHVybiBzdWl0ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RCYWNrd2FyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNzBmZjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29uZmlndXJhdGlvbnMvVGVzdEJhY2t3YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29uZmlndXJhdGlvbnM7DQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEJhY2t3YXJkIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdEJhY2t3YXJkKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUJhY2t3YXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBjbGVhbnVwDQotCQlTaXRlTG9jYWwgc2l0ZUxvY2FsID0gKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpOw0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQ0KLQ0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZiA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsNCi0JCQ0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG9sZEluc3RhbGxDb25maWcgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQlJQ29uZmlndXJlZFNpdGUgb2xkQ29uZmlnU2l0ZSA9IG9sZEluc3RhbGxDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQkNCi0JCSgoQ29uZmlndXJlZFNpdGUpb2xkQ29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwkNCi0JCWFzc2VydE5vdE51bGwoIlJlZmVyZW5jZSBpcyBudWxsIixmZWF0dXJlUmVmKTsNCi0JCXJlbW92ZShmZWF0dXJlUmVmLmdldEZlYXR1cmUobnVsbCksb2xkQ29uZmlnU2l0ZSk7CQ0KLQkJb2xkQ29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShudWxsKSxudWxsLG51bGwpOw0KLQkJc2l0ZS5zYXZlKCk7DQotCQ0KLQkJDQotCQkvLyBBY3Rpdml0eSAtPiBJbnN0YWxsQ29uZmlnDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudCA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0vLwkJSUFjdGl2aXR5IGFjdGl2aXR5ID0gY3VycmVudC5nZXRBY3Rpdml0aWVzKClbMF07CQ0KLS8vCQlhc3NlcnRUcnVlKGFjdGl2aXR5LmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuZXF1YWxzKGN1cnJlbnQpKTsNCi0JCQ0KLQkJLy8gQ29uZmlnU2l0ZS0+SW5zdGFsbENvbmZpZw0KLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld0NvbmZpZ1NpdGUgPSBjdXJyZW50LmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJYXNzZXJ0VHJ1ZShuZXdDb25maWdTaXRlLmdldEluc3RhbGxDb25maWd1cmF0aW9uKCkuZXF1YWxzKGN1cnJlbnQpKTsNCi0JCQ0KLQkJLy8gY2xlYW51cA0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCQ0KLQl9DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvbmZpZ3VyYXRpb25zL1Rlc3RSZXZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhNTQzZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb25maWd1cmF0aW9ucy9UZXN0UmV2ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvbmZpZ3VyYXRpb25zOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuQ29uZmlndXJhdGlvblBvbGljeU1vZGVsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwubW9kZWwuQ29uZmlndXJlZFNpdGVNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFJldmVydCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RSZXZlcnQoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmV2ZXJ0SW5zdGFsbCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy8gY2xlYW51cA0KLQkJU2l0ZUxvY2FsIHNpdGVMb2NhbCA9ICgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKTsNCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJDQotDQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZjIgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMV07DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZVJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJDQotCQkvLyBvbGQgY29uZmlnLCBubyBmZWF0dXJlcyBpbnN0YWxsZWQNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBvbGQgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQlDb25maWd1cmF0aW9uUG9saWN5IGV4Y2x1ZGVwb2xpY3kgPSBuZXcgQ29uZmlndXJhdGlvblBvbGljeSgpOw0KLQkJZXhjbHVkZXBvbGljeS5zZXRQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUpOw0KLQkJSUNvbmZpZ3VyZWRTaXRlIG9sZENvbmZpZ1NpdGUgPSBvbGQuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlleGNsdWRlcG9saWN5LnNldENvbmZpZ3VyZWRTaXRlTW9kZWwoKENvbmZpZ3VyZWRTaXRlTW9kZWwpb2xkQ29uZmlnU2l0ZSk7CQkNCi0JCSgoQ29uZmlndXJlZFNpdGVNb2RlbClvbGRDb25maWdTaXRlKS5zZXRDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbClleGNsdWRlcG9saWN5KTsNCi0JCQ0KLQkJLy8gaW5zdGFsbCBvbmUgZmVhdHVyZQ0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlpZiAoIWNvbmZpZ1NpdGUuZ2V0U2l0ZSgpLmVxdWFscyhvbGRDb25maWdTaXRlLmdldFNpdGUoKSkpIGZhaWwoIkNvbmZpZyBzaXRlcyBhcmUgbm90IGVxdWFscyIpOw0KLQkJc2l0ZS5hZGRDb25maWd1cmF0aW9uKG5ld0NvbmZpZyk7CQ0KLQkJDQotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsJCQkNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGxlZEZlYXR1cmUgPSBjb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOw0KLQkJc2l0ZS5zYXZlKCk7DQotDQotCQkvLyB1bmNvbmZpZ3VyZSBpdA0KLQkJY29uZmlnU2l0ZS51bmNvbmZpZ3VyZShpbnN0YWxsZWRGZWF0dXJlLmdldEZlYXR1cmUobnVsbCkpOw0KLQ0KLQkJLy8gaW5zdGFsbCBhbm90aGVyIGZlYXR1cmUNCi0JCUlGZWF0dXJlIGZlYXR1cmUyID0gZmVhdHVyZVJlZjIuZ2V0RmVhdHVyZShudWxsKTsNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcyID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCQlJQ29uZmlndXJlZFNpdGUgYW5vdGhlckNvbmZpZ1NpdGUgPSBuZXdDb25maWcyLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJaWYgKCFhbm90aGVyQ29uZmlnU2l0ZS5nZXRTaXRlKCkuZXF1YWxzKG9sZENvbmZpZ1NpdGUuZ2V0U2l0ZSgpKSkgZmFpbCgiQ29uZmlnIHNpdGVzIGFyZSBub3QgZXF1YWxzIik7CQkNCi0JCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcyKTsJCQ0KLQkJYW5vdGhlckNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlMixudWxsLG51bGwpOw0KLQkJc2l0ZS5zYXZlKCk7DQotDQotCQkvLyByZXZlcnQgdG8gb2xkIHN0YXRlIHdoZXJlIG5vIGZlYXR1cmUgd2hlcmUgY29uZmlndXJlZA0KLQkJc2l0ZS5yZXZlcnRUbyhvbGQsbnVsbCxudWxsKTsNCi0JCXNpdGUuc2F2ZSgpOw0KLQkJDQotCQkvLyBjaGVjaw0KLQkJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOw0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7DQotCQkNCi0JCQ0KLQkJLy9maW5kIGNvbmZpZ3VyZWQgc2l0ZQ0KLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld0NvbmZpZ1NpdGUgPSBudWxsOw0KLQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKHNpdGVzW2ldLmdldFNpdGUoKS5lcXVhbHMob2xkQ29uZmlnU2l0ZS5nZXRTaXRlKCkpKXsNCi0JCQkJIG5ld0NvbmZpZ1NpdGUgPSBzaXRlc1tpXTsNCi0JCQkJIGJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JCWlmIChuZXdDb25maWdTaXRlPT1udWxsKSBmYWlsKCJDYW5ub3QgZmluZCBjb25maWd1cmF0aW9uIHNpdGUiKTsNCi0NCi0JCWludCBvbGROdW1iZXIgPSBvbGRDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsNCi0JCWludCBuZXdOdW1iZXIgPSBuZXdDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aDsNCi0JCQ0KLQkJLy8NCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gY29uZmlnRmVhdHVyZXMgPSBuZXdDb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdGZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihjb25maWdGZWF0dXJlc1tpXSk7DQotCQl9CQkNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIG9sZDoiK29sZE51bWJlcisiIG5ldzoiK25ld051bWJlcixvbGROdW1iZXI9PW5ld051bWJlcik7DQotCQkNCi0JCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUNCi0JCWludCBuZXdOdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcyA9ICgoQ29uZmlndXJlZFNpdGUpbmV3Q29uZmlnU2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoOw0KLQkJaW50IG9sZE51bWJlclVuY29uZmlndXJlZEZlYXR1cmVzID0gKChDb25maWd1cmVkU2l0ZSlvbGRDb25maWdTaXRlKS5nZXRDb25maWd1cmF0aW9uUG9saWN5KCkuZ2V0VW5jb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg7CQkNCi0JCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsb2xkTnVtYmVyVW5jb25maWd1cmVkRmVhdHVyZXMrMixuZXdOdW1iZXJVbmNvbmZpZ3VyZWRGZWF0dXJlcyk7DQotCQkNCi0JCS8vIGNsZWFudXANCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKHNpdGVMb2NhbC5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ow0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkNCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQkJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQ0KLQkJdGltZSA9ICIiK25ld0NvbmZpZy5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7DQotCQlmaWxlID0gbmV3IEZpbGUobmV3IFVSTCgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKSwiRGVmYXVsdENvbmZpZyIrdGltZSsiLnhtbCIpLmdldEZpbGUoKSk7CQ0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkNCi0JCXRpbWUgPSAiIituZXdDb25maWcyLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsNCi0JCWZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLCJEZWZhdWx0Q29uZmlnIit0aW1lKyIueG1sIikuZ2V0RmlsZSgpKTsJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQ0KLQl9DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9BbGxQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L0FsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMWZlZjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L0FsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290Ow0KLQ0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsNCi0NCi1wdWJsaWMgY2xhc3MgQWxsUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdHMNCi0JZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSB7DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3Rvcg0KLQkgKi8NCi0JcHVibGljIEFsbFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7DQotCQlzdXBlcihuYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIExpc3Qgb2YgQVBJIHRlc3RzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0JCXN1aXRlLnNldE5hbWUoIlBsYXRmb3JtQ29uZmlndXJhdGlvbiBUZXN0cyIpOw0KLQ0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RQbGF0Q2ZnQVBJLmNsYXNzKSk7DQotDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1BsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmYTAxZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmJvb3Q7DQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7DQotDQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZSB7DQotCQ0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRlbXBEaXI7DQotCQ0KLQlwdWJsaWMgUGxhdGZvcm1Db25maWd1cmF0aW9uVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLQkJdHJ5IHsNCi0JCQlpbml0KCk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoZS50b1N0cmluZygpKTsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgew0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHsNCi0JCS8vIGdldCBuZXcgdGVtcCBkaXJlY3RvcnkgZm9yIHRlc3RjYXNlDQotCQlTdHJpbmcgcm9vdCA9IGdldFRlbXBEaXJlY3RvcnlOYW1lKCk7DQotCQlzZXR1cERpcmVjdG9yeShyb290KTsNCi0JCXRlbXBEaXIgPSByb290Ow0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHsNCi0JCS8vIGNsZWFudXAgdGVzdGNhc2UgdGVtcCBkaXJlY3RvcnkNCi0JCWlmICh0ZW1wRGlyICE9IG51bGwpDQotCQkJY2xlYW51cERpcmVjdG9yeSh0ZW1wRGlyKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUZW1wRGlyZWN0b3J5TmFtZSgpIHsNCi0JCVN0cmluZyB0bXAgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7DQotCQlpZiAoIXRtcC5lbmRzV2l0aChGaWxlLnNlcGFyYXRvcikpDQotCQkJdG1wICs9IEZpbGUuc2VwYXJhdG9yOw0KLQkJcmV0dXJuIHRtcCsiZWNsaXBzZSIrRmlsZS5zZXBhcmF0b3IrKG5ldyBEYXRlKCkuZ2V0VGltZSgpK0ZpbGUuc2VwYXJhdG9yKTsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBEaXJlY3RvcnkoU3RyaW5nIG5hbWUpIHsNCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUobmFtZSk7DQotCQlkaXIubWtkaXJzKCk7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBEaXJlY3RvcnkoU3RyaW5nIG5hbWUpIHsNCi0JCUZpbGUgZGlyID0gbmV3IEZpbGUobmFtZSk7DQotCQlkZWxldGVEaXJlY3RvcnkoZGlyKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcikgew0KLQkJRmlsZVtdIGxpc3QgPSBkaXIubGlzdEZpbGVzKCk7DQotCQlpZiAobGlzdCA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCQkNCi0JCWZvciAoaW50IGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGxpc3RbaV0uaXNEaXJlY3RvcnkoKSkgDQotCQkJCWRlbGV0ZURpcmVjdG9yeShsaXN0W2ldKTsNCi0JCQlpZiAoIWxpc3RbaV0uZGVsZXRlKCkpDQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5hYmxlIHRvIGRlbGV0ZSAiK2xpc3RbaV0udG9TdHJpbmcoKSk7DQotCQl9DQotCX0NCi19DQotDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvY29yZS9ib290L1Rlc3RQbGF0Q2ZnQVBJLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvVGVzdFBsYXRDZmdBUEkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUxNjQwNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvVGVzdFBsYXRDZmdBUEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290Ow0KLQ0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uKjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdFBsYXRDZmdBUEkgZXh0ZW5kcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25UZXN0Q2FzZSB7DQotCQkJDQotCXB1YmxpYyBUZXN0UGxhdENmZ0FQSShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24gew0KLQkJDQotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QNCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IG51bGw7DQotCQl0cnkgew0KLQkJCWNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24obnVsbCk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJQXNzZXJ0LmZhaWwoIjAuMC4wICIrZS50b1N0cmluZygpKTsNCi0JCX0NCi0JCUlTaXRlRW50cnlbXSBkZmx0ID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjAuMC4xIixkZmx0Lmxlbmd0aCwwKTsNCi0JCQ0KLQkJLy8gcG9saWN5IHRlc3RzDQotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG51bGwpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4wLjAiLHAxLmdldFR5cGUoKSxJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4wLjEiLHAxLmdldExpc3QoKS5sZW5ndGgsMCk7DQotCQlwMS5zZXRMaXN0KG5ldyBTdHJpbmdbXSB7ImZpcnN0In0pOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4wLjIiLHAxLmdldExpc3QoKS5sZW5ndGgsMSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjAuMyIscDEuZ2V0TGlzdCgpWzBdLCJmaXJzdCIpOw0KLQkJDQotCQlJU2l0ZVBvbGljeSBwMiA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUsIG5ldyBTdHJpbmdbMF0pOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjAiLHAyLmdldFR5cGUoKSxJU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjEiLHAyLmdldExpc3QoKS5sZW5ndGgsMCk7DQotCQlwMi5zZXRMaXN0KG5ldyBTdHJpbmdbXSB7ImZpcnN0IiwgInNlY29uZCJ9KTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjEuMS4yIixwMi5nZXRMaXN0KCkubGVuZ3RoLDIpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMS4xLjMiLHAyLmdldExpc3QoKVsxXSwic2Vjb25kIik7DQotCQkNCi0JCS8vIGNyZWF0ZSBzb21lIHVybHMNCi0JCVVSTCB1MSA9IG51bGw7DQotCQlVUkwgdTIgPSBudWxsOw0KLQ0KLQkJVVJMIHU0ID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJdTEgPSBuZXcgVVJMKCJmaWxlOi9kOi90ZW1wIik7DQotLy8JCQl1MiA9IG5ldyBVUkwoImZpbGU6Ly9sb2NhbGhvc3QvdGVtcCIpOw0KLQkJCW5ldyBVUkwoImh0dHA6Ly9zb21lLnNlcnZlci90ZW1wLyIpOw0KLQkJCXU0ID0gbmV3IFVSTCgiaHR0cDovL2JhZC51cmwiKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJQXNzZXJ0LmZhaWwoIjIuMC4wIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7DQotCQl9DQotCQkJCQ0KLQkJLy8gc2l0ZSBjcmVhdGlvbiB0ZXN0cw0KLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUxLHAyKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4wIixzMS5nZXRVUkwoKSx1MSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMSIsczEuZ2V0U2l0ZVBvbGljeSgpLHAyKTsNCi0JCXMxLnNldFNpdGVQb2xpY3kocDEpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4wLjIiLHMxLmdldFNpdGVQb2xpY3koKSxwMSk7DQotCQkNCi0vLwkJSVNpdGVFbnRyeSBzMiA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUyLHAxKTsNCi0vLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjAiLHMyLmdldFVSTCgpLHUyKTsNCi0vLwkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjEiLHMyLmdldFNpdGVQb2xpY3koKSxwMSk7DQotLy8JCXMyLnNldFNpdGVQb2xpY3kocDIpOw0KLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMiIsczIuZ2V0U2l0ZVBvbGljeSgpLHAyKTsNCi0JCQ0KLQkJLy8gY29uZmlndXJlIHNpdGUgdGVzdHMNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4wIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwwKTsNCi0JCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMSIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMSk7DQotLy8JCWNmaWcuY29uZmlndXJlU2l0ZShzMik7DQotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4yIixjZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aCwyKTsNCi0vLwkJDQotCQkvLyBsb29rdXAgc2l0ZSB0ZXN0cw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy40LjAiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUxKSxzMSk7DQotLy8JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuNC4xIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1MiksczIpOw0KLQkJQXNzZXJ0LmFzc2VydE51bGwoIjMuNC4zIixjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1NCkpOw0KLQkJDQotCQkvLyB1bmNvbmZpZ3VyZSBzaXRlIHRlc3RzDQotCQljZmlnLnVuY29uZmlndXJlU2l0ZShzMSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjUuMCIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMCk7DQotCQlBc3NlcnQuYXNzZXJ0TnVsbCgiMy41LjEiLGNmaWcuZmluZENvbmZpZ3VyZWRTaXRlKHUxKSk7CQkNCi0vLwkJY2ZpZy51bmNvbmZpZ3VyZVNpdGUoczIpOw0KLS8vCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjUuMiIsY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGgsMCk7DQotLy8JCUFzc2VydC5hc3NlcnROdWxsKCIzLjUuMyIsY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodTIpKTsJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RTYXZlUmVzdG9yZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQkJCQkNCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCIwLjAgVW5hYmxlIHRvIG9idGFpbiB0ZW1wIGRpcmVjdG9yeSIsdGVtcERpcik7DQotCQkNCi0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdA0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihudWxsKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlBc3NlcnQuZmFpbCgiMC4wLjAgIitlLnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQkJSVNpdGVFbnRyeVtdIHNpdGVzID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjAuMC4xIixzaXRlcy5sZW5ndGgsMCk7DQotCQkJCQ0KLQkJLy8gY3JlYXRlIHBvbGljaWVzDQotCQlJU2l0ZVBvbGljeSBwMSA9IGNmaWcuY3JlYXRlU2l0ZVBvbGljeShJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREUsIG51bGwpOw0KLQkJSVNpdGVQb2xpY3kgcDIgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFLCBuZXcgU3RyaW5nWzBdKTsJCQ0KLQkJSVNpdGVQb2xpY3kgcDMgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFLCBuZXcgU3RyaW5nW10geyJmaXJzdCJ9KTsNCi0JCUlTaXRlUG9saWN5IHA0ID0gY2ZpZy5jcmVhdGVTaXRlUG9saWN5KElTaXRlUG9saWN5LlVTRVJfRVhDTFVERSwgbmV3IFN0cmluZ1tdIHsiZmlyc3QiLCAic2Vjb25kIn0pOw0KLQkJCQkJCQ0KLQkJLy8gY3JlYXRlIHNvbWUgdXJscw0KLQkJVVJMIHUxID0gbnVsbDsNCi0JCVVSTCB1MiA9IG51bGw7DQotCQlVUkwgdTMgPSBudWxsOw0KLQkJVVJMIHU0ID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJdTEgPSBuZXcgVVJMKCJmaWxlOmQ6L3RlbXAvIik7DQotCQkJdTIgPSBuZXcgVVJMKCJmaWxlOi8vbG9jYWxob3N0L3RlbXAvIik7DQotCQkJdTMgPSBuZXcgVVJMKCJodHRwOi8vc29tZS5zZXJ2ZXIvdGVtcC8iKTsNCi0JCQl1NCA9IG5ldyBVUkwoImh0dHA6Ly9hbm90aGVyLnNlcnZlci90ZW1wLyIpOw0KLQkJCW5ldyBVUkwoImh0dHA6Ly9vbmUubW9yZS5zZXJ2ZXIvdGVtcC8iKTsNCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQkJQXNzZXJ0LmZhaWwoIjEuMCB1bmFibGUgdG8gY3JlYXRlIFVSTCAiK2UpOw0KLQkJfQ0KLQkJDQotCQkvLyBjcmVhdGUgYW5kIGNvbmZpZ3VyZSBzaXRlcw0KLQkJSVNpdGVFbnRyeSBzMSA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHUxLHAxKTsNCi0JCWNmaWcuY29uZmlndXJlU2l0ZShzMSk7DQotCQlJU2l0ZUVudHJ5IHMyID0gY2ZpZy5jcmVhdGVTaXRlRW50cnkodTIscDIpOw0KLQkJY2ZpZy5jb25maWd1cmVTaXRlKHMyKTsNCi0JCUlTaXRlRW50cnkgczMgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1MyxwMyk7DQotCQljZmlnLmNvbmZpZ3VyZVNpdGUoczMpOw0KLQkJSVNpdGVFbnRyeSBzNCA9IGNmaWcuY3JlYXRlU2l0ZUVudHJ5KHU0LHA0KTsNCi0JCWNmaWcuY29uZmlndXJlU2l0ZShzNCk7DQotCQlzaXRlcyA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxLjEiLHNpdGVzLmxlbmd0aCw0KTsNCi0JCQ0KLQkJLy8gZG8gc2F2ZQ0KLQkJdHJ5IHsNCi0JCQljZmlnLnNhdmUoKTsNCi0JCQlBc3NlcnQuZmFpbCgiMi4wIHdhcyBleHBlY3RpbmcgSU9FeGNlcHRpb24iKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCQ0KLQkJVVJMIGNmaWdVUkwgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQljZmlnVVJMID0gbmV3IFVSTCgiZmlsZToiK3RlbXBEaXIrICJwbGF0Zm9ybS54bWwiKTsNCi0JCX0gY2F0Y2goTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQlBc3NlcnQuZmFpbCgiMi4xIHVuYWJsZSB0byBjcmVhdGUgVVJMICIrZSk7DQotCQl9DQotCQkNCi0JCXRyeSB7DQotCQkJY2ZpZy5zYXZlKGNmaWdVUkwpOw0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLQkJCUFzc2VydC5mYWlsKCIyLjIgIitlKTsNCi0JCX0NCi0JCQ0KLQkJLy8gcmVsb2FkIGNvbmZpZ3VyYXRpb24JDQotCQl0cnkgew0KLQkJCUNvbmZpZ3VyYXRvclV0aWxzLmdldFBsYXRmb3JtQ29uZmlndXJhdGlvbihjZmlnVVJMKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQlBc3NlcnQuZmFpbCgiMi4zICIrZS50b1N0cmluZygpKTsNCi0JCX0NCi0JCUlTaXRlRW50cnlbXSBuZXdTaXRlcyA9IGNmaWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyLjQiLG5ld1NpdGVzLmxlbmd0aCw0KTsNCi0JCQ0KLQkJLy8gY2hlY2sgd2hhdCB3ZSd2ZSBnb3QNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4xIixzaXRlc1swXS5nZXRVUkwoKSxuZXdTaXRlc1swXS5nZXRVUkwoKSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjAuMiIsc2l0ZXNbMF0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1swXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMC4zIixzaXRlc1swXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzBdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOw0KLQkJDQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMSIsc2l0ZXNbMV0uZ2V0VVJMKCksbmV3U2l0ZXNbMV0uZ2V0VVJMKCkpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4xLjIiLHNpdGVzWzFdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCksbmV3U2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjEuMyIsc2l0ZXNbMV0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSxuZXdTaXRlc1sxXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpKTsNCi0JCQ0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjEiLHNpdGVzWzJdLmdldFVSTCgpLG5ld1NpdGVzWzJdLmdldFVSTCgpKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMi4yIixzaXRlc1syXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpLG5ld1NpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRUeXBlKCkpOw0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiMy4yLjMiLHNpdGVzWzJdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCksbmV3U2l0ZXNbMl0uZ2V0U2l0ZVBvbGljeSgpLmdldExpc3QoKSk7DQotCQkNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4xIixzaXRlc1szXS5nZXRVUkwoKSxuZXdTaXRlc1szXS5nZXRVUkwoKSk7DQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzLjMuMiIsc2l0ZXNbM10uZ2V0U2l0ZVBvbGljeSgpLmdldFR5cGUoKSxuZXdTaXRlc1szXS5nZXRTaXRlUG9saWN5KCkuZ2V0VHlwZSgpKTsNCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIjMuMy4zIixzaXRlc1szXS5nZXRTaXRlUG9saWN5KCkuZ2V0TGlzdCgpLG5ld1NpdGVzWzNdLmdldFNpdGVQb2xpY3koKS5nZXRMaXN0KCkpOw0KLQkJDQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRlc3RDdXJyZW50Q29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gew0KLQkJCQkNCi0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCIwLjAgVW5hYmxlIHRvIG9idGFpbiB0ZW1wIGRpcmVjdG9yeSIsdGVtcERpcik7DQotCQkNCi0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdA0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gbnVsbDsNCi0JCWNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7DQotCQljZmlnLmdldFBsdWdpblBhdGgoKTsNCi0JCWNmaWcuc2F2ZSgpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0RlZmF1bHQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2NvcmUvYm9vdC9UZXN0UGxhdENmZ0RlZmF1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMGIwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9jb3JlL2Jvb3QvVGVzdFBsYXRDZmdEZWZhdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5ib290Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotDQotDQotcHVibGljIGNsYXNzIFRlc3RQbGF0Q2ZnRGVmYXVsdA0KLQlleHRlbmRzIFBsYXRmb3JtQ29uZmlndXJhdGlvblRlc3RDYXNlIHsNCi0JCQ0KLQlwdWJsaWMgVGVzdFBsYXRDZmdEZWZhdWx0KFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IG51bGw7DQotCQljZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOw0KLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZUVudHJ5IHNlID0gY2ZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kgc3AgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3koSVBsYXRmb3JtQ29uZmlndXJhdGlvbi5JU2l0ZVBvbGljeS5VU0VSX0VYQ0xVREUsIG5ldyBTdHJpbmdbXSB7IjEiLCAiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIifSk7DQotCQlzZS5zZXRTaXRlUG9saWN5KHNwKTsNCi0JCWNmaWcuc2F2ZSgpOw0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJkb25lIC4uLiIpOw0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFAuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL2ltcGxlbWVudGF0aW9uL1NpdGVGVFAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1OWIyMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uOw0KLQ0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlUmVmZXJlbmNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JUGx1Z2luRW50cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklVUkxFbnRyeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuSW5zdGFsbEFib3J0ZWRFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotDQotcHVibGljIGNsYXNzIFNpdGVGVFAgaW1wbGVtZW50cyBJU2l0ZSB7DQotDQotCXByaXZhdGUgVVJMIHVybDsNCi0JcHVibGljIFNpdGVGVFAoVVJMIHVybCl7DQotCQl0aGlzLnVybCA9IHVybDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRGZWF0dXJlUmVmZXJlbmNlcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjaW5zdGFsbChJRmVhdHVyZSwgRmVhdHVyZVZlcmlmaWNhdGlvbiB2ZXJpZmllcixJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoSUZlYXR1cmUgZmVhdHVyZSxJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNyZW1vdmUoSUZlYXR1cmUsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUZlYXR1cmUgZmVhdHVyZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNhZGRTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNyZW1vdmVTaXRlQ2hhbmdlZExpc3RlbmVyKElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZVNpdGVDaGFuZ2VkTGlzdGVuZXIoSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRVUkwoKQ0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0VHlwZSgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7DQotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5mdHAiOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0Q2F0ZWdvcmllcygpDQotCSAqLw0KLQlwdWJsaWMgSUNhdGVnb3J5W10gZ2V0Q2F0ZWdvcmllcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0QXJjaGl2ZXMoKQ0KLQkgKi8NCi0JcHVibGljIElBcmNoaXZlUmVmZXJlbmNlW10gZ2V0QXJjaGl2ZXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLSANCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNhZGRDYXRlZ29yeShJQ2F0ZWdvcnkpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRDYXRlZ29yeShJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI3NhdmUoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cmllcygpDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyeUNvdW50KCkNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlKQ0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplRm9yKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0SW5zdGFsbFNpemVGb3IoSUZlYXR1cmUpDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZUZvcihJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQlyZXR1cm4gMDsNCi0JfQ0KLQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjc3RvcmUoSVBsdWdpbkVudHJ5LCBTdHJpbmcsIElucHV0U3RyZWFtKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc3RvcmUoSVBsdWdpbkVudHJ5IGVudHJ5LCBTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykNCi0JICovDQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI3NldFNpdGVDb250ZW50Q29uc3VtZXIoSVNpdGVDb250ZW50Q29uc3VtZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlQ29udGVudENvbnN1bWVyKElTaXRlQ29udGVudENvbnN1bWVyIGNvbnRlbnRDb25zdW1lcikgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjc2V0U2l0ZUNvbnRlbnRQcm92aWRlcihJU2l0ZUNvbnRlbnRQcm92aWRlcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFNpdGVDb250ZW50UHJvdmlkZXIoSVNpdGVDb250ZW50UHJvdmlkZXIgc2l0ZUNvbnRlbnRQcm92aWRlcikgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVDb250ZW50UHJvdmlkZXIgZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RGVmYXVsdFBhY2thZ2VkRmVhdHVyZVR5cGUoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZWRGZWF0dXJlVHlwZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjc3RvcmUoSUZlYXR1cmUsIFN0cmluZywgSW5wdXRTdHJlYW0sIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShJRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQl9DQotDQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNyZW1vdmUoSVBsdWdpbkVudHJ5LCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVtb3ZlKElQbHVnaW5FbnRyeSBlbnRyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZSNnZXRDYXRlZ29yeShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgSUNhdGVnb3J5IGdldENhdGVnb3J5KFN0cmluZyBrZXkpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjY3JlYXRlU2l0ZUNvbnRlbnRDb25zdW1lcihJRmVhdHVyZSkNCi0JICovDQotCXB1YmxpYyBJU2l0ZUNvbnRlbnRDb25zdW1lciBjcmVhdGVTaXRlQ29udGVudENvbnN1bWVyKElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVNpdGUjZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSkNCi0JICovDQotCXB1YmxpYyBJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZVJlZmVyZW5jZShJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldERlc2NyaXB0aW9uKCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0RGVzY3JpcHRpb24oKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlKQ0KLQkgKi8NCi0JcHVibGljIElQbHVnaW5FbnRyeVtdIGdldFBsdWdpbkVudHJpZXNPbmx5UmVmZXJlbmNlZEJ5KElGZWF0dXJlIGZlYXR1cmUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElTaXRlI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklTaXRlI2luc3RhbGwoSUZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10sIElWZXJpZmljYXRpb25MaXN0ZW5lciwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyBJRmVhdHVyZVJlZmVyZW5jZSBpbnN0YWxsKElGZWF0dXJlIGZlYXR1cmUsIElGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxmZWF0dXJlcywgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnN0YWxsQWJvcnRlZEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBJRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyB0eXBlLCBVUkwgdXJsKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZSNjcmVhdGVGZWF0dXJlKGphdmEubGFuZy5TdHJpbmcsIGphdmEubmV0LlVSTCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmUgY3JlYXRlRmVhdHVyZShTdHJpbmcgdHlwZSwgVVJMIHVybCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JU2l0ZSNnZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGVGZWF0dXJlUmVmZXJlbmNlW10gZ2V0UmF3RmVhdHVyZVJlZmVyZW5jZXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvaW1wbGVtZW50YXRpb24vU2l0ZUZUUEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3OWIxOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9pbXBsZW1lbnRhdGlvbi9TaXRlRlRQRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVSTEVuY29kZXI7DQotDQotcHVibGljIGNsYXNzIFNpdGVGVFBGYWN0b3J5IGV4dGVuZHMgU2l0ZU1vZGVsRmFjdG9yeSBpbXBsZW1lbnRzIElTaXRlRmFjdG9yeSB7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEUgPSAiYS9iL2MvIjsNCi0NCi0JLyoNCi0JICogQHNlZSBJU2l0ZUZhY3RvcnkjY3JlYXRlU2l0ZShVUkwsIGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgY3JlYXRlU2l0ZShVUkwgdXJsKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24sIEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiB7DQotCQlJU2l0ZSBzaXRlID0gbnVsbDsNCi0JCUlucHV0U3RyZWFtIHNpdGVTdHJlYW0gPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwpOw0KLQkJCXNpdGVTdHJlYW0gPSByZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCk7DQotDQotCQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gKFNpdGVNb2RlbEZhY3RvcnkpIHRoaXM7DQotCQkJZmFjdG9yeS5wYXJzZVNpdGUoc2l0ZVN0cmVhbSk7DQotDQotCQkJc2l0ZSA9IG5ldyBTaXRlRlRQKG5ldyBVUkwoImh0dHA6Ly9lY2xpcHNlLm9yZy8iICsgRklMRSkpOw0KLQkJCQ0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNyZWF0ZSBVUkwiLCBlKTsNCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsNCi0JCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFjY2VzcyBVUkwiLElTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTiwgZSk7DQotCQl9IGZpbmFsbHkgew0KLQkJCXRyeSB7DQotCQkJCWlmIChzaXRlU3RyZWFtICE9IG51bGwpDQotCQkJCQlzaXRlU3RyZWFtLmNsb3NlKCk7DQotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIFNpdGVNb2RlbEZhY3RvcnkjY2FuUGFyc2VTaXRlVHlwZShTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBjYW5QYXJzZVNpdGVUeXBlKFN0cmluZyB0eXBlKSB7DQotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLmZ0cCIuZXF1YWxzSWdub3JlQ2FzZSh0eXBlKTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvQWxsTWlycm9yVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9BbGxNaXJyb3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjk5MTg2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9BbGxNaXJyb3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEFsbE1pcnJvclRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQWxsTWlycm9yVGVzdHMoU3RyaW5nIG5hbWUpewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiTWlycm9yIFRlc3RzIik7Ci0JCQotCQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGhlIHRlc3QgbWV0aG9kcyBpbiB0aGUgY2xhc3MgdGhhdCBzdGFydHMgd2l0aCAidGVzdCIKLQkJCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuY2xhc3MpKTsKLQkJCi0JCS8vIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGUgbWV0aG9kCi0JCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsKLQkJcmV0dXJuIHN1aXRlOwkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9NaXJyb3JNYW5hZ2VyVGVzdENhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9NaXJyb3JNYW5hZ2VyVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5ZmI5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvTWlycm9yTWFuYWdlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgTWlycm9yTWFuYWdlclRlc3RDYXNlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlewotCXB1YmxpYyBzdGF0aWMgaW50IGV4aXRWYWx1ZT0tMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZ0J1ZmZlciBlcnJPdXRwdXQ7Ci0JCi0JcHVibGljIE1pcnJvck1hbmFnZXJUZXN0Q2FzZShTdHJpbmcgYXJnMCl7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQkKLQkvL1dhdGNoRG9nIHRocmVhZCB0byBraWxsIG1pcnJvcmluZyBwcm9jZXNzIGlmIGl0IGhhbmdzIChvciB0YWtlcyB0b28gbG9uZykKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVyIGV4dGVuZHMgVGhyZWFkewotCQlwcml2YXRlIFByb2Nlc3MgcHJvYzsKLQkJCi0JCXB1YmxpYyBUaW1lcihQcm9jZXNzIHByb2MpewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2V0RGFlbW9uKHRydWUpOwotCQkJdGhpcy5wcm9jID0gcHJvYzsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCl7Ci0JCQl0cnkgewotCQkJCS8vIE5vdGU6IG5vcm1hbCB0ZXN0IG9uIDIuMkdoeiBQNCBpcyAyLjlzIAotCQkJCS8vOi4gZ2l2aW5nIDEwMHggbGVld2F5IHRvIGNvbXBsZXRlIHByb2Nlc3MgYmVmb3JlIGtpbGxpbmcgaXQKLQkJCQlzbGVlcCgzMDAwMDApOyAKLQkJCQlwcm9jLmRlc3Ryb3koKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBzdHJ1Y3R1cmUgdG8gaG9sZCBjYXRlZ29yeSBkZWZpbml0aW9uIG5hbWVzIGFuZCBkZXNjcmlwdGlvbnMKLQljbGFzcyBDYXRlZ29yeURlZmluaXRpb24gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIFN0cmluZyBkZXNjOwotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldERlc2MoU3RyaW5nIGRlc2MpIHsKLQkJCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjKCkgewotCQkJcmV0dXJuIGRlc2M7Ci0JCX0KLQl9Ci0JCi0JLy8gc3RydWN0dXJlIHRvIGhvbGQgZmVhdHVyZSBJRHMgYW5kIHRoZWlyIGNhdGVnb3J5IG5hbWVzCi0JcHVibGljIGNsYXNzIEZlYXR1cmVDYXRlZ29yeXsKLQkJcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZUlkOwotCQlwcml2YXRlIEFycmF5TGlzdCBjYXRlZ29yeTsKLQkJCi0JCXB1YmxpYyBGZWF0dXJlQ2F0ZWdvcnkoKXsKLQkJCWNhdGVnb3J5ID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlSUQoU3RyaW5nIGZpZCl7Ci0JCQlmZWF0dXJlSWQgPSBmaWQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5KFN0cmluZyBjYXQpewotCQkJY2F0ZWdvcnkuYWRkKGNhdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmVhdHVyZUlEKCl7Ci0JCQlyZXR1cm4gZmVhdHVyZUlkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q2F0ZWdvcmllcygpewotCQkJcmV0dXJuIChTdHJpbmdbXSljYXRlZ29yeS50b0FycmF5KG5ldyBTdHJpbmdbY2F0ZWdvcnkuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0JCi0JLy8gU3RyZWFtQ29uc3VtZXIgdG8gZGlzcGxheSBvdXRwdXQgdG8gb3V0cHV0IGZpbGVzIG9yIGNvbnNvbGUKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbUNvbnN1bWVyIGV4dGVuZHMgVGhyZWFkIHsKLQkJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciBiUmVhZGVyOwotCi0JCXB1YmxpYyBTdHJlYW1Db25zdW1lcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQkJc3VwZXIoKTsKLQkJCXNldERhZW1vbih0cnVlKTsKLQkJCWJSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBsaW5lOwotCQkJCXdoaWxlIChudWxsICE9IChsaW5lID0gYlJlYWRlci5yZWFkTGluZSgpKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGluZSk7Ci0JCQkJCWVyck91dHB1dC5hcHBlbmQobGluZSk7Ci0JCQkJCWVyck91dHB1dC5hcHBlbmQoIlxuIik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBhcnJheSBjb25zaXN0aW5nIG9mIGNvbW1hbmRzIGFuZCB0aGVpciBhcmd1bWVudHMgdG8KLQkgKiBiZSBydW4uCi0JICogQHBhcmFtIHJlbW90ZUxvYyAtIHBhdGggb2YgcmVtb3RlIHNpdGUgKHNpdGUgYmVpbmcgbWlycm9yZWQpCi0JICogQHBhcmFtIHRvTG9jYWxTaXRlVXJsIC0gcGF0aCBvZiBsb2NhbCBzaXRlIChuZXcgbWlycm9yIHNpdGUpCi0JICogQHBhcmFtIGZpZCAtIGZlYXR1cmUgaWQgb2YgZmVhdHVyaW5nIGJlaW5nIG1pcnJvciAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKLQkgKiBAcGFyYW0gdmVyIC0gdmVyc2lvbiBvZiBmZWF0dXJlIHRvIGJlIG1pcnJvcmVkIChvcHRpb25hbCAtIGNhbiBiZSBudWxsKQotCSAqIEBwYXJhbSBtaXJVcmwgLSBkaXJlY3RvcnkgbG9jYXRpb24gb2YgcG9saWN5LnhtbCAob3B0aW9uYWwgLSBjYW4gYmUgbXVsbCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldENvbW1hbmQoCi0JCVN0cmluZyByZW1vdGVMb2MsCi0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCwKLQkJU3RyaW5nIGZpZCwKLQkJU3RyaW5nIHZlciwKLQkJU3RyaW5nIG1pclVybCkgewotCQlmaW5hbCBTdHJpbmcgY2xhc3NwYXRoID0gInN0YXJ0dXAuamFyIjsKLQkJZmluYWwgU3RyaW5nIGxhdW5jaGVyID0gIm9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuTWFpbiI7Ci0JCWZpbmFsIFN0cmluZyBjb21tYW5kID0gIm1pcnJvciI7Ci0JCWZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbiA9ICJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5zdGFuZGFsb25lVXBkYXRlIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ1AgPSAiLWNwIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQVBQID0gIi1hcHBsaWNhdGlvbiI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NNRCA9ICItY29tbWFuZCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0ZJRCA9ICItZmVhdHVyZUlkIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfREFUQSA9ICItZGF0YSI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX1ZFUlNJT04gPSAiLXZlcnNpb24iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19GUk9NID0gIi1mcm9tIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfVE8gPSAiLXRvIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfVVJMID0gIi1taXJyb3JVUkwiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19TUExBU0ggPSAiLW5vc3BsYXNoIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ09OU09MRUxPRyA9ICItY29uc29sZWxvZyI7Ci0JCWZpbmFsIFN0cmluZyBkYXRhID0KLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJU3RyaW5nW10gY21kID0KLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJZ2V0SmF2YVZNUGF0aCgpLAotCQkJCUZMQUdfQ1AsCi0JCQkJY2xhc3NwYXRoLAotCQkJCWxhdW5jaGVyLAotCQkJCUZMQUdfQVBQLAotCQkJCWFwcGxpY2F0aW9uLAotCQkJCUZMQUdfQ01ELAotCQkJCWNvbW1hbmQsCi0JCQkJRkxBR19GUk9NLAotCQkJCShyZW1vdGVMb2MgIT1udWxsID8gcmVtb3RlTG9jIDogIiIpLAotCQkJCUZMQUdfVE8sCi0JCQkJdG9Mb2NhbFNpdGVVcmwsCi0JCQkJKGZpZCAhPSBudWxsID8gRkxBR19GSUQgOiAiIiksCi0JCQkJKGZpZCAhPSBudWxsID8gZmlkIDogIiIpLAotCQkJCSh2ZXIgIT0gbnVsbCA/IEZMQUdfVkVSU0lPTiA6ICIiKSwKLQkJCQkodmVyICE9IG51bGwgPyB2ZXIgOiAiIiksCi0JCQkJKG1pclVybCAhPSBudWxsID8gRkxBR19VUkwgOiAiIiksCi0JCQkJKG1pclVybCAhPSBudWxsID8gbWlyVXJsIDogIiIpLAotCQkJCUZMQUdfU1BMQVNILAotCQkJCUZMQUdfREFUQSwKLQkJCQlkYXRhLAotCQkJCUZMQUdfQ09OU09MRUxPR307Ci0JCXJldHVybiBjbWQ7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNoZWNrRmVhdHVyZUluU2l0ZVhNTEV4aXN0cyhTdHJpbmcgdXJsLCBTdHJpbmcgZmlkLCBTdHJpbmcgdmVyKXsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCQlTdHJpbmcgamFyTmFtZSA9IGZpZCArICJfIiArIHZlciArICIuamFyIjsKLQkJU3RyaW5nIGZlYXR1cmUgPSAiPGZlYXR1cmUgdXJsPVwiIiArCi0JCQkiZmVhdHVyZXMvIiArIGphck5hbWUgKyAKLQkJCSJcIiBpZD1cIiIgKyBmaWQgKyAKLQkJCSJcIiB2ZXJzaW9uPVwiIiArIHZlcisiXCI+IjsKLQkJdHJ5IHsKLQkJCWZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihzaXRlKTsKLQkJCWJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3b3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGJ5IGFzc2VydCBhYm92ZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRyeSB7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7Ci0JCQkJaWYgKHRleHQuZXF1YWxzKGZlYXR1cmUpKXsKLQkJCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJCQlmcmVhZGVyLmNsb3NlKCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2hlY2tTaXRlWE1MKFN0cmluZyB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIG1pcnJvciA9IG5ldyBGaWxlKHVybCk7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvc2l0ZS54bWwiKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuaXNEaXJlY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUobWlycm9yLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShzaXRlLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja1BvbGljeVhNTChTdHJpbmcgdXJsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBtaXJyb3IgPSBuZXcgRmlsZSh1cmwpOwotCQlGaWxlIHNpdGUgPSBuZXcgRmlsZSh1cmwgKyAiL3BvbGljeS54bWwiKTsKLQkJYXNzZXJ0VHJ1ZShtaXJyb3IuaXNEaXJlY3RvcnkoKSk7Ci0JCWFzc2VydFRydWUobWlycm9yLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShzaXRlLmV4aXN0cygpKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gY2hlY2tQb2xpY3lVUkwoU3RyaW5nIHVybCwgU3RyaW5nIG1pcnJvclVybCl7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvcG9saWN5LnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCi0JCXRyeSB7Ci0JCQlmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc2l0ZSk7Ci0JCQlicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gd291bGQgaGF2ZSBiZWVuIGNhdWdodCBieSBhc3NlcnQgYWJvdmUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQl3aGlsZSAoKHRleHQgPSBicmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlpZiAodGV4dC5pbmRleE9mKG1pcnJvclVybCkhPS0xKXsKLQkJCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJCQlmcmVhZGVyLmNsb3NlKCk7CQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFkZXIuY2xvc2UoKTsKLQkJCWZyZWFkZXIuY2xvc2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRvZXNDYXRlZ29yeURlZmluaXRpb25FeGlzdChTdHJpbmcgdXJsKSB7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvc2l0ZS54bWwiKTsKLQkJYXNzZXJ0VHJ1ZShzaXRlLmV4aXN0cygpKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlcjsKLQkJRmlsZVJlYWRlciBmcmVhZGVyOwotCQlTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoKTsKLQotCQl0cnkgewotCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOwotCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQl0cnkgewotCQkJd2hpbGUgKCh0ZXh0ID0gYnJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRleHQuaW5kZXhPZigiY2F0ZWdvcnktZGVmIikhPS0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRFY2xpcHNlUm9vdCgpIHsKLQkJcmV0dXJuIENvbmZpZ3VyYXRvclV0aWxzLmdldEluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpLnJlcGxhY2VGaXJzdCgKLQkJCSJmaWxlOiIsCi0JCQkiIik7Ci0JfQotCQotCXB1YmxpYyBGZWF0dXJlQ2F0ZWdvcnlbXSBnZXRGZWF0dXJlQ2F0ZWdvcmllcyhTdHJpbmcgdXJsKXsKLQkJRmlsZSBzaXRlID0gbmV3IEZpbGUodXJsICsgIi9zaXRlLnhtbCIpOwotCQlhc3NlcnRUcnVlKHNpdGUuZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyOwotCQlGaWxlUmVhZGVyIGZyZWFkZXI7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZygpOwotCQlBcnJheUxpc3QgZmVhdHVyZUNhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQl0cnkgewotCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOwotCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCi0JCQlyZXR1cm4gbmV3IEZlYXR1cmVDYXRlZ29yeVswXTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlGZWF0dXJlQ2F0ZWdvcnkgY3VyclRvayA9IG5ldyBGZWF0dXJlQ2F0ZWdvcnkoKTsKLQkJCWJvb2xlYW4gYWRkID0gZmFsc2U7Ci0JCQl3aGlsZSgodGV4dCA9YnJlYWRlci5yZWFkTGluZSgpKSE9bnVsbCl7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHN0clRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodGV4dCk7Ci0JCQkJd2hpbGUgKHN0clRvay5oYXNNb3JlVG9rZW5zKCkpewotCQkJCQlTdHJpbmcgdGVtcCA9IHN0clRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHRlbXAuZXF1YWxzKCI8L2ZlYXR1cmU+IikpewotCQkJCQkJYWRkID0gdHJ1ZTsKLQkJCQkJfSBlbHNlIGlmICh0ZW1wLnN0YXJ0c1dpdGgoImlkIikpewotCQkJCQkJY3VyclRvay5zZXRGZWF0dXJlSUQodGVtcC5zcGxpdCgiXCIiKVsxXSk7Ci0JCQkJCX0gZWxzZSBpZiAodGVtcC5zdGFydHNXaXRoKCJuYW1lIikpewotCQkJCQkJY3VyclRvay5hZGRDYXRlZ29yeSh0ZW1wLnNwbGl0KCJcIiIpWzFdKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYWRkKXsKLQkJCQkJZmVhdHVyZUNhdGVnb3JpZXMuYWRkKGN1cnJUb2spOwotCQkJCQljdXJyVG9rID0gbmV3IEZlYXR1cmVDYXRlZ29yeSgpOwotCQkJCQlhZGQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWJyZWFkZXIuY2xvc2UoKTsKLQkJCWZyZWFkZXIuY2xvc2UoKTsKLQkJCXJldHVybiAoRmVhdHVyZUNhdGVnb3J5W10pZmVhdHVyZUNhdGVnb3JpZXMudG9BcnJheShuZXcgRmVhdHVyZUNhdGVnb3J5W2ZlYXR1cmVDYXRlZ29yaWVzLnNpemUoKV0pOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQlyZXR1cm4gbmV3IEZlYXR1cmVDYXRlZ29yeVswXTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFWTVBhdGgoKSB7Ci0JCS8vIENyZWF0ZSBjb21tYW5kIHN0cmluZyBmb3IgbGF1bmNoaW5nIHRoZSBwcm9jZXNzCi0JCVN0cmluZyB2bSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52bS5uYW1lIik7Ci0JCVN0cmluZyBleGVjdXRhYmxlID0gIko5Ii5lcXVhbHModm0pID8gImo5IiA6ICJqYXZhIjsKLQkJaWYgKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKFBsYXRmb3JtLmdldE9TKCkpKQotCQkJZXhlY3V0YWJsZSArPSAidy5leGUiOwotCi0JCVN0cmluZyBqYXZhSW5zdGFsbERpciA9Ci0JCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaG9tZSIpICsgRmlsZS5zZXBhcmF0b3IgKyAiYmluIjsKLQkJcmV0dXJuIGphdmFJbnN0YWxsRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBleGVjdXRhYmxlOwotCX0KLQkKLQlwdWJsaWMgQ2F0ZWdvcnlEZWZpbml0aW9uW10gZ2V0Q2F0ZWdvcnlEZWZpbml0aW9ucyhTdHJpbmcgdXJsKSB7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHVybCArICIvc2l0ZS54bWwiKTsKLQkJYXNzZXJ0VHJ1ZShzaXRlLmV4aXN0cygpKTsKLQkJQnVmZmVyZWRSZWFkZXIgYnJlYWRlcjsKLQkJRmlsZVJlYWRlciBmcmVhZGVyOwotCQlTdHJpbmcgdGV4dCA9IG5ldyBTdHJpbmcoKTsKLQkJQXJyYXlMaXN0IGNhdERlZiA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQl0cnkgewotCQkJZnJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKHNpdGUpOwotCQkJYnJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmcmVhZGVyKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdvdWxkIGhhdmUgYmVlbiBjYXVnaHQgYnkgYXNzZXJ0IGFib3ZlCi0JCQlyZXR1cm4gbmV3IENhdGVnb3J5RGVmaW5pdGlvblswXTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlib29sZWFuIGFkZCA9IGZhbHNlOwotCQkJYm9vbGVhbiBpc0Rlc2MgPSBmYWxzZTsKLQkJCUNhdGVnb3J5RGVmaW5pdGlvbiB0ZW1wID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOwotCQkJd2hpbGUgKCh0ZXh0ID0gYnJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRleHQudHJpbSgpLnN0YXJ0c1dpdGgoIjxjYXRlZ29yeS1kZWYiKQotCQkJCQkmJiB0ZXh0LmluZGV4T2YoIm5hbWUiKSAhPSAtMSkgewotCQkJCQl0ZW1wLnNldE5hbWUodGV4dC5zcGxpdCgiXCIiKVsxXSk7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCX0gZWxzZSBpZiAodGV4dC50cmltKCkuZXF1YWxzKCI8ZGVzY3JpcHRpb24+IikpIHsKLQkJCQkJaXNEZXNjID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKHRleHQudHJpbSgpLmVxdWFscygiPC9kZXNjcmlwdGlvbj4iKSkgewotCQkJCQlpc0Rlc2MgPSBmYWxzZTsKLQkJCQl9IGVsc2UgaWYgKGlzRGVzYykgewotCQkJCQl0ZW1wLnNldERlc2ModGV4dC50cmltKCkpOwotCQkJCX0gZWxzZSBpZiAodGV4dC50cmltKCkuZXF1YWxzKCI8L2NhdGVnb3J5LWRlZj4iKSkgewotCQkJCQlhZGQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoYWRkKSB7Ci0JCQkJCWNhdERlZi5hZGQodGVtcCk7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCQl0ZW1wID0gbmV3IENhdGVnb3J5RGVmaW5pdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJYnJlYWRlci5jbG9zZSgpOwotCQkJZnJlYWRlci5jbG9zZSgpOwotCQkJcmV0dXJuIChDYXRlZ29yeURlZmluaXRpb25bXSljYXREZWYudG9BcnJheShuZXcgQ2F0ZWdvcnlEZWZpbml0aW9uW2NhdERlZi5zaXplKCldKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQkJcmV0dXJuIG5ldyBDYXRlZ29yeURlZmluaXRpb25bMF07Ci0JCX0KLQotCX0KLQkKLQlwdWJsaWMgaW50IHBlcmZvcm1NaXJyb3IoU3RyaW5nW10gY21kX21pcnJvcikgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRFY2xpcHNlUm9vdCgpKTsKLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTGF1bmNoaW5nOiIpOwotCQkJZm9yKGludCBpPTA7IGk8Y21kX21pcnJvci5sZW5ndGg7IGkrKyl7Ci0JCQkJU3lzdGVtLm91dC5wcmludChjbWRfbWlycm9yW2ldKyIgIik7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCVByb2Nlc3MgcHJvYyA9Ci0JCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhjbWRfbWlycm9yLCAoU3RyaW5nW10pIG51bGwsIGZpbGUpOwotCi0JCQlTdHJlYW1Db25zdW1lciBvdXRwdXRzID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSk7Ci0JCQlvdXRwdXRzLnN0YXJ0KCk7Ci0JCQlTdHJlYW1Db25zdW1lciBlcnJvcnMgPSBuZXcgU3RyZWFtQ29uc3VtZXIocHJvYy5nZXRFcnJvclN0cmVhbSgpKTsKLQkJCWVycm9ycy5zdGFydCgpOwotCQkJVGltZXIgdGltZXIgPSBuZXcgVGltZXIocHJvYyk7Ci0JCQl0aW1lci5zdGFydCgpOwotCi0JCQlyZXR1cm4gcHJvYy53YWl0Rm9yKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCAwKTsKLQl9Ci0JCi0JLy8gZW5zdXJlIG91dHB1dCBzdHJpbmcgYnVmZmVyIGVuZHMgd2l0aCAiTWlycm9yIGNvbW1hbmQgY29tcGxldGVkCi0JLy8gc3VjY2Vzc2Z1bGx5LiIKLQkvLyBub3RlOiBvdXRwdXQgbWF5IGluc3RlYWQgYnkgIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iCi0JcHVibGljIHZvaWQgdGVzdE1pcnJvclN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9Ci0JCQluZXcgU3RyaW5nVG9rZW5pemVyKAotCQkJCWVyck91dHB1dC50b1N0cmluZygpLAotCQkJCSJcbiIpOwotCQlTdHJpbmcgbGFzdExpbmUgPSBuZXcgU3RyaW5nKCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKXsKLQkJCWxhc3RMaW5lID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQl9Ci0JCWFzc2VydFRydWUoCi0JCQlsYXN0TGluZS5lcXVhbHMoIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIikKLQkJCQl8fCBsYXN0TGluZS5lcXVhbHMoIkNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4iKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21pcnJvci9UZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0Y2FkMjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZVRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciBleHRlbmRzIE1pcnJvck1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc01pcnJvcmVkOwotCi0JcHVibGljIFRlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWVyck91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaXNNaXJyb3JlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCVN0cmluZyBmZWF0dXJlSWQgPSAidXBkYXRlLmZlYXR1cmUxYyI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjMuMC4wIjsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCS8vIGZpcnN0IG1pcnJvcgotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJImZpbGU6IgotCQkJCSsgZGF0YVBhdGgKLQkJCQkrICJtaXJyb3JzL3VwZGF0ZS1zaXRlMSI7Ci0JCWlmICghaXNNaXJyb3JlZCkgewotCQkJZXhpdFZhbHVlID0KLQkJCQlwZXJmb3JtTWlycm9yKAotCQkJCQlnZXRDb21tYW5kKGZyb21SZW1vdGVTaXRlVXJsLHRvTG9jYWxTaXRlVXJsLCBudWxsLCBudWxsLCBtaXJyb3JVUkwpKTsKLQkJCi0JCS8vIGVuZCBvZiBmaXJzdCBtaXJyb3IKLQkJZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkJImZpbGU6IgotCQkJKyBkYXRhUGF0aAotCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTUiOwotCQkJZXhpdFZhbHVlID0KLQkJCQlwZXJmb3JtTWlycm9yKAotCQkJCQlnZXRDb21tYW5kKGZyb21SZW1vdGVTaXRlVXJsLHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24sIG1pcnJvclVSTCkpOwotCQkJaXNNaXJyb3JlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBtYWtlIHN1cmUgZWFjaCBmZWF0dXJlIGlzIHVuZGVyIGl0cyBjb3JyZWN0IGNhdGVnb3J5IG5hbWVzCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0KLQkJICAgICAgICBkYXRhUGF0aAotCQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGU1IjsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlGZWF0dXJlQ2F0ZWdvcnlbXSBtaXJyb3JGZWF0dXJlcyA9IGdldEZlYXR1cmVDYXRlZ29yaWVzKHRvTG9jYWxTaXRlVXJsKTsKLQkJRmVhdHVyZUNhdGVnb3J5W10gcmVxdWlyZWQgPSBuZXcgRmVhdHVyZUNhdGVnb3J5WzFdOwotCQlyZXF1aXJlZFswXSA9IG5ldyBGZWF0dXJlQ2F0ZWdvcnkoKTsKLQkJcmVxdWlyZWRbMF0uc2V0RmVhdHVyZUlEKCJ1cGRhdGUuZmVhdHVyZTFjIik7Ci0JCXJlcXVpcmVkWzBdLmFkZENhdGVnb3J5KCJTaXRlNS1DYXRlZ29yeTEiKTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZlYXR1cmVDYXRlZ29yaWVzQ29udGFpbmVkKHJlcXVpcmVkLCBtaXJyb3JGZWF0dXJlcykpOwotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0RXhpdFZhbHVlKCk7Ci0JfQotCQotCS8vIGVuc3VyZSBjYXRlZ29yeSBkZWZpbml0aW9ucyBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yeURlZmluaXRpb25zRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlhc3NlcnRUcnVlKGRvZXNDYXRlZ29yeURlZmluaXRpb25FeGlzdCh0b0xvY2FsU2l0ZVVybCkpOwotCX0KLQotCS8vIGVuc3VyZSBmZWF0dXJlIGV4aXN0cyBwZXIgc2l0ZS54bWwKLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZUluU2l0ZVhNTEV4aXN0cygpIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMWMiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIzLjAuMCI7Ci0JCWFzc2VydFRydWUoCi0JCQljaGVja0ZlYXR1cmVJblNpdGVYTUxFeGlzdHModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbikpOwotCX0KLQotCS8vIGVuc3VyZSBzaXRlLnhtbCBpcyBnZW5lcmF0ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrU2l0ZVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWNoZWNrUG9saWN5WE1MKHRvTG9jYWxTaXRlVXJsKTsKLQl9Ci0KLQkvLyBlbnN1cmUgcG9saWN5LnhtbCByZWZlcmVuY2VzIHRoZSBjb3JyZWN0IG1pcnJvclVSTAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVEb3VibGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCWFzc2VydFRydWUoY2hlY2tQb2xpY3lVUkwodG9Mb2NhbFNpdGVVcmwsIG1pcnJvclVSTCkpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBmZWF0dXJlcyBkaXJlY3RvcnkgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmVhdHVyZUphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZURvdWJsZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZ1tdIGZlYXR1cmVKYXJzID0geyAidXBkYXRlLmZlYXR1cmUxYl8yLjAuMC5qYXIiIH07Ci0JCWFzc2VydFRydWUoY2hlY2tBbGxGZWF0dXJlSmFycyh0b0xvY2FsU2l0ZVVybCwgZmVhdHVyZUphcnMpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGphcnMgaW4gcGx1Z2lucyBkaXJlY3RvcnkgbWlycm9yZWQKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsUGx1Z2luSmFyc0V4aXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRG91YmxlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nW10gcGx1Z2luSmFycyA9Ci0JCQl7ICJjb20ucGx1Z2luMV8xLjAuMC5qYXIiLCAiY29tLnBsdWdpbjFhXzEuMC4xLmphciIgfTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0FsbFBsdWdpbkphcnModG9Mb2NhbFNpdGVVcmwsIHBsdWdpbkphcnMpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKLQkvLyBzdWNjZXNzZnVsbHkuIgotCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKLQlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0TWlycm9yU3VjY2VzcygpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0FsbEZlYXR1cmVKYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgZmVhdHVyZXNEaXIgPSBuZXcgRmlsZSh1cmwgKyAiL2ZlYXR1cmVzIik7Ci0JCWFzc2VydFRydWUoZmVhdHVyZXNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmlzRGlyZWN0b3J5KCkpOwotCQlTdHJpbmdbXSBsaXN0ID0gZmVhdHVyZXNEaXIubGlzdCgpOwotCi0JCUFycmF5TGlzdCBscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlscy5hZGQobGlzdFtpXSk7Ci0JCX0KLQotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxQbHVnaW5KYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHVybCArICIvcGx1Z2lucyIpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSk7Ci0JCVN0cmluZ1tdIGxpc3QgPSBwbHVnaW5zRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCBqYXJOYW1lcy5sZW5ndGg7IGorKykgewotCQkJYXNzZXJ0VHJ1ZShscy5jb250YWlucyhqYXJOYW1lc1tqXSkpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrRmVhdHVyZUNhdGVnb3JpZXNDb250YWluZWQoRmVhdHVyZUNhdGVnb3J5W10gcmVxdWlyZWQsRmVhdHVyZUNhdGVnb3J5W10gbG9jYWxEZWZzKXsKLQkJYm9vbGVhbiBoYXNNYXRjaDsKLQkJZm9yIChpbnQgaSA9IDAgOyBpPHJlcXVpcmVkLmxlbmd0aDsgaSsrKXsKLQkJCWhhc01hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgajxsb2NhbERlZnMubGVuZ3RoOyBqKyspewotCQkJCWlmIChsb2NhbERlZnNbal0uZ2V0RmVhdHVyZUlEKCkuZXF1YWxzKHJlcXVpcmVkW2ldLmdldEZlYXR1cmVJRCgpKSAmJgotCQkJCQljaGVja0NhdGVnb3JpZXNNYXRjaChsb2NhbERlZnNbal0uZ2V0Q2F0ZWdvcmllcygpLCByZXF1aXJlZFtpXS5nZXRDYXRlZ29yaWVzKCkpKXsKLQkJCQkJCWhhc01hdGNoID0gdHJ1ZTsKLQkJCQkJCWo9bG9jYWxEZWZzLmxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWhhc01hdGNoKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDYXRlZ29yaWVzTWF0Y2goU3RyaW5nW10gbG9jYWxDYXQsIFN0cmluZ1tdIHJlbW90ZUNhdCl7Ci0JCWJvb2xlYW4gaGFzTWF0Y2g7Ci0JCWZvciAoaW50IGkgPSAwOyBpPGxvY2FsQ2F0Lmxlbmd0aDsgaSsrKXsKLQkJCWhhc01hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgajxyZW1vdGVDYXQubGVuZ3RoOyBpKyspewotCQkJCWlmIChsb2NhbENhdFtpXS5lcXVhbHMocmVtb3RlQ2F0W2pdKSl7Ci0JCQkJCWhhc01hdGNoID0gdHJ1ZTsKLQkJCQkJaj1yZW1vdGVDYXQubGVuZ3RoOwotCQkJCX0KLQkJCX0KLQkJCWlmKCFoYXNNYXRjaCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZlYTI2MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlVGVzdHNQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIGV4dGVuZHMgTWlycm9yTWFuYWdlclRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWlycm9yZWQ7Ci0KLQlwdWJsaWMgVGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvcihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpc01pcnJvcmVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOwotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCVN0cmluZyBtaXJyb3JVUkwgPSAiaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy9teS1taXJyb3ItdXJsIjsKLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0KLQkJCQkiZmlsZToiCi0JCQkJKyBkYXRhUGF0aAotCQkJCSsgIm1pcnJvcnMvdXBkYXRlLXNpdGU0IjsKLQkJaWYgKCFpc01pcnJvcmVkKSB7Ci0JCQlleGl0VmFsdWUgPQotCQkJCXBlcmZvcm1NaXJyb3IoCi0JCQkJCWdldENvbW1hbmQoZnJvbVJlbW90ZVNpdGVVcmwsdG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbiwgbWlycm9yVVJMKSk7Ci0JCQlpc01pcnJvcmVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RFeGl0VmFsdWUoKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGNhdGVnb3J5IGRlZmluaXRpb25zIGV4aXN0Ci0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUVtYmVkZGVkRmVhdHVyZU1pcnJvciI7Ci0JCWFzc2VydFRydWUoZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KHRvTG9jYWxTaXRlVXJsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVJblNpdGVYTUxFeGlzdHMoKSB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTFjIjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMy4wLjAiOwotCQlhc3NlcnRUcnVlKAotCQkJY2hlY2tGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24pKTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2l0ZS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFNpdGVYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQljaGVja1NpdGVYTUwodG9Mb2NhbFNpdGVVcmwpOwotCX0KLQotCS8vIGVuc3VyZSBwb2xpY3kueG1sIGlzIGdlbmVyYXRlZAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQljaGVja1BvbGljeVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgdXNlcyB0aGUgY29ycmVjdCBtaXJyb3JVUkwKLQlwdWJsaWMgdm9pZCB0ZXN0UG9saWN5VVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRW1iZWRkZWRGZWF0dXJlTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlhc3NlcnRUcnVlKGNoZWNrUG9saWN5VVJMKHRvTG9jYWxTaXRlVXJsLCBtaXJyb3JVUkwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGphcnMgaW4gZmVhdHVyZXMgZGlyZWN0b3J5IG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbEZlYXR1cmVKYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmdbXSBmZWF0dXJlSmFycyA9IHsgInVwZGF0ZS5mZWF0dXJlMV8xLjAuMC5qYXIiLCAidXBkYXRlLmZlYXR1cmUxXzEuMC4xLmphciIsICJ1cGRhdGUuZmVhdHVyZTFiXzIuMC4wLmphciIsICJ1cGRhdGUuZmVhdHVyZTFjXzMuMC4wLmphciIgfTsKLQkJYXNzZXJ0VHJ1ZShjaGVja0FsbEZlYXR1cmVKYXJzKHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSmFycykpOwotCX0KLQotCS8vIGVuc3VyZSBhbGwgamFycyBpbiBwbHVnaW5zIGRpcmVjdG9yeSBtaXJyb3JlZAotCXB1YmxpYyB2b2lkIHRlc3RBbGxQbHVnaW5KYXJzRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmdbXSBwbHVnaW5KYXJzID0KLQkJCXsgImNvbS5wbHVnaW4xXzEuMC4wLmphciIsICJjb20ucGx1Z2luMWFfMS4wLjEuamFyIiB9OwotCQlhc3NlcnRUcnVlKGNoZWNrQWxsUGx1Z2luSmFycyh0b0xvY2FsU2l0ZVVybCwgcGx1Z2luSmFycykpOwotCX0KLQotCS8vIGVuc3VyZSBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBlbmRzIHdpdGggIk1pcnJvciBjb21tYW5kIGNvbXBsZXRlZAotCS8vIHN1Y2Nlc3NmdWxseS4iCi0JLy8gbm90ZTogb3V0cHV0IG1heSBpbnN0ZWFkIGJ5ICJDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIgotCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlc3RNaXJyb3JTdWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxGZWF0dXJlSmFycyhTdHJpbmcgdXJsLCBTdHJpbmdbXSBqYXJOYW1lcykgewotCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUodXJsICsgIi9mZWF0dXJlcyIpOwotCQlhc3NlcnRUcnVlKGZlYXR1cmVzRGlyLmV4aXN0cygpKTsKLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlc0Rpci5pc0RpcmVjdG9yeSgpKTsKLQkJU3RyaW5nW10gbGlzdCA9IGZlYXR1cmVzRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGxpc3QubGVuZ3RoLCBqYXJOYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tBbGxQbHVnaW5KYXJzKFN0cmluZyB1cmwsIFN0cmluZ1tdIGphck5hbWVzKSB7Ci0JCUZpbGUgcGx1Z2luc0RpciA9IG5ldyBGaWxlKHVybCArICIvcGx1Z2lucyIpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKHBsdWdpbnNEaXIuaXNEaXJlY3RvcnkoKSk7Ci0JCVN0cmluZ1tdIGxpc3QgPSBwbHVnaW5zRGlyLmxpc3QoKTsKLQotCQlBcnJheUxpc3QgbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJbHMuYWRkKGxpc3RbaV0pOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGxpc3QubGVuZ3RoLCBqYXJOYW1lcy5sZW5ndGgpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGphck5hbWVzLmxlbmd0aDsgaisrKSB7Ci0JCQlhc3NlcnRUcnVlKGxzLmNvbnRhaW5zKGphck5hbWVzW2pdKSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tDYXRlZ29yeURlZmluaXRpb25zQ29udGFpbmVkKENhdGVnb3J5RGVmaW5pdGlvbltdIGxvY2FsRGVmcywgQ2F0ZWdvcnlEZWZpbml0aW9uW10gcmVtb3RlRGVmcyl7Ci0JCWJvb2xlYW4gaGFzTWF0Y2g7Ci0JCWZvciAoaW50IGkgPSAwIDsgaTxsb2NhbERlZnMubGVuZ3RoOyBpKyspewotCQkJaGFzTWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqPHJlbW90ZURlZnMubGVuZ3RoOyBqKyspewotCQkJCWlmIChsb2NhbERlZnNbaV0uZ2V0TmFtZSgpLmVxdWFscyhyZW1vdGVEZWZzW2pdLmdldE5hbWUoKSkKLQkJCQkJCSYmIGxvY2FsRGVmc1tpXS5nZXREZXNjKCkuZXF1YWxzKHJlbW90ZURlZnNbal0uZ2V0RGVzYygpKSkKLQkJCQkJaGFzTWF0Y2ggPSB0cnVlOwotCQkJfQotCQkJaWYgKCFoYXNNYXRjaCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCi0KLQkvLyBzdGFydCB0ZXN0aW5nIGNhdGVnb3J5IGRlZmluaXRpb25zCi0JcHVibGljIHZvaWQgdGVzdENhdGVnb3J5RGVmaW5pdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVFbWJlZGRlZEZlYXR1cmVNaXJyb3IiOwotCQlTdHJpbmcgZnJvbVJlbW90ZVNpdGVVcmwgPQotCQkgICAgICAgIGRhdGFQYXRoCi0JCQkJKyAibWlycm9ycy91cGRhdGUtc2l0ZTQiOwotCQlDYXRlZ29yeURlZmluaXRpb25bXSBsb2NhbERlZnMgPSBnZXRDYXRlZ29yeURlZmluaXRpb25zKHRvTG9jYWxTaXRlVXJsKTsKLQkJQ2F0ZWdvcnlEZWZpbml0aW9uW10gcmVtb3RlRGVmcyA9IGdldENhdGVnb3J5RGVmaW5pdGlvbnMoZnJvbVJlbW90ZVNpdGVVcmwpOwotCQlhc3NlcnRUcnVlKGNoZWNrQ2F0ZWdvcnlEZWZpbml0aW9uc0NvbnRhaW5lZChsb2NhbERlZnMsIHJlbW90ZURlZnMpKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9taXJyb3IvVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYTBiMjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbWlycm9yL1Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubWlycm9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZVRlc3RzUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgVGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIGV4dGVuZHMgTWlycm9yTWFuYWdlclRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTWlycm9yZWQ7Ci0JCi0JcHVibGljIFRlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvcihTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQkJZXJyT3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpc01pcnJvcmVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTEiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlTdHJpbmcgbWlycm9yVVJMID0gImh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvbXktbWlycm9yLXVybCI7Ci0JCVN0cmluZyBmcm9tUmVtb3RlU2l0ZVVybCA9ICJmaWxlOiIgKyBkYXRhUGF0aCArICJtaXJyb3JzL3VwZGF0ZS1zaXRlMSI7Ci0JCWlmICghaXNNaXJyb3JlZCkgewotCQkJZXhpdFZhbHVlID0KLQkJCQlwZXJmb3JtTWlycm9yKAotCQkJCQlnZXRDb21tYW5kKGZyb21SZW1vdGVTaXRlVXJsLHRvTG9jYWxTaXRlVXJsLCBmZWF0dXJlSWQsIHZlcnNpb24sIG1pcnJvclVSTCkpOwotCQkJaXNNaXJyb3JlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0RXhpdFZhbHVlKCk7Ci0JfQotCi0JLy8gZW5zdXJlIGFsbCBjYXRlZ29yeSBkZWZpbml0aW9ucyBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3RDYXRlZ29yeURlZmluaXRpb25zRXhpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCWFzc2VydFRydWUoZG9lc0NhdGVnb3J5RGVmaW5pdGlvbkV4aXN0KHRvTG9jYWxTaXRlVXJsKSk7Ci0JfQotCi0JLy8gZW5zdXJlIGZlYXR1cmUgZXhpc3RzIHBlciBzaXRlLnhtbAotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSW5TaXRlWE1MRXhpc3RzKCl7Ci0JCVN0cmluZyB0b0xvY2FsU2l0ZVVybCA9Ci0JCQlVcGRhdGVUZXN0c1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRTdGF0ZUxvY2F0aW9uKCkKLQkJCQkrICIvdGVtcC90ZXN0UmVtb3RlRmVhdHVyZVZlcnNpb25NaXJyb3IiOwotCQlTdHJpbmcgZmVhdHVyZUlkID0gInVwZGF0ZS5mZWF0dXJlMSI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQkJYXNzZXJ0VHJ1ZShjaGVja0ZlYXR1cmVJblNpdGVYTUxFeGlzdHModG9Mb2NhbFNpdGVVcmwsIGZlYXR1cmVJZCwgdmVyc2lvbikpOwotCX0KLQkKLQkvLyBlbnN1cmUgc2l0ZS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFNpdGVYTUxFeGlzdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvTG9jYWxTaXRlVXJsID0KLQkJCVVwZGF0ZVRlc3RzUGx1Z2luLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKQotCQkJCSsgIi90ZW1wL3Rlc3RSZW1vdGVGZWF0dXJlVmVyc2lvbk1pcnJvciI7Ci0JCWNoZWNrU2l0ZVhNTCh0b0xvY2FsU2l0ZVVybCk7Ci0JfQotCi0JLy8gZW5zdXJlIHBvbGljeS54bWwgaXMgZ2VuZXJhdGVkCi0JcHVibGljIHZvaWQgdGVzdFBvbGljeVhNTEV4aXN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJY2hlY2tQb2xpY3lYTUwodG9Mb2NhbFNpdGVVcmwpOwotCX0KLQkKLQkvLyBlbnN1cmUgcG9saWN5LnhtbCB1c2VzIHRoZSBjb3JyZWN0IG1pcnJvclVSTAotCXB1YmxpYyB2b2lkIHRlc3RQb2xpY3lVUkwoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJU3RyaW5nIG1pcnJvclVSTCA9ICJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL215LW1pcnJvci11cmwiOwotCQlhc3NlcnRUcnVlKGNoZWNrUG9saWN5VVJMKHRvTG9jYWxTaXRlVXJsLCBtaXJyb3JVUkwpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgYWxsIGphcnMgZm9yIGZlYXR1cmVzIGFuZCBwbHVnaW5zIG1pcnJvcmVkCi0JcHVibGljIHZvaWQgdGVzdEFsbEphcnNFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdG9Mb2NhbFNpdGVVcmwgPQotCQkJVXBkYXRlVGVzdHNQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0U3RhdGVMb2NhdGlvbigpCi0JCQkJKyAiL3RlbXAvdGVzdFJlbW90ZUZlYXR1cmVWZXJzaW9uTWlycm9yIjsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJ1cGRhdGUuZmVhdHVyZTEiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0JCVN0cmluZyBqYXJOYW1lID0gZmVhdHVyZUlkICsgIl8iICsgdmVyc2lvbiArICIuamFyIjsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodG9Mb2NhbFNpdGVVcmwgKyAiL2ZlYXR1cmVzLyIgKyBqYXJOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlLmV4aXN0cygpKTsKLQl9Ci0KLQkvLyBlbnN1cmUgb3V0cHV0IHN0cmluZyBidWZmZXIgZW5kcyB3aXRoICJNaXJyb3IgY29tbWFuZCBjb21wbGV0ZWQKLQkvLyBzdWNjZXNzZnVsbHkuIgotCS8vIG5vdGU6IG91dHB1dCBtYXkgaW5zdGVhZCBieSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiIKLQlwdWJsaWMgdm9pZCB0ZXN0TWlycm9yU3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZXN0TWlycm9yU3VjY2VzcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvQWxsTW9kZWxUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvQWxsTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQ4ZGU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0FsbE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5tb2RlbDsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotLyoqDQotICogTWFuYWdlcyB0aGUgQVBJIHRlc3RzDQotICovDQotcHVibGljIGNsYXNzIEFsbE1vZGVsVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkvKioNCi0JICogQ29uc3RydWN0b3INCi0JICovDQotCXB1YmxpYyBBbGxNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7DQotCQlzdXBlcihuYW1lKTsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIExpc3Qgb2YgQVBJIHRlc3RzDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0JCXN1aXRlLnNldE5hbWUoIk1vZGVsIFRlc3RzIik7DQotDQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoRmVhdHVyZU1haW4uY2xhc3MpKTsNCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShTaXRlTWFpbi5jbGFzcykpOwkJDQotDQotCQlyZXR1cm4gc3VpdGU7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvRmVhdHVyZU1haW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL0ZlYXR1cmVNYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGQ0NzAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvRmVhdHVyZU1haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubW9kZWw7DQotDQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIEZlYXR1cmVNYWluIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JcHVibGljIEZlYXR1cmVNYWluKFN0cmluZyB0ZXN0Y2FzZSl7DQotCQlzdXBlcih0ZXN0Y2FzZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdE1haW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCQ0KLQkJRmVhdHVyZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZlYXR1cmVNb2RlbEZhY3RvcnkoKTsNCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0JCUZlYXR1cmVNb2RlbCBmZWF0dXJlID0gbnVsbDsNCi0JCQ0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJQYXJzaW5nIGZlYXR1cmUgLi4uIik7DQotCQl0cnkgew0KLQkJCWlzID0gRmVhdHVyZU1haW4uY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZmVhdHVyZS54bWwiKTsJCQ0KLQkJCWZlYXR1cmUgPSBmYWN0b3J5LnBhcnNlRmVhdHVyZShpcyk7DQotCQl9IGZpbmFsbHkgew0KLQkJCWlmIChpcyAhPSBudWxsKSB7DQotCQkJCXRyeSB7IGlzLmNsb3NlKCk7fSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7fQ0KLQkJCX0NCi0JCX0NCi0JCQ0KLQkJU3RyaW5nIGJhc2UgPSAiaHR0cDovL2Fub3RoZXIuc2VydmVyL2ZlYXR1cmUueG1sIjsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiUmVzb2x2aW5nIGZlYXR1cmUgdXNpbmcgIitiYXNlKyIgLi4uIik7DQotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOw0KLQkJYnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvdGVzdCIpOw0KLQkJZmVhdHVyZS5yZXNvbHZlKG5ldyBVUkwoYmFzZSksIG5ldyBVUkwoYmFzZSkpOw0KLQl9DQotCQ0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVGZWF0dXJlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsNCi0vLwkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgcmV0dXJuOw0KLS8vCQkNCi0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0vLwkJdy5wcmludGxuKGluKyI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz4iKTsNCi0vLwkJDQotLy8JCXcucHJpbnRsbihpbisiPGZlYXR1cmUiKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrInZlcnNpb249XCIiK2ZlYXR1cmUuZ2V0RmVhdHVyZVZlcnNpb24oKSsiXCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrZmVhdHVyZS5nZXRMYWJlbCgpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrInByb3ZpZGVyLW5hbWU9XCIiK2ZlYXR1cmUuZ2V0UHJvdmlkZXIoKSsiXCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyJpbWFnZT1cIiIrZmVhdHVyZS5nZXRJbWFnZVVSTFN0cmluZygpKyJcIiAtPiAiK2ZlYXR1cmUuZ2V0SW1hZ2VVUkwoKSk7DQotLy8JCXcucHJpbnRsbihpbisiICAgIisib3M9XCIiK2ZlYXR1cmUuZ2V0T1MoKSsiXCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyJ3cz1cIiIrZmVhdHVyZS5nZXRXUygpKyJcIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIiAgICIrIm5sPVwiIitmZWF0dXJlLmdldE5MKCkrIlwiIik7DQotLy8JCXcucHJpbnRsbihpbisiICAgIisiYXBwbGljYXRpb249XCIiK2ZlYXR1cmUuZ2V0QXBwbGljYXRpb24oKSsiXCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7DQotLy8JCQ0KLS8vCQl3cml0ZURlc2NyaXB0aW9uKHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsNCi0vLwkJd3JpdGVDb3B5cmlnaHQodywgbGV2ZWwrMSwgZmVhdHVyZS5nZXRDb3B5cmlnaHRNb2RlbCgpKTsNCi0vLwkJd3JpdGVMaWNlbnNlKHcsIGxldmVsKzEsIGZlYXR1cmUuZ2V0TGljZW5zZU1vZGVsKCkpOw0KLS8vCQl3cml0ZVVSTHModywgbGV2ZWwrMSwgZmVhdHVyZSk7DQotLy8JCXdyaXRlUHJlcmVxcyh3LCBsZXZlbCsxLCBmZWF0dXJlKTsNCi0vLwkJd3JpdGVQbHVnaW5FbnRyaWVzKHcsIGxldmVsKzEsIGZlYXR1cmUpOw0KLS8vCQl3cml0ZU5vblBsdWdpbkVudHJpZXModywgbGV2ZWwrMSwgZmVhdHVyZSk7DQotLy8JCSAgICAgICAgIA0KLS8vICAgICAgICB3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsNCi0vLwl9DQotLy8JDQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZURlc2NyaXB0aW9uKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgVVJMRW50cnlNb2RlbCB1ZSkgew0KLS8vCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLS8vCQl3LnByaW50bG4oIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIjxkZXNjcmlwdGlvbiB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK3VlLmdldFVSTCgpKyI+Iik7DQotLy8JCXcucHJpbnRsbihpbit1ZS5nZXRBbm5vdGF0aW9uKCkpOw0KLS8vCQl3LnByaW50bG4oaW4rIjwvZGVzY3JpcHRpb24+Iik7DQotLy8JfQ0KLS8vCQ0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVDb3B5cmlnaHQoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBVUkxFbnRyeU1vZGVsIHVlKSB7DQotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotLy8JCXcucHJpbnRsbigiIik7DQotLy8JCXcucHJpbnRsbihpbisiPGNvcHlyaWdodCB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK3VlLmdldFVSTCgpKyI+Iik7DQotLy8JCXcucHJpbnRsbihpbit1ZS5nZXRBbm5vdGF0aW9uKCkpOw0KLS8vCQl3LnByaW50bG4oaW4rIjwvY29weXJpZ2h0PiIpOw0KLS8vCX0NCi0vLwkNCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTGljZW5zZShQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsNCi0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0vLwkJdy5wcmludGxuKCIiKTsNCi0vLwkJdy5wcmludGxuKGluKyI8bGljZW5zZSB1cmw9XCIiK3VlLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK3VlLmdldFVSTCgpKyI+Iik7DQotLy8JCXcucHJpbnRsbihpbit1ZS5nZXRBbm5vdGF0aW9uKCkpOw0KLS8vCQl3LnByaW50bG4oaW4rIjwvbGljZW5zZT4iKTsNCi0vLwl9DQotLy8JDQotLy8JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVVSTHMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBGZWF0dXJlTW9kZWwgZmVhdHVyZSkgew0KLS8vCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLS8vCQlTdHJpbmcgaW4yID0gZ2V0SW5kZW50KGxldmVsKzEpOw0KLS8vCQl3LnByaW50bG4oIiIpOw0KLS8vCQl3LnByaW50bG4oaW4rIjx1cmw+Iik7DQotLy8JCQ0KLS8vCQlVUkxFbnRyeU1vZGVsIHVwZGF0ZSA9IGZlYXR1cmUuZ2V0VXBkYXRlU2l0ZUVudHJ5TW9kZWwoKTsNCi0vLwkJdy5wcmludGxuKGluMisiPHVwZGF0ZSIpOw0KLS8vCQl3LnByaW50bG4oaW4yKyIgICAiKyJ1cmw9XCIiK3VwZGF0ZS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIit1cGRhdGUuZ2V0VVJMKCkpOw0KLS8vCQl3LnByaW50bG4oaW4yKyIgICAiKyJsYWJlbD1cIiIrdXBkYXRlLmdldEFubm90YXRpb24oKSsiXCIiKTsNCi0vLwkJdy5wcmludGxuKGluMisiICAgIisiLz4iKTsNCi0vLwkJDQotLy8JCVVSTEVudHJ5TW9kZWxbXSBkaXNjb3ZlcnkgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOw0KLS8vCQlmb3IgKGludCBpPTA7IGk8ZGlzY292ZXJ5Lmxlbmd0aDsgaSsrKSB7DQotLy8JCQl3LnByaW50bG4oaW4yKyI8ZGlzY292ZXJ5Iik7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJ1cmw9XCIiK2Rpc2NvdmVyeVtpXS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIitkaXNjb3ZlcnlbaV0uZ2V0VVJMKCkpOw0KLS8vCQkJdy5wcmludGxuKGluMisiICAgIisibGFiZWw9XCIiK2Rpc2NvdmVyeVtpXS5nZXRBbm5vdGF0aW9uKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOw0KLS8vCQl9DQotLy8JCQ0KLS8vCQl3LnByaW50bG4oaW4rIjwvdXJsPiIpOw0KLS8vCX0NCi0vLwkNCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUHJlcmVxcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7DQotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotLy8JCVN0cmluZyBpbjIgPSBnZXRJbmRlbnQobGV2ZWwrMSk7DQotLy8JCXcucHJpbnRsbigiIik7DQotLy8JCXcucHJpbnRsbihpbisiPHJlcXVpcmVzPiIpOw0KLS8vCQkNCi0vLwkJSW1wb3J0TW9kZWxbXSBpbXAgPSBmZWF0dXJlLmdldEltcG9ydE1vZGVscygpOw0KLS8vCQlmb3IgKGludCBpPTA7IGk8aW1wLmxlbmd0aDsgaSsrKSB7DQotLy8JCQl3LnByaW50bG4oaW4yKyI8aW1wb3J0Iik7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJwbHVnaW49XCIiK2ltcFtpXS5nZXRJZGVudGlmaWVyKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyJ2ZXJzaW9uPVwiIitpbXBbaV0uZ2V0VmVyc2lvbigpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluMisiICAgIisibWF0Y2g9XCIiK2ltcFtpXS5nZXRNYXRjaGluZ1J1bGVOYW1lKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4yKyIgICAiKyIvPiIpOw0KLS8vCQl9DQotLy8JCQ0KLS8vCQl3LnByaW50bG4oaW4rIjwvcmVxdWlyZXM+Iik7DQotLy8JfQ0KLS8vCQ0KLS8vCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVQbHVnaW5FbnRyaWVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgRmVhdHVyZU1vZGVsIGZlYXR1cmUpIHsNCi0vLwkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0vLwkJdy5wcmludGxuKCIiKTsNCi0vLwkJDQotLy8JCVBsdWdpbkVudHJ5TW9kZWxbXSBwbHVnaW4gPSBmZWF0dXJlLmdldFBsdWdpbkVudHJ5TW9kZWxzKCk7DQotLy8JCWZvciAoaW50IGk9MDsgaTxwbHVnaW4ubGVuZ3RoOyBpKyspIHsNCi0vLwkJCXcucHJpbnRsbihpbisiPHBsdWdpbiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpZD1cIiIrcGx1Z2luW2ldLmdldFBsdWdpbklkZW50aWZpZXIoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisidmVyc2lvbj1cIiIrcGx1Z2luW2ldLmdldFBsdWdpblZlcnNpb24oKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisiZnJhZ21lbnQ9XCIiK3BsdWdpbltpXS5pc0ZyYWdtZW50KCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrIm9zPVwiIitwbHVnaW5baV0uZ2V0T1MoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisid3M9XCIiK3BsdWdpbltpXS5nZXRXUygpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJubD1cIiIrcGx1Z2luW2ldLmdldE5MKCkrIlwiIik7DQotLy8JCQl3LnByaW50bG4oaW4rIiAgICIrImRvd25sb2FkLXNpemU9XCIiK3BsdWdpbltpXS5nZXREb3dubG9hZFNpemUoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisiaW5zdGFsbC1zaXplPVwiIitwbHVnaW5baV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsNCi0vLwkJfQ0KLS8vCX0NCi0vLwkNCi0vLwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlTm9uUGx1Z2luRW50cmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIEZlYXR1cmVNb2RlbCBmZWF0dXJlKSB7DQotLy8JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotLy8JCXcucHJpbnRsbigiIik7DQotLy8JCQ0KLS8vCQlOb25QbHVnaW5FbnRyeU1vZGVsW10gZGF0YSA9IGZlYXR1cmUuZ2V0Tm9uUGx1Z2luRW50cnlNb2RlbHMoKTsNCi0vLwkJZm9yIChpbnQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspIHsNCi0vLwkJCXcucHJpbnRsbihpbisiPGRhdGEiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisiaWQ9XCIiK2RhdGFbaV0uZ2V0SWRlbnRpZmllcigpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJkb3dubG9hZC1zaXplPVwiIitkYXRhW2ldLmdldERvd25sb2FkU2l6ZSgpKyJcIiIpOw0KLS8vCQkJdy5wcmludGxuKGluKyIgICAiKyJpbnN0YWxsLXNpemU9XCIiK2RhdGFbaV0uZ2V0SW5zdGFsbFNpemUoKSsiXCIiKTsNCi0vLwkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsNCi0vLwkJfQ0KLS8vCX0NCi0vLwkNCi0vLwkNCi0vLwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SW5kZW50KGludCBsZXZlbCkgew0KLS8vCQlTdHJpbmcgaW5kZW50ID0gIiI7DQotLy8JCWZvciAoaW50IGk9MDsgaTxsZXZlbDsgaSsrKSANCi0vLwkJCWluZGVudCArPSAiICAgIjsNCi0vLwkJcmV0dXJuIGluZGVudDsNCi0vLwl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL1NpdGVNYWluLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9TaXRlTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIwMjY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL1NpdGVNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuU2l0ZUZlYXR1cmVSZWZlcmVuY2VNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZU1haW4gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkNCi0JcHVibGljIFNpdGVNYWluKFN0cmluZyBuYW1lKXsNCi0JCXN1cGVyKG5hbWUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RNYWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQkNCi0JCVN0cmluZ1dyaXRlciBzdHJXcml0ZXI9bmV3IFN0cmluZ1dyaXRlcigpOw0KLQkJUHJpbnRXcml0ZXIgdyA9IG5ldyBQcmludFdyaXRlcihzdHJXcml0ZXIpOw0KLQ0KLQkJcHJvY2Vzcygic2l0ZV9vbGRfZm9ybWF0LnhtbCIsdyk7DQotCQlwcm9jZXNzKCJzaXRlLnhtbCIsdyk7DQotCQl0cnkgew0KLQkJCXByb2Nlc3MoInNpdGVfd2l0aF90eXBlLnhtbCIsdyk7DQotCQkJZmFpbCgiSW52YWxpZFNpdGVUeXBlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsNCi0JCX0gY2F0Y2ggKEludmFsaWRTaXRlVHlwZUV4Y2VwdGlvbiBlKSB7DQotCQkJYXNzZXJ0RXF1YWxzKGUuZ2V0TmV3VHlwZSgpLCJzb21lLm90aGVyLnNpdGUudHlwZSIpOw0KLQkJfSBmaW5hbGx5IHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyV3JpdGVyKTsNCi0JCQl3LmNsb3NlKCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2VzcyhTdHJpbmcgeG1sLCBQcmludFdyaXRlciB3KSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JCQ0KLQkJU2l0ZU1vZGVsRmFjdG9yeSBmYWN0b3J5ID0gbmV3IFNpdGVNb2RlbEZhY3RvcnkoKTsNCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsNCi0JCVNpdGVNb2RlbCBzaXRlID0gbnVsbDsNCi0JCQ0KLQkJdy5wcmludGxuKCIiKTsNCi0JCXcucHJpbnRsbigiUGFyc2luZyBzaXRlIG1hcCAuLi4iKTsNCi0JCXRyeSB7DQotCQkJaXMgPSBTaXRlTWFpbi5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKHhtbCk7CQkNCi0JCQlzaXRlID0gZmFjdG9yeS5wYXJzZVNpdGUoaXMpOw0KLQkJfSAgZmluYWxseSB7DQotCQkJaWYgKGlzICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsgaXMuY2xvc2UoKTt9IGNhdGNoKElPRXhjZXB0aW9uIGUpIHt9DQotCQkJfQ0KLQkJfQ0KLQkJDQotCQlpZiAoc2l0ZSA9PSBudWxsKSByZXR1cm47DQotCQkNCi0JCVN0cmluZyBiYXNlID0gImh0dHA6Ly9hbm90aGVyLnNlcnZlci9zaXRlLnhtbCI7DQotCQl3LnByaW50bG4oIlJlc29sdmluZyBzaXRlIHVzaW5nICIrYmFzZSsiIC4uLiIpOw0KLQkJc2l0ZS5yZXNvbHZlKG5ldyBVUkwoYmFzZSksIG51bGwpOw0KLQkJDQotCQl3LnByaW50bG4oIldyaXRpbmcgc2l0ZSAuLi4iKTsNCi0JCXdyaXRlU2l0ZSh3LDAsc2l0ZSk7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTaXRlKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZU1vZGVsIHNpdGUpIHsNCi0JCWlmIChzaXRlID09IG51bGwpIHJldHVybjsNCi0JCQ0KLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0JCXcucHJpbnRsbihpbisiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+Iik7DQotCQkNCi0JCXcucHJpbnRsbihpbisiPHNpdGUiKTsNCi0JCXcucHJpbnRsbihpbisiICAgIisidHlwZT1cIiIrc2l0ZS5nZXRUeXBlKCkrIlwiIik7DQotCQl3LnByaW50bG4oaW4rIiAgICIrIj4iKTsNCi0JCQ0KLQkJd3JpdGVEZXNjcmlwdGlvbih3LCBsZXZlbCsxLCBzaXRlLmdldERlc2NyaXB0aW9uTW9kZWwoKSk7DQotCQl3cml0ZUZlYXR1cmVzKHcsIGxldmVsKzEsIHNpdGUpOw0KLQkJd3JpdGVBcmNoaXZlcyh3LCBsZXZlbCsxLCBzaXRlKTsNCi0JCXdyaXRlQ2F0ZWdvcnlEZWZzKHcsIGxldmVsKzEsIHNpdGUpOw0KLSAgICAgICAgIA0KLSAgICAgICAgdy5wcmludGxuKGluKyI8L2ZlYXR1cmU+Iik7DQotCX0NCi0JDQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVEZXNjcmlwdGlvbihQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFVSTEVudHJ5TW9kZWwgdWUpIHsNCi0JCWlmICh1ZSA9PSBudWxsKSByZXR1cm47DQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLQkJdy5wcmludGxuKCIiKTsNCi0JCXcucHJpbnRsbihpbisiPGRlc2NyaXB0aW9uIHVybD1cIiIrdWUuZ2V0VVJMU3RyaW5nKCkrIlwiIC0+ICIrdWUuZ2V0VVJMKCkrIj4iKTsNCi0JCXcucHJpbnRsbihpbit1ZS5nZXRBbm5vdGF0aW9uKCkpOw0KLQkJdy5wcmludGxuKGluKyI8L2Rlc2NyaXB0aW9uPiIpOw0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlRmVhdHVyZXMoUHJpbnRXcml0ZXIgdywgaW50IGxldmVsLCBTaXRlTW9kZWwgc2l0ZSkgew0KLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0JCWdldEluZGVudChsZXZlbCsxKTsNCi0JCXcucHJpbnRsbigiIik7DQotCQkNCi0JCVNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJZm9yIChpbnQgaT0wOyBpPGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQotCQkJdy5wcmludGxuKGluKyI8ZmVhdHVyZSIpOw0KLQkJCXcucHJpbnRsbihpbisiICAgIisidHlwZT1cIiIrZmVhdHVyZXNbaV0uZ2V0VHlwZSgpKyJcIiIpOw0KLQkJCXcucHJpbnRsbihpbisiICAgIisidXJsPVwiIitmZWF0dXJlc1tpXS5nZXRVUkxTdHJpbmcoKSsiXCIgLT4gIitmZWF0dXJlc1tpXS5nZXRVUkwoKSk7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7DQotCQkJd3JpdGVDYXRlZ29yaWVzKHcsIGxldmVsKzEsIGZlYXR1cmVzW2ldKTsNCi0JCQl3LnByaW50bG4oaW4rIjwvZmVhdHVyZT4iKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUFyY2hpdmVzKFByaW50V3JpdGVyIHcsIGludCBsZXZlbCwgU2l0ZU1vZGVsIHNpdGUpIHsNCi0JCVN0cmluZyBpbiA9IGdldEluZGVudChsZXZlbCk7DQotCQl3LnByaW50bG4oIiIpOw0KLQkJDQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlID0gc2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7DQotCQlmb3IgKGludCBpPTA7IGk8YXJjaGl2ZS5sZW5ndGg7IGkrKykgew0KLQkJCXcucHJpbnRsbihpbisiPGFyY2hpdmUiKTsNCi0JCQl3LnByaW50bG4oaW4rIiAgICIrInBhdGg9XCIiK2FyY2hpdmVbaV0uZ2V0UGF0aCgpKyJcIiIpOw0KLQkJCXcucHJpbnRsbihpbisiICAgIisidXJsPVwiIithcmNoaXZlW2ldLmdldFVSTFN0cmluZygpKyJcIiAtPiAiK2FyY2hpdmVbaV0uZ2V0VVJMKCkpOw0KLQkJCXcucHJpbnRsbihpbisiICAgIisiLz4iKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZUNhdGVnb3J5RGVmcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVNb2RlbCBzaXRlKSB7DQotCQlTdHJpbmcgaW4gPSBnZXRJbmRlbnQobGV2ZWwpOw0KLQkJZ2V0SW5kZW50KGxldmVsKzEpOw0KLQkJdy5wcmludGxuKCIiKTsNCi0JCQ0KLQkJQ2F0ZWdvcnlNb2RlbFtdIGNhdCA9IHNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsNCi0JCWZvciAoaW50IGk9MDsgaTxjYXQubGVuZ3RoOyBpKyspIHsNCi0JCQl3LnByaW50bG4oaW4rIjxjYXRlZ29yeS1kZWYiKTsNCi0JCQl3LnByaW50bG4oaW4rIiAgICIrIm5hbWU9XCIiK2NhdFtpXS5nZXROYW1lKCkrIlwiIik7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyJsYWJlbD1cIiIrY2F0W2ldLmdldExhYmVsKCkrIlwiIik7DQotCQkJdy5wcmludGxuKGluKyIgICAiKyI+Iik7DQotCQkJd3JpdGVEZXNjcmlwdGlvbih3LCBsZXZlbCsxLCBjYXRbaV0uZ2V0RGVzY3JpcHRpb25Nb2RlbCgpKTsNCi0JCQl3LnByaW50bG4oaW4rIjwvY2F0ZWdvcnktZGVmPiIpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2F0ZWdvcmllcyhQcmludFdyaXRlciB3LCBpbnQgbGV2ZWwsIFNpdGVGZWF0dXJlUmVmZXJlbmNlTW9kZWwgZmVhdHVyZSkgew0KLQkJU3RyaW5nIGluID0gZ2V0SW5kZW50KGxldmVsKTsNCi0JCVN0cmluZ1tdIGNhdCA9IGZlYXR1cmUuZ2V0Q2F0ZWdvcnlOYW1lcygpOw0KLQkJZm9yIChpbnQgaT0wOyBpPGNhdC5sZW5ndGg7IGkrKykgew0KLQkJCXcucHJpbnRsbihpbisiPGNhdGVnb3J5IG5hbWU9XCIiK2NhdFtpXSsiXCIiKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEluZGVudChpbnQgbGV2ZWwpIHsNCi0JCVN0cmluZyBpbmRlbnQgPSAiIjsNCi0JCWZvciAoaW50IGk9MDsgaTxsZXZlbDsgaSsrKSANCi0JCQlpbmRlbnQgKz0gIiAgICI7DQotCQlyZXR1cm4gaW5kZW50Ow0KLQl9DQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkYjk2NTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTxmZWF0dXJlIGlkPSJteS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjcuMSIgbGFiZWw9IiVzMSIgcHJvdmlkZXItbmFtZT0iVksgSW5jLiINCi0gICAgICAgICBpbWFnZT0iaW1hZ2VzL2ZlYXR1cmUuZ2lmIiBvcz0iV2luMzIiIHdzPSJXaW4zMiIgbmw9ImVuX0NBLGVuX1VTIg0KLSAgICAgICAgIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2giPg0KLQ0KLSAgIDxpbnN0YWxsLWhhbmRsZXIgdXJsPSJpbnN0YWxsL2hhbmRsZXIuaHRtbCIgbGlicmFyeT0iY3VzdG9tLmphciIgY2xhc3M9Ikluc3RhbGxIYW5kbGVyIi8+DQotICAgDQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vZmVhdHVyZXMvbXkuZmVhdHVyZSI+DQotICAgICAgRGVzY3JpcHRpb24gb2YgbXkuZmVhdHVyZQ0KLSAgIDwvZGVzY3JpcHRpb24+DQotICAgDQotICAgPGNvcHlyaWdodCB1cmw9ImNvcHlyaWdodC9teS5mZWF0dXJlIj4NCi0gICAgICBDb3B5cmlnaHQgZm9yIG15LmZlYXR1cmUNCi0gICA8L2NvcHlyaWdodD4NCi0gICANCi0gICA8bGljZW5zZSB1cmw9IiV1cmwxIj4NCi0gICAgICBMaWNlbnNlIGZvciBteS5mZWF0dXJlDQotICAgPC9saWNlbnNlPg0KLSAgIA0KLSAgIDx1cmw+DQotICAgICAgPHVwZGF0ZSB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3VwZGF0ZSIgbGFiZWw9IlVwZGF0ZSBzaXRlIi8+DQotICAgICAgPGRpc2NvdmVyeSB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL2Rpc2NvdmVyeTEiIGxhYmVsPSIlczIiLz4NCi0gICAgICA8ZGlzY292ZXJ5IHVybD0iJXVybDIiIGxhYmVsPSIlczMgRGlzY292ZXJ5IHNpdGUgMiIvPg0KLSAgICAgIDxkaXNjb3ZlcnkgdXJsPSIldXJsMyBodHRwOi8vd3d3LnRvb2xzLmNvbS9kaXNjb3ZlcnkzIiBsYWJlbD0iRGlzY292ZXJ5IHNpdGUgMyIvPg0KLSAgIDwvdXJsPg0KLSAgIA0KLSAgIDxyZXF1aXJlcz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0icGx1Z2luLjEiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0icGVyZmVjdCIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJwbHVnaW4uMiIgdmVyc2lvbj0iMy4yLjAiLz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0icGx1Z2luLjMiLz4NCi0gICA8L3JlcXVpcmVzPg0KLSAgIA0KLSAgIDxwbHVnaW4gaWQ9Im15LnBsdWdpbi4xIiB2ZXJzaW9uPSIxLjAuMCIgZnJhZ21lbnQ9InRydWUiDQotICAgICAgICAgICBvcz0iV2luMzIiIHdzPSJXaW4zMiIgbmw9ImVuX1VTIiBkb3dubG9hZC1zaXplPSIyMzQ1NiIgaW5zdGFsbC1zaXplPSIxMjM0NTY3Ii8+DQotICAgPHBsdWdpbiBpZD0ibXkucGx1Z2luLjIiIHZlcnNpb249IjEuMC4xIi8+DQotICAgPHBsdWdpbiBpZD0ibXkucGx1Z2luLjMiIHZlcnNpb249IjEuMC4yIi8+DQotICAgDQotICAgPGRhdGEgaWQ9ImV4YW1wbGVzLnppcCIgZG93bmxvYWQtc2l6ZT0iMjM0NTYiIGluc3RhbGwtc2l6ZT0iMTIzNDU2NyIvPg0KLSAgIDxkYXRhIGlkPSJjdXN0b20vcnQuamFyIi8+DQotDQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MTZmMjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTxzaXRlPg0KLQ0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiPg0KLSAgICAgIFNpdGUgZGVzY3JpcHRpb24NCi0gICA8L2Rlc2NyaXB0aW9uPg0KLQ0KLSAgIDxmZWF0dXJlIHR5cGU9Im15LmZlYXR1cmUudHlwZSIgdXJsPSJmZWF0dXJlMS5qYXIiPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ0b29scyIvPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4NCi0gICAgICA8Y2F0ZWdvcnkgbmFtZT0id2luZG93cy50b29scyIvPg0KLSAgIDwvZmVhdHVyZT4NCi0gICANCi0gICA8ZmVhdHVyZSB0eXBlPSIiIHVybD0iZmlsZTovZmVhdHVyZTIuamFyIj4NCi0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idXRpbGl0aWVzIi8+DQotICAgPC9mZWF0dXJlPg0KLSAgIA0KLSAgIA0KLSAgIDxhcmNoaXZlIHBhdGg9ImZpcnN0L2FyY2hpdmUiIHVybD0iYXJjaGl2ZTEuamFyIi8+DQotICAgPGFyY2hpdmUgcGF0aD0ic2Vjb25kL2FyY2hpdmUiIHVybD0iYXJjaGl2ZTIuamFyIi8+DQotICAgDQotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ0b29scyIgbGFiZWw9IkRldmVsb3BtZW50IFRvb2xzIj4NCi0gICAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LnRvb2xzLmNvbS90b29scyI+DQotICAgICAgICAgVGhpcyBpcyBkZXNjcmlwdGlvbiBmb3IgdG9vbHMNCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgIDwvY2F0ZWdvcnktZGVmPg0KLSAgIA0KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0idXRpbGl0aWVzIiBsYWJlbD0iVXRpbGl0aWVzIj4NCi0gICAgICA8ZGVzY3JpcHRpb24gdXJsPSJ0b29scy5odG1sIi8+Lw0KLSAgIDwvY2F0ZWdvcnktZGVmPg0KLSAgIA0KLSAgIDxjYXRlZ29yeS1kZWYgbmFtZT0id2luZG93cy50b29scyIgbGFiZWw9IldpbmRvd3MgRGV2ZWxvcG1lbnQgVG9vbHMiLz4NCi0NCi08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL21vZGVsL3NpdGVfb2xkX2Zvcm1hdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTBlZjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV9vbGRfZm9ybWF0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotDQotPHNpdGUgdXJsPSJ3d3cudG9vbHMuY29tL3VwZGF0ZVNpdGUiPg0KLQ0KLSAgIDxmZWF0dXJlIHR5cGU9Im15LmZlYXR1cmUudHlwZSIgdXJsPSJmZWF0dXJlMS5qYXIiPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ0b29scyIvPg0KLSAgICAgIDxjYXRlZ29yeSBuYW1lPSJ1dGlsaXRpZXMiLz4NCi0gICAgICA8Y2F0ZWdvcnkgbmFtZT0id2luZG93cy50b29scyIvPg0KLSAgIDwvZmVhdHVyZT4NCi0gICANCi0gICA8ZmVhdHVyZSB0eXBlPSIiIHVybD0iZmVhdHVyZTIuamFyIj4NCi0gICAgICA8Y2F0ZWdvcnkgbmFtZT0idXRpbGl0aWVzIi8+DQotICAgPC9mZWF0dXJlPg0KLSAgDQotICAgPGFyY2hpdmUgcGF0aD0iZmlyc3QvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMS5qYXIiLz4NCi0gICA8YXJjaGl2ZSBwYXRoPSJzZWNvbmQvYXJjaGl2ZSIgdXJsPSJhcmNoaXZlMi5qYXIiLz4NCi0gICANCi0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9InRvb2xzIiBsYWJlbD0iRGV2ZWxvcG1lbnQgVG9vbHMiPg0KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cudG9vbHMuY29tL3Rvb2xzIj4NCi0gICAgICAgICBUaGlzIGlzIGRlc2NyaXB0aW9uIGZvciB0b29scw0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgPC9jYXRlZ29yeS1kZWY+DQotICAgDQotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ1dGlsaXRpZXMiIGxhYmVsPSJVdGlsaXRpZXMiPg0KLSAgICAgIDxkZXNjcmlwdGlvbiB1cmw9InV0aWxpdGllcy5odG1sIi8+DQotICAgPC9jYXRlZ29yeS1kZWY+DQotICAgDQotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ3aW5kb3dzLnRvb2xzIiBsYWJlbD0iV2luZG93cyBEZXZlbG9wbWVudCBUb29scyIvPg0KLQ0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC9zaXRlX3dpdGhfdHlwZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTNhM2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvc2l0ZV93aXRoX3R5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTxzaXRlIHVybD0iaHR0cDovL3d3dy50b29scy5jb20vdXBkYXRlU2l0ZSIgdHlwZT0ic29tZS5vdGhlci5zaXRlLnR5cGUiPg0KLQ0KLTwvc2l0ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC90ZXN0LnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9tb2RlbC90ZXN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMDE4MTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbW9kZWwvdGVzdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi1zMSA9IFN0cmluZyAxDQotczIgPSBTdHJpbmcgMg0KLXVybDEgPSByZWxhdGl2ZS9pbmRleC5odG1sDQotdXJsMiA9IGh0dHA6Ly9zb21lLnNlcnZlci90b29scy5odG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvbmF0aXZlVGVzdHMvVGVzdExvY2FsU3lzdGVtSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNjY2JkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25hdGl2ZVRlc3RzL1Rlc3RMb2NhbFN5c3RlbUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLm5hdGl2ZVRlc3RzOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklWb2x1bWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uTG9jYWxTeXN0ZW1JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0TG9jYWxTeXN0ZW1JbmZvIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgdGhlIG5hdGl2ZXMKLQkgKi8KLQlwdWJsaWMgVGVzdExvY2FsU3lzdGVtSW5mbyhTdHJpbmcgYXJnMCkgewotCQlzdXBlcihhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCi0JCS8vIG1vdW50IHBvaW50Ci0gICAgICAgSVZvbHVtZVtdIGEgPSBMb2NhbFN5c3RlbUluZm8uZ2V0Vm9sdW1lcygpOwotICAgICAgICBpZiAoYT09bnVsbCkgdGhyb3cgbmV3IEV4Y2VwdGlvbigiY2Fubm90IGZpbmQgbmF0aXZlIGxpYnJhcnkiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJGb3VuZCAiK2EubGVuZ3RoKyIgbW91bnQgcG9pbnRzLiIpOwotCQlmb3IgKGludCBpID0wOyBpPGEubGVuZ3RoO2krKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCIjIitpKyIgLSAiK2FbaV0pOwotCQkJCi0JCQlGaWxlIHJvb3QgPSBhW2ldLmdldEZpbGUoKTsKLQkJCVN0cmluZyBsYWJlbCA9IGFbaV0uZ2V0TGFiZWwoKTsKLQkJCWlmIChsYWJlbD09bnVsbCkgbGFiZWw9Ik5PIExBQkVMIjsKLQkJCWludCB0eXBlID0gYVtpXS5nZXRUeXBlKCk7Ci0JCQlsb25nIHNpemUgPSBMb2NhbFN5c3RlbUluZm8uZ2V0RnJlZVNwYWNlKHJvb3QpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLT46IitsYWJlbCsiOiIrZ2V0VHlwZSh0eXBlKSsiOiIrZ2V0U2l6ZShzaXplKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VHlwZShpbnQgdHlwZSl7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX0ZJWEVEIDoKLQkJCQlyZXR1cm4gIlZPTFVNRSBGSVhFRCI7Ci0JCQljYXNlIExvY2FsU3lzdGVtSW5mby5WT0xVTUVfUkVNT1RFIDoKLQkJCQlyZXR1cm4gIlZPTFVNRSBSRU1PVEUiOwotCQkJY2FzZSBMb2NhbFN5c3RlbUluZm8uVk9MVU1FX1JFTU9WQUJMRSA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgUkVNT1ZBQkxFIjsKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9DRFJPTSA6Ci0JCQkJcmV0dXJuICJWT0xVTUUgQ0RST00iOwkJCQkKLQkJCWNhc2UgTG9jYWxTeXN0ZW1JbmZvLlZPTFVNRV9VTktOT1dOIDoKLQkJCQlyZXR1cm4gIlZPTFVNRSBVTktOT1dOIjsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiAiV1JPTkcgVk9MVU1FIElORk8iOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFNpemUobG9uZyBzaXplKXsKLQkJaWYgKHNpemU9PUxvY2FsU3lzdGVtSW5mby5TSVpFX1VOS05PV04pIHJldHVybiAiVU5LTk9XTiBTSVpFIjsKLQkJCi0JCWxvbmcga2IgPSBzaXplLygxMDI0KjEwMjQpOwotCQlyZXR1cm4gbmV3IFN0cmluZyhzaXplKyIgKCIra2IrIk1CKSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL0FsbE5lc3RlZFRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9BbGxOZXN0ZWRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzIzM2MwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL0FsbE5lc3RlZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5uZXN0ZWRmZWF0dXJlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWxsTmVzdGVkVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotcHVibGljIEFsbE5lc3RlZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0Jc3VwZXIobmFtZSk7Ci19Ci1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOwotCXN1aXRlLnNldE5hbWUoIk5lc3RlZCBJbnN0YWxsIFRlc3RzIik7Ci0JCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcKLQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbC5jbGFzcykpOwotCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QKLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQotCQotCXJldHVybiBzdWl0ZTsKLX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9uZXN0ZWRmZWF0dXJlcy9UZXN0SW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTcyZGJlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL25lc3RlZGZlYXR1cmVzL1Rlc3RJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMubmVzdGVkZmVhdHVyZXM7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgVGVzdEluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxCi0JICovCi0JcHVibGljIFRlc3RJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJLy9jbGVhbnVwIHRhcmdldCAKLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwkJCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7Ci0JCQotCi0JCUlTaXRlIHJlbW90ZVNpdGUgPQotCQkJU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsICJuZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwiKSxudWxsKTsKLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIHZlcmlmeSByb290IEZlYXR1cmUKLQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5GaWxlLAotCQkJcGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0JCUZpbGUgcGx1Z2luWE1MRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKLQotCQlGaWxlIGZlYXR1cmVGaWxlID0KLQkJCW5ldyBGaWxlKAotCQkJCXNpdGUsCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgKLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkvLyBjbGVhbiBwbHVnaW5zICYgZmVhdHVyZQotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBsdWdpbk5hbWUgPSBlbnRyaWVzW2ldLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOwotCQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4oZW50cmllc1tpXSk7Ci0JCX0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZlYXR1cmVGaWxlKTsKLQotCQkvLyB2ZXJpZnkgY2hpbGQgRmVhdHVyZQotCQlJRmVhdHVyZSBjaGlsZEZlYXR1cmUgPQotCQkJcmVtb3RlRmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsKLQkJZW50cmllcyA9IGNoaWxkRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5GaWxlLAotCQkJcGx1Z2luRmlsZS5leGlzdHMoKSk7Ci0JCXBsdWdpblhNTEZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lICsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOwotCQlhc3NlcnRUcnVlKCJwbHVnaW4ueG1sIGZpbGUgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7Ci0KLQkJZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIGNoaWxkRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCWFzc2VydFRydWUoCi0JCQkiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgZmVhdHVyZUZpbGUsCi0JCQlmZWF0dXJlRmlsZS5leGlzdHMoKSk7Ci0KLQkJLy8gY2xlYW4gcGx1Z2lucwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOwotCQl9Ci0KLQkJLy8gY2xlYW4gZmVhdHVyZXMKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZlYXR1cmVGaWxlKTsKLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsKLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlJU2l0ZSByZW1vdGVTaXRlID0KLQkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfSFRUUF9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0LyIpLG51bGwpOwotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsKLQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkKLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoInJvb3RmZWF0dXJlLmphciIpKSB7Ci0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCByb290ZmVhdHVyZS5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOwotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7Ci0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOwotCi0JCS8vIHJvb3RmZWF0dXJlLmphciBzaG91bGQgbm90IGJlIGluIHRoZSBsb2NhbCBzaXRlCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgicm9vdGZlYXR1cmUuamFyIikpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlhc3NlcnRUcnVlKAotCQkJIkZvdW5kIHJvb3RmZWF0dXJlLmphciBvbiB0YXJnZXQgc2l0ZS4gVGFyZ2V0IHNpdGUgZmVhdHVyZSByZWYgc2hvdWxkbm90IGNvbnRhaW4gSkFSIGZpbGUiLAotCQkJIWZvdW5kKTsKLQotCQkvLyBjaGVjayByb290Ci0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsKLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7Ci0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJwbHVnaW4gZmlsZXMgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBwbHVnaW5GaWxlLAotCQkJcGx1Z2luRmlsZS5leGlzdHMoKSk7CQkKLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSsgRmlsZS5zZXBhcmF0b3IgKyAicGx1Z2luLnhtbCIpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiICsgcGx1Z2luWE1MRmlsZSwKLQkJCXBsdWdpblhNTEZpbGUuZXhpc3RzKCkpOwotCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQotCQkJbmV3IEZpbGUoCi0JCQkJc2l0ZSwKLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOwotCi0JCS8vIGNsZWFuIHBsdWdpbnMgJiBmZWF0dXJlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCQlJbnN0YWxsUmVnaXN0cnkudW5yZWdpc3RlclBsdWdpbihlbnRyaWVzW2ldKTsKLQkJfQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCi0JCS8vIHZlcmlmeSBjaGlsZCBGZWF0dXJlCi0JCUlGZWF0dXJlIGNoaWxkRmVhdHVyZSA9Ci0JCQlyZW1vdGVGZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOwotCQllbnRyaWVzID0gY2hpbGRGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOwotCQlwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLQkJcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotCQlhc3NlcnRUcnVlKAotCQkJInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIHBsdWdpbkZpbGUsCi0JCQlwbHVnaW5GaWxlLmV4aXN0cygpKTsKLQkJcGx1Z2luWE1MRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7Ci0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsKLQotCQlmZWF0dXJlRmlsZSA9Ci0JCQluZXcgRmlsZSgKLQkJCQlzaXRlLAotCQkJCVNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRICi0JCQkJCSsgY2hpbGRGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsKLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwKLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLQotCQkvLyBjbGVhbiBwbHVnaW5zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0JCQlwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0JCX0KLQotCQkvLyBjbGVhbiBmZWF0dXJlcwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmVhdHVyZUZpbGUpOwotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOwotCX0KLQotLy8JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCi0vLwkJLy8gY2xlYW51cCBsb2NhbCBmaWxlcy4uLgotLy8JCVVSTCBsb2NhbFVSTCA9ICgoU2l0ZUxvY2FsKSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKTsKLS8vCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKGxvY2FsVVJMLmdldEZpbGUoKSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7Ci0vLwkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsKLS8vCi0vLwkJVVJMIElOU1RBTExfU0lURSA9IG51bGw7Ci0vLwkJdHJ5IHsKLS8vCQkJSU5TVEFMTF9TSVRFID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCAibmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sIik7Ci0vLwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vCQkJZmFpbChlLnRvU3RyaW5nKCkpOwotLy8JCQllLnByaW50U3RhY2tUcmFjZSgpOwotLy8JCX0KLS8vCi0vLwkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLG51bGwpOwotLy8JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0vLwkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7Ci0vLwotLy8JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotLy8JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOwotLy8KLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJyb290ZmVhdHVyZS5qYXIiKSkgewotLy8JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7Ci0vLwkJCQlicmVhazsKLS8vCQkJfQotLy8JCX0KLS8vCi0vLwkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgcm9vdGZlYXR1cmUuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsKLS8vCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotLy8JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0KLS8vCQkJbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07Ci0vLwotLy8JCSgoQ29uZmlndXJlZFNpdGUpc2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOwotLy8JCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsKLS8vCi0vLwkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOwotLy8JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsKLS8vCi0vLwkJU3RyaW5nIHNpdGVQYXRoID0gc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOwotLy8JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsKLS8vCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlUGF0aCwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsKLS8vCi0vLwkJRmlsZSBmZWF0dXJlRmlsZSA9Ci0vLwkJCW5ldyBGaWxlKAotLy8JCQkJc2l0ZVBhdGgsCi0vLwkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotLy8JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIGZlYXR1cmVGaWxlLmV4aXN0cygpKTsKLS8vCi0vLwkJLy9jbGVhbnVwCi0vLwkJRmlsZSBmaWxlID0KLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkKLS8vCQkJCQkrIEZpbGUuc2VwYXJhdG9yCi0vLwkJCQkJKyBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSAotLy8JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOwotLy8JCS8vIGNsZWFuIHBsdWdpbnMKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLS8vCQkJcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7Ci0vLwkJCXBsdWdpbkZpbGUgPQotLy8JCQkJbmV3IEZpbGUoCi0vLwkJCQkJc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpLAotLy8JCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOwotLy8JCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7Ci0vLwkJfQotLy8KLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7Ci0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSgKLS8vCQkJbmV3IEZpbGUoCi0vLwkJCQkoKEluc3RhbGxDb25maWd1cmF0aW9uKSBsb2NhbFNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSkKLS8vCQkJCQkuZ2V0VVJMKCkKLS8vCQkJCQkuZ2V0RmlsZSgpKSk7Ci0vLwl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvQWxsUGFyc2VyVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9BbGxQYXJzZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2MwMWE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9BbGxQYXJzZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7DQotDQotDQotcHVibGljIGNsYXNzIEFsbFBhcnNlclRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi1wdWJsaWMgQWxsUGFyc2VyVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0Jc3VwZXIobmFtZSk7DQotfQ0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQlzdWl0ZS5zZXROYW1lKCJQYXJzaW5nIFRlc3RzIik7DQotCQ0KLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0Jw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVQYXJzZS5jbGFzcykpOw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVQYXJzZS5jbGFzcykpOwkNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RDYXRlZ29yaWVzLmNsYXNzKSk7CQkNCi0JDQotCS8vIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGUgbWV0aG9kDQotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJDQotCQ0KLQlyZXR1cm4gc3VpdGU7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdENhdGVnb3JpZXMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDQzY2JmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0Q2F0ZWdvcmllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0Q2F0ZWdvcmllcyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0Q2F0ZWdvcmllcyhTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdENhdGVnb3JpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAieG1scy9zaXRlMS8iKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHJlbW90ZVVybCxudWxsKTsNCi0NCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkvL0lDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3JpZXMoKTsNCi0NCi0JCUlDYXRlZ29yeSBmZWF0dXJlQ2F0ZWdvcnkgPSBmZWF0dXJlWzBdLmdldENhdGVnb3JpZXMoKVswXTsNCi0NCi0JCWFzc2VydEVxdWFscygiVU1MIHRvb2xzIiwgZmVhdHVyZUNhdGVnb3J5LmdldExhYmVsKCkpOw0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlcmVkQ2F0ZWdvcmllcygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUocmVtb3RlVXJsLG51bGwpOw0KLQ0KLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcmllcygpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXQgb3JkZXJlZC0+IiArIGNhdGVnb3JpZXNbaV0uZ2V0TmFtZSgpKTsNCi0JCX0NCi0NCi0JCWFzc2VydEVxdWFscygiRWNsaXBzZSB0b29scyIsIGNhdGVnb3JpZXNbMV0uZ2V0TGFiZWwoKSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zbGF0ZWRDYXRlZ29yaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOw0KLQ0KLQkJSUNhdGVnb3J5W10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcmllcygpOw0KLQ0KLQkJYXNzZXJ0RXF1YWxzKCJSZXF1aXJlZCBEcml2ZXJzIiwgY2F0ZWdvcmllc1swXS5nZXRMYWJlbCgpKTsNCi0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdEZlYXR1cmVQYXJzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcGFyc2VyL1Rlc3RGZWF0dXJlUGFyc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyMmVlNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdEZlYXR1cmVQYXJzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRGVmYXVsdEZlYXR1cmVQYXJzZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkZlYXR1cmVNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuVVJMRW50cnlNb2RlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247DQotDQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlUGFyc2UgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxDQotCSAqLw0KLQlwdWJsaWMgVGVzdEZlYXR1cmVQYXJzZShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlTdHJpbmcgeG1sRmlsZSA9ICJ4bWxzL2ZlYXR1cmVfMS4wLjAvIjsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsIG51bGwpOw0KLQkJVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwocmVtb3RlU2l0ZS5nZXRVUkwoKSwgeG1sRmlsZSwgbnVsbCk7DQotDQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKHJlbW90ZVNpdGUpOw0KLQkJcmVmLnNldFVSTCh1cmwpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQ0KLQkJU3RyaW5nIHByb3YgPSBmZWF0dXJlLmdldFByb3ZpZGVyKCk7DQotCQlhc3NlcnRFcXVhbHMoIk9iamVjdCBUZWNobm9sb2d5IEludGVybmF0aW9uYWwiLCBwcm92KTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlMS54bWwiKTsNCi0JCQlEZWZhdWx0RmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKTsNCi0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQkJRmVhdHVyZU1vZGVsIHJlbW90ZUZlYXR1cmUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIE5PVCBiZSB0aHJvd24iKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDFiaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlMWJpcy54bWwiKTsNCi0JCQlEZWZhdWx0RmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKTsNCi0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQkJRmVhdHVyZU1vZGVsIHJlbW90ZUZlYXR1cmUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIE5PVCBiZSB0aHJvd24iKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9mZWF0dXJlMi54bWwiKTsNCi0JCQlEZWZhdWx0RmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdEZlYXR1cmVQYXJzZXIoKTsNCi0JCQlwYXJzZXIuaW5pdChuZXcgRmVhdHVyZUV4ZWN1dGFibGVGYWN0b3J5KCkpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQkJRmVhdHVyZU1vZGVsIHJlbW90ZUZlYXR1cmUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCQlyZW1vdGVGZWF0dXJlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmUzLnhtbCIpOw0KLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJCVN0cmluZyBjb3B5cmlnaHRTdHJpbmcgPSByZW1vdGVGZWF0dXJlLmdldENvcHlyaWdodE1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJCWJvb2xlYW4gcmVzb2x2ZWQgPSBjb3B5cmlnaHRTdHJpbmcuaW5kZXhPZihTaXRlTWFuYWdlci5nZXRPUygpKSAhPSAtMTsNCi0JCQlhc3NlcnRUcnVlKCJDb3B5cmlnaHQgVVJMIG5vdCByZXNvbHZlZDoiICsgY29weXJpZ2h0U3RyaW5nLCByZXNvbHZlZCk7DQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBwYXJzZSB0eXBlDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkNCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL2ZlYXR1cmU0LnhtbCIpOw0KLQkJCURlZmF1bHRGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0RmVhdHVyZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBGZWF0dXJlRXhlY3V0YWJsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlGZWF0dXJlTW9kZWwgcmVtb3RlRmVhdHVyZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZUZlYXR1cmUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJCVVSTEVudHJ5TW9kZWxbXSBtb2RlbHMgPSByZW1vdGVGZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyeU1vZGVscygpOw0KLQkJCWFzc2VydFRydWUoIkRpc2NvdmVyeSBtb2RlbCBpcyBub3QgYSBXZWIgTW9kZWwiLCBtb2RlbHNbMF0uZ2V0VHlwZSgpPT1JVVJMRW50cnkuV0VCX1NJVEUpOw0KLQkJCVVSTEVudHJ5TW9kZWwgY29weXJpZ2h0ID0gcmVtb3RlRmVhdHVyZS5nZXRDb3B5cmlnaHRNb2RlbCgpOw0KLQkJCWFzc2VydFRydWUoIkNvcHlyaWdodCBtb2RlbCBpcyBub3QgYW4gVXBkYXRlIE1vZGVsIiwgY29weXJpZ2h0LmdldFR5cGUoKT09SVVSTEVudHJ5LlVQREFURV9TSVRFKTsNCi0JCQkNCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0U2l0ZVBhcnNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9wYXJzZXIvVGVzdFNpdGVQYXJzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmM0Yzg4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3BhcnNlci9UZXN0U2l0ZVBhcnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnBhcnNlcjsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlRmlsZUZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVSTEVuY29kZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVBhcnNlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RTaXRlUGFyc2UoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ4bWxzL3NpdGUxLyIpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUocmVtb3RlVXJsLG51bGwpOw0KLQ0KLQkJLy9JRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkvL0lDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3JpZXMoKTsNCi0NCi0JCVN0cmluZyBwYXRoID0gcmVtb3RlVXJsLmdldEZpbGUoKTsNCi0JCVN0cmluZyBwYXRoMiA9IHJlbW90ZVNpdGUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocGF0aCArICJpbmRleC5odG1sIiksIG5ldyBGaWxlKHBhdGgyKSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdE51bWJlck9mRmVhdHVyZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVUkwsbnVsbCk7DQotDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlhc3NlcnRFcXVhbHMoZmVhdHVyZS5sZW5ndGgsIDIpOw0KLQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlLnhtbCIpOw0KLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCUNhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOw0KLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0NCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmUubGVuZ3RoID09IDYpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNhdGVnb3JpZXMiLCBjYXRlZ29yaWVzLmxlbmd0aCA9PSAzKTsNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhcmNoaXZlcyIsIGFyY2hpdmVzLmxlbmd0aCA9PSAwKTsNCi0NCi0JCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsNCi0JCVN0cmluZyBwYXRoMiA9IHJlbW90ZVNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCWFzc2VydEVxdWFscyhwYXRoICsgImluZGV4Lmh0bWwiLCBwYXRoMik7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3JlZGRvdC54bWwiKTsNCi0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOw0KLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsNCi0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7DQotCQlDYXRlZ29yeU1vZGVsW10gY2F0ZWdvcmllcyA9IHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKTsNCi0JCUFyY2hpdmVSZWZlcmVuY2VNb2RlbFtdIGFyY2hpdmVzID0gcmVtb3RlU2l0ZS5nZXRBcmNoaXZlUmVmZXJlbmNlTW9kZWxzKCk7DQotDQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgZmVhdHVyZXMiLCBmZWF0dXJlLmxlbmd0aCA9PSAyKTsNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjYXRlZ29yaWVzIiwgY2F0ZWdvcmllcy5sZW5ndGggPT0gMSk7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMik7DQotDQotCQlTdHJpbmcgdmFsaWRlU3RyaW5nID0gIlRoaXMgY2F0ZWdvcnkgY29udGFpbnMgYWxsIG9mIHRoZSA8Y3VycmVudGx5PiBhdmFpbGFibGUgdmVyc2lvbnMgb2YgUmVkIERvdCBmZWF0dXJlLiA8Z3JlZXRpbmc+SGVsbG8sIHdvcmxkITwvZ3JlZXRpbmc+IjsNCi0JCWFzc2VydEVxdWFscyh2YWxpZGVTdHJpbmcsIHJlbW90ZVNpdGUuZ2V0Q2F0ZWdvcnlNb2RlbHMoKVswXS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0QW5ub3RhdGlvbigpKTsNCi0NCi0JCVN0cmluZyBwYXRoID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzLyIpLmdldEZpbGUoKTsNCi0JCVN0cmluZyBwYXRoMiA9IHJlbW90ZVNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCWFzc2VydEVxdWFscyhwYXRoICsgImluZGV4Lmh0bWwiLCBwYXRoMik7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3JlZGRvdDEueG1sIik7DQotCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gZmVhdHVyZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpOw0KLQkJQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgY2F0ZWdvcmllcyIsIGNhdGVnb3JpZXMubGVuZ3RoID09IDEpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDIpOw0KLQ0KLQkJU3RyaW5nIHZhbGlkZVN0cmluZyA9ICJUaGlzIGNhdGVnb3J5IGNvbnRhaW5zIGFsbCBvZiB0aGUgPGN1cnJlbnRseT4gYXZhaWxhYmxlIHZlcnNpb25zIG9mIFJlZCBEb3QgZmVhdHVyZS4iOw0KLQkJYXNzZXJ0RXF1YWxzKHZhbGlkZVN0cmluZywgcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpWzBdLmdldERlc2NyaXB0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uKCkpOw0KLQ0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvIikuZ2V0RmlsZSgpOw0KLQkJU3RyaW5nIHBhdGgyID0gcmVtb3RlU2l0ZS5nZXREZXNjcmlwdGlvbk1vZGVsKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJYXNzZXJ0RXF1YWxzKHBhdGggKyAiaW5kZXguaHRtbCIsIHBhdGgyKTsNCi0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9zaXRlLnhtbCIpOw0KLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCS8vQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZS5sZW5ndGggPT0gMik7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMyk7DQotDQotCQlVUkwgcGF0aDEgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9hcnRpZmFjdHMvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyIik7DQotCQlVUkwgdXJsMSA9IGZlYXR1cmVbMF0uZ2V0VVJMKCk7DQotCQlhc3NlcnRFcXVhbHMocGF0aDEsIHVybDEpOw0KLQkJVVJMIHBhdGgyID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgIlNpdGVVUkxUZXN0L2RhdGEvYXJ0aWZhY3RzL3BsdWdpbnMvaGVscC5qYXIiKTsNCi0JCWFzc2VydEVxdWFscyhwYXRoMiwgYXJjaGl2ZXNbMF0uZ2V0VVJMKCkpOw0KLQ0KLQkJU3RyaW5nIHBhdGggPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAiU2l0ZVVSTFRlc3QvZGF0YS9pbmZvLyIpLmdldEZpbGUoKTsNCi0JCVN0cmluZyBwYXRoMyA9IHJlbW90ZVNpdGUuZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCWFzc2VydEVxdWFscyhwYXRoICsgInNpdGVJbmZvLmh0bWwiLCBwYXRoMyk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUyLnhtbCIpOw0KLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCS8vQ2F0ZWdvcnlNb2RlbFtdIGNhdGVnb3JpZXMgPSByZW1vdGVTaXRlLmdldENhdGVnb3J5TW9kZWxzKCk7DQotCQlBcmNoaXZlUmVmZXJlbmNlTW9kZWxbXSBhcmNoaXZlcyA9IHJlbW90ZVNpdGUuZ2V0QXJjaGl2ZVJlZmVyZW5jZU1vZGVscygpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGZlYXR1cmVzIiwgZmVhdHVyZVJlZi5sZW5ndGggPT0gMSk7DQotCQlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYXJjaGl2ZXMiLCBhcmNoaXZlcy5sZW5ndGggPT0gMCk7DQotDQotCQl0cnkgew0KLQkJCSgoRmVhdHVyZVJlZmVyZW5jZSkgZmVhdHVyZVJlZlswXSkuZ2V0RmVhdHVyZShudWxsKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCVRocm93YWJsZSBlMSA9IGUuZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCk7DQotCQkJaWYgKGUxLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJub3QtZWNsaXBzZSIpID09IC0xKSB7DQotCQkJCXRocm93IGU7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkNigpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlNC54bWwiKTsNCi0JCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOw0KLQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsNCi0JCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQlGZWF0dXJlUmVmZXJlbmNlTW9kZWxbXSBmZWF0dXJlUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7DQotCQkvL0NhdGVnb3J5TW9kZWxbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yeU1vZGVscygpOw0KLQkJQXJjaGl2ZVJlZmVyZW5jZU1vZGVsW10gYXJjaGl2ZXMgPSByZW1vdGVTaXRlLmdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0NCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBmZWF0dXJlcyIsIGZlYXR1cmVSZWYubGVuZ3RoID09IDIpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFyY2hpdmVzIiwgYXJjaGl2ZXMubGVuZ3RoID09IDApOw0KLQ0KLQkJdHJ5IHsNCi0JCQkoKEZlYXR1cmVSZWZlcmVuY2UpIGZlYXR1cmVSZWZbMF0pLmdldEZlYXR1cmUobnVsbCk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlUaHJvd2FibGUgZTEgPSBlLmdldFN0YXR1cygpLmdldEV4Y2VwdGlvbigpOw0KLQkJCVN0cmluZyBtc2cgPSBlMS5nZXRNZXNzYWdlKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7DQotCQkJaWYgKG1zZy5pbmRleE9mKCJfMS4wLjAuamFyL2ZlYXR1cmUueG1sIikgPT0gLTEpIHsNCi0JCQkJdGhyb3cgZTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVW5rbm93bkNhdGVnb3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGUzLnhtbCIpOw0KLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0NCi0JCUZlYXR1cmVSZWZlcmVuY2VNb2RlbFtdIGZlYXR1cmVSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VNb2RlbHMoKTsNCi0JCUlDYXRlZ29yeVtdIGNhdGVnb3JpZXMgPSAoKFNpdGVGZWF0dXJlUmVmZXJlbmNlKSBmZWF0dXJlUmVmWzBdKS5nZXRDYXRlZ29yaWVzKCk7DQotCQlhc3NlcnRUcnVlKGNhdGVnb3JpZXMubGVuZ3RoID09IDApOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkNygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJdHJ5IHsNCi0JCQlVUkwgcmVtb3RlVVJMID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInBhcnNlcnRlc3RzL3NpdGU3LnhtbCIpOw0KLQkJCURlZmF1bHRTaXRlUGFyc2VyIHBhcnNlciA9IG5ldyBEZWZhdWx0U2l0ZVBhcnNlcigpOw0KLQkJCXBhcnNlci5pbml0KG5ldyBTaXRlRmlsZUZhY3RvcnkoKSk7DQotCQkJVVJMIHJlc29sdmVkVVJMID0gVVJMRW5jb2Rlci5lbmNvZGUocmVtb3RlVVJMKTsNCi0JCQlTaXRlTW9kZWwgcmVtb3RlU2l0ZSA9IHBhcnNlci5wYXJzZShyZXNvbHZlZFVSTC5vcGVuU3RyZWFtKCkpOw0KLQkJCXJlbW90ZVNpdGUucmVzb2x2ZShyZW1vdGVVUkwsIG51bGwpOw0KLQ0KLQkJfSBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoIkV4Y2VwdGlvbiBzaG91bGQgbm90IGJlIHRocm93biIgKyBlLmdldE1lc3NhZ2UoKSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQ4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQl0cnkgew0KLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZTgueG1sIik7DQotCQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gcGFyc2VyLnBhcnNlKHJlc29sdmVkVVJMLm9wZW5TdHJlYW0oKSk7DQotCQkJcmVtb3RlU2l0ZS5yZXNvbHZlKHJlbW90ZVVSTCwgbnVsbCk7DQotDQotCQl9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBlKSB7DQotCQkJZmFpbCgiRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgdGhyb3duIiArIGUuZ2V0TWVzc2FnZSgpKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VWYWxpZDkoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlOS54bWwiKTsNCi0JCQlEZWZhdWx0U2l0ZVBhcnNlciBwYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsNCi0JCQlwYXJzZXIuaW5pdChuZXcgU2l0ZUZpbGVGYWN0b3J5KCkpOw0KLQkJCVVSTCByZXNvbHZlZFVSTCA9IFVSTEVuY29kZXIuZW5jb2RlKHJlbW90ZVVSTCk7DQotCQkJU2l0ZU1vZGVsIHJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RQYXJzZVZhbGlkMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVNpdGVNb2RlbCByZW1vdGVTaXRlID0gbnVsbDsNCi0JCXRyeSB7DQotCQkJVVJMIHJlbW90ZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJwYXJzZXJ0ZXN0cy9zaXRlMTAueG1sIik7DQotCQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7DQotCQkJcGFyc2VyLmluaXQobmV3IFNpdGVGaWxlRmFjdG9yeSgpKTsNCi0JCQlVUkwgcmVzb2x2ZWRVUkwgPSBVUkxFbmNvZGVyLmVuY29kZShyZW1vdGVVUkwpOw0KLQkJCXJlbW90ZVNpdGUgPSBwYXJzZXIucGFyc2UocmVzb2x2ZWRVUkwub3BlblN0cmVhbSgpKTsNCi0JCQlyZW1vdGVTaXRlLnJlc29sdmUocmVtb3RlVVJMLCBudWxsKTsNCi0JCX0gY2F0Y2ggKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHsNCi0JCQlmYWlsKCJFeGNlcHRpb24gc2hvdWxkIG5vdCBiZSB0aHJvd24iICsgZS5nZXRNZXNzYWdlKCkpOw0KLQkJfQ0KLQkJRmVhdHVyZVJlZmVyZW5jZU1vZGVsW10gbW9kZWxzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlTW9kZWxzKCk7DQotCQlhc3NlcnRFcXVhbHMoIkludmFsaWQgdmVyc2lvbmVkIGlkZW50aWZpZXIiLCBtb2RlbHNbMF0uZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSwgIm9yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZSIpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL0FsbFJlY29uY2lsaWF0aW9uVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlY29uY2lsaWF0aW9uL0FsbFJlY29uY2lsaWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZDE3YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9BbGxSZWNvbmNpbGlhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWNvbmNpbGlhdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsKLQotLyoqCi0gKiBNYW5hZ2VzIHRoZSBBUEkgdGVzdHMKLSAqLwotcHVibGljIGNsYXNzIEFsbFJlY29uY2lsaWF0aW9uVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEFsbFJlY29uY2lsaWF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIExpc3Qgb2YgQVBJIHRlc3RzCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiQVBJIFRlc3RzIik7Ci0KLQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVSZWNvbmNpbGlhdGlvbi5jbGFzcykpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWNvbmNpbGlhdGlvbi9UZXN0U2l0ZVJlY29uY2lsaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZmU0NzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVjb25jaWxpYXRpb24vVGVzdFNpdGVSZWNvbmNpbGlhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlY29uY2lsaWF0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci5JUGxhdGZvcm1Db25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsKLQotcHVibGljIGNsYXNzIFRlc3RTaXRlUmVjb25jaWxpYXRpb24gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCQotCi0JCi0KLQkvKioKLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpCi0JICovCi0JcHVibGljIFRlc3RTaXRlUmVjb25jaWxpYXRpb24oU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENvbmZpZ1NpdGUoaW50IHBvbGljeSwgVVJMIHVybCxTdHJpbmdbXSBsaXN0T2ZQbHVnaW5zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHhtbEZpbGUgPSAoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCk7Ci0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZSh4bWxGaWxlKSk7CQkKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsKLQkJLy8gZ2V0IG5ldyBjb25maWcgb2JqZWN0Ci0JCUlQbGF0Zm9ybUNvbmZpZ3VyYXRpb24gY2ZpZyA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKTsKLQkJSVNpdGVQb2xpY3kgcDEgPSBjZmlnLmNyZWF0ZVNpdGVQb2xpY3kocG9saWN5LCBsaXN0T2ZQbHVnaW5zKTsJCi0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmNyZWF0ZVNpdGVFbnRyeSh1cmwscDEpOwotCQljZmlnLmNvbmZpZ3VyZVNpdGUoczEpOwkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbmZpZ1NpdGUoVVJMIHVybCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1cmwpOwotCQlhc3NlcnROb3ROdWxsKCJVbmFibGUgdG8gZmluZCBzaXRlIGVudHJ5OiIrdXJsLHMxKTsKLQkJY2ZpZy51bmNvbmZpZ3VyZVNpdGUoczEpOwotCQljZmlnLnNhdmUoKTsKLQl9CQotCS8qKgotCSAqIFNpdGUgMSBjb250YWlucyBhIGZlYXR1cmUgd2hpY2ggbmVlZHMgYSBwbHVnaW4gdGFodCBpcyBub3Qgb24gdGhlIHBhdGggd2hlbiB3ZSBzdGFydAotCSAqIGl0IHdpbGwgbmV2ZXIgYmUgY29uZmlndXJlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaXRlSW5jbHVkZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJaW50IHBvbGljeSAgPSBJU2l0ZVBvbGljeS5VU0VSX0lOQ0xVREU7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIixudWxsLGRhdGFQYXRoKyJyZWNvbmNpbGlhdGlvblNpdGVzL3NpdGUxLyIpOwotCQlTdHJpbmdbXSBwbHVnaW5zID0gbmV3IFN0cmluZ1tde307Ci0JCWFkZENvbmZpZ1NpdGUocG9saWN5LHVybCwgcGx1Z2lucyk7Ci0KLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkoKFNpdGVMb2NhbClsb2NhbCkuc2V0U3RhbXAoMCk7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIG5ld1NpdGVzID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld1NpdGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwobmV3U2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLHVybCkpewotCQkJCW5ld1NpdGUgPSBuZXdTaXRlc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ld1NpdGU9PW51bGwpIGZhaWwoIlNpdGUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmID0gbmV3U2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsJCQotCQlyZWYgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CQkKLQkJCi0JCXJlbW92ZUNvbmZpZ1NpdGUodXJsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2l0ZUV4Y2x1ZGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlpbnQgcG9saWN5ICA9IElTaXRlUG9saWN5LlVTRVJfRVhDTFVERTsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLG51bGwsZGF0YVBhdGgrInJlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTEvIik7Ci0JCVN0cmluZ1tdIHBsdWdpbnMgPSBuZXcgU3RyaW5nW117fTsKLQkJYWRkQ29uZmlnU2l0ZShwb2xpY3ksdXJsLCBwbHVnaW5zKTsKLQkJCi0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJKChTaXRlTG9jYWwpbG9jYWwpLnNldFN0YW1wKDApOwkJCi0JCUlDb25maWd1cmVkU2l0ZVtdIG5ld1NpdGVzID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIG5ld1NpdGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoVXBkYXRlTWFuYWdlclV0aWxzLnNhbWVVUkwobmV3U2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLHVybCkpewotCQkJCW5ld1NpdGUgPSBuZXdTaXRlc1tpXTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKG5ld1NpdGU9PW51bGwpIGZhaWwoIlNpdGUgbm90IGZvdW5kIGluIGNvbmZpZ3VyYXRpb24iKTsKLQkJCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmID0gbmV3U2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsJCQotCQlyZWYgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7CQkJCQotCQlyZW1vdmVDb25maWdTaXRlKHVybCk7Ci0JfQotCi0JLyoqCi0JICogU2l0ZSAyIGNvbnRhaW5zIGEgZmVhdHVyZSB3aGljaCBuZWVkcyBhIHBsdWdpbiB0YWh0IGlzIG9uIHRoZSBwYXRoIHdoZW4gd2Ugc3RhcnQKLQkgKiBpdCB3aWxsIGJlIGNvbmZpZ3VyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2l0ZUluY2x1ZGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlpbnQgcG9saWN5ICA9IElTaXRlUG9saWN5LlVTRVJfSU5DTFVERTsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLG51bGwsZGF0YVBhdGgrInJlY29uY2lsaWF0aW9uU2l0ZXMvc2l0ZTIvIik7Ci0JCVN0cmluZ1tdIHBsdWdpbnMgPSBuZXcgU3RyaW5nW117fTsKLQkJYWRkQ29uZmlnU2l0ZShwb2xpY3ksdXJsLCBwbHVnaW5zKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkoKFNpdGVMb2NhbClsb2NhbCkuc2V0U3RhbXAoMCk7CQkKLQkJSUNvbmZpZ3VyZWRTaXRlW10gbmV3U2l0ZXMgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQlJQ29uZmlndXJlZFNpdGUgbmV3U2l0ZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3U2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChuZXdTaXRlc1tpXS5nZXRTaXRlKCkuZ2V0VVJMKCksdXJsKSl7Ci0JCQkJbmV3U2l0ZSA9IG5ld1NpdGVzW2ldOwotCQkJfQotCQl9Ci0JCQotCQlpZiAobmV3U2l0ZT09bnVsbCkgZmFpbCgiU2l0ZSBub3QgZm91bmQgaW4gY29uZmlndXJhdGlvbiIpOwotCQkKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWYgPSBuZXdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiBjb25maWd1cmVkIGZlYXR1cmVzIiwwLHJlZi5sZW5ndGgpOwotCQlyZWYgPSAoKENvbmZpZ3VyZWRTaXRlKW5ld1NpdGUpLmdldENvbmZpZ3VyYXRpb25Qb2xpY3koKS5nZXRVbmNvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQlhc3NlcnRFcXVhbHMoIldyb25nIG51bWJlciBvZiB1bmNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7Ci0JCQotCQlyZW1vdmVDb25maWdTaXRlKHVybCk7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaXRlRXhjbHVkZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCWludCBwb2xpY3kgID0gSVNpdGVQb2xpY3kuVVNFUl9FWENMVURFOwotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsbnVsbCxkYXRhUGF0aCsicmVjb25jaWxpYXRpb25TaXRlcy9zaXRlMi8iKTsKLQkJU3RyaW5nW10gcGx1Z2lucyA9IG5ldyBTdHJpbmdbXXt9OwotCQlhZGRDb25maWdTaXRlKHBvbGljeSx1cmwsIHBsdWdpbnMpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCSgoU2l0ZUxvY2FsKWxvY2FsKS5zZXRTdGFtcCgwKTsJCQotCQlJQ29uZmlndXJlZFNpdGVbXSBuZXdTaXRlcyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBuZXdTaXRlID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXdTaXRlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFVwZGF0ZU1hbmFnZXJVdGlscy5zYW1lVVJMKG5ld1NpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSx1cmwpKXsKLQkJCQluZXdTaXRlID0gbmV3U2l0ZXNbaV07Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdTaXRlPT1udWxsKSBmYWlsKCJTaXRlIG5vdCBmb3VuZCBpbiBjb25maWd1cmF0aW9uIik7Ci0JCQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZiA9IG5ld1NpdGUuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMiLDAscmVmLmxlbmd0aCk7Ci0JCXJlZiA9ICgoQ29uZmlndXJlZFNpdGUpbmV3U2l0ZSkuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCk7Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgbnVtYmVyIG9mIHVuY29uZmlndXJlZCBmZWF0dXJlcyIsMCxyZWYubGVuZ3RoKTsKLQotCQlyZW1vdmVDb25maWdTaXRlKHVybCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9BbGxSZWd1bGFySW5zdGFsbFRlc3RzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9BbGxSZWd1bGFySW5zdGFsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NTdiNTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvQWxsUmVndWxhckluc3RhbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQWxsUmVndWxhckluc3RhbGxUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotcHVibGljIEFsbFJlZ3VsYXJJbnN0YWxsVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0Jc3VwZXIobmFtZSk7DQotfQ0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQlzdWl0ZS5zZXROYW1lKCJSZWd1bGFyIEluc3RhbGwgVGVzdHMiKTsNCi0JDQotCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnDQotDQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0SW5zdGFsbC5jbGFzcykpOw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEluc3RhbGxVUkxTSXRlWE1MLmNsYXNzKSk7CQ0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNwYWNlSW5JbnN0YWxsLmNsYXNzKSk7CQ0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEdldEZlYXR1cmUuY2xhc3MpKTsNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RFeGVjdXRhYmxlSW5zdGFsbC5jbGFzcykpOwkNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmNsYXNzKSk7CQkNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3REYXRhRW50cnlJbnN0YWxsLmNsYXNzKSk7DQotCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0TG9jYWxTaXRlLmNsYXNzKSk7CQkNCi0JDQotCS8vIG9yIHlvdSBjYW4gc3BlY2lmeSB0aGUgbWV0aG9kDQotCS8vc3VpdGUuYWRkVGVzdChuZXcgVGVzdEdldEZlYXR1cmUoIm1ldGhvZFRoYXREb2VzTm90U3RhcnRXaXRodGVzdCIpKTsJDQotCQ0KLQlyZXR1cm4gc3VpdGU7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9NdWx0aXBsZVRlc3RMb2NhbFNpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL011bHRpcGxlVGVzdExvY2FsU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDMyNWIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL011bHRpcGxlVGVzdExvY2FsU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgTXVsdGlwbGVUZXN0TG9jYWxTaXRlIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi1wdWJsaWMgTXVsdGlwbGVUZXN0TG9jYWxTaXRlKFN0cmluZyBuYW1lKSB7DQotCXN1cGVyKG5hbWUpOw0KLX0NCi1wdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7DQotCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsNCi0Jc3VpdGUuc2V0TmFtZSgiTXVsdGlwbGUgVGVzdCBMb2NhbCBTaXRlIik7DQotCQ0KLQkvLyB0aGUgZm9sbG93aW5nIHdpbGwgdGFrZSBhbGwgdGVoIHRlc3QgbWV0aG9kcyBpbiB0ZWggY2xhc3MgdGhhdCBzdGFydCB3aXRoICd0ZXN0Jw0KLQkNCi0JZm9yKGludCBpPTA7IGk8NTA7IGkrKyl7DQotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdExvY2FsU2l0ZS5jbGFzcykpOw0KLQl9DQotCQ0KLQlyZXR1cm4gc3VpdGU7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RGF0YUVudHJ5SW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdERhdGFFbnRyeUluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyMDNiYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RGF0YUVudHJ5SW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdERhdGFFbnRyeUluc3RhbGwgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQkvKioNCi0JICogQ29uc3RydWN0b3IgZm9yIFRlc3QxDQotCSAqLw0KLQlwdWJsaWMgVGVzdERhdGFFbnRyeUluc3RhbGwoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCS8qKg0KLQkgKiBXaXRoIHNpdGUueG1sDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YUVudHJ5U2l0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotCQkNCi0JCVVSTCBuZXdVUkwgPW5ldyBGaWxlKGRhdGFQYXRoICsgImRhdGFFbnRyeVNpdGVUZXN0L3NpdGUxL3NpdGUueG1sIikudG9VUkwoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsNCi0JCQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgew0KLQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsbnVsbCk7DQotDQotCQkJLy8gdmVyaWZ5DQotCQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQlhc3NlcnRUcnVlKCJubyBkYXRhIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7DQotCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKStGaWxlLnNlcGFyYXRvcisgcGx1Z2luTmFtZSk7DQotCQkJYXNzZXJ0VHJ1ZSgiZGF0YSBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0JCX0gDQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotDQotDQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogV2l0aCBzaXRlLnhtbA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdERhdGFFbnRyeVNpdGVQYWNrYWdlZCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotCQkNCi0JCVVSTCBuZXdVUkwgPW5ldyBGaWxlKGRhdGFQYXRoICsgImRhdGFFbnRyeVNpdGVUZXN0L3NpdGUyL3NpdGUueG1sIikudG9VUkwoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsNCi0JCQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgew0KLQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsbnVsbCk7DQotDQotCQkJLy8gdmVyaWZ5DQotCQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJCUlOb25QbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JCQlhc3NlcnRUcnVlKCJubyBkYXRhIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7DQotCQkJZW50cmllc1swXS5nZXRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrRmlsZS5zZXBhcmF0b3IrICJub25kYXRhIitGaWxlLnNlcGFyYXRvcisiZmlsZTEuemlwIik7DQotCQkJYXNzZXJ0VHJ1ZSgiRGF0YSBmaWxlIGluc2lkZSB0aGUgamFyIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQkJCXBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkrRmlsZS5zZXBhcmF0b3IrICJmaWxlLnppcCIpOw0KLQkJCWFzc2VydFRydWUoIkRhdGEgZmlsZSBvdXRzaWRlIHRoZSBqYXIgbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotCQkJDQotCQl9IA0KLQkJDQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotDQotDQotCX0JDQotCQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZUluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA3YzEwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJVdGlsczsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgVGVzdEV4ZWN1dGFibGVJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RFeGVjdXRhYmxlSW5zdGFsbChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb257DQotCQkNCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOwkJDQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOw0KLQkJDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZVJlZmVyZW5jZSA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSByZW1vdGVGZWF0dXJlUmVmZXJlbmNlWzBdLmdldEZlYXR1cmUobnVsbCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7DQotCQlhc3NlcnROb3ROdWxsKHJlbW90ZUZlYXR1cmUpOw0KLQkJcmVtb3ZlKHJlbW90ZUZlYXR1cmUsbG9jYWxTaXRlKTsJCQ0KLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSxudWxsLG51bGwpOw0KLQkJDQotCQkvLyB2ZXJpZnkNCi0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsNCi0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLChlbnRyaWVzIT1udWxsICYmIGVudHJpZXMubGVuZ3RoIT0wKSk7DQotCQlTdHJpbmcgcGx1Z2luTmFtZT0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIK3BsdWdpbk5hbWUpOw0KLQkJaWYgKExvY2FsZS5nZXREZWZhdWx0KCkudG9TdHJpbmcoKS5pbmRleE9mKCJ1cyIpICE9IC0xKQ0KLQkJCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgrcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrZmVhdHVyZUZpbGUsZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpcyBhIGZpbGUsIG5vdCBhIGRpcmVjdG9yeToiK2ZlYXR1cmVGaWxlLGZlYXR1cmVGaWxlLmlzRGlyZWN0b3J5KCkpOw0KLQ0KLQkJDQotCQlGaWxlIGZlYXR1cmVGaWxlWE1MID0gbmV3IEZpbGUoc2l0ZSxTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCtyZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpK0ZpbGUuc2VwYXJhdG9yKyJmZWF0dXJlLnhtbCIpOw0KLQkJYXNzZXJ0VHJ1ZSgiZmVhdHVyZSBpbmZvIG5vdCBpbnN0YWxsZWQgbG9jYWxseTogbm8gZmVhdHVyZS54bWwiLGZlYXR1cmVGaWxlWE1MLmV4aXN0cygpKTsNCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCQ0KLQl9DQotDQotfQ0KLQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0RXhlY3V0YWJsZVBhY2thZ2VkSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2M4OWI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBUZXN0MQ0KLQkgKi8NCi0JcHVibGljIFRlc3RFeGVjdXRhYmxlUGFja2FnZWRJbnN0YWxsKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogV2l0aCBzaXRlLnhtbA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEZpbGVQYWNrYWdlRXhlY3V0YWJsZUZlYXR1cmVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0ICANCi0JCUZpbGUgdGFyZ2V0ID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotCQkNCi0JCVVSTCBuZXdVUkwgPSBuZXcgRmlsZShkYXRhUGF0aCArICJFeGVjdXRhYmxlRmVhdHVyZVBhY2thZ2VkU2l0ZS9kYXRhMi9zaXRlLnhtbCIpLnRvVVJMKCk7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzUmVmID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7DQotCQkNCi0JCS8vIGF0IGxlYXN0IG9uZSBleGVjdXRhYmxlIGZlYXR1cmUgYW5kIG9uIHBhY2thZ2VkDQotCQlib29sZWFuIGV4ZWNGZWF0dXJlID0gZmFsc2U7DQotCQlib29sZWFuIHBhY2tGZWF0dXJlID0gZmFsc2U7DQotDQotCQlpZiAoZmVhdHVyZXNSZWYubGVuZ3RoPT0wKSBmYWlsICgibm8gZmVhdHVyZSBmb3VuZCIpOw0KLQkNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXNSZWYubGVuZ3RoOyBpKyspIHsNCi0JCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNSZWZbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOwkJCQ0KLQkJCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsbnVsbCk7DQotCQkJDQotCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7DQotCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZUV4ZWN1dGFibGVDb250ZW50UHJvdmlkZXIpIGV4ZWNGZWF0dXJlID0gdHJ1ZTsNCi0NCi0JCQkvLyB2ZXJpZnkNCi0JCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJmZWF0dXJlLnhtbCIpOw0KLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOw0KLQkJfQ0KLQ0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpew0KLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7DQotCQl9DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotDQotDQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogV2l0aG91dCBzaXRlLnhtbA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEZpbGVOb1NpdGVYTUxTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZShUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCQ0KLQkJVVJMIG5ld1VSTCA9IG5ldyBGaWxlKGRhdGFQYXRoICsgIkV4ZWN1dGFibGVGZWF0dXJlUGFja2FnZWRTaXRlL2RhdGEvIikudG9VUkwoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ld1VSTCxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsNCi0JCQ0KLQkJLy8gYXQgbGVhc3Qgb25lIGV4ZWN1dGFibGUgZmVhdHVyZSBhbmQgb24gcGFja2FnZWQNCi0JCWJvb2xlYW4gZXhlY0ZlYXR1cmUgPSBmYWxzZTsNCi0JCWJvb2xlYW4gcGFja0ZlYXR1cmUgPSBmYWxzZTsNCi0NCi0JCWlmIChmZWF0dXJlc1JlZi5sZW5ndGg9PTApIGZhaWwgKCJubyBmZWF0dXJlIGZvdW5kIik7DQotCQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlc1JlZi5sZW5ndGg7IGkrKykgew0KLQkJCXRyeSB7DQotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1JlZltpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7DQotCQkJCVRocm93YWJsZSBlMSA9IGUuZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCk7DQotCQkJCVN0cmluZyBtc2cgPSBlMS5nZXRNZXNzYWdlKCkucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsJy8nKTsNCi0JCQkJaWYgKG1zZy5pbmRleE9mKCJDVlMvZmVhdHVyZS54bWwiKT09LTEpew0KLQkJCQkJdGhyb3cgZTsNCi0JCQkJfQkJCQkNCi0JCQl9DQotCQkJaWYgKHJlbW90ZUZlYXR1cmUhPW51bGwpew0KLQkJCQlyZW1vdmUocmVtb3RlRmVhdHVyZSxsb2NhbFNpdGUpOw0KLQkJCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLG51bGwsIG51bGwpOw0KLQkJCQkNCi0JCQkJaWYgKHJlbW90ZUZlYXR1cmUuZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgRmVhdHVyZVBhY2thZ2VkQ29udGVudFByb3ZpZGVyKSBwYWNrRmVhdHVyZSA9IHRydWU7DQotCQkJCWlmIChyZW1vdGVGZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKSBleGVjRmVhdHVyZSA9IHRydWU7DQotCQ0KLQkJCQkvLyB2ZXJpZnkNCi0JCQkJU3RyaW5nIHNpdGUgPSBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpOw0KLQkJCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRSYXdQbHVnaW5FbnRyaWVzKCk7DQotCQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseToiK3BsdWdpbkZpbGUsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQkNCi0JCQkJRmlsZSBmZWF0dXJlRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQkNCi0JCQkJRmlsZSBmZWF0dXJlRmlsZVhNTCA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIICsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSArIEZpbGUuc2VwYXJhdG9yICsgImZlYXR1cmUueG1sIik7DQotCQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmICghZXhlY0ZlYXR1cmUgJiYgIXBhY2tGZWF0dXJlKXsNCi0JCQlmYWlsKCJjYW5ub3QgZmluZCBvbmUgZXhlY3V0YWJsZSBhbmQgb25lIHBhY2thZ2UgZmVhdHVyZSBvbiB0ZWggc2l0ZSIpOw0KLQkJfQ0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCANCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOw0KLQ0KLQ0KLQl9DQotCQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEdldEZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVjZTY4OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0R2V0RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJJbnN0YWxsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0R2V0RmVhdHVyZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotDQotCS8qKg0KLQkgKiBUZXN0IHRoZSBnZXRGZWF0dXJlcygpDQotCSAqLw0KLQlwdWJsaWMgVGVzdEdldEZlYXR1cmUoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb257DQotCQkNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlbW90ZUZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJaWYgKHJlbW90ZUZlYXR1cmVzPT1udWxsIHx8IHJlbW90ZUZlYXR1cmVzLmxlbmd0aD09MCkgZmFpbCgiTm8gZmVhdHVyZSBhdmFpbGFibGUgZm9yIHRlc3RpbmciKTsNCi0JCWZvciAoaW50IGk9MDtpPHJlbW90ZUZlYXR1cmVzLmxlbmd0aDtpKyspew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZmVhdHVyZToiK3JlbW90ZUZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQkJfQ0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSFRUUFNpdGUoKSB0aHJvd3MgRXhjZXB0aW9ueyANCi0JCQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOwkJDQotCQlmb3IgKGludCBpPTA7aTxyZW1vdGVGZWF0dXJlcy5sZW5ndGg7aSsrKXsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZlYXR1cmU6IityZW1vdGVGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCX0NCi0JfQ0KLX0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0ODFkZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RJbnN0YWxsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRURfRkVBVFVSRV9UWVBFID0gInBhY2thZ2VkIjsgLy8kTk9OLU5MUy0xJA0KLQ0KLQlwdWJsaWMgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgew0KLQ0KLQkJcHVibGljIGJvb2xlYW4gbm90aWZpZWQgPSBmYWxzZTsNCi0NCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJCW5vdGlmaWVkID0gdHJ1ZTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWVkIERlZmF1bHRGZWF0dXJlIEluc3RhbGxlZCIpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfTsNCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfTsNCi0NCi0JCXB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7DQotCQkJcmV0dXJuIG5vdGlmaWVkOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0SW5zdGFsbChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JcHJpdmF0ZSBJRmVhdHVyZSBnZXRGZWF0dXJlMShJU2l0ZSBzaXRlKQ0KLQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7DQotCQlTaXRlRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBuZXcgU2l0ZUZlYXR1cmVSZWZlcmVuY2UoKTsNCi0JCXJlZi5zZXRTaXRlKHNpdGUpOw0KLQkJcmVmLnNldFVSTFN0cmluZygiZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTFfMS4wLjQuamFyIik7DQotCQlyZWYuc2V0VHlwZShnZXREZWZhdWx0SW5zdGFsbGFibGVGZWF0dXJlVHlwZSgpKTsNCi0JCXJlZi5yZXNvbHZlKHNpdGUuZ2V0VVJMKCksIG51bGwpOw0KLQkJcmV0dXJuIHJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlU2l0ZSgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJLy8gdmVyaWZ5DQotCQlTdHJpbmcgc2l0ZSA9IGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCk7DQotCQlJUGx1Z2luRW50cnlbXSBlbnRyaWVzID0gcmVtb3RlRmVhdHVyZS5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQlhc3NlcnRUcnVlKCJubyBwbHVnaW5zIGVudHJ5IiwgKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCAhPSAwKSk7DQotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQlGaWxlIHBsdWdpbkZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCWFzc2VydFRydWUoInBsdWdpbiBmaWxlcyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0JCUZpbGUgcGx1Z2luWE1MRmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCXNpdGUsDQotCQkJCVNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUgKyBGaWxlLnNlcGFyYXRvciArICJwbHVnaW4ueG1sIik7DQotCQlhc3NlcnRUcnVlKCJwbHVnaW4ueG1sIGZpbGUgbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgcGx1Z2luWE1MRmlsZS5leGlzdHMoKSk7DQotDQotCQlGaWxlIGZlYXR1cmVGaWxlID0NCi0JCQluZXcgRmlsZSgNCi0JCQkJc2l0ZSwNCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQlhc3NlcnRUcnVlKA0KLQkJCSJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwNCi0JCQlmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotCQkvL2NsZWFudXANCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7DQotDQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEhUVFBTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQ0KLQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApDQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7DQotCQkJCXJlbW90ZUZlYXR1cmUgPSBmZWF0dXJlc1tpXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnROb3ROdWxsKCJDYW5ub3QgZmluZCBmZWF0dXJlMi5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOw0KLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShUQVJHRVRfRklMRV9TSVRFLG51bGwpOw0KLQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCwgbnVsbCk7DQotDQotCQkvLyBmZWF0dXJlMi5qYXIgc2hvdWxkIG5vdCBiZSBpbiB0aGUgbG9jYWwgc2l0ZQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBsb2NhbEZlYXR1cmVzID0gbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApDQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7DQotDQotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAobG9jYWxGZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJmZWF0dXJlczIuamFyIikpIHsNCi0JCQkJZm91bmQgPSB0cnVlOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotDQotCQlhc3NlcnRUcnVlKA0KLQkJCSJGb3VuZCBmZWF0dXJlMi5qYXIgb24gdGFyZ2V0IHNpdGUuIFRhcmdldCBzaXRlIGZlYXR1cmUgcmVmIHNob3VsZG5vdCBjb250YWluIEpBUiBmaWxlIiwNCi0JCQkhZm91bmQpOw0KLQ0KLQkJLy8gY2hlY2sNCi0JCVN0cmluZyBzaXRlID0gbG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0NCi0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOw0KLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5OiIrcGx1Z2luRmlsZSwgcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotDQotCQlGaWxlIGZlYXR1cmVGaWxlID0NCi0JCQluZXcgRmlsZSgNCi0JCQkJc2l0ZSwNCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJLy9sb2NhbFNpdGUuc2F2ZSgpOw0KLQ0KLQkJLy9jbGVhbnVwDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0ocGx1Z2luRmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obmV3IEZpbGUobG9jYWxTaXRlLmdldFVSTCgpLmdldEZpbGUoKSkpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0NCi0JCVVSTCBJTlNUQUxMX1NJVEUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJTlNUQUxMX1NJVEUgPQ0KLQkJCQluZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoZS50b1N0cmluZygpKTsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IHJlbW90ZVNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQ0KLQkJaWYgKGZlYXR1cmVzID09IG51bGwgfHwgZmVhdHVyZXMubGVuZ3RoID09IDApDQotCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHNpdGUiKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoZmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiaGVscEZlYXR1cmUuamFyIikpIHsNCi0JCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWFzc2VydE5vdE51bGwoIkNhbm5vdCBmaW5kIGhlbHAuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsNCi0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9DQotCQkJbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOw0KLQkJc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7DQotDQotCQkoKENvbmZpZ3VyZWRTaXRlKXNpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsNCi0JCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsNCi0NCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsNCi0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0NCi0JCVN0cmluZyBzaXRlUGF0aCA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSkNCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlUGF0aCwNCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJLy9jbGVhbnVwDQotCQlGaWxlIGZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkNCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3INCi0JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOw0KLQkJSW5zdGFsbFJlZ2lzdHJ5LnVucmVnaXN0ZXJQbHVnaW4oZW50cmllc1swXSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSgNCi0JCQluZXcgRmlsZSgNCi0JCQkJKChJbnN0YWxsQ29uZmlndXJhdGlvbikgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpDQotCQkJCQkuZ2V0VVJMKCkNCi0JCQkJCS5nZXRGaWxlKCkpKTsNCi0NCi0JCXNpdGUucmVtb3ZlQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOw0KLQkJYXNzZXJ0VHJ1ZSgiTGlzdGVuZXIgaGFzbid0IHJlY2VpdmVkIG5vdGlmaWNhdGlvbiIsIGxpc3RlbmVyLmlzTm90aWZpZWQoKSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlV2l0aG91dFNpdGVYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gZ2V0RmVhdHVyZTEocmVtb3RlU2l0ZSk7DQotCQlJQ29uZmlndXJlZFNpdGUgbG9jYWxTaXRlID0NCi0JCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJbG9jYWxTaXRlLmdldFNpdGUoKS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBmZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCWlmIChmZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0JCQlmYWlsKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGZlYXR1cmUsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgZmVhdHVyZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7DQotCQlpZiAobG9jYWxTaXRlLmdldFNpdGUoKS5nZXRBcmNoaXZlcygpLmxlbmd0aCA9PSAwKQ0KLQkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYXJjaGl2ZXMsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgYXJjaGl2ZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7DQotDQotCQkvL2NsZWFudXANCi0JCUZpbGUgZmlsZSA9DQotCQkJbmV3IEZpbGUoDQotCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpDQotCQkJCQkrIEZpbGUuc2VwYXJhdG9yDQotCQkJCQkrIFNpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIDQotCQkJCQkrIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0JCWZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQ0KLQkJCQkJKyBGaWxlLnNlcGFyYXRvcg0KLQkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgNCi0JCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYiKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0JCWZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQ0KLQkJCQkJKyBGaWxlLnNlcGFyYXRvcg0KLQkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgNCi0JCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAiKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQ0KLQkJdHJ5IHsNCi0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIiksbnVsbCk7DQotCQkJZmFpbCgiVGhlIHNpdGUgY29udGFpbnMgc2l0ZS54bWwuLi4gaXQgc2hvdWxkIGJlIGFuIEhUVFAgc2l0ZSB3aXRob3V0IGFuIFhNTCBmaWxlIik7CQkJDQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBleHBlY3RlZA0KLQkJfQ0KLQ0KLQl9DQotDQotLy8JLyoqDQotLy8JKiANCi0vLwkqLw0KLS8vCXByaXZhdGUgRmVhdHVyZSBjcmVhdGVQYWNrYWdlZEZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSkNCi0vLwkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLS8vCQlTdHJpbmcgcGFja2FnZWRGZWF0dXJlVHlwZSA9IElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFOw0KLS8vCQlGZWF0dXJlIHJlc3VsdCA9IG51bGw7DQotLy8JCWlmIChwYWNrYWdlZEZlYXR1cmVUeXBlICE9IG51bGwpIHsNCi0vLwkJCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0NCi0vLwkJCQlGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHBhY2thZ2VkRmVhdHVyZVR5cGUpOw0KLS8vCQkJcmVzdWx0ID0gKEZlYXR1cmUpIGZhY3RvcnkuY3JlYXRlRmVhdHVyZSh1cmwsIHNpdGUpOw0KLS8vCQl9DQotLy8JCXJldHVybiByZXN1bHQ7DQotLy8JfQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7DQotCQlTdHJpbmcgcGx1Z2luSUQgPQ0KLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuIjsNCi0JCXJldHVybiBwbHVnaW5JRCArIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0SW5zdGFsbFVSTFNJdGVYTUwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsVVJMU0l0ZVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzgyYmM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RJbnN0YWxsVVJMU0l0ZVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7DQotDQotcHVibGljIGNsYXNzIFRlc3RJbnN0YWxsVVJMU0l0ZVhNTCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRSA9ICJwYWNrYWdlZCI7IC8vJE5PTi1OTFMtMSQJDQotDQotCXB1YmxpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIElDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lciB7DQotDQotCQlwdWJsaWMgYm9vbGVhbiBub3RpZmllZCA9IGZhbHNlOw0KLQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUluc3RhbGxlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQkJbm90aWZpZWQgPSB0cnVlOw0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm90aWZpZWQgRGVmYXVsdEZlYXR1cmUgSW5zdGFsbGVkIik7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlUmVtb3ZlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlQ29uZmlndXJlZChJRmVhdHVyZSBmZWF0dXJlKSB7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBmZWF0dXJlVW5jb25maWd1cmVkKElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCX0NCi0NCi0JCXB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7DQotCQkJcmV0dXJuIG5vdGlmaWVkOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0SW5zdGFsbFVSTFNJdGVYTUwoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCXByaXZhdGUgSUZlYXR1cmUgZ2V0RmVhdHVyZTEoSVNpdGUgc2l0ZSkNCi0JCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7DQotCQlyZWYuc2V0U2l0ZShzaXRlKTsNCi0JCXJlZi5zZXRVUkxTdHJpbmcoImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIpOw0KLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOw0KLQkJcmVmLnJlc29sdmUoc2l0ZS5nZXRVUkwoKSwgbnVsbCk7DQotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0NCi0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwgU2l0ZS5TSVRFX1hNTCksdHJ1ZSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsNCi0JCVVSTCB1cmwgPSBUQVJHRVRfRklMRV9TSVRFOw0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOw0KLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh1cmwsdHJ1ZSxudWxsKTsNCi0JCXJlbW92ZShyZW1vdGVGZWF0dXJlLGxvY2FsU2l0ZSk7DQotCQlsb2NhbFNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsNCi0NCi0JCS8vIHZlcmlmeQ0KLQkJU3RyaW5nIHNpdGUgPSBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKTsNCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFBsdWdpbkVudHJpZXMoKTsNCi0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGUsIFNpdGUuREVGQVVMVF9QTFVHSU5fUEFUSCArIHBsdWdpbk5hbWUpOw0KLQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQkJRmlsZSBwbHVnaW5YTUxGaWxlID0NCi0JCQluZXcgRmlsZSgNCi0JCQkJc2l0ZSwNCi0JCQkJU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSArIEZpbGUuc2VwYXJhdG9yICsgInBsdWdpbi54bWwiKTsNCi0JCWFzc2VydFRydWUoInBsdWdpbi54bWwgZmlsZSBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5YTUxGaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLA0KLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWFzc2VydFRydWUoDQotCQkJImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IiArIGZlYXR1cmVGaWxlLA0KLQkJCWZlYXR1cmVGaWxlLmV4aXN0cygpKTsNCi0JCS8vY2xlYW51cA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEhUVFBTaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBjbGVhbg0KLQkJRmlsZSB0YXJnZXRGaWxlICA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXRGaWxlKTsNCi0JCUluc3RhbGxSZWdpc3RyeS5jbGVhbnVwKCk7DQotDQotCQlJU2l0ZSByZW1vdGVTaXRlID0NCi0JCQlTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0hUVFBfU0lURSwgU2l0ZS5TSVRFX1hNTCksdHJ1ZSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gbnVsbDsNCi0NCi0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQ0KLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSBzaXRlIik7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGZlYXR1cmVzW2ldLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkuZW5kc1dpdGgoImZlYXR1cmVzMi5qYXIiKSkgew0KLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgZmVhdHVyZTIuamFyIG9uIHNpdGUiLCByZW1vdGVGZWF0dXJlKTsNCi0JCVVSTCB1cmwgPSBUQVJHRVRfRklMRV9TSVRFOw0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpOw0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOw0KLQkJSVNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZSh1cmwsdHJ1ZSxudWxsKTsNCi0JCWxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJLy8gZmVhdHVyZTIuamFyIHNob3VsZCBub3QgYmUgaW4gdGhlIGxvY2FsIHNpdGUNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9IGxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKQ0KLQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOw0KLQ0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKS5lbmRzV2l0aCgiZmVhdHVyZXMyLmphciIpKSB7DQotCQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJYXNzZXJ0VHJ1ZSgNCi0JCQkiRm91bmQgZmVhdHVyZTIuamFyIG9uIHRhcmdldCBzaXRlLiBUYXJnZXQgc2l0ZSBmZWF0dXJlIHJlZiBzaG91bGRub3QgY29udGFpbiBKQVIgZmlsZSIsDQotCQkJIWZvdW5kKTsNCi0NCi0JCS8vIGNoZWNrDQotCQlTdHJpbmcgc2l0ZSA9IFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQ0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLA0KLQkJCQlTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSA0KLQkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKTsNCi0JCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHkiLCBmZWF0dXJlRmlsZS5leGlzdHMoKSk7DQotDQotCQkvL2xvY2FsU2l0ZS5zYXZlKCk7DQotDQotCQkvL2NsZWFudXANCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShwbHVnaW5GaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKSk7DQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvLyBjbGVhbnVwIGxvY2FsIGZpbGVzLi4uDQotCQlTaXRlTG9jYWwgc2l0ZUxvY2FsID0gKChTaXRlTG9jYWwpIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKTsNCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoc2l0ZUxvY2FsLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0JCS8vaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIGZhaWwoIkxvY2FsU2l0ZSBmaWxlIGRvZXNuJ3QgZXhpc3QgLT4iK2xvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSsiPC0iKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCQkvKg0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobG9jYWxGaWxlLFNpdGVMb2NhbC5TSVRFX0xPQ0FMX0ZJTEUpOw0KLQkJaWYgKCFsb2NhbEZpbGUuZXhpc3RzKCkpIGZhaWwoIkxvY2FsU2l0ZS54bWwgZG9lc24ndCBleGlzdDoiK2xvY2FsRmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JCSovDQotCQkNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlID0gbnVsbDsNCi0NCi0JCVVSTCBJTlNUQUxMX1NJVEUgPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlJTlNUQUxMX1NJVEUgPQ0KLQkJCQluZXcgVVJMKCJodHRwIiwgZ2V0SHR0cEhvc3QoKSwgZ2V0SHR0cFBvcnQoKSwgYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSk7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWZhaWwoZS50b1N0cmluZygpKTsNCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOw0KLQkJfQ0KLQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoSU5TVEFMTF9TSVRFLHRydWUsbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGZlYXR1cmVzID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJSUZlYXR1cmUgcmVtb3RlRmVhdHVyZSA9IG51bGw7DQotDQotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0JCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgc2l0ZSIpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChmZWF0dXJlc1tpXS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLmVuZHNXaXRoKCJoZWxwRmVhdHVyZS5qYXIiKSkgew0KLQkJCQlyZW1vdGVGZWF0dXJlID0gZmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJYXNzZXJ0Tm90TnVsbCgiQ2Fubm90IGZpbmQgaGVscC5qYXIgb24gc2l0ZSIsIHJlbW90ZUZlYXR1cmUpOw0KLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpOw0KLQkJc2l0ZS5hZGRDb25maWd1cmVkU2l0ZUNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7DQotDQotCQkoKENvbmZpZ3VyZWRTaXRlKXNpdGUpLnNldFVwZGF0YWJsZSh0cnVlKTsNCi0JCXNpdGUuaW5zdGFsbChyZW1vdGVGZWF0dXJlLCBudWxsLCBudWxsKTsNCi0NCi0JCUlQbHVnaW5FbnRyeVtdIGVudHJpZXMgPSByZW1vdGVGZWF0dXJlLmdldFJhd1BsdWdpbkVudHJpZXMoKTsNCi0JCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0NCi0JCVN0cmluZyBzaXRlUGF0aCA9IHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKTsNCi0JCVN0cmluZyBwbHVnaW5OYW1lID0gZW50cmllc1swXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCUZpbGUgcGx1Z2luRmlsZSA9IG5ldyBGaWxlKHNpdGVQYXRoLCBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEggKyBwbHVnaW5OYW1lKTsNCi0JCWlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCkuaW5kZXhPZigiZnIiKSAhPSAtMSkNCi0JCQlhc3NlcnRUcnVlKCJwbHVnaW4gaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitwbHVnaW5GaWxlLCBwbHVnaW5GaWxlLmV4aXN0cygpKTsNCi0NCi0JCUZpbGUgZmVhdHVyZUZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlUGF0aCwNCi0JCQkJU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7DQotCQlpZiAoTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImZyIikgIT0gLTEgfHwNCi0JCQkJTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoInVzIikgIT0gLTEgfHwNCi0JCQkJTG9jYWxlLmdldERlZmF1bHQoKS50b1N0cmluZygpLmluZGV4T2YoImRlIikgIT0gLTEpDQotCQlhc3NlcnRUcnVlKCJmZWF0dXJlIGluZm8gbm90IGluc3RhbGxlZCBsb2NhbGx5IiwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJLy9jbGVhbnVwDQotCQlGaWxlIGZpbGUgPQ0KLQkJCW5ldyBGaWxlKA0KLQkJCQlzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkNCi0JCQkJCSsgRmlsZS5zZXBhcmF0b3INCi0JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0JCQkJCSsgcmVtb3RlRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHBsdWdpbkZpbGUpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oDQotCQkJbmV3IEZpbGUoDQotCQkJCSgoSW5zdGFsbENvbmZpZ3VyYXRpb24pIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKQ0KLQkJCQkJLmdldFVSTCgpDQotCQkJCQkuZ2V0RmlsZSgpKSk7DQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOw0KLQkJDQotCQlzaXRlLnJlbW92ZUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsNCi0JCWFzc2VydFRydWUoIkxpc3RlbmVyIGhhc24ndCByZWNlaXZlZCBub3RpZmljYXRpb24iLCBsaXN0ZW5lci5pc05vdGlmaWVkKCkpOw0KLQl9DQotDQotLy8JcHVibGljIHZvaWQgdGVzdEZpbGVTaXRlV2l0aG91dFNpdGVYTUwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0vLw0KLS8vCQlJU2l0ZSByZW1vdGVTaXRlID0NCi0vLwkJCVNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFLCBTaXRlLlNJVEVfWE1MKSx0cnVlLG51bGwpOw0KLS8vCQlJRmVhdHVyZSByZW1vdGVGZWF0dXJlID0gZ2V0RmVhdHVyZTEocmVtb3RlU2l0ZSk7DQotLy8JCUlDb25maWd1cmVkU2l0ZSBsb2NhbFNpdGUgPQ0KLS8vCQkJU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0vLwkJbG9jYWxTaXRlLmdldFNpdGUoKS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLS8vDQotLy8JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXMgPSBsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotLy8JCWlmIChmZWF0dXJlcy5sZW5ndGggPT0gMCkNCi0vLwkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gZmVhdHVyZSwgc2hvdWxkIG5vdCBjb250YWluIGFuIFhNTCBmaWxlIGJ1dCBmZWF0dXJlcyBzaG91bGQgYmUgZm91bmQgYW55d2F5IGJ5IHBhcnNpbmciKTsNCi0vLwkJaWYgKGxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0QXJjaGl2ZXMoKS5sZW5ndGggPT0gMCkNCi0vLwkJCWZhaWwoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYXJjaGl2ZXMsIHNob3VsZCBub3QgY29udGFpbiBhbiBYTUwgZmlsZSBidXQgYXJjaGl2ZXMgc2hvdWxkIGJlIGZvdW5kIGFueXdheSBieSBwYXJzaW5nIik7DQotLy8NCi0vLwkJLy9jbGVhbnVwDQotLy8JCUZpbGUgZmlsZSA9DQotLy8JCQluZXcgRmlsZSgNCi0vLwkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQ0KLS8vCQkJCQkrIEZpbGUuc2VwYXJhdG9yDQotLy8JCQkJCSsgU2l0ZS5ERUZBVUxUX0lOU1RBTExFRF9GRUFUVVJFX1BBVEgNCi0vLwkJCQkJKyByZW1vdGVGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSk7DQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsNCi0vLwkJZmlsZSA9DQotLy8JCQluZXcgRmlsZSgNCi0vLwkJCQlsb2NhbFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKQ0KLS8vCQkJCQkrIEZpbGUuc2VwYXJhdG9yDQotLy8JCQkJCSsgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIDQotLy8JCQkJCSsgIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYiKTsNCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOw0KLS8vCQlmaWxlID0NCi0vLwkJCW5ldyBGaWxlKA0KLS8vCQkJCWxvY2FsU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkuZ2V0RmlsZSgpDQotLy8JCQkJCSsgRmlsZS5zZXBhcmF0b3INCi0vLwkJCQkJKyBTaXRlLkRFRkFVTFRfUExVR0lOX1BBVEgNCi0vLwkJCQkJKyAib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMCIpOw0KLS8vCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7DQotLy8JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsNCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7DQotLy8NCi0vLwl9DQotDQotCS8qKg0KLQkqIA0KLQkqLw0KLS8vCXByaXZhdGUgRmVhdHVyZSBjcmVhdGVQYWNrYWdlZEZlYXR1cmUoVVJMIHVybCwgSVNpdGUgc2l0ZSkNCi0vLwkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLS8vCQlTdHJpbmcgcGFja2FnZWRGZWF0dXJlVHlwZSA9IElTaXRlLkRFRkFVTFRfUEFDS0FHRURfRkVBVFVSRV9UWVBFOw0KLS8vCQlGZWF0dXJlIHJlc3VsdCA9IG51bGw7DQotLy8JCWlmIChwYWNrYWdlZEZlYXR1cmVUeXBlICE9IG51bGwpIHsNCi0vLwkJCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0NCi0vLwkJCQlGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRGYWN0b3J5KHBhY2thZ2VkRmVhdHVyZVR5cGUpOw0KLS8vCQkJcmVzdWx0ID0gKEZlYXR1cmUpIGZhY3RvcnkuY3JlYXRlRmVhdHVyZSh1cmwsIHNpdGUpOw0KLS8vCQl9DQotLy8JCXJldHVybiByZXN1bHQ7DQotLy8JfQ0KLQkvKg0KLQkgKiBAc2VlIElTaXRlI2dldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSB7DQotCQlTdHJpbmcgcGx1Z2luSUQgPQ0KLQkJCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuIjsNCi0JCXJldHVybiBwbHVnaW5JRCArIFBBQ0tBR0VEX0ZFQVRVUkVfVFlQRTsNCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0TG9jYWxTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Y2UyYTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhckluc3RhbGwvVGVzdExvY2FsU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVGVzdExvY2FsU2l0ZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RMb2NhbFNpdGUoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRpb25Db25maWdGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFuIHVwDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkNCi0NCi0NCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQkJc2l0ZS5zYXZlKCk7DQotCQlhc3NlcnRUcnVlKCJjb25maWcgZmlsZSBoYXNuJ3QgYmVlbiBzYXZlZCBpbiA6Iitsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGxvY2FsRmlsZS5leGlzdHMoKSk7DQotCQkNCi0JCS8vIGNsZWFudXANCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJDQotCQkNCi0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb25maWdGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFuIHVwDQotDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOw0KLQ0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGFuIGhpc3Rvcnkgb2YgaW5zdGFsbCBjb25maWd1cmF0aW9uIixzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoIT0wKTsNCi0JCWFzc2VydFRydWUoIlRoZSBsb2NhbCBzaXRlIGRvZXMgbm90IGNvbnRhaW4gYW4gY3VycmVudCBpbnN0YWxsIGNvbmZpZ3VyYXRpb24iLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSE9bnVsbCk7DQotCQlhc3NlcnRUcnVlKCJUaGUgbG9jYWwgc2l0ZSBkb2VzIG5vdCBjb250YWluIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHNpdGUgZm9yIHRoZSBjdXJyZW50IGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoIT0wKTsNCi0JCQ0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEZWZhdWx0IENvbmZpZyBTaXRlIGlzIDoiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7DQotCQkNCi0JCS8vIGNsZWFudXAJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQ0KLQkJDQotDQotCX0NCi0JDQotLyoJcHVibGljIHZvaWQgdGVzdEluc3RhbGxGZWF0dXJlU2F2ZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy9jbGVhbiB1cA0KLQkJU2l0ZUxvY2FsIHNpdGVMb2NhbCA9IChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChzaXRlTG9jYWwuZ2V0TG9jYXRpb25VUkwoKSxTaXRlTG9jYWwuU0lURV9MT0NBTF9GSUxFKTsNCi0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3VVJMLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZSgoKEluc3RhbGxDb25maWd1cmF0aW9uKXNpdGVMb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsJDQotCQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOwkJDQotDQotCQlJTG9jYWxTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsNCi0JCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEVfSU5TVEFMTEVEKTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZSgpOw0KLQkJaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7DQotCQkNCi0JCS8vIHdlIGFyZSBub3QgY2hlY2tpbmcgaWYgdGhpcyBpcyByZWFkIG9ubHkNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkNCi0JCS8vSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gbmV3Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOw0KLQkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7DQotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3koKENvbmZpZ3VyYXRpb25Qb2xpY3kpY29uZmlnUG9saWN5KTsNCi0JCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJDQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsJDQotCQlhc3NlcnROb3ROdWxsKGZlYXR1cmUpOwkNCi0NCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuaXNVcGRhdGFibGUodHJ1ZSk7DQotCQlyZW1vdmUoZmVhdHVyZSxjb25maWdTaXRlKTsJCQkJDQotCQljb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOw0KLQkJCQkNCi0JCS8vIHRlaCBjdXJyZW50IG9uZSBwb2ludHMgdG8gYSByZWFsIGZhdHVyZQ0KLQkJLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IuDQotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlhc3NlcnRUcnVlKCJObyBDb25maWd1cmVkIGZlYXR1cmVzIGZvdW5kIixjb25maWdTaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpLmxlbmd0aD4wKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpWzBdOw0KLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSByZWYuZ2V0RmVhdHVyZSgpOw0KLQkJLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOw0KLQ0KLQkJYXNzZXJ0RXF1YWxzKGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMCIpOw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgaWQgIHZlcnNpb24gb2YgZmVhdHVyZSIsZmVhdHVyZTIuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZSgib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTNfMS4wLjAiKSk7DQotCQkNCi0JCS8vIG9ubHkgb25lIGZlYXR1cmUgY29uZmlndXJlZA0KLQkJYXNzZXJ0VHJ1ZSgidG9vIG1hbnkgZmVhdHVyZXMgY29uZmlndXJlZCIsY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPT0xKTsNCi0JCQ0KLQkJLy8gbm8gZmVhdHVyZSB1bmNvbmZpZ3VyZWQNCi0JCWFzc2VydFRydWUoInRvbyBtYW55IHVuY29uZmlndXJlZCBmZWF0dXJlcyIsKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlMikuZ2V0Q29uZmlndXJhdGlvblBvbGljeSgpLmdldFVuY29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPT0wKTsNCi0JCQ0KLQkJLy8gdGVzdCBvbmx5IDIgaW5zdGFsbCBjb25maWcgaW4gbG9jYWwgc2l0ZQ0KLQkJLy9hc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBoaXN0b3J5IGluIExvY2FsIHNpdGU6IixvbGROdW1iZXJPZmhpc3RvcnkrMSxzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoKTsNCi0JCQ0KLQkJLy8gdGVzdCBzYW1lICMgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjb25maWcgc2l0ZXMgaW4gY3VycmVudCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg9PW9sZE51bWJlcik7DQotCQkNCi0JCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQ0KLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMgZm9yIGNvbmZpZyBzaXRlIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF0uZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPT0xKTsNCi0JCQ0KLQkJLy8gdGVzdCBvbmx5IDIgYWN0aXZpdGllcw0KLQkJYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGFjdGl2aXRpZXMgZm9yIGluc3RhbGwgY29uZmlnIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0QWN0aXZpdGllcygpLmxlbmd0aD09Mik7DQotDQotCQlzaXRlLnNhdmUoKTsJCQ0KLQ0KLQkJLy8gY2hlY2sNCi0JCS8vIHRoZXJlIGFyZSAyIGNvbmZpZ3VyYXRpb24NCi0JCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsNCi0JCVVSTCBsb2NhdGlvbiA9ICgoU2l0ZUxvY2FsKXNpdGUpLmdldExvY2F0aW9uVVJMKCk7DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJDb25maWciK3RpbWUrIi54bWwiKS5nZXRGaWxlKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsNCi0JCQ0KLQkJLy8gY2xlYW51cA0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlTG9jYWwuU0lURV9MT0NBTF9GSUxFKS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQkNCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZUxvY2FsLkRFRkFVTFRfQ09ORklHX0ZJTEUpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGUuREVGQVVMVF9GRUFUVVJFX1BBVEgrRmlsZS5zZXBhcmF0b3IrZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkuZ2V0RmlsZSgpKTsJCQ0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKS5nZXRGaWxlKCkpOwkJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkNCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmUyLmdldFVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JfQ0KLSovDQotCQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0cml2ZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy9jbGVhbiB1cA0KLQkJRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZSgoKFNpdGVMb2NhbClTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKSkuZ2V0TG9jYXRpb25VUkwoKS5nZXRGaWxlKCkpOw0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7CQ0KLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5sb2NhbFNpdGU9bnVsbDsJCQ0KLQ0KLQkJSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFX0lOU1RBTExFRCxudWxsKTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCWludCBvbGROdW1iZXIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKCkubGVuZ3RoOwkJDQotCQkNCi0JCS8vIHdlIGFyZSBub3QgY2hlY2tpbmcgaWYgdGhpcyBpcyByZWFkIG9ubHkNCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBuZXdDb25maWcgPSBzaXRlLmNsb25lQ3VycmVudENvbmZpZ3VyYXRpb24oKTsNCi0JCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkNCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlID0gbmV3Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJQ29uZmlndXJhdGlvblBvbGljeU1vZGVsIGNvbmZpZ1BvbGljeSA9IG5ldyBCYXNlU2l0ZUxvY2FsRmFjdG9yeSgpLmNyZWF0ZUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgpOw0KLQkJY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7DQotCQkoKENvbmZpZ3VyZWRTaXRlKWNvbmZpZ1NpdGUpLnNldENvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCgoQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKWNvbmZpZ1BvbGljeSk7CQ0KLQkJaW50IG9sZE51bWJlck9maGlzdG9yeSA9IHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGg7CQkJDQotCQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsNCi0JCWFzc2VydE5vdE51bGwoZmVhdHVyZSk7CQkJDQotCQkNCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0VXBkYXRhYmxlKHRydWUpOw0KLQkJcmVtb3ZlKGZlYXR1cmUsY29uZmlnU2l0ZSk7CQkJDQotCQljb25maWdTaXRlLmluc3RhbGwoZmVhdHVyZSxudWxsLG51bGwpOw0KLQkJc2l0ZS5zYXZlKCk7DQotCQkNCi0JCS8vIHdlIGNyZWF0ZWQgdGhlIHNlY29uZCB4bWwgZmlsZQ0KLQ0KLQkJLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQ0KLQkJLy8gYnV0IGZvcmNlIHJlLXJlYWQgb2YgeG1sIEZpbGUNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7DQotCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQkNCi0JCS8vIGNoZWNrDQotCQkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uDQotCQlTdHJpbmcgdGltZSA9ICIiK3NpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDcmVhdGlvbkRhdGUoKS5nZXRUaW1lKCk7DQotCQlVUkwgbG9jYXRpb24gPSAoKFNpdGVMb2NhbClzaXRlKS5nZXRMb2NhdGlvblVSTCgpOwkJDQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLCJwbGF0Zm9ybS54bWwiKS5nZXRGaWxlKCkpOw0KLQkJYXNzZXJ0VHJ1ZSgibmV3IGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZXhpc3QiLCBmaWxlLmV4aXN0cygpKTsNCi0JCQ0KLQkJLy8gdGVoIGN1cnJlbnQgb25lIHBvaW50cyB0byBhIHJlYWwgZmF0dXJlDQotCQkvLyBkb2VzIG5vdCB0aHJvdyBlcnJvci4NCi0JCUlDb25maWd1cmVkU2l0ZSBjb25maWdTaXRlMiA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSBudWxsOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJDQotCQkJaWYgKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlM18xLjAuMCIuZXF1YWxzKGZlYXR1cmUzLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSl7DQotCQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7DQotCQkJCWJyZWFrOw0KLQkJCX0JCQ0KLQkJfQ0KLQkJYXNzZXJ0Tm90TnVsbCgiRmVhdHVyZSAyIGlzIE51bGwiLGZlYXR1cmUyKTsNCi0JCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUzXzEuMC4wIikpOw0KLQkJDQotCQkvLyB0ZXN0IG9ubHkgMiBpbnN0YWxsIGNvbmZpZyBpbiBsb2NhbCBzaXRlDQotLy8JCWFzc2VydEVxdWFscygid3JvbmcgbnVtYmVyIG9mIGhpc3RvcnkgaW4gTG9jYWwgc2l0ZToiLG9sZE51bWJlck9maGlzdG9yeSsxLHNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKS5sZW5ndGgpOw0KLQkJDQotCQkvLyB0ZXN0ICMgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjb25maWcgc2l0ZXMgaW4gY3VycmVudCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg9PW9sZE51bWJlcik7DQotCQkNCi0JCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQ0KLS8vCQlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOw0KLQkJDQotCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzDQotLy8JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOw0KLQkJDQotCQkNCi0JCS8vIGNsZWFudXANCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCQkJDQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0oZmlsZSk7CQkNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0cml2ZUNvbmZpZ0hUVFBJbnN0YWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotDQotCQkvL2NsZWFuIHVwDQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkNCi0NCi0JCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0hUVFBfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQ0KLQkJLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQ0KLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIG5ld0NvbmZpZyA9IHNpdGUuY2xvbmVDdXJyZW50Q29uZmlndXJhdGlvbigpOw0KLQkJbmV3Q29uZmlnLnNldExhYmVsKCJuZXcgTGFiZWwiKTsJCQ0KLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQlDb25maWd1cmF0aW9uUG9saWN5TW9kZWwgY29uZmlnUG9saWN5ID0gbmV3IEJhc2VTaXRlTG9jYWxGYWN0b3J5KCkuY3JlYXRlQ29uZmlndXJhdGlvblBvbGljeU1vZGVsKCk7DQotCQljb25maWdQb2xpY3kuc2V0UG9saWN5KElQbGF0Zm9ybUNvbmZpZ3VyYXRpb24uSVNpdGVQb2xpY3kuVVNFUl9JTkNMVURFKTsNCi0JCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJDQotCQlpbnQgb2xkTnVtYmVyT2ZoaXN0b3J5ID0gc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aDsJCQkNCi0JCXNpdGUuYWRkQ29uZmlndXJhdGlvbihuZXdDb25maWcpOw0KLQkJDQotCQ0KLQkJKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7CQkJCQ0KLQkJY29uZmlnU2l0ZS5pbnN0YWxsKGZlYXR1cmUsbnVsbCxudWxsKTsNCi0JCXNpdGUuc2F2ZSgpOw0KLQ0KLQkJLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQ0KLQkJLy8gYnV0IGZvcmNlIHJlLXJlYWQgb2YgeG1sIEZpbGUNCi0JCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7DQotCQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCQlmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7DQotCQlpbnQgb2xkTnVtYmVyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aDsJCQ0KLQkJDQotCQkvLyBjaGVjaw0KLQkJLy8gdGhlcmUgYXJlIDIgY29uZmlndXJhdGlvbg0KLQkJU3RyaW5nIHRpbWUgPSAiIitzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q3JlYXRpb25EYXRlKCkuZ2V0VGltZSgpOw0KLQkJVVJMIGxvY2F0aW9uID0gKChTaXRlTG9jYWwpc2l0ZSkuZ2V0TG9jYXRpb25VUkwoKTsJCQ0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbiwicGxhdGZvcm0ueG1sIikuZ2V0RmlsZSgpKTsNCi0JCWFzc2VydFRydWUoIm5ldyBjb25maWd1cmF0aW9uIGRvZXMgbm90IGV4aXN0IiwgZmlsZS5leGlzdHMoKSk7DQotCQkNCi0JCS8vIHRlaCBjdXJyZW50IG9uZSBwb2ludHMgdG8gYSByZWFsIGZhdHVyZQ0KLQkJLy8gZG9lcyBub3QgdGhyb3cgZXJyb3IuDQotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlnU2l0ZTIgPSBzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCQkNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOw0KLQkJSUZlYXR1cmUgZmVhdHVyZTIgPSBudWxsOw0KLQkJZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiBpIDwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQ0KLQkJCWlmICgib3JnLnRlc3QxLmlkZW50MV8xLjAuMCIuZXF1YWxzKGZlYXR1cmUzLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSl7DQotCQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7DQotCQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQl9CQkNCi0JCX0NCi0NCi0JCS8vU3RyaW5nIGNvbmZpZ3VyZWRGZWF0dXJlID0gZmVhdHVyZTIuZ2V0TGFiZWwoKTsNCi0JCWFzc2VydFRydWUoImNhbm5vdCBmaW5kIGZlYXR1cmUgb3JnLnRlc3QxLmlkZW50MV8xLjAuMCBpbiBjb25maWd1cmVkIFNpdGUiLGZvdW5kKTsNCi0JCWFzc2VydFRydWUoIldyb25nIGlkICB2ZXJzaW9uIG9mIGZlYXR1cmUiLGZlYXR1cmUyLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiKSk7DQotCQkNCi0JCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUNCi0vLwkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBudW1iZXIgb2YgaGlzdG9yeSBpbiBMb2NhbCBzaXRlOiIsb2xkTnVtYmVyT2ZoaXN0b3J5KzEsc2l0ZS5nZXRDb25maWd1cmF0aW9uSGlzdG9yeSgpLmxlbmd0aCk7DQotCQkNCi0JCS8vIHRlc3Qgc2FtZSBudW1iZXIgb2Ygc2l0ZXMgaW4gY3VycmVudCBjb25maWcNCi0JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBjb25maWcgc2l0ZXMgaW4gY3VycmVudCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg9PW9sZE51bWJlcik7DQotCQkNCi0JCS8vdGVzdCBvbmx5IG9uZSBmZWF0dXJlIGZvciB0aGUgc2l0ZQ0KLS8vCQlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOw0KLQkJDQotCQkvLyB0ZXN0IG9ubHkgMiBhY3Rpdml0aWVzDQotLy8JCWFzc2VydFRydWUoIldyb25nIG51bWJlciBvZiBhY3Rpdml0aWVzIGZvciBpbnN0YWxsIGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldEFjdGl2aXRpZXMoKS5sZW5ndGg9PTIpOw0KLQkJDQotCQkNCi0JCS8vIGNsZWFudXANCi0JCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uLmdldEZpbGUoKSk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlLkRFRkFVTFRfRkVBVFVSRV9QQVRIK0ZpbGUuc2VwYXJhdG9yK2ZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpLmdldEZpbGUoKSk7CQkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkJCQkJCQkNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShmaWxlKTsJCQ0KLQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoZmVhdHVyZTIuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOw0KLQl9DQotCQ0KLS8vVE9ETyB1bmNvbW1lbnQgdGhpcyBvbmNlIHNpdGUgZGlzYWJsaW5nIGlzIHN1cHBvcnRlZA0KLXB1YmxpYyB2b2lkIHRlc3RSZXRyaXZlQ29uZmlnSFRUUEluc3RhbGxOb3RFbmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0vKg0KLQkvL2NsZWFuIHVwDQotCVNpdGVMb2NhbCBzaXRlTG9jYWwgPSAoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOw0KLQlVUkwgbmV3VVJMID0gbmV3IFVSTChzaXRlTG9jYWwuZ2V0TG9jYXRpb25VUkwoKSxTaXRlTG9jYWwuU0lURV9MT0NBTF9GSUxFKTsNCi0JRmlsZSBsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXdVUkwuZ2V0RmlsZSgpKTsNCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGxvY2FsRmlsZSk7DQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZSgoKEluc3RhbGxDb25maWd1cmF0aW9uKXNpdGVMb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsJDQotCUludGVybmFsU2l0ZU1hbmFnZXIubG9jYWxTaXRlPW51bGw7CQkNCi0NCi0JSUxvY2FsU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCUlTaXRlIHJlbW90ZVNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9IVFRQX1NJVEUpOw0KLQlJRmVhdHVyZSBmZWF0dXJlID0gcmVtb3RlU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdLmdldEZlYXR1cmUobnVsbCk7DQotCQkNCi0JLy8gd2UgYXJlIG5vdCBjaGVja2luZyBpZiB0aGlzIGlzIHJlYWQgb25seQ0KLQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gbmV3Q29uZmlnID0gc2l0ZS5jbG9uZUN1cnJlbnRDb25maWd1cmF0aW9uKCk7DQotCW5ld0NvbmZpZy5zZXRMYWJlbCgibmV3IExhYmVsIik7CQkNCi0JSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUgPSBuZXdDb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF07DQotCUNvbmZpZ3VyYXRpb25Qb2xpY3lNb2RlbCBjb25maWdQb2xpY3kgPSBuZXcgQmFzZVNpdGVMb2NhbEZhY3RvcnkoKS5jcmVhdGVDb25maWd1cmF0aW9uUG9saWN5TW9kZWwoKTsNCi0JY29uZmlnUG9saWN5LnNldFBvbGljeShJUGxhdGZvcm1Db25maWd1cmF0aW9uLklTaXRlUG9saWN5LlVTRVJfSU5DTFVERSk7DQotCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0Q29uZmlndXJhdGlvblBvbGljeU1vZGVsKChDb25maWd1cmF0aW9uUG9saWN5TW9kZWwpY29uZmlnUG9saWN5KTsJDQotCWludCBvbGROdW1iZXJPZmhpc3RvcnkgPSBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoOwkJCQ0KLQlzaXRlLmFkZENvbmZpZ3VyYXRpb24obmV3Q29uZmlnKTsNCi0JCQ0KLQkNCi0JKChDb25maWd1cmVkU2l0ZSljb25maWdTaXRlKS5zZXRVcGRhdGFibGUodHJ1ZSk7DQotCWNvbmZpZ1NpdGUuaW5zdGFsbChmZWF0dXJlLG51bGwsbnVsbCk7DQotCSgoQ29uZmlndXJlZFNpdGUpY29uZmlnU2l0ZSkuc2V0RW5hYmxlZChmYWxzZSk7CQ0KLQlzaXRlLnNhdmUoKTsNCi0NCi0JLy9kbyBub3QgY2xlYW51cCwgd2Ugd2FudCB0byByZXVzZSBwcmV2aW91c2x5IGNyZWF0ZWQgbG9jYWwgc2l0ZQ0KLQkvLyBidXQgZm9yY2UgcmUtcmVhZCBvZiB4bWwgRmlsZQ0KLQlJbnRlcm5hbFNpdGVNYW5hZ2VyLmxvY2FsU2l0ZT1udWxsOw0KLQlzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7DQotCWZlYXR1cmUgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF0uZ2V0RmVhdHVyZShudWxsKTsNCi0JaW50IG9sZE51bWJlciA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKS5sZW5ndGg7CQkNCi0JCQ0KLQkvLyBjaGVjaw0KLQkvLyB0aGVyZSBhcmUgMiBjb25maWd1cmF0aW9uDQotCVN0cmluZyB0aW1lID0gIiIrc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENyZWF0aW9uRGF0ZSgpLmdldFRpbWUoKTsNCi0JVVJMIGxvY2F0aW9uID0gKChTaXRlTG9jYWwpc2l0ZSkuZ2V0TG9jYXRpb25VUkwoKTsJCQ0KLQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbi5nZXRGaWxlKCkpOw0KLQlhc3NlcnRUcnVlKCJuZXcgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCIsIGZpbGUuZXhpc3RzKCkpOw0KLQkJDQotCS8vIHRlaCBjdXJyZW50IG9uZSBwb2ludHMgdG8gYSByZWFsIGZhdHVyZQ0KLQkvLyBkb2VzIG5vdCB0aHJvdyBlcnJvci4NCi0JSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ1NpdGUyID0gc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpWzBdOw0KLQkJDQotCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNvbmZpZ1NpdGUyLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOw0KLQlib29sZWFuIGZvdW5kID0gZmFsc2U7DQotCUlGZWF0dXJlIGZlYXR1cmUyID0gbnVsbDsNCi0JZm9yIChpbnQgaSA9IDA7ICFmb3VuZCAmJiBpIDwgcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJSUZlYXR1cmUgZmVhdHVyZTMgPSByZWZzW2ldLmdldEZlYXR1cmUobnVsbCk7CQkJDQotCQlpZiAoIm9yZy50ZXN0MS5pZGVudDFfMS4wLjAiLmVxdWFscyhmZWF0dXJlMy5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSkpew0KLQkJCWZlYXR1cmUyID0gZmVhdHVyZTM7DQotCQkJZm91bmQgPSB0cnVlOw0KLQkJfQkJDQotCX0NCi0NCi0JLy9TdHJpbmcgY29uZmlndXJlZEZlYXR1cmUgPSBmZWF0dXJlMi5nZXRMYWJlbCgpOw0KLQlhc3NlcnRUcnVlKCJmb3VuZCBmZWF0dXJlIG9yZy50ZXN0MS5pZGVudDFfMS4wLjAgaW4gZGlzYWJsZWQgY29uZmlndXJlZCBTaXRlIiwhZm91bmQpOw0KLQkJDQotCS8vdGVzdCBubyBjb25maWd1cmVkIGZlYXR1cmVzDQotLy8JYXNzZXJ0VHJ1ZSgid3JvbmcgbnVtYmVyIG9mIGNvbmZpZ3VyZWQgZmVhdHVyZXMgZm9yIGNvbmZpZyBzaXRlIixzaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZFNpdGVzKClbMF0uZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCkubGVuZ3RoPT0wKTsNCi0JDQotCQ0KLQljb25maWdTaXRlMi5zZXRFbmFibGVkKHRydWUpOw0KLQlyZWZzID0gY29uZmlnU2l0ZTIuZ2V0Q29uZmlndXJlZEZlYXR1cmVzKCk7CQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IHJlZnMubGVuZ3RoOyBpKyspIHsNCi0JCUlGZWF0dXJlIGZlYXR1cmUzID0gcmVmc1tpXS5nZXRGZWF0dXJlKG51bGwpOwkJCQ0KLQkJaWYgKCJvcmcudGVzdDEuaWRlbnQxXzEuMC4wIi5lcXVhbHMoZmVhdHVyZTMuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpKXsNCi0JCQlmZWF0dXJlMiA9IGZlYXR1cmUzOw0KLQkJCWZvdW5kID0gdHJ1ZTsNCi0JCX0JCQ0KLQl9DQotDQotCS8vU3RyaW5nIGNvbmZpZ3VyZWRGZWF0dXJlID0gZmVhdHVyZTIuZ2V0TGFiZWwoKTsNCi0JYXNzZXJ0VHJ1ZSgiY2Fubm90IGZpbmQgZmVhdHVyZSBvcmcudGVzdDEuaWRlbnQxXzEuMC4wIGluIGNvbmZpZ3VyZWQgU2l0ZSIsZm91bmQpOw0KLQlhc3NlcnRUcnVlKCJXcm9uZyBpZCAgdmVyc2lvbiBvZiBmZWF0dXJlIixmZWF0dXJlMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKCJvcmcudGVzdDEuaWRlbnQxXzEuMC4wIikpOw0KLQkJDQotCS8vIHRlc3Qgb25seSAyIGluc3RhbGwgY29uZmlnIGluIGxvY2FsIHNpdGUNCi0vLwlhc3NlcnRFcXVhbHMoIndyb25nIG51bWJlciBvZiBoaXN0b3J5IGluIExvY2FsIHNpdGU6IixvbGROdW1iZXJPZmhpc3RvcnkrMSxzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoKTsNCi0JCQ0KLQkvLyB0ZXN0IHNhbWUgbnVtYmVyIG9mIHNpdGVzIGluIGN1cnJlbnQgY29uZmlnDQotLy8JYXNzZXJ0VHJ1ZSgiV3JvbmcgbnVtYmVyIG9mIGNvbmZpZyBzaXRlcyBpbiBjdXJyZW50IGNvbmZpZyIsc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldENvbmZpZ3VyZWRTaXRlcygpLmxlbmd0aD09b2xkTnVtYmVyKTsNCi0JCQ0KLQkvL3Rlc3Qgb25seSBvbmUgZmVhdHVyZSBmb3IgdGhlIHNpdGUNCi0vLwlhc3NlcnRUcnVlKCJ3cm9uZyBudW1iZXIgb2YgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgY29uZmlnIHNpdGUiLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmVkU2l0ZXMoKVswXS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGg9PTEpOw0KLQkJDQotCS8vIHRlc3Qgb25seSAyIGFjdGl2aXRpZXMNCi0vLwlhc3NlcnRUcnVlKCJXcm9uZyBudW1iZXIgb2YgYWN0aXZpdGllcyBmb3IgaW5zdGFsbCBjb25maWciLHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRBY3Rpdml0aWVzKCkubGVuZ3RoPT0yKTsNCi0JCQ0KLQkJDQotCS8vIGNsZWFudXANCi0JbG9jYWxGaWxlID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbixTaXRlTG9jYWwuU0lURV9MT0NBTF9GSUxFKS5nZXRGaWxlKCkpOw0KLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJCQ0KLQlsb2NhbEZpbGUgPSBuZXcgRmlsZShuZXcgVVJMKGxvY2F0aW9uLFNpdGVMb2NhbC5ERUZBVUxUX0NPTkZJR19GSUxFKS5nZXRGaWxlKCkpOw0KLQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0obG9jYWxGaWxlKTsJDQotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKG5ldyBVUkwobG9jYXRpb24sU2l0ZS5ERUZBVUxUX0ZFQVRVUkVfUEFUSCtGaWxlLnNlcGFyYXRvcitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKS5nZXRGaWxlKCkpOwkJDQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOwkNCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pc2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpKS5nZXRVUkwoKS5nZXRGaWxlKCkpKTsJCQkJCQkNCi0JVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKGZpbGUpOwkJDQotCWxvY2FsRmlsZSA9IG5ldyBGaWxlKGZlYXR1cmUyLmdldFVSTCgpLmdldEZpbGUoKSk7DQotCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShsb2NhbEZpbGUpOyovDQotfQ0KLQ0KLQ0KLX0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFySW5zdGFsbC9UZXN0U3BhY2VJbkluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RTcGFjZUluSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTZlNGE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJJbnN0YWxsL1Rlc3RTcGFjZUluSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5yZWd1bGFySW5zdGFsbDsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RTcGFjZUluSW5zdGFsbCBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0U3BhY2VJbkluc3RhbGwoU3RyaW5nIGFyZzApIHsNCi0JCXN1cGVyKGFyZzApOw0KLQl9DQotDQotCS8qKg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdFNwYWNlSW5VUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vY2xlYW51cCB0YXJnZXQgDQotCQlVUkwgdGVzdFVSTCA9IG5ldyBVUkwoVEFSR0VUX0ZJTEVfU0lURSwidGVzdCBzaXRlIHNwYWNlLyIpOyANCi0JCVN0cmluZyB0ZXN0UGF0aCA9IHRlc3RVUkwuZ2V0RmlsZSgpOw0KLQkJRmlsZSB0YXJnZXQgPSBuZXcgRmlsZSh0ZXN0UGF0aCk7DQotCQlVcGRhdGVNYW5hZ2VyVXRpbHMucmVtb3ZlRnJvbUZpbGVTeXN0ZW0odGFyZ2V0KTsNCi0JCQ0KLQkJVVJMIG5ld1VSTCA9IG5ldyBGaWxlKGRhdGFQYXRoICsgIlNpdGUgd2l0aCBzcGFjZS9zaXRlLnhtbCIpLnRvVVJMKCk7DQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXdVUkwsdHJ1ZSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0ZXN0VVJMLmdldEZpbGUoKSk7DQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIGZpbGUubWtkaXJzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHRlc3RVUkwsdHJ1ZSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQkJDQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZA0KLQkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBwYWNrRmVhdHVyZSA9IGZhbHNlOw0KLQ0KLQkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsNCi0JDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJcmVtb3ZlKHJlbW90ZUZlYXR1cmUsbG9jYWxTaXRlKTsgDQotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsNCi0JCQkNCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsNCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOw0KLQ0KLQkJCS8vIHZlcmlmeQ0KLQkJCVN0cmluZyBzaXRlID0gdGVzdFVSTC5nZXRGaWxlKCk7DQotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJmZWF0dXJlLnhtbCIpOw0KLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOw0KLQkJfQ0KLQ0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpew0KLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7DQotCQl9DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotDQotDQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTcGFjZUluSFRUUFVSTCgpIHRocm93cyBFeGNlcHRpb24gew0KLQ0KLQkJLy9jbGVhbnVwIHRhcmdldCAgDQotCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKTsNCi0JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbSh0YXJnZXQpOw0KLQkJSW5zdGFsbFJlZ2lzdHJ5LmNsZWFudXAoKTsNCi0JCQ0KLQkJU3RyaW5nIHBhdGggPSBidW5kbGUuZ2V0U3RyaW5nKCJIVFRQX1BBVEhfMyIpOw0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IFVSTCgiaHR0cCIsZ2V0SHR0cEhvc3QoKSxnZXRIdHRwUG9ydCgpLHBhdGgpLHRydWUsbnVsbCk7CQkNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gZmVhdHVyZXNSZWYgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlJU2l0ZSBsb2NhbFNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFRBUkdFVF9GSUxFX1NJVEUsdHJ1ZSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBudWxsOw0KLQkJDQotCQkvLyBhdCBsZWFzdCBvbmUgZXhlY3V0YWJsZSBmZWF0dXJlIGFuZCBvbiBwYWNrYWdlZA0KLQkJYm9vbGVhbiBleGVjRmVhdHVyZSA9IGZhbHNlOw0KLQkJYm9vbGVhbiBwYWNrRmVhdHVyZSA9IGZhbHNlOw0KLQ0KLQkJaWYgKGZlYXR1cmVzUmVmLmxlbmd0aD09MCkgZmFpbCAoIm5vIGZlYXR1cmUgZm91bmQiKTsNCi0JDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzUmVmLmxlbmd0aDsgaSsrKSB7DQotCQkJcmVtb3RlRmVhdHVyZSA9IGZlYXR1cmVzUmVmW2ldLmdldEZlYXR1cmUobnVsbCk7DQotCQkJbG9jYWxTaXRlLmluc3RhbGwocmVtb3RlRmVhdHVyZSwgbnVsbCxudWxsKTsNCi0JCQkNCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpIHBhY2tGZWF0dXJlID0gdHJ1ZTsNCi0JCQlpZiAocmVtb3RlRmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlRXhlY3V0YWJsZUNvbnRlbnRQcm92aWRlcikgZXhlY0ZlYXR1cmUgPSB0cnVlOw0KLQ0KLQkJCS8vIHZlcmlmeQ0KLQkJCVN0cmluZyBzaXRlID0gVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCk7CQkJDQotCQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UmF3UGx1Z2luRW50cmllcygpOw0KLQkJCWFzc2VydFRydWUoIm5vIHBsdWdpbnMgZW50cnkiLCAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMubGVuZ3RoICE9IDApKTsNCi0JCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGVudHJpZXNbMF0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCk7DQotCQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQkJYXNzZXJ0VHJ1ZSgicGx1Z2luIGZpbGVzIG5vdCBpbnN0YWxsZWQgbG9jYWxseSIsIHBsdWdpbkZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJCUZpbGUgZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOw0KLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IitmZWF0dXJlRmlsZSwgZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQkJCUZpbGUgZmVhdHVyZUZpbGVYTUwgPSBuZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIHJlbW90ZUZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkgKyBGaWxlLnNlcGFyYXRvciArICJmZWF0dXJlLnhtbCIpOw0KLQkJCWFzc2VydFRydWUoImZlYXR1cmUgaW5mbyBub3QgaW5zdGFsbGVkIGxvY2FsbHk6IG5vIGZlYXR1cmUueG1sIiwgZmVhdHVyZUZpbGVYTUwuZXhpc3RzKCkpOw0KLQkJfQ0KLQ0KLQkJaWYgKCFleGVjRmVhdHVyZSAmJiAhcGFja0ZlYXR1cmUpew0KLQkJCWZhaWwoImNhbm5vdCBmaW5kIG9uZSBleGVjdXRhYmxlIGFuZCBvbmUgcGFja2FnZSBmZWF0dXJlIG9uIHRlaCBzaXRlIik7DQotCQl9DQotDQotCQkvL2NsZWFudXAgdGFyZ2V0IA0KLQkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKHRhcmdldCk7DQotCQlJbnN0YWxsUmVnaXN0cnkuY2xlYW51cCgpOw0KLQ0KLQl9DQotCQkNCi0JCQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9BbGxSZWd1bGFyUmVtb3ZlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3ZWM3NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9yZWd1bGFyUmVtb3ZlL0FsbFJlZ3VsYXJSZW1vdmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnJlZ3VsYXJSZW1vdmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxSZWd1bGFyUmVtb3ZlVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLXB1YmxpYyBBbGxSZWd1bGFyUmVtb3ZlVGVzdHMoU3RyaW5nIG5hbWUpIHsNCi0Jc3VwZXIobmFtZSk7DQotfQ0KLXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsNCi0JVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZSgpOw0KLQlzdWl0ZS5zZXROYW1lKCJSZWd1bGFyIFJlbW92ZSBUZXN0cyIpOw0KLQkNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RSZW1vdmUuY2xhc3MpKTsNCi0JDQotCXJldHVybiBzdWl0ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3JlZ3VsYXJSZW1vdmUvVGVzdFJlbW92ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZWIxMjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvcmVndWxhclJlbW92ZS9UZXN0UmVtb3ZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMucmVndWxhclJlbW92ZTsNCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi5JQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotcHVibGljIGNsYXNzIFRlc3RSZW1vdmUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQlwdWJsaWMgY2xhc3MgTGlzdGVuZXIgaW1wbGVtZW50cyBJQ29uZmlndXJlZFNpdGVDaGFuZ2VkTGlzdGVuZXIgew0KLQ0KLQkJcHVibGljIGJvb2xlYW4gbm90aWZpZWQgPSBmYWxzZTsNCi0NCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJCW5vdGlmaWVkID0gdHJ1ZTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGlmaWVkIERlZmF1bHRGZWF0dXJlIEluc3RhbGxlZCIpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfQ0KLQkJcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfTsNCi0JCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJfTsNCi0NCi0JCXB1YmxpYyBib29sZWFuIGlzTm90aWZpZWQoKSB7DQotCQkJcmV0dXJuIG5vdGlmaWVkOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgVGVzdDENCi0JICovDQotCXB1YmxpYyBUZXN0UmVtb3ZlKFN0cmluZyBhcmcwKSB7DQotCQlzdXBlcihhcmcwKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIElGZWF0dXJlIGdldEZlYXR1cmUxKElTaXRlIHNpdGUpDQotCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsNCi0JCS8vVVJMIHVybCA9IFVwZGF0ZU1hbmFnZXJVdGlscy5nZXRVUkwoc2l0ZS5nZXRVUkwoKSwgImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIsIG51bGwpOw0KLQkJU2l0ZUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gbmV3IFNpdGVGZWF0dXJlUmVmZXJlbmNlKCk7DQotCQlyZWYuc2V0U2l0ZShzaXRlKTsNCi0JCXJlZi5zZXRVUkxTdHJpbmcoImZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphciIpOw0KLQkJcmVmLnNldFR5cGUoSVNpdGUuREVGQVVMVF9QQUNLQUdFRF9GRUFUVVJFX1RZUEUpOw0KLQkJcmVmLnJlc29sdmUoc2l0ZS5nZXRVUkwoKSwgbnVsbCk7DQotCQlyZXR1cm4gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCS8vIGluc3RhbGwgZmVhdHVyZQ0KLQkJSVNpdGUgcmVtb3RlU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoU09VUkNFX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlIHJlbW90ZUZlYXR1cmUgPSBnZXRGZWF0dXJlMShyZW1vdGVTaXRlKTsNCi0JCUlTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUoVEFSR0VUX0ZJTEVfU0lURSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGxvY2FsU2l0ZS5pbnN0YWxsKHJlbW90ZUZlYXR1cmUsIG51bGwsIG51bGwpOw0KLQ0KLQkJLy8gdGhlbiByZW1vdmUgaXQNCi0JCWFzc2VydE5vdE51bGwoIkZlYXR1cmUgaXMgbnVsbCIscmVmLmdldEZlYXR1cmUobnVsbCkpOw0KLQkJU3RyaW5nIGZlYXR1cmVSZWYgPSByZWYuZ2V0RmVhdHVyZShudWxsKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKTsNCi0JCWxvY2FsU2l0ZS5yZW1vdmUocmVmLmdldEZlYXR1cmUobnVsbCksIG51bGwpOw0KLQ0KLQkJLy8gdmVyaWZ5DQotCQlTdHJpbmcgc2l0ZSA9IFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpOw0KLQkJSVBsdWdpbkVudHJ5W10gZW50cmllcyA9IHJlbW90ZUZlYXR1cmUuZ2V0UGx1Z2luRW50cmllcygpOw0KLQkJYXNzZXJ0VHJ1ZSgibm8gcGx1Z2lucyBlbnRyeSIsIChlbnRyaWVzICE9IG51bGwgJiYgZW50cmllcy5sZW5ndGggIT0gMCkpOw0KLQkJU3RyaW5nIHBsdWdpbk5hbWUgPSBlbnRyaWVzWzBdLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOw0KLQ0KLQkJRmlsZSBwbHVnaW5GaWxlID0gbmV3IEZpbGUoc2l0ZSwgU2l0ZS5ERUZBVUxUX1BMVUdJTl9QQVRIICsgcGx1Z2luTmFtZSk7DQotCQlhc3NlcnRUcnVlKCJwbHVnaW4gZmlsZXMgaW5zdGFsbGVkIGxvY2FsbHkiLCAhcGx1Z2luRmlsZS5leGlzdHMoKSk7DQotDQotCQlGaWxlIGZlYXR1cmVGaWxlID0NCi0JCQluZXcgRmlsZShzaXRlLCBTaXRlLkRFRkFVTFRfSU5TVEFMTEVEX0ZFQVRVUkVfUEFUSCArIGZlYXR1cmVSZWYpOw0KLQkJYXNzZXJ0VHJ1ZSgNCi0JCQkiZmVhdHVyZSBpbmZvIGluc3RhbGxlZCBsb2NhbGx5OiIgKyBmZWF0dXJlRmlsZSwNCi0JCQkhZmVhdHVyZUZpbGUuZXhpc3RzKCkpOw0KLQ0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL0FsbFNpdGVWYWxpZGF0aW9uVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL0FsbFNpdGVWYWxpZGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNjNhOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9BbGxTaXRlVmFsaWRhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zaXRldmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBBbGxTaXRlVmFsaWRhdGlvblRlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsKLQlwdWJsaWMgQWxsU2l0ZVZhbGlkYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLnNldE5hbWUoIlNpdGUgVmFsaWRhdGlvbiBUZXN0cyIpOwotCi0JCS8vIHRoZSBmb2xsb3dpbmcgd2lsbCB0YWtlIGFsbCB0ZWggdGVzdCBtZXRob2RzIGluIHRlaCBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggJ3Rlc3QnCi0KLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RTaXRlVmFsaWRhdGlvbi5jbGFzcykpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zaXRldmFsaWRhdGlvbi9UZXN0U2l0ZVZhbGlkYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL1Rlc3RTaXRlVmFsaWRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDVhMjdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3NpdGV2YWxpZGF0aW9uL1Rlc3RTaXRlVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnNpdGV2YWxpZGF0aW9uOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVZhbGlkYXRpb24gZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAKLQkgKi8KLQlwdWJsaWMgVGVzdFNpdGVWYWxpZGF0aW9uKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVDb25maWdTaXRlKFVSTCB1cmwpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBnZXQgbmV3IGNvbmZpZyBvYmplY3QKLQkJSVBsYXRmb3JtQ29uZmlndXJhdGlvbiBjZmlnID0gQ29uZmlndXJhdG9yVXRpbHMuZ2V0Q3VycmVudFBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwotCQlJU2l0ZUVudHJ5IHMxID0gY2ZpZy5maW5kQ29uZmlndXJlZFNpdGUodXJsKTsKLQkJYXNzZXJ0Tm90TnVsbCgiVW5hYmxlIHRvIGZpbmQgc2l0ZSBlbnRyeToiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChUQVJHRVRfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTEvZWNsaXBzZSIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCWZpbGUubWtkaXJzKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmICghc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljdXJyZW50Q29uZmlnLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKGNvbmZpZ3VyZWRTaXRlKTsKLQkJcmVtb3ZlQ29uZmlnU2l0ZShjb25maWd1cmVkU2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTIvZWNsaXBzZS8iKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGU7Ci0JCXRyeSB7Ci0JCSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSl7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOwotCi0JCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKHN0YXR1cy5pc09LKCkpewotCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJaWYgKHN0YXR1cy5nZXRNZXNzYWdlKCkuaW5kZXhPZigiVGhpcyBzaXRlIGlzIGNvbnRhaW5lZCBpbiBhbm90aGVyIHNpdGU6Iik9PS0xKXsKLQkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlVUkwgcmVtb3RlVXJsID0gbmV3IFVSTChTT1VSQ0VfRklMRV9TSVRFICsgInZhbGlkYXRpb24vc2l0ZTMvZWNsaXBzZS8iKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocmVtb3RlVXJsLmdldEZpbGUoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWwgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKTsKLQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQlJQ29uZmlndXJlZFNpdGUgY29uZmlndXJlZFNpdGUgPSBjdXJyZW50Q29uZmlnLmNyZWF0ZUNvbmZpZ3VyZWRTaXRlKGZpbGUpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGNvbmZpZ3VyZWRTaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOwotCi0vLwkJVXBkYXRlTWFuYWdlclV0aWxzLnJlbW92ZUZyb21GaWxlU3lzdGVtKG5ldyBGaWxlKGZpbGUsIi5lY2xpcHNlVU0iKSk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotLy8JCWlmIChzdGF0dXMuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIlRoaXMgc2l0ZSBpcyBjb250YWluZWQgaW4gYW5vdGhlciBzaXRlOiIpPT0tMSl7Ci0vLwkJCWZhaWwoIldyb25nIHZhbGlkYXRpb246IitzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLS8vCQl9Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlNCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNC9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgbm90IGJlIHVwZGF0YWJsZS4iOwotCQlpZiAoc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGUgc2l0ZSBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgdGhpcyBwcm9kdWN0LiBJdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCBwcm9kdWN0OiIpPT0tMSl7Ci0JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFNpdGU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJVVJMIHJlbW90ZVVybCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJ2YWxpZGF0aW9uL3NpdGU1LyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IGxvY2FsLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZSBjb25maWd1cmVkU2l0ZSA9IGN1cnJlbnRDb25maWcuY3JlYXRlQ29uZmlndXJlZFNpdGUoZmlsZSk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gY29uZmlndXJlZFNpdGUudmVyaWZ5VXBkYXRhYmxlU3RhdHVzKCk7Ci0KLQkJU3RyaW5nIG1zZyA9ICJUaGUgc2l0ZSAiK2ZpbGUrIiBzaG91bGQgYmUgdXBkYXRhYmxlLiI7Ci0JCWlmICghc3RhdHVzLmlzT0soKSl7Ci0JCQlmYWlsKG1zZytzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQkKLQkJCS8vIGdldCBuZXcgY29uZmlnIG9iamVjdAotCQlVUkwgdXJsID0gY29uZmlndXJlZFNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpOwotCQlJUGxhdGZvcm1Db25maWd1cmF0aW9uIGNmaWcgPSBDb25maWd1cmF0b3JVdGlscy5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7Ci0JCUlTaXRlRW50cnkgczEgPSBjZmlnLmZpbmRDb25maWd1cmVkU2l0ZSh1cmwpOwotCQlhc3NlcnROb3ROdWxsKCJTaXRlIGVudHJ5IG5vdCBmb3VuZDoiK3VybCxzMSk7Ci0JCWNmaWcudW5jb25maWd1cmVTaXRlKHMxKTsKLQkJY2ZpZy5zYXZlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXRlNigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVVSTCByZW1vdGVVcmwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAidmFsaWRhdGlvbi9zaXRlNi9jaGlsZHJlbi9jaGlsZHJlbi9lY2xpcHNlLyIpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShyZW1vdGVVcmwuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSBmaWxlLm1rZGlycygpOwotCQlJTG9jYWxTaXRlIGxvY2FsID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWwuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNvbmZpZ3VyZWRTaXRlID0gY3VycmVudENvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBjb25maWd1cmVkU2l0ZS52ZXJpZnlVcGRhdGFibGVTdGF0dXMoKTsKLQotLy8JCVVwZGF0ZU1hbmFnZXJVdGlscy5yZW1vdmVGcm9tRmlsZVN5c3RlbShuZXcgRmlsZShmaWxlLCIuZWNsaXBzZVVNIikpOwotCi0JCVN0cmluZyBtc2cgPSAiVGhlIHNpdGUgIitmaWxlKyIgc2hvdWxkIG5vdCBiZSB1cGRhdGFibGUuIjsKLQkJaWYgKHN0YXR1cy5pc09LKCkpewotCQkJZmFpbChtc2crc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLS8vCQlpZiAoc3RhdHVzLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJUaGlzIHNpdGUgaXMgY29udGFpbmVkIGluIGFub3RoZXIgc2l0ZToiKT09LTEpewotLy8JCQlmYWlsKCJXcm9uZyB2YWxpZGF0aW9uOiIrc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0vLwkJfQotCX0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9BbGxTdGFuZGFsb25lVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4OTMwOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL0FsbFN0YW5kYWxvbmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEFsbFN0YW5kYWxvbmVUZXN0cyBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZXsKLQotCXB1YmxpYyBBbGxTdGFuZGFsb25lVGVzdHMoU3RyaW5nIG5hbWUpewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCl7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuc2V0TmFtZSgiU3RhbmRhbG9uZSBUZXN0cyIpOwotCQkKLQkJLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRoZSB0ZXN0IG1ldGhvZHMgaW4gCi0JCS8vIHRoZSBjbGFzcyB0aGF0IHN0YXJ0IHdpdGggInRlc3QiCi0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZUluc3RhbGwuY2xhc3MpKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlVXBkYXRlLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZUVuYWJsZS5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEZlYXR1cmVEaXNhYmxlLmNsYXNzKSk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0RmVhdHVyZVVuaW5zdGFsbC5jbGFzcykpOwotCQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdEJ1bmRsZXNJbnN0YWxsLmNsYXNzKSk7Ci0JCS8vYW5kIHRoaXMgb25lJ3MgZm9yIGZ1biA6KQotLy8JCXN1aXRlLmFkZFRlc3QobmV3IFRlc3RTdWl0ZShUZXN0U2l0ZVNlYXJjaC5jbGFzcykpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9TdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MjA0ZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9TdGFuZGFsb25lTWFuYWdlclRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuKjsKLQotcHVibGljIGNsYXNzIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nQnVmZmVyIGVyck91dHB1dDsKLQlwdWJsaWMgc3RhdGljIEludGVnZXIgZXhpdFZhbHVlPSBuZXcgSW50ZWdlcigtMSk7Ci0JcHVibGljIHN0YXRpYyBVUkwgVEFSR0VUX0ZJTEVfU0lURTsKLQlwcml2YXRlIGJvb2xlYW4gb2xkQ2FjaGUgPSBmYWxzZTsKLQkKLQlzdGF0aWMgewotCQlGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7Ci0JCXRhcmdldERpciA9IG5ldyBGaWxlKHRhcmdldERpciwgInN0YW5kYWxvbmUiKTsKLQkJdGFyZ2V0RGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyLCAibXl0YXJnZXQiKTsKLQkJaWYgKHRhcmdldERpci5leGlzdHMoKSkKLQkJCWRlbGV0ZURpcmVjdG9yeSh0YXJnZXREaXIpOwotCQl0cnkgewotCQkJVEFSR0VUX0ZJTEVfU0lURSA9IHRhcmdldERpci50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSAoU3RyaW5nIGFyZzApewotCQlzdXBlcihhcmcwKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB1cCB0aGUgZml4dHVyZSwgZm9yIGV4YW1wbGUsIG9wZW4gYSBuZXR3b3JrIGNvbm5lY3Rpb24uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSBhIHRlc3QgaXMgZXhlY3V0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdW1TZXRVcCgpIHsKLQkJLy8gc2V0dXAgY2FjaGUgc2l0ZSB0byB0cnVlCi0JCW9sZENhY2hlID0gSW50ZXJuYWxTaXRlTWFuYWdlci5nbG9iYWxVc2VDYWNoZTsKLQkJSW50ZXJuYWxTaXRlTWFuYWdlci5nbG9iYWxVc2VDYWNoZSA9IHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFRlYXJzIGRvd24gdGhlIGZpeHR1cmUsIGZvciBleGFtcGxlLCBjbG9zZSBhIG5ldHdvcmsgY29ubmVjdGlvbi4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYSB0ZXN0IGlzIGV4ZWN1dGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVtVGVhckRvd24oKSB7Ci0JCS8vIGRvIG5vdGhpbmcuCi0JCUludGVybmFsU2l0ZU1hbmFnZXIuZ2xvYmFsVXNlQ2FjaGUgPSBvbGRDYWNoZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2hlY2tDb25maWd1cmVkU2l0ZXMoKXsKLQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGU7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigifn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiIpOwotCQl0cnkgewotCQkJbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxvY2FsU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpLmdldExhYmVsKCkpOwotCQkKLQkJLy9HZXQgc2l0ZSB0byBpbnN0YWxsIHRvCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50Q29uZmlnID0gbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCUlDb25maWd1cmVkU2l0ZVtdIHNpdGVzID0gY3VycmVudENvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLS8vCQotLy8JCQkvLyBzdGFydCBvZiBjb25maWcgc2l0ZSBwcmludAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdFVFRJTkcgQ09ORklHVVJFRCBTSVRFUy4uLiIpOwotCQlmb3IgKGludCBpID0gMDsgaTxzaXRlcy5sZW5ndGg7IGkrKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNpdGUgIyIgKyBpICsgIjogIiArIHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQl9Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigifn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fiIpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQkKLQkvLyBnZXQgdGhlIGZpcnN0IGNvbmZpZ3VyZWQgc2l0ZSBmb3VuZCBiZWNhdXNlIHRoaXMgaXMgdGhlIG9uZSB3ZSdyZSBtb3N0IGxpa2VseSB0byAKLQkvLyBoYXZlIGluc3RhbGxlZCBpbnRvCi0JcHVibGljIElTaXRlIGdldENvbmZpZ3VyZWRTaXRlKFVSTCB0YXJnZXQpewotCQl0cnkgewotCQkJSUxvY2FsU2l0ZSBsb2NhbCA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSBsb2NhbC5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjdXJyZW50Q29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcbnJldHJpZXZpbmcgY29uZmlndXJlZCBzaXRlcy4uLiIpOwotCQkJU3RyaW5nIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXQuZ2V0RmlsZSgpKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpPHNpdGVzLmxlbmd0aCA7IGkrKyl7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzaXRlWyIraSsiXTogIiArIHNpdGVzW2ldLmdldFNpdGUoKS5nZXRVUkwoKSk7Ci0JCQkJU3RyaW5nIHNpdGVGaWxlID0gbmV3IEZpbGUoc2l0ZXNbaV0uZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQkJaWYgKHRhcmdldEZpbGUuZXF1YWxzKHNpdGVGaWxlKSkKLQkJCQkJcmV0dXJuIHNpdGVzW2ldLmdldFNpdGUoKTsKLQkJCX0KLQkJCWlmIChzaXRlcy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBzaXRlc1swXS5nZXRTaXRlKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JLy9XYXRjaERvZyB0aHJlYWQgdG8ga2lsbCBtaXJyb3JpbmcgcHJvY2VzcyBpZiBpdCBoYW5ncyAob3IgdGFrZXMgdG9vIGxvbmcpCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lciBleHRlbmRzIFRocmVhZHsKLQkJcHJpdmF0ZSBQcm9jZXNzIHByb2M7Ci0JCQotCQlwdWJsaWMgVGltZXIoUHJvY2VzcyBwcm9jKXsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNldERhZW1vbih0cnVlKTsKLQkJCXRoaXMucHJvYyA9IHByb2M7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJ1bigpewotCQkJdHJ5IHsKLQkJCQkvLyBzbGVlcCB0aW1lIDVtaW4KLQkJCQlzbGVlcCgzMDAwMDApOyAKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImRlc3Ryb3lpbmcgcHJvY2VzcyIpOwotCQkJCXByb2MuZGVzdHJveSgpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvLyBTdHJlYW1Db25zdW1lciB0byBkaXNwbGF5IG91dHB1dCB0byBvdXRwdXQgZmlsZXMgb3IgY29uc29sZQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWFtQ29uc3VtZXIgZXh0ZW5kcyBUaHJlYWQgewotCQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGJSZWFkZXI7Ci0KLQkJcHVibGljIFN0cmVhbUNvbnN1bWVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCQlzdXBlcigpOwotCQkJc2V0RGFlbW9uKHRydWUpOwotCQkJYlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW5wdXRTdHJlYW0pKTsKLQkJCWVyck91dHB1dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIGxpbmU7Ci0JCQkJd2hpbGUgKG51bGwgIT0gKGxpbmUgPSBiUmVhZGVyLnJlYWRMaW5lKCkpKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJZXJyT3V0cHV0LmFwcGVuZChsaW5lKTsKLQkJCQkJZXJyT3V0cHV0LmFwcGVuZCgiXG4iKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHBhcmFtIGNvbW1hbmQgOiBjb21tYW5kIGFyZ3VtZW50IHRvIHJ1biBvbiBzaXRlL2ZlYXR1cmUgCi0JICogKGkuZS4gJ2luc3RhbGwnLCAnZW5hYmxlJywgJ2Rpc2FibGUnLCAndXBkYXRlJykgKjxpPnJlcXVpcmVkPC9pPioKLQkgKiBAcGFyYW0gZmlkIDogZmVhdHVyZSBpZCBvZiB0aGUgZmVhdHVyZSBiZWluZyBpbnN0YWxsZWQsIGVuYWJsZWQsIGV0Yy4KLQkgKiAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKLQkgKiBAcGFyYW0gdmVyIDogdmVyc2lvbiBvZiBmZWF0dXJlIGJlaW5nIGluc3RhbGxlZCwgZW5hYmxlZCwgZXRjLiAob3B0aW9uYWwgLSBjYW4gYmUgbnVsbCkKLQkgKiBAcGFyYW0gY29uZmlnIDogbG9jYXRpb24gb2YgY29uZmlndXJhdGlvbiBpbmZvIChpLmUuIGZpbGU6RDpcdGVtcFwuY29uZmlnXCkKLQkgKiBAcGFyYW0gcmVtb3RlTG9jIDogcmVtb3RlIHNpdGUgdXJsIChyZXF1aXJlZCBmb3IgaW5zdGFsbGluZy9zZWFyY2hpbmcgZnJvbSByZW1vdGUgc2l0ZSkKLQkgKiBAcGFyYW0gbG9jYWxMb2MgOiB0YXJnZXQgc2l0ZSBkaXJlY3RvcnkgKHJlcXVpcmVkIHVubGVzcyB1cGRhdGluZy9zZWFyY2hpbmcpCi0JICogQHJldHVybiBhIHN0cmluZyBhcnJheSBjb25zaXN0aW5nIG9mIGNvbW1hbmRzIGFuZCB0aGVpciBhcmd1bWVudHMgdG8KLQkgKiBiZSBydW4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29tbWFuZCgKLQkJU3RyaW5nIGNvbW1hbmQsCi0JCVN0cmluZyBmaWQsCi0JCVN0cmluZyB2ZXIsCi0JCVN0cmluZyBjb25maWcsCi0JCVN0cmluZyByZW1vdGVMb2MsCi0JCVN0cmluZyBsb2NhbExvYyl7Ci0JCWZpbmFsIFN0cmluZyBjbGFzc3BhdGggPSAic3RhcnR1cC5qYXIiOwotCQlmaW5hbCBTdHJpbmcgbGF1bmNoZXIgPSAib3JnLmVjbGlwc2UuY29yZS5sYXVuY2hlci5NYWluIjsKLQkJZmluYWwgU3RyaW5nIGFwcGxpY2F0aW9uID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnN0YW5kYWxvbmVVcGRhdGUiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DUCA9ICItY3AiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19BUFAgPSAiLWFwcGxpY2F0aW9uIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfQ01EID0gIi1jb21tYW5kIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfRklEID0gIi1mZWF0dXJlSWQiOwotCQlmaW5hbCBTdHJpbmcgRkxBR19EQVRBID0gIi1kYXRhIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfVkVSU0lPTiA9ICItdmVyc2lvbiI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0ZST00gPSAiLWZyb20iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19UTyA9ICItdG8iOwotCQlmaW5hbCBTdHJpbmcgRkxBR19DT05GSUcgPSAiLWNvbmZpZ3VyYXRpb24iOwotLy8JCWZpbmFsIFN0cmluZyBGTEFHX1VSTCA9ICItbWlycm9yVVJMIjsKLQkJZmluYWwgU3RyaW5nIEZMQUdfU1BMQVNIID0gIi1ub3NwbGFzaCI7Ci0JCWZpbmFsIFN0cmluZyBGTEFHX0NPTlNPTEVMT0cgPSAiLWNvbnNvbGVsb2ciOwotCQlmaW5hbCBTdHJpbmcgZGF0YSA9Ci0JCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFN0YXRlTG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCVN0cmluZ1tdIGNtZCA9Ci0JCQluZXcgU3RyaW5nW10gewotCQkJCWdldEphdmFWTVBhdGgoKSwKLQkJCQlGTEFHX0NQLAotCQkJCWNsYXNzcGF0aCwKLQkJCQlsYXVuY2hlciwKLQkJCQlGTEFHX0FQUCwKLQkJCQlhcHBsaWNhdGlvbiwKLQkJCQlGTEFHX0NNRCwKLQkJCQljb21tYW5kLAotCQkJCShyZW1vdGVMb2MgIT1udWxsID8gRkxBR19GUk9NIDogIiIpLAotCQkJCShyZW1vdGVMb2MgIT1udWxsID8gcmVtb3RlTG9jIDogIiIpLAotCQkJCShsb2NhbExvYyAhPW51bGwgPyBGTEFHX1RPIDogIiIpLAotCQkJCShsb2NhbExvYyAhPW51bGwgP2xvY2FsTG9jLnJlcGxhY2VGaXJzdCgiZmlsZToiLCAiIikgOiAiIiksCi0JCQkJKGZpZCAhPSBudWxsID8gRkxBR19GSUQgOiAiIiksCi0JCQkJKGZpZCAhPSBudWxsID8gZmlkIDogIiIpLAotCQkJCSh2ZXIgIT0gbnVsbCA/IEZMQUdfVkVSU0lPTiA6ICIiKSwKLQkJCQkodmVyICE9IG51bGwgPyB2ZXIgOiAiIiksCi0JCQkJKGNvbmZpZyAhPSBudWxsID8gRkxBR19DT05GSUcgOiAiIiksCi0JCQkJKGNvbmZpZyAhPSBudWxsID8gY29uZmlnIDogIiIpLAotCQkJCUZMQUdfU1BMQVNILAotCQkJCUZMQUdfREFUQSwKLQkJCQlkYXRhLAotCQkJCUZMQUdfQ09OU09MRUxPR307Ci0JCWZvciAoaW50IGkgPSAwIDtpPGNtZC5sZW5ndGg7IGkrKyl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KGNtZFtpXSArICIgIik7CQkJCi0JCX1TeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJcmV0dXJuIGNtZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVk1QYXRoKCkgewotCQkvLyBDcmVhdGUgY29tbWFuZCBzdHJpbmcgZm9yIGxhdW5jaGluZyB0aGUgcHJvY2VzcwotCQlTdHJpbmcgdm0gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEudm0ubmFtZSIpOwotCQlTdHJpbmcgZXhlY3V0YWJsZSA9ICJKOSIuZXF1YWxzKHZtKSA/ICJqOSIgOiAiamF2YSI7Ci0JCWlmIChvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuQ29uc3RhbnRzLk9TX1dJTjMyLmVxdWFscyhQbGF0Zm9ybS5nZXRPUygpKSkKLQkJCWV4ZWN1dGFibGUgKz0gIncuZXhlIjsKLQotCQlTdHJpbmcgamF2YUluc3RhbGxEaXIgPQotCQkJU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKSArIEZpbGUuc2VwYXJhdG9yICsgImJpbiI7Ci0JCXJldHVybiBqYXZhSW5zdGFsbERpciArIEZpbGUuc2VwYXJhdG9yICsgZXhlY3V0YWJsZTsKLQl9Ci0JCi0JcHVibGljIGludCBwZXJmb3JtQWN0aW9uKFN0cmluZ1tdIGNtZCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShnZXRFY2xpcHNlUm9vdCgpKTsKLQkJdHJ5IHsKLQotCQkJUHJvY2VzcyBwcm9jID0KLQkJCQlSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZCwgKFN0cmluZ1tdKSBudWxsLCBmaWxlKTsKLQotCQkJU3RyZWFtQ29uc3VtZXIgb3V0cHV0cyA9IG5ldyBTdHJlYW1Db25zdW1lcihwcm9jLmdldElucHV0U3RyZWFtKCkpOwotCQkJb3V0cHV0cy5zdGFydCgpOwotCQkJU3RyZWFtQ29uc3VtZXIgZXJyb3JzID0gbmV3IFN0cmVhbUNvbnN1bWVyKHByb2MuZ2V0RXJyb3JTdHJlYW0oKSk7Ci0JCQllcnJvcnMuc3RhcnQoKTsKLQkJCVRpbWVyIHRpbWVyID0gbmV3IFRpbWVyKHByb2MpOwotCQkJdGltZXIuc3RhcnQoKTsKLQotCQkJcmV0dXJuIHByb2Mud2FpdEZvcigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWNsaXBzZVJvb3QoKSB7Ci0JCXJldHVybiBDb25maWd1cmF0b3JVdGlscy5nZXRJbnN0YWxsVVJMKCkudG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlRmlyc3QoCi0JCQkiZmlsZToiLAotCQkJIiIpOwotCX0KLQkKLQlwdWJsaWMgQXJyYXlMaXN0IGdldEFycmF5TGlzdChTdHJpbmdbXSBsaXN0KXsKLQkJQXJyYXlMaXN0IHRlbXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvcihpbnQgaSA9IDA7IGk8IGxpc3QubGVuZ3RoOyBpKyspewotCQkJdGVtcC5hZGQobGlzdFtpXSk7Ci0JCX0KLQkJcmV0dXJuIHRlbXA7Ci0JfQotCQotCXB1YmxpYyBGaWxlIGdldExhdGVzdENvbmZpZ3VyYXRpb25GaWxlKEZpbGUgbG9jYWxGaWxlKSB7Ci0KLQkJdHJ5IHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVhZGluZyBmcm9tIDogIiArIGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJRmlsZVJlYWRlciBmcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIobG9jYWxGaWxlKTsKLQkJCQlCdWZmZXJlZFJlYWRlciBicmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZyZWFkZXIpOwotCQkJCVN0cmluZyBjb25maWdGaWxlTmFtZT0iIiwgbGluZTsKLQkJCQl3aGlsZSAoYnJlYWRlci5yZWFkeSgpKSB7Ci0JCQkJCWxpbmUgPSBicmVhZGVyLnJlYWRMaW5lKCk7Ci0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKGxpbmUpOwotCQkJCQlpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aCgiPGNvbmZpZyB1cmwiKSkgewotCQkJCQkJY29uZmlnRmlsZU5hbWUgPSBsaW5lLnNwbGl0KCJcIiIpWzFdOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHJlYWQgY29uZmlnIGZpbGUKLQkJCQlGaWxlIHBhcmVudCA9IG5ldyBGaWxlKGxvY2FsRmlsZS5nZXRQYXJlbnQoKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnQ6ICIgKyBwYXJlbnQuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCVN0cmluZ1tdIHBhckxpc3QgPSBwYXJlbnQubGlzdCgpOwotCQkJCWludCBsYXRlc3QgPSAwOyAKLQkJCQlmb3IgKGludCBpID0gcGFyTGlzdC5sZW5ndGgtMTsgaT49MDsgaS0tKXsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJwYXJMaXN0WyIgKyBpICsgIl06ICIgKyBwYXJMaXN0W2ldKTsKLQkJCQkJaWYgKHBhckxpc3RbaV0uc3RhcnRzV2l0aCgicGxhdGZvcm0iKSl7Ci0JCQkJCQlsYXRlc3QgPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUocGFyZW50LmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IgKyBwYXJMaXN0W2xhdGVzdF0pOwotCQkJCXJldHVybiBjb25maWdGaWxlOwotCQkJCS8vIGVuZCBvZiBjb25maWcgZmlsZSByZWFkCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBsb2NhbEZpbGU7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyKSB7Ci0JCUZpbGVbXSBsaXN0ID0gZGlyLmxpc3RGaWxlcygpOwotCQlpZiAobGlzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWZvciAoaW50IGk9MDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobGlzdFtpXS5pc0RpcmVjdG9yeSgpKSAKLQkJCQlkZWxldGVEaXJlY3RvcnkobGlzdFtpXSk7Ci0JCQlpZiAoIWxpc3RbaV0uZGVsZXRlKCkpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gZGVsZXRlICIrbGlzdFtpXS50b1N0cmluZygpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RCdW5kbGVzSW5zdGFsbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJhYjkwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEJ1bmRsZXNJbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLio7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RCdW5kbGVzSW5zdGFsbCBleHRlbmRzIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQ7Ci0KLQlwdWJsaWMgVGVzdEJ1bmRsZXNJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQlpc0luc3RhbGxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCXN1cGVyLnVtU2V0VXAoKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCS8vY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJCi0JCVN0cmluZyBmZWF0dXJlSWQgPSAiY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0KLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0gImh0dHA6Ly8iK2dldEh0dHBIb3N0KCkrIjoiKyBnZXRIdHRwUG9ydCgpKyAiL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlLnVwZGF0ZXRlc3RzL2J1bmRsZVNpdGUvIjs7Ci0JCWlmICghaXNJbnN0YWxsZWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkiPT09PT09PT09PT09PT0iICsgdGhpcy5nZXRDbGFzcygpICsgIj09PT09PT09PT09PT0iKTsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiBhcHAgPSBuZXcgU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWV4aXRWYWx1ZSA9IChJbnRlZ2VyKWFwcC5ydW4oZ2V0Q29tbWFuZCgKLQkJCQkJImluc3RhbGwiLAotCQkJCQlmZWF0dXJlSWQsCi0JCQkJCXZlcnNpb24sCi0JCQkJCW51bGwsCi0JCQkJCWZyb21SZW1vdGVTaXRlVXJsLAotCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXNJbnN0YWxsZWQgPSB0cnVlOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVnaW5zRXhpc3QoKSB7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcyA9IGxvY2FsU2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCWZhaWwoIk5vIHBsdWdpbiBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQl9IGVsc2V7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcGx1Z2luOiAiICsgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJbGlzdC5hZGQocGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQl7CSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luXzEuMC4wIiwKLQkJCQkiY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMCIsCi0JCQkJImNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudF8xLjAuMCIsCi0JCQkJImNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpXzEuMC4wIn07Ci0JCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChwbHVnaW5OYW1lcywgbGlzdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc0V4aXN0KCkgewotCQl0cnkgewotCQkJSVNpdGUgbG9jYWxTaXRlID0gIGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQkJLy8gZ2V0IGZlYXR1cmUgcmVmZXJlbmNlcyAKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsIGN1cnJlbnRDT25maWdTaXRlOiAiICsgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKXsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQkJCWxpc3QuYWRkKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJU3RyaW5nW10gZmVhdHVyZU5hbWVzID0KLQkJCQl7Ci0JCQkJCSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMCJ9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzSW5MaXN0KGZlYXR1cmVOYW1lcywgbGlzdCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfQotCX0KLQotCS8vIG1ha2VzIHN1cmUgYWxsIGZpbGVzL2RpcmVjdG9yaWVzIGluICJuYW1lcyIgYXJlIGluIHRoZSBkaXJlY3RvcnkgbGlzdGluZyAibGlzdCIKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0ZpbGVzSW5MaXN0KAotCQlTdHJpbmdbXSBuYW1lcywKLQkJQXJyYXlMaXN0IGxpc3QpIHsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lc1tpXSk7Ci0JCQlpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRGlzYWJsZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZURpc2FibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNzhlNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRGlzYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlRGlzYWJsZSBleHRlbmRzIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgewotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Rpc2FibGVkOwotCQotCXB1YmxpYyBUZXN0RmVhdHVyZURpc2FibGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzRGlzYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bVNldFVwKCkgewotCQlzdXBlci51bVNldFVwKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCWlmICghaXNEaXNhYmxlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkiZGlzYWJsZSIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzRGlzYWJsZWQgPSB0cnVlOwotCQkJY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJfQotCX0KLQkKLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlU3RhdHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgbG9jYWxGaWxlID0gbmV3IEZpbGUoKChTaXRlTG9jYWwpU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpLmdldExvY2F0aW9uVVJMKCkuZ2V0RmlsZSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKGxvY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydFRydWUobG9jYWxGaWxlLmV4aXN0cygpKTsKLQkJRmlsZSBjb25maWdGaWxlID0gZ2V0TGF0ZXN0Q29uZmlndXJhdGlvbkZpbGUobG9jYWxGaWxlKTsKLQkKLQkJU3RyaW5nW10gbmFtZXMgPQotCQkJewotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wLyIsCi0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAvIiwKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXRfMS4wLjAvIiB9OwotCQlhc3NlcnRUcnVlKGNvbmZpZ0ZpbGUuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKGNoZWNrRmVhdHVyZXNEaXNhYmxlZChnZXRBcnJheUxpc3QobmFtZXMpLGNvbmZpZ0ZpbGUsIFRBUkdFVF9GSUxFX1NJVEUuZ2V0RmlsZSgpKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2hlY2tGZWF0dXJlc0Rpc2FibGVkKEFycmF5TGlzdCBmZWF0dXJlTmFtZXMsIEZpbGUgY29uZmlnRmlsZSwgU3RyaW5nIHNpdGVMb2NhdGlvbil7Ci0JCXRyeSB7Ci0JCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihjb25maWdGaWxlKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm93IHJlYWRpbmcuLi4iICsgY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlib29sZWFuIGlzU2l0ZVRvQ2hlY2sgPSBmYWxzZTsKLQkJCXdoaWxlIChicmVhZGVyLnJlYWR5KCkpIHsKLQkJCQlsaW5lID0gYnJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCI8c2l0ZSB1cmwiKSl7Ci0JCQkJCWlzU2l0ZVRvQ2hlY2sgPSBsaW5lLnRyaW0oKS5zcGxpdCgiXCIiKVsxXS5yZXBsYWNlRmlyc3QoImZpbGU6IiwiIikuZXF1YWxzKHNpdGVMb2NhdGlvbik7Ci0JCQkJfSBlbHNlIGlmIChpc1NpdGVUb0NoZWNrICYmIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxmZWF0dXJlIGNvbmZpZ3VyZWQiKSl7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJU3RyaW5nW10gY29uZmlnTGluZSA9IGxpbmUuc3BsaXQoIlwiIik7Ci0JCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkgJiYgY29uZmlnTGluZVsxXS5lcXVhbHMoInRydWUiKSl7Ci0JCQkJCQlmYWlsKGNvbmZpZ0xpbmVbM10gKyAiIGhhcyBub3QgYmVlbiBkaXNhYmxlZC4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlRW5hYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OWFjNmIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUVuYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGxhdGZvcm1SdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlRW5hYmxlIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZDsKLQkKLQlwdWJsaWMgVGVzdEZlYXR1cmVFbmFibGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0KLQkJc3VwZXIudW1TZXRVcCgpOwotCQkKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJteS5hbHBoYWJldCI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4wIjsKLQotCQljaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQlpZiAoIWlzRW5hYmxlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkiZW5hYmxlIiwKLQkJCQkJZmVhdHVyZUlkLAotCQkJCQl2ZXJzaW9uLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXNFbmFibGVkID0gdHJ1ZTsKLQkJCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCX0KLQl9Ci0JCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZVN0YXR1cygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlGaWxlIGxvY2FsRmlsZSA9IG5ldyBGaWxlKCgoU2l0ZUxvY2FsKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpKS5nZXRMb2NhdGlvblVSTCgpLmdldEZpbGUoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlhc3NlcnRUcnVlKGxvY2FsRmlsZS5leGlzdHMoKSk7Ci0JCUZpbGUgY29uZmlnRmlsZSA9IGdldExhdGVzdENvbmZpZ3VyYXRpb25GaWxlKGxvY2FsRmlsZSk7Ci0JCQotCQlTdHJpbmdbXSBuYW1lcyA9Ci0JCQl7Ci0JCQkJImZlYXR1cmVzL215LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAvIiwKLQkJCQkiZmVhdHVyZXMvbXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMC8iLAotCQkJCSJmZWF0dXJlcy9teS5hbHBoYWJldF8xLjAuMC8iIH07Ci0JCWFzc2VydFRydWUoY29uZmlnRmlsZS5leGlzdHMoKSk7Ci0JCWFzc2VydFRydWUoY2hlY2tGZWF0dXJlc0VuYWJsZWQoZ2V0QXJyYXlMaXN0KG5hbWVzKSxjb25maWdGaWxlLCBUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoZWNrRmVhdHVyZXNFbmFibGVkKEFycmF5TGlzdCBmZWF0dXJlTmFtZXMsIEZpbGUgY29uZmlnRmlsZSwgU3RyaW5nIHNpdGVMb2NhdGlvbil7Ci0JCXRyeSB7Ci0JCQlGaWxlUmVhZGVyIGZyZWFkZXIgPSBuZXcgRmlsZVJlYWRlcihjb25maWdGaWxlKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZnJlYWRlcik7Ci0JCQlTdHJpbmcgbGluZTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibm93IHJlYWRpbmcuLi4iICsgY29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlib29sZWFuIGlzU2l0ZVRvQ2hlY2sgPSBmYWxzZTsKLQkJCXdoaWxlIChicmVhZGVyLnJlYWR5KCkpIHsKLQkJCQlsaW5lID0gYnJlYWRlci5yZWFkTGluZSgpOwotCQkJCWlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCI8c2l0ZSB1cmwiKSl7Ci0JCQkJCWlzU2l0ZVRvQ2hlY2sgPSBsaW5lLnRyaW0oKS5zcGxpdCgiXCIiKVsxXS5yZXBsYWNlRmlyc3QoImZpbGU6IiwiIikuZXF1YWxzKHNpdGVMb2NhdGlvbik7Ci0JCQkJfSBlbHNlIGlmIChpc1NpdGVUb0NoZWNrICYmIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoIjxmZWF0dXJlIGNvbmZpZ3VyZWQiKSl7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbihsaW5lKTsKLQkJCQkJU3RyaW5nW10gY29uZmlnTGluZSA9IGxpbmUuc3BsaXQoIlwiIik7Ci0JCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkgJiYgY29uZmlnTGluZVsxXS5lcXVhbHMoImZhbHNlIikpewotCQkJCQkJZmFpbChjb25maWdMaW5lWzNdICsgIiBoYXMgbm90IGJlZW4gZW5hYmxlZC4iKTsKLQkJCQkJfQotCQkJCQkvLyB0ZW1wIC0gZGVsZXRlIGxhdGVyCi0JCQkJCWlmIChmZWF0dXJlTmFtZXMuY29udGFpbnMoY29uZmlnTGluZVszXSkpCi0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4obGluZSk7Ci0JCQkJCS8vIGVuZCBvZiB0ZW1wIGRlbGV0ZQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbihlKTsKLQkJfSAKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZUluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2ZDFmZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuc3RhbmRhbG9uZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLio7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlSW5zdGFsbCBleHRlbmRzIFN0YW5kYWxvbmVNYW5hZ2VyVGVzdENhc2UgewotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQ7Ci0KLQlwdWJsaWMgVGVzdEZlYXR1cmVJbnN0YWxsKFN0cmluZyBhcmcwKSB7Ci0JCXN1cGVyKGFyZzApOwotCQlpc0luc3RhbGxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCXN1cGVyLnVtU2V0VXAoKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCS8vY2hlY2tDb25maWd1cmVkU2l0ZXMoKTsKLQkJCi0JCVN0cmluZyBmZWF0dXJlSWQgPSAibXkuYWxwaGFiZXQiOwotCQlTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7Ci0KLQkJU3RyaW5nIGZyb21SZW1vdGVTaXRlVXJsID0KLQkJCSJodHRwOi8vZGV2LmVjbGlwc2Uub3JnL3ZpZXdjdnMvaW5kZXguY2dpLyU3RWNoZWNrb3V0JTdFL3BsYXRmb3JtLXVwZGF0ZS1ob21lLzMuMC9zaXRlLyI7Ci0JCWlmICghaXNJbnN0YWxsZWQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkiPT09PT09PT09PT09PT0iICsgdGhpcy5nZXRDbGFzcygpICsgIj09PT09PT09PT09PT0iKTsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiBhcHAgPSBuZXcgU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWV4aXRWYWx1ZSA9IChJbnRlZ2VyKWFwcC5ydW4oZ2V0Q29tbWFuZCgKLQkJCQkJImluc3RhbGwiLAotCQkJCQlmZWF0dXJlSWQsCi0JCQkJCXZlcnNpb24sCi0JCQkJCW51bGwsCi0JCQkJCWZyb21SZW1vdGVTaXRlVXJsLAotCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXNJbnN0YWxsZWQgPSB0cnVlOwotCQl9Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQbHVnaW5zRXhpc3QoKSB7Ci0JCUlTaXRlIGxvY2FsU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCQkKLQkJU3lzdGVtLm91dC5wcmludGxuKCJsb2NhbFNpdGU6ICIgKyBsb2NhbFNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKTsKLQkJSVBsdWdpbkVudHJ5W10gcGx1Z2luRW50cmllcyA9IGxvY2FsU2l0ZS5nZXRQbHVnaW5FbnRyaWVzKCk7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApewotCQkJU3lzdGVtLmVyci5wcmludGxuKCJObyBwbHVnaW4gZW50cmllcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCWZhaWwoIk5vIHBsdWdpbiBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQl9IGVsc2V7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkVudHJpZXMubGVuZ3RoOyBpKyspewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcGx1Z2luOiAiICsgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJbGlzdC5hZGQocGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQl7CSJteS5hbHBoYWJldC5sZXR0ZXIuYV8xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0LmxldHRlci5iXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuZV8xLjAuMCIsCi0JCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAotCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiIH07Ci0JCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChwbHVnaW5OYW1lcywgbGlzdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc0V4aXN0KCkgewotCQl0cnkgewotCQkJSVNpdGUgbG9jYWxTaXRlID0gIGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsU2l0ZTogIiArIGxvY2FsU2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpOwotCQkJLy8gZ2V0IGZlYXR1cmUgcmVmZXJlbmNlcyAKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvY2FsIGN1cnJlbnRDT25maWdTaXRlOiAiICsgbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmVkU2l0ZSgpKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKGxvY2FsRmVhdHVyZXMgPT0gbnVsbCB8fCBsb2NhbEZlYXR1cmVzLmxlbmd0aCA9PSAwKXsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJCWZhaWwoIk5vIGZlYXR1cmVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsRmVhdHVyZXMubGVuZ3RoOyBpKyspCi0JCQkJCWxpc3QuYWRkKGxvY2FsRmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJU3RyaW5nW10gZmVhdHVyZU5hbWVzID0KLQkJCQl7Ci0JCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXRfMS4wLjAiIH07Ci0JCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QoZmVhdHVyZU5hbWVzLCBsaXN0KSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JLy8gbWFrZXMgc3VyZSBhbGwgZmlsZXMvZGlyZWN0b3JpZXMgaW4gIm5hbWVzIiBhcmUgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNJbkxpc3QoCi0JCVN0cmluZ1tdIG5hbWVzLAotCQlBcnJheUxpc3QgbGlzdCkgewotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWVzW2ldKTsKLQkJCWlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBlbnN1cmUgZXhpdCB3aXRob3V0IHByb2JsZW1zCi0JcHVibGljIHZvaWQgdGVzdEV4aXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV4aXRWYWx1ZTogIiArIGV4aXRWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleGl0VmFsdWUsIElQbGF0Zm9ybVJ1bm5hYmxlLkVYSVRfT0spOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVbmluc3RhbGwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVbmluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhMzZmZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy9zdGFuZGFsb25lL1Rlc3RGZWF0dXJlVW5pbnN0YWxsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5zdGFuZGFsb25lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zdGFuZGFsb25lLio7Ci0KLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVW5pbnN0YWxsIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVW5pbnN0YWxsZWQ7Ci0JCi0JcHVibGljIFRlc3RGZWF0dXJlVW5pbnN0YWxsKFN0cmluZyBhcmcwKXsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzVW5pbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdW1TZXRVcCgpIHsKLQkJc3VwZXIudW1TZXRVcCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImxvb2tpbmcgYXQgY29uZmlndXJlZCBzaXRlcyBhdmFpbGFibGUuLi4uIik7Ci0JCWNoZWNrQ29uZmlndXJlZFNpdGVzKCk7Ci0JCQotCQlTdHJpbmcgZmVhdHVyZUlkID0gIm15LmFscGhhYmV0IjsKLQkJU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOwotCi0JCWlmKCFpc1VuaW5zdGFsbGVkKXsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkiPT09PT09PT09PT09PT0iICsgdGhpcy5nZXRDbGFzcygpICsgIj09PT09PT09PT09PT0iKTsKLQkJCVN0YW5kYWxvbmVVcGRhdGVBcHBsaWNhdGlvbiBhcHAgPSBuZXcgU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uKCk7Ci0JCQl0cnkgewotCQkJCWV4aXRWYWx1ZSA9IChJbnRlZ2VyKWFwcC5ydW4oZ2V0Q29tbWFuZCgKLQkJCQkJInVuaW5zdGFsbCIsCi0JCQkJCWZlYXR1cmVJZCwKLQkJCQkJdmVyc2lvbiwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJVEFSR0VUX0ZJTEVfU0lURS5nZXRGaWxlKCkpKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWlzVW5pbnN0YWxsZWQgPSB0cnVlOwotCQl9Ci0JfQotCQotCS8vIGVuc3VyZSBleGl0IHdpdGhvdXQgcHJvYmxlbXMKLQlwdWJsaWMgdm9pZCB0ZXN0RXhpdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZXhpdFZhbHVlOiAiICsgZXhpdFZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXRWYWx1ZSwgSVBsYXRmb3JtUnVubmFibGUuRVhJVF9PSyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlc1VuaW5zdGFsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJU2l0ZSBsb2NhbFNpdGUgPSBnZXRDb25maWd1cmVkU2l0ZShUQVJHRVRfRklMRV9TSVRFKTsKLQkJCQotCQkJLy8gZ2V0IGZlYXR1cmUgcmVmZXJlbmNlcyAKLQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gbG9jYWxGZWF0dXJlcyA9Ci0JCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChsb2NhbEZlYXR1cmVzID09IG51bGwgfHwgbG9jYWxGZWF0dXJlcy5sZW5ndGggPT0gMCl7Ci0JCQkJZmFpbCgiTm8gZmVhdHVyZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxGZWF0dXJlcy5sZW5ndGg7IGkrKykKLQkJCQkJbGlzdC5hZGQobG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBmZWF0dXJlTmFtZXMgPQotCQkJCXsKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMCIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc05vdEluTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBsdWdpbnNVbmluc3RhbGxlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJSVNpdGUgbG9jYWxTaXRlID0gZ2V0Q29uZmlndXJlZFNpdGUoVEFSR0VUX0ZJTEVfU0lURSk7Ci0JCQkKLQkJCUlQbHVnaW5FbnRyeVtdIHBsdWdpbkVudHJpZXMgPSBsb2NhbFNpdGUuZ2V0UGx1Z2luRW50cmllcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAocGx1Z2luRW50cmllcyA9PSBudWxsIHx8IHBsdWdpbkVudHJpZXMubGVuZ3RoID09IDApCi0JCQkJZmFpbCgiTm8gcGx1Z2luIGVudHJpZXMgb24gdGhlIHRhcmdldCBzaXRlIik7Ci0JCQllbHNlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwbHVnaW5FbnRyaWVzLmxlbmd0aDsgaSsrKXsKLQkJCQkJbGlzdC5hZGQocGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicGx1Z2luIGZvdW5kOiAiICsgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJfQotCi0JCQlTdHJpbmdbXSBwbHVnaW5OYW1lcyA9Ci0JCQkJewkibXkuYWxwaGFiZXQubGV0dGVyLmFfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmJfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQubGV0dGVyLmVfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiB9OwotCQkJYXNzZXJ0VHJ1ZShjaGVja0ZpbGVzTm90SW5MaXN0KHBsdWdpbk5hbWVzLCBsaXN0KSk7CQotCX0KLQkKLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBOT1QgaW4gdGhlIGRpcmVjdG9yeSBsaXN0aW5nICJsaXN0IgotCXB1YmxpYyBib29sZWFuIGNoZWNrRmlsZXNOb3RJbkxpc3QoCi0JCVN0cmluZ1tdIG5hbWVzLAotCQlBcnJheUxpc3QgbGlzdCkgewotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZWFyY2hpbmcgZm9yICIgKyBuYW1lc1tpXSArICIuLi4iKTsKLQkJCWlmIChsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvc3RhbmRhbG9uZS9UZXN0RmVhdHVyZVVwZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTk2YTQ1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3N0YW5kYWxvbmUvVGVzdEZlYXR1cmVVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnN0YW5kYWxvbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnN0YW5kYWxvbmUuKjsKLQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVXBkYXRlIGV4dGVuZHMgU3RhbmRhbG9uZU1hbmFnZXJUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXBkYXRlZDsKLQkKLQlwdWJsaWMgVGVzdEZlYXR1cmVVcGRhdGUoU3RyaW5nIGFyZzApIHsKLQkJc3VwZXIoYXJnMCk7Ci0JCWlzVXBkYXRlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVtU2V0VXAoKSB7Ci0JCXN1cGVyLnVtU2V0VXAoKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJsb29raW5nIGF0IGNvbmZpZ3VyZWQgc2l0ZXMgYXZhaWxhYmxlLi4uLiIpOwotCQljaGVja0NvbmZpZ3VyZWRTaXRlcygpOwotCQkKLQkJU3RyaW5nIGZlYXR1cmVJZCA9ICJteS5hbHBoYWJldCI7Ci0JCVN0cmluZyB2ZXJzaW9uID0gIjEuMC4xIjsKLQotCQlpZiAoIWlzVXBkYXRlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKAotCQkJCSI9PT09PT09PT09PT09PSIgKyB0aGlzLmdldENsYXNzKCkgKyAiPT09PT09PT09PT09PSIpOwotCQkJU3RhbmRhbG9uZVVwZGF0ZUFwcGxpY2F0aW9uIGFwcCA9IG5ldyBTdGFuZGFsb25lVXBkYXRlQXBwbGljYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJZXhpdFZhbHVlID0gKEludGVnZXIpYXBwLnJ1bihnZXRDb21tYW5kKAotCQkJCQkJInVwZGF0ZSIsCi0JCQkJCQlmZWF0dXJlSWQsCi0JCQkJCQl2ZXJzaW9uLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQlUQVJHRVRfRklMRV9TSVRFLmdldEZpbGUoKSkpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQkJaXNVcGRhdGVkID0gdHJ1ZTsKLQkJfQotCX0KLQotCi0JLy8gZW5zdXJlIGV4aXQgd2l0aG91dCBwcm9ibGVtcwotCXB1YmxpYyB2b2lkIHRlc3RFeGl0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJleGl0VmFsdWU6ICIgKyBleGl0VmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpdFZhbHVlLCBJUGxhdGZvcm1SdW5uYWJsZS5FWElUX09LKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBsdWdpbnNFeGlzdCgpIHsKLQotCQkJSVNpdGUgbG9jYWxTaXRlID0gIGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCi0JCQlJUGx1Z2luRW50cnlbXSBwbHVnaW5FbnRyaWVzID0gbG9jYWxTaXRlLmdldFBsdWdpbkVudHJpZXMoKTsKLQkJCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKHBsdWdpbkVudHJpZXMgPT0gbnVsbCB8fCBwbHVnaW5FbnRyaWVzLmxlbmd0aCA9PSAwKQotCQkJCWZhaWwoIk5vIHBsdWdpbiBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2l0ZSIpOwotCQkJZWxzZQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlsaXN0LmFkZCgKLQkJCQkJCXBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCX0KLQotCQkJU3RyaW5nW10gcGx1Z2luTmFtZXMgPQotCQkJCXsKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5hXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5iXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5jXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LmxldHRlci5lXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjAiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYV8xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuYl8xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuY18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5sZXR0ZXIuZV8xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldC5yb3VuZC5sZXR0ZXJzXzEuMC4xIiwKLQkJCQkJIm15LmFscGhhYmV0LnN0cmFpZ2h0LmxldHRlcnNfMS4wLjEiLAotCQkJCQkibXkuYWxwaGFiZXRfMS4wLjEiIH07Ci0JCQlhc3NlcnRUcnVlKGNoZWNrRmlsZXNJbkxpc3QocGx1Z2luTmFtZXMsIGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZXNFeGlzdCgpIHsKLQkJdHJ5IHsKLQkJCUlTaXRlIGxvY2FsU2l0ZSA9IGdldENvbmZpZ3VyZWRTaXRlKFRBUkdFVF9GSUxFX1NJVEUpOwotCi0JCQkvLyBnZXQgZmVhdHVyZSByZWZlcmVuY2VzCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGxvY2FsRmVhdHVyZXMgPQotCQkJCWxvY2FsU2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAobG9jYWxGZWF0dXJlcyA9PSBudWxsIHx8IGxvY2FsRmVhdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCQlmYWlsKCJObyBmZWF0dXJlcyBvbiB0aGUgdGFyZ2V0IHNpdGUiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKAotCQkJCQkJbG9jYWxGZWF0dXJlc1tpXS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigKLQkJCQkJCWxvY2FsRmVhdHVyZXNbaV0uZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLnRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZ1tdIGZlYXR1cmVOYW1lcyA9Ci0JCQkJewotCQkJCQkibXkuYWxwaGFiZXQucm91bmQubGV0dGVyc18xLjAuMCIsCi0JCQkJCSJteS5hbHBoYWJldC5zdHJhaWdodC5sZXR0ZXJzXzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0XzEuMC4wIiwKLQkJCQkJIm15LmFscGhhYmV0LnJvdW5kLmxldHRlcnNfMS4wLjEiLAotCQkJCQkibXkuYWxwaGFiZXQuc3RyYWlnaHQubGV0dGVyc18xLjAuMSIsCi0JCQkJCSJteS5hbHBoYWJldF8xLjAuMSIgfTsKLQkJCWFzc2VydFRydWUoY2hlY2tGaWxlc0luTGlzdChmZWF0dXJlTmFtZXMsIGxpc3QpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0JCX0KLQl9Ci0KLQkvLyBtYWtlcyBzdXJlIGFsbCBmaWxlcy9kaXJlY3RvcmllcyBpbiAibmFtZXMiIGFyZSBpbiB0aGUgZGlyZWN0b3J5IGxpc3RpbmcKLQkvLyAibGlzdCIKLQlwdWJsaWMgYm9vbGVhbiBjaGVja0ZpbGVzSW5MaXN0KFN0cmluZ1tdIG5hbWVzLCBBcnJheUxpc3QgbGlzdCkgewotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL0FsbFR5cGVzVGVzdHMuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL0FsbFR5cGVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwNjQ4ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9BbGxUeXBlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMudHlwZXM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOw0KLQ0KLQ0KLXB1YmxpYyBjbGFzcyBBbGxUeXBlc1Rlc3RzIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi1wdWJsaWMgQWxsVHlwZXNUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQlzdXBlcihuYW1lKTsNCi19DQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOw0KLQkNCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RGZWF0dXJlVHlwZS5jbGFzcykpOw0KLQlzdWl0ZS5hZGRUZXN0KG5ldyBUZXN0U3VpdGUoVGVzdFNpdGVUeXBlLmNsYXNzKSk7CQ0KLQkNCi0JLy8gb3IgeW91IGNhbiBzcGVjaWZ5IHRoZSBtZXRob2QNCi0JLy9zdWl0ZS5hZGRUZXN0KG5ldyBUZXN0R2V0RmVhdHVyZSgibWV0aG9kVGhhdERvZXNOb3RTdGFydFdpdGh0ZXN0IikpOwkNCi0JDQotCXJldHVybiBzdWl0ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL1Rlc3RGZWF0dXJlVHlwZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzkzNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdHlwZXMvVGVzdEZlYXR1cmVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotDQotcHVibGljIGNsYXNzIFRlc3RGZWF0dXJlVHlwZSBleHRlbmRzIFVwZGF0ZU1hbmFnZXJUZXN0Q2FzZSB7DQotDQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFRF9GRUFUVVJFX1RZUEUgPSAicGFja2FnZWQiOyAvLyROT04tTkxTLTEkDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMRURfRkVBVFVSRV9UWVBFID0gImluc3RhbGxlZCI7IC8vJE5PTi1OTFMtMSQJDQotCQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RGZWF0dXJlVHlwZShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkgew0KLQkJU3RyaW5nIHBsdWdpbklEID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpICsgIi4iOyAvLyROT04tTkxTLTEkDQotCQlyZXR1cm4gcGx1Z2luSUQgKyBQQUNLQUdFRF9GRUFUVVJFX1RZUEU7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEV4ZWN1dGFibGVGZWF0dXJlVHlwZSgpIHsNCi0JCVN0cmluZyBwbHVnaW5JRCA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKSArICIuIjsgLy8kTk9OLU5MUy0xJA0KLQkJcmV0dXJuIHBsdWdpbklEICsgSU5TVEFMTEVEX0ZFQVRVUkVfVFlQRTsNCi0JfQkJDQotCQ0KLQkvKioNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYWNrYWdlZEZlYXR1cmVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgDQotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCQlJRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IGZhY3Rvcmllcy5nZXRGYWN0b3J5KGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkpOw0KLQkJDQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfRklMRV9TSVRFLG51bGwpOw0KLQkJVVJMIGZlYXR1cmVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUsImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIgIik7DQotCQkNCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGZlYXR1cmVVUkwsc2l0ZSxudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGFub3RoZXJGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7DQotCX0JDQotCQ0KLQkJLyoqDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgDQotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCQlJRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IGZhY3Rvcmllcy5nZXRGYWN0b3J5KGdldERlZmF1bHRFeGVjdXRhYmxlRmVhdHVyZVR5cGUoKSk7DQotCQkNCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKFNPVVJDRV9GSUxFX1NJVEUsbnVsbCk7DQotCQlVUkwgZmVhdHVyZVVSTCA9IG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSwidGVzdEFQSS8iK1NpdGUuREVGQVVMVF9JTlNUQUxMRURfRkVBVFVSRV9QQVRIKyJmZWF0dXJlMy8iKTsNCi0JCQ0KLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZVVSTCxzaXRlLG51bGwpOw0KLQkJDQotCQlhc3NlcnRUcnVlKCJGYWN0b3J5IGRvZXNuJ3QgY3JlYXRlIHNhbWUgZmVhdHVyZSIsYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsNCi0JfQkNCi0JDQotCS8qKg0KLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbg0KLQkgKi8NCi0JcHVibGljIHZvaWQgdGVzdEZlYXR1cmVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbnsgDQotCQlGZWF0dXJlVHlwZUZhY3RvcnkgZmFjdG9yaWVzID0gRmVhdHVyZVR5cGVGYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCQlJRmVhdHVyZUZhY3RvcnkgZmFjdG9yeSA9IGZhY3Rvcmllcy5nZXRGYWN0b3J5KGdldERlZmF1bHRJbnN0YWxsYWJsZUZlYXR1cmVUeXBlKCkpOw0KLQkJDQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShTT1VSQ0VfSFRUUF9TSVRFLG51bGwpOw0KLQkJSUZlYXR1cmUgZmVhdHVyZSA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXS5nZXRGZWF0dXJlKG51bGwpOw0KLQkJDQotCQlJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSA9IGZhY3RvcnkuY3JlYXRlRmVhdHVyZShmZWF0dXJlLmdldFVSTCgpLHNpdGUsbnVsbCk7DQotCQkNCi0JCWFzc2VydFRydWUoIkZhY3RvcnkgZG9lc24ndCBjcmVhdGUgc2FtZSBmZWF0dXJlIixmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5lcXVhbHMoYW5vdGhlckZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpKSk7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlTmV3VHlwZSgpIHRocm93cyBFeGNlcHRpb257IA0KLQkJRmVhdHVyZVR5cGVGYWN0b3J5IGZhY3RvcmllcyA9IEZlYXR1cmVUeXBlRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQkJSUZlYXR1cmVGYWN0b3J5IGZhY3RvcnkgPSBmYWN0b3JpZXMuZ2V0RmFjdG9yeShnZXREZWZhdWx0RXhlY3V0YWJsZUZlYXR1cmVUeXBlKCkpOw0KLQkJDQotCQlTdHJpbmcgZmVhdHVyZVBhdGggPSBkYXRhUGF0aCsiRmVhdHVyZVR5cGVFeGFtcGxlcy9zaXRlMS9zaXRlLnhtbCI7DQotCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgRmlsZShmZWF0dXJlUGF0aCkudG9VUkwoKSxudWxsKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKVswXTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsNCi0JCQ0KLQkJSUZlYXR1cmUgYW5vdGhlckZlYXR1cmUgPSBmYWN0b3J5LmNyZWF0ZUZlYXR1cmUoZmVhdHVyZS5nZXRVUkwoKSxzaXRlLG51bGwpOw0KLQ0KLQkJYXNzZXJ0VHJ1ZShmZWF0dXJlLmdldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIEZlYXR1cmVFeGVjdXRhYmxlQ29udGVudFByb3ZpZGVyKTsJCQ0KLQkJYXNzZXJ0VHJ1ZSgoKEZlYXR1cmVSZWZlcmVuY2UpcmVmKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS5mZWF0dXJlMSIpKTsJCQ0KLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsNCi0NCi0NCi0JfQ0KLQkNCi0JDQotCQkvKioNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlQW5vdGhlclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9ueyANCi0JCUZlYXR1cmVUeXBlRmFjdG9yeSBmYWN0b3JpZXMgPSBGZWF0dXJlVHlwZUZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsNCi0JCUlGZWF0dXJlRmFjdG9yeSBmYWN0b3J5ID0gZmFjdG9yaWVzLmdldEZhY3RvcnkoZ2V0RGVmYXVsdEluc3RhbGxhYmxlRmVhdHVyZVR5cGUoKSk7DQotCQkNCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUyL3NpdGUueG1sIjsNCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOwkJDQotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCQkNCi0JCUlGZWF0dXJlIGFub3RoZXJGZWF0dXJlID0gZmFjdG9yeS5jcmVhdGVGZWF0dXJlKGZlYXR1cmUuZ2V0VVJMKCksc2l0ZSxudWxsKTsNCi0JCQ0KLQkJYXNzZXJ0VHJ1ZSgiRmFjdG9yeSBkb2Vzbid0IGNyZWF0ZSBzYW1lIGZlYXR1cmUiLGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmVxdWFscyhhbm90aGVyRmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKTsNCi0JCWFzc2VydFRydWUoZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpOw0KLQkJYXNzZXJ0VHJ1ZSgoKEZlYXR1cmVSZWZlcmVuY2UpcmVmKS5nZXRUeXBlKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5wYWNrYWdlZCIpKTsNCi0JCQ0KLQl9DQotCQkNCi0JCQ0KLQkvKioNCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlVW5rbm93blR5cGUoKSB0aHJvd3MgRXhjZXB0aW9ueyANCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoKyJGZWF0dXJlVHlwZUV4YW1wbGVzL3NpdGUzL3NpdGUueG1sIjsNCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBGaWxlKGZlYXR1cmVQYXRoKS50b1VSTCgpLG51bGwpOw0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmID0gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpWzBdOwkJDQotCQl0cnkgew0KLQkJCXJlZi5nZXRGZWF0dXJlKG51bGwpOw0KLQkJCWFzc2VydFRydWUoImlkIGZvdW5kLCBzaG91bGQgbm90IGJlIGZvdW5kIixmYWxzZSk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpew0KLQkJCWlmIChlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS51bmtub3dudHlwZS5qYXIiKT09LTEpew0KLQkJCQl0aHJvdyBlOw0KLQkJCX0NCi0JCX0NCi0JCQ0KLQl9CQkNCi0JCQ0KLX0NCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy90eXBlcy9UZXN0U2l0ZVR5cGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL1Rlc3RTaXRlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU3Y2U3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3R5cGVzL1Rlc3RTaXRlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnR5cGVzOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkZpbGU7DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkZlYXR1cmVQYWNrYWdlZENvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuU2l0ZVVSTENvbnRlbnRQcm92aWRlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLlVwZGF0ZU1hbmFnZXJUZXN0Q2FzZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmltcGxlbWVudGF0aW9uLlNpdGVGVFBGYWN0b3J5Ow0KLQ0KLXB1YmxpYyBjbGFzcyBUZXN0U2l0ZVR5cGUgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLQ0KLQkvKioNCi0JICogVGVzdCB0aGUgZ2V0RmVhdHVyZXMoKQ0KLQkgKi8NCi0JcHVibGljIFRlc3RTaXRlVHlwZShTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEB0aHJvd3MgRXhjZXB0aW9uDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCVN0cmluZyBmZWF0dXJlUGF0aCA9IGRhdGFQYXRoICsgIlNpdGVUeXBlRXhhbXBsZXMvc2l0ZTEvc2l0ZS54bWwiOw0KLQkJSVNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldFNpdGUobmV3IEZpbGUoZmVhdHVyZVBhdGgpLnRvVVJMKCksbnVsbCk7DQotCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSBzaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKClbMF07DQotCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7DQotDQotCQlhc3NlcnRUcnVlKHNpdGUuZ2V0U2l0ZUNvbnRlbnRQcm92aWRlcigpIGluc3RhbmNlb2YgU2l0ZVVSTENvbnRlbnRQcm92aWRlcik7DQotCQlhc3NlcnRUcnVlKCgoU2l0ZSkgc2l0ZSkuZ2V0VHlwZSgpLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuaHR0cCIpKTsNCi0JCWFzc2VydFRydWUoZmVhdHVyZS5nZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBGZWF0dXJlUGFja2FnZWRDb250ZW50UHJvdmlkZXIpOw0KLQ0KLQl9DQotDQotCS8qKg0KLQkJICogQHRocm93cyBFeGNlcHRpb24NCi0JCSAqLw0KLQlwdWJsaWMgdm9pZCB0ZXN0RlRQU2l0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0NCi0JCUlTaXRlIHNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKG5ldyBVUkwoU09VUkNFX0ZJTEVfU0lURSArICJGVFBMaWtlU2l0ZS8iKSxudWxsKTsNCi0NCi0JCS8vIHNob3VsZCBub3QgZmluZCB0aGUgbWFwcGluZw0KLQkJLy8gYnV0IHRoZW4gc2hvdWxkIGF0dGVtcHQgdG8gcmVhZCB0aGUgWE1MIGZpbGUNCi0JCS8vIGZvdW5kIGEgbmV3IHR5cGUNCi0JCS8vIGNhbGwgdGhlIG5ldyB0eXBlDQotCQlhc3NlcnRUcnVlKA0KLQkJCSJXcm9uZyBzaXRlIHR5cGUiLA0KLQkJCXNpdGUuZ2V0VHlwZSgpLmVxdWFscygib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmZ0cCIpKTsNCi0JCWFzc2VydFRydWUoDQotCQkJIldyb25nIGZpbGUiLA0KLQkJCXNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpLmVxdWFscygiLyIgKyBTaXRlRlRQRmFjdG9yeS5GSUxFKSk7DQotDQotCX0NCi0NCi0JcHVibGljIHZvaWQgdGVzdFBhcnNlVmFsaWQxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCQl0cnkgew0KLQkJCVVSTCByZW1vdGVVUkwgPSBuZXcgVVJMKFNPVVJDRV9GSUxFX1NJVEUgKyAicGFyc2VydGVzdHMvc2l0ZWZ0cC54bWwiKTsNCi0JCQlJU2l0ZSBzaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShyZW1vdGVVUkwsbnVsbCk7DQotCQkJc2l0ZS5nZXRBcmNoaXZlcygpOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJaWYgKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIjwvZmVhdHVyZT4iKSA9PSAtMSkgew0KLQkJCQl0aHJvdyBlOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9BbGxDb3JlVUlUZXN0cy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdWl2YWx1ZXMvQWxsQ29yZVVJVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4YWIxNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS90ZXN0cy91aXZhbHVlcy9BbGxDb3JlVUlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLnVpdmFsdWVzOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuVXBkYXRlTWFuYWdlclRlc3RDYXNlOw0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsNCi0NCi0NCi1wdWJsaWMgY2xhc3MgQWxsQ29yZVVJVGVzdHMgZXh0ZW5kcyBVcGRhdGVNYW5hZ2VyVGVzdENhc2Ugew0KLXB1YmxpYyBBbGxDb3JlVUlUZXN0cyhTdHJpbmcgbmFtZSkgew0KLQlzdXBlcihuYW1lKTsNCi19DQotcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgew0KLQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7DQotCXN1aXRlLnNldE5hbWUoIlJlZ3VsYXIgSW5zdGFsbCBUZXN0cyIpOw0KLQkNCi0JLy8gdGhlIGZvbGxvd2luZyB3aWxsIHRha2UgYWxsIHRlaCB0ZXN0IG1ldGhvZHMgaW4gdGVoIGNsYXNzIHRoYXQgc3RhcnQgd2l0aCAndGVzdCcNCi0Jc3VpdGUuYWRkVGVzdChuZXcgVGVzdFN1aXRlKFRlc3RVSUxhYmVsLmNsYXNzKSk7DQotCQ0KLQkvLyBvciB5b3UgY2FuIHNwZWNpZnkgdGhlIG1ldGhvZA0KLQkvL3N1aXRlLmFkZFRlc3QobmV3IFRlc3RHZXRGZWF0dXJlKCJtZXRob2RUaGF0RG9lc05vdFN0YXJ0V2l0aHRlc3QiKSk7CQ0KLQkNCi0JcmV0dXJuIHN1aXRlOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdWl2YWx1ZXMvVGVzdFVJTGFiZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3Rlc3RzL3VpdmFsdWVzL1Rlc3RVSUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzU0YTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdGVzdHMvdWl2YWx1ZXMvVGVzdFVJTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy51aXZhbHVlczsNCi0NCi1pbXBvcnQgamF2YS5pby5GaWxlOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5VcGRhdGVNYW5hZ2VyVGVzdENhc2U7DQotDQotDQotcHVibGljIGNsYXNzIFRlc3RVSUxhYmVsIGV4dGVuZHMgVXBkYXRlTWFuYWdlclRlc3RDYXNlIHsNCi0NCi0JLyoqDQotCSAqIFRlc3QgdGhlIGdldEZlYXR1cmVzKCkNCi0JICovDQotCXB1YmxpYyBUZXN0VUlMYWJlbChTdHJpbmcgYXJnMCkgew0KLQkJc3VwZXIoYXJnMCk7DQotCX0NCi0JDQotCQ0KLQkvKioNCi0JICogTWV0aG9kIHRlc3RIVFRQU2l0ZS4NCi0JICogQHRocm93cyBFeGNlcHRpb24NCi0JICovDQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYW5hZ2VyU2l0ZSgpIHRocm93cyBFeGNlcHRpb257IA0KLQkJDQotCQlJU2l0ZSByZW1vdGVTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0U2l0ZShuZXcgVVJMKCJodHRwIixnZXRIdHRwSG9zdCgpLGdldEh0dHBQb3J0KCksYnVuZGxlLmdldFN0cmluZygiSFRUUF9QQVRIXzIiKSksbnVsbCk7DQotCQlJQ2F0ZWdvcnlbXSBjYXRlZ29yaWVzID0gcmVtb3RlU2l0ZS5nZXRDYXRlZ29yaWVzKCk7DQotCQlmb3IgKGludCBpID0wOyBpPGNhdGVnb3JpZXMubGVuZ3RoOyBpKyspew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2F0ZWdvcnkgLT4iK2NhdGVnb3JpZXNbaV0uZ2V0TGFiZWwoKSsiOiIrY2F0ZWdvcmllc1tpXS5nZXROYW1lKCkpOw0KLQkJfQ0KLQkJU3lzdGVtLm91dC5wcmludGxuKHJlbW90ZVNpdGUuZ2V0RGVzY3JpcHRpb24oKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpKTsNCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVtb3RlRmVhdHVyZXMgPSByZW1vdGVTaXRlLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQlpZiAocmVtb3RlRmVhdHVyZXM9PW51bGwgfHwgcmVtb3RlRmVhdHVyZXMubGVuZ3RoPT0wKSBmYWlsKCJObyBmZWF0dXJlIGF2YWlsYWJsZSBmb3IgdGVzdGluZyIpOwkJDQotCQlmb3IgKGludCBpPTA7aTxyZW1vdGVGZWF0dXJlcy5sZW5ndGg7aSsrKXsNCi0JCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVtb3RlRmVhdHVyZXNbaV0uZ2V0RmVhdHVyZShudWxsKTsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImZlYXR1cmU6IitmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKSsiLT4iK2ZlYXR1cmUuZ2V0TGFiZWwoKSk7DQotCQkJcHJpbnQoZmVhdHVyZS5nZXRMaWNlbnNlKCksIkxpY2Vuc2UiKTsNCi0JCQlwcmludChmZWF0dXJlLmdldENvcHlyaWdodCgpLCJDb3B5cmlnaHQiKTsJCQkNCi0JCQlwcmludChmZWF0dXJlLmdldERlc2NyaXB0aW9uKCksIkRlc2NyaXB0aW9uIik7CQkJCQ0KLQkJCQ0KLQkJCS8vIGNoZWNrIHRoYXQgaXQgZG93bmxvYWRzIHRoZSBmZWF0dXJlLmphciB1bmRlciB0aGUgY292ZXINCi0JCQkvLyBhbmQgdW5wYWNrIGl0DQotCQkJDQotCQkJVVJMIHVybCA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpLmdldFVSTCgpOw0KLQkJCWlmICh1cmwhPW51bGwpew0KLQkJCQlhc3NlcnRUcnVlKChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSkuZXhpc3RzKCkpOw0KLQkJCX0NCi0NCi0JCQl1cmwgPSBmZWF0dXJlLmdldENvcHlyaWdodCgpLmdldFVSTCgpOw0KLQkJCWlmICh1cmwhPW51bGwpew0KLQkJCQlhc3NlcnRUcnVlKChuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKSkuZXhpc3RzKCkpOw0KLQkJCX0NCi0JCQkNCi0JCQl1cmwgPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCkuZ2V0VVJMKCk7DQotCQkJaWYgKHVybCE9bnVsbCl7DQotCQkJCWFzc2VydFRydWUoKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5leGlzdHMoKSk7DQotCQkJfQ0KLQkJCQ0KLQkJfQ0KLQl9DQotCQ0KLQkNCi0JLyoqDQotCSAqIE1ldGhvZCBwcmludC4NCi0JICogQHBhcmFtIGluZm8NCi0JICogQHBhcmFtIHRleHQNCi0JICovDQotCXByaXZhdGUgdm9pZCBwcmludChJVVJMRW50cnkgaW5mbywgU3RyaW5nIHRleHQpew0KLQkJU3lzdGVtLm91dC5wcmludCgiLT4iK3RleHQrIjoiKTsNCi0JCWlmIChpbmZvLmdldFVSTCgpIT1udWxsKSANCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIjwiK2luZm8uZ2V0VVJMKCkudG9FeHRlcm5hbEZvcm0oKSsiPiIpOw0KLQkJZWxzZSANCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5mby5nZXRBbm5vdGF0aW9uKCkpOw0KLQl9DQotfSANCi0NCi0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdC54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxODg4NTUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+DQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPiANCi0gIA0KLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4NCi0gIDwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+DQotICA8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLiIvPg0KLSAgDQotICA8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgZWNsaXBzZS1ob21lLCBhbmQgbGlicmFyeS1maWxlIC0tPg0KLSAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUiLz4NCi0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+DQotICA8cHJvcGVydHkgbmFtZT0iY2xhc3MtbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5BbGxUZXN0cyIgLz4NCi0gIA0KLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPg0KLSAgPCEtLSBhbGwgdGVzdHMgdGhhdCBhcmUgdG8gYmUgcnVuLiBJbml0aWFsaXphdGlvbiBmb3IgaW5kaXZpZHVhbCB0ZXN0cyAtLT4NCi0gIDwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPg0KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4NCi0gICAgPHRzdGFtcC8+DQotICAgIDxkZWxldGU+DQotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPg0KLSAgICA8L2RlbGV0ZT4NCi0gIDwvdGFyZ2V0Pg0KLSAgDQotICA8IS0tIFRoaXMgdGFyZ2V0IGRlZmluZXMgdGhlIHRlc3RzIHRoYXQgbmVlZCB0byBiZSBydW4uIC0tPg0KLSAgPHRhcmdldCBuYW1lPSJzdWl0ZSI+DQotICAgIDxwcm9wZXJ0eSBuYW1lPSJzbmlmZi1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vdXBkYXRlX2NvcmVfc25pZmZfZm9sZGVyIi8+DQotICAgIDxkZWxldGUgZGlyPSIke3NuaWZmLWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+DQotICAgIA0KLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4NCi0gICAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke3NuaWZmLWZvbGRlcn0iLz4NCi0gICAgICA8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSIke2NsYXNzLW5hbWV9Ii8+DQotICAgIDwvYW50Pg0KLSAgPC90YXJnZXQ+DQotICANCi0gIDwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPg0KLSAgPCEtLSBhZnRlciBhbGwgb2YgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4uIFlvdSBjYW4gdXNlIHRoaXMgdGFyZ2V0IHRvIC0tPg0KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPg0KLSAgPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4NCi0gIDwvdGFyZ2V0Pg0KLSAgDQotICA8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+DQotICA8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+DQotICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+DQotICAgIDxhbnQgdGFyZ2V0PSJjb2xsZWN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4NCi0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPg0KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIvPg0KLSAgICA8L2FudD4NCi0gIDwvdGFyZ2V0Pg0KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdF93aXRoX21haWwueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3Rlc3Rfd2l0aF9tYWlsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxZDQwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvdGVzdF93aXRoX21haWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+IAotICAKLSAgPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLSAgPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLSAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2UtaG9tZSIgdmFsdWU9IiR7YmFzZWRpcn0vLi4vLi4iLz4KLSAgCi0gIDwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBlY2xpcHNlLWhvbWUsIGFuZCBsaWJyYXJ5LWZpbGUgLS0+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJsaWJyYXJ5LWZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy9vcmcuZWNsaXBzZS50ZXN0L2xpYnJhcnkueG1sIi8+Ci0gIDxwcm9wZXJ0eSBuYW1lPSJjbGFzcy1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLkFsbFRlc3RzIiAvPgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotICA8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotICA8IS0tIHNob3VsZCBiZSBkb25lIHdpdGhpbiB0aGUgYm9keSBvZiB0aGUgc3VpdGUgdGFyZ2V0LiAtLT4KLSAgPHRhcmdldCBuYW1lPSJpbml0Ij4KLSAgICA8dHN0YW1wLz4KLSAgICA8ZGVsZXRlPgotICAgICAgPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotICAgIDwvZGVsZXRlPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0gIDx0YXJnZXQgbmFtZT0ic3VpdGUiPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJzbmlmZi1mb2xkZXIiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vdXBkYXRlX2NvcmVfc25pZmZfZm9sZGVyIi8+Ci0gICAgPGRlbGV0ZSBkaXI9IiR7c25pZmYtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLSAgICAKLSAgICA8YW50IHRhcmdldD0iY29yZS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7c25pZmYtZm9sZGVyfSIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSIke2NsYXNzLW5hbWV9Ii8+Ci0gICAgPC9hbnQ+Ci0gIDwvdGFyZ2V0PgotICAKLSAgPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgLS0+Ci0gIDwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLSAgPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotICA8dGFyZ2V0IG5hbWU9ImNsZWFudXAiPgotICA8L3RhcmdldD4KLSAgCi0gIDwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLSAgPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotICAgPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsc3VpdGUsY2xlYW51cCI+Ci0KLSAgICA8cHJvcGVydHkgbmFtZT0iZW1haWwtZnJvbSIgdmFsdWU9IkVjbGlwc2VfQXV0b21hdGVkX1Rlc3RAb3RpLmNvbSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbWFpbC1zdWJqZWN0IiB2YWx1ZT0iSW5zdGFsbC9VcGRhdGU6IE5pZ2h0bHkgQnVpbGQgUmVwb3J0Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImVtYWlsLXN1YmplY3QtbG9nIiB2YWx1ZT0iSW5zdGFsbC9VcGRhdGU6IE5pZ2h0bHkgLmxvZyIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJlbWFpbC1zZXJ2ZXIiIHZhbHVlPSJkMjVtbDA0LnRvcm9sYWIuaWJtLmNvbSIvPgotICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmZpbGUiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPHByb3BlcnR5IG5hbWU9ImluZmlsZS1sb2ciIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vd29ya3NwYWNlLy5tZXRhZGF0YS8ubG9nIi8+Ci0gICAgICAKLSAgICA8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIvPgotICAgICAgPHByb3BlcnR5IG5hbWU9Im91dHB1dC1maWxlIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0ueG1sIi8+Ci0gICAgPC9hbnQ+Ci0gICAgCi0gICAgPHRvdWNoIGZpbGU9IiR7aW5maWxlLWxvZ30iLz4KLQotICAgIDxtYWlsIGZyb209IiR7ZW1haWwtZnJvbX0iIHRvbGlzdD0iY2VsZWtAY2EuaWJtLmNvbSIKLSAgICAgICAgICBzdWJqZWN0PSIke2VtYWlsLXN1YmplY3R9IiBmaWxlcz0iJHtpbmZpbGV9IgotICAgICAgICAgIG1haWxob3N0PSIke2VtYWlsLXNlcnZlcn0iLz4KLQotICAgIDxtYWlsIGZyb209IiR7ZW1haWwtZnJvbX0iIHRvbGlzdD0iY2VsZWtAY2EuaWJtLmNvbSIKLSAgICAgICAgICBzdWJqZWN0PSIke2VtYWlsLXN1YmplY3QtbG9nfSIgZmlsZXM9IiR7aW5maWxlLWxvZ30iCi0gICAgICAgICAgbWFpbGhvc3Q9IiR7ZW1haWwtc2VydmVyfSIvPgotCi0gICAgPG1haWwgZnJvbT0iJHtlbWFpbC1mcm9tfSIgdG9saXN0PSJjZWxla0Byb2dlcnMuY29tIgotICAgICAgICAgIHN1YmplY3Q9IiR7ZW1haWwtc3ViamVjdC1sb2d9IiBmaWxlcz0iJHtpbmZpbGUtbG9nfSIKLSAgICAgICAgICBtYWlsaG9zdD0iJHtlbWFpbC1zZXJ2ZXJ9Ii8+Ci0KLSAgICA8bWFpbCBmcm9tPSIke2VtYWlsLWZyb219IiB0b2xpc3Q9ImNlbGVrQHJvZ2Vycy5jb20iCi0gICAgICAgICAgc3ViamVjdD0iJHtlbWFpbC1zdWJqZWN0fSIgZmlsZXM9IiR7aW5maWxlfSIKLSAgICAgICAgICBtYWlsaG9zdD0iJHtlbWFpbC1zZXJ2ZXJ9Ii8+Ci0KLSAgPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2UvaGVscEZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY5MTQ5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL2hlbHBGZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2ZlYXR1cmVzIHNwYWNlL3NwYWNlIGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZTgxZWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE3YmI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vaW1nL3dlbF9tbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTMzZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5mby9pbWcvd2VsX21sLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NWFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbmZvL3NpdGVJbmZvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4NCi08aHRtbD4NCi08aGVhZD4NCi08L2hlYWQ+DQotICA8Ym9keT4NCi08aW1nIHNyYz0iaW1nL3RvcF90aXRsc20uZ2lmIiBhbHQ9IiIgd2lkdGg9IjQ2MCIgaGVpZ2h0PSI1MCI+DQotPGJyPg0KLTxicj4NCi0gICAgIEl0IHN0YXJ0ZWQgd2l0aCBTbWFsbHRhbGs8YnI+DQotICAgIE9USSBoYXMgYmVlbiBidWlsZGluZyB0b29scyBmb3IgcGxhdGZvcm0taW5kZXBlbmRlbnQgT08gZGV2ZWxvcG1lbnQgc2luY2UNCi0gIDE5ODguIE91ciBFTlZZJnJlZzsgdGVjaG5vbG9neSBmaXJzdCBicm91Z2h0IGNvbGxhYm9yYXRpdmUgc29mdHdhcmUgZGV2ZWxvcG1lbnQsDQotICB2ZXJzaW9uIG1hbmFnZW1lbnQgYW5kIHNoYXJlZCByZXBvc2l0b3JpZXMgdG8gU21hbGx0YWxrLiBJQk0gaXMgb25lIG9mDQotbWFueSAgIGNvbXBhbmllcyB0byBsaWNlbnNlIEVOVlksIHdoaWNoIGNvbnRpbnVlcyB0byBiZSB0aGUgZm91bmRhdGlvbiBvZg0KLVZpc3VhbEFnZSZyZWc7ICAgU21hbGx0YWxrLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOZXh0IGNhbWUgSmF2YSYjODQ4Mjs8YnI+DQotICAgIEJlY2F1c2Ugb2Ygb3VyIGV4cGVydGlzZSBpbiBPTyB0ZWNobm9sb2d5LCBJQk0gdHVybmVkIHRvIE9USSBmb3IgYSBuZXh0LWdlbmVyYXRpb24NCi0gIGRldmVsb3BtZW50IGVudmlyb25tZW50IGZvciBKYXZhLiBUaGUgcmVzdWx0IGlzIFZpc3VhbEFnZSBmb3IgSmF2YSwgd2hpY2gNCi0gIGNvbnRpbnVlcyB0byB3aW4gYXdhcmRzIGZvciBpdHMgaW5ub3ZhdGl2ZSBJREUgYW5kIHRlYW0gc3VwcG9ydC4gSW5mb1dvcmxkDQotICBoYXMgY2hvc2VuIFZpc3VhbEFnZSBmb3IgSmF2YSBhcyBkZXZlbG9wbWVudCB0b29sIG9mIHRoZSB5ZWFyIC0geWVhciBhZnRlcg0KLSAgeWVhciBhZnRlciB5ZWFyITxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBUaGVuIHBlcnZhc2l2ZSBjb21wdXRpbmc8YnI+DQotICAgIE9USSBjb250aW51ZXMgaXRzIGRldmVsb3BtZW50IG9mIElCTSdzIFZpc3VhbEFnZSBNaWNybyBFZGl0aW9uLCBhIHN0YXRlLW9mLXRoZS1hcnQNCi0gIHBsYXRmb3JtIGZvciBjb2xsYWJvcmF0aXZlIGRldmVsb3BtZW50IG9mIGVtYmVkZGVkIGFwcGxpY2F0aW9ucyBhbmQgc3lzdGVtcw0KLSAgdGhhdCBhcmUgdmVyeSBsZWFuLiBBcyB0aGUgc3RlYWR5IHN0cmVhbSBvZiBwcmVzcyByZWxlYXNlcyBhdHRlc3RzLCBWaXN1YWxBZ2UNCi0gIE1pY3JvIEVkaXRpb24gaXMgYWxyZWFkeSBsaWNlbnNlZCB0byB0aGUgbGVhZGluZyBtaWNyb2NoaXAgbWFudWZhY3R1cmVycywNCi0gIG1pY3Jva2VybmVsIGRldmVsb3BlcnMsIGFuZCBwcm9kdWNlcnMgb2YgaGFuZGhlbGQgYW5kIGNvbnN1bWVyIGRldmljZXMuPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIE5vdyBpdCdzIEVjbGlwc2U8YnI+DQotICAgIE9USSBoYXMgYnVpbHQgdGhlIG5leHQgZ2VuZXJhdGlvbiBJQk0gYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQgdG9vbHMgcGxhdGZvcm0uDQotICBFY2xpcHNlIGlzIGEga2luZCBvZiB1bml2ZXJzYWwgdG9vbCBwbGF0Zm9ybSAtIGFuIG9wZW4gZXh0ZW5zaWJsZSBJREUgZm9yDQotICBhbnl0aGluZyBhbmQgbm90aGluZyBpbiBwYXJ0aWN1bGFyLiBUaGUgcmVhbCB2YWx1ZSBjb21lcyBmcm9tIHRvb2wgcGx1Zy1pbnMNCi0gIHRoYXQgInRlYWNoIiBFY2xpcHNlIGhvdyB0byB3b3JrIHdpdGggdGhpbmdzIC0gamF2YSBmaWxlcywgd2ViIGNvbnRlbnQsDQotZ3JhcGhpY3MsICB2aWRlbyAtIGFsbW9zdCBhbnl0aGluZyB5b3UgY2FuIGltYWdpbmUuIEVjbGlwc2UgYWxsb3dzIHlvdSB0bw0KLWluZGVwZW5kZW50bHkgIGRldmVsb3AgdG9vbHMgdGhhdCBpbnRlZ3JhdGUgd2l0aCBvdGhlciBwZW9wbGUncyB0b29scyBzbw0KLXNlYW1sZXNzbHkgeW91IHdvbid0IGtub3cgd2hlcmUgb25lIHRvb2wgZW5kcyBhbmQgYW5vdGhlciBzdGFydHMuIFRoZSBJQk0NCi1zdXBwb3J0ZWQgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3ksIFdlYlNwaGVyZSBTdHVkaW8gV29ya2JlbmNoLCB3aWxsIGJlDQotdGhlIGNvcmUgb2YgdGhlIG5leHQgIGdlbmVyYXRpb24gb2YgSUJNIGFuZCBJQk0gQnVzaW5lc3MgUGFydG5lciBlLWJ1c2luZXNzDQotdG9vbHMgb3B0aW1pemVkIGZvciAgdGhlIFdlYlNwaGVyZSBzb2Z0d2FyZSBwbGF0Zm9ybS48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgU28gd2hhdCdzIG5leHQ/PGJyPg0KLSAgICBPVEkgY29udGludWVzIHRvIGRlbGl2ZXIgb2JqZWN0LW9yaWVudGVkIHRlY2hub2xvZ3kgdGhhdCBzY2FsZXMgYWNyb3NzDQotIHBsYXRmb3JtcywgIGFjcm9zcyB0ZWFtcyBhbmQgYWNyb3NzIHByb2plY3Qgc2l6ZS4gRnJvbSBhIG1haW5mcmFtZSB0byBhDQotd2F0Y2ggIC0gd2UncmUgIGNsb3NpbmcgaW4gb24gdGhhdCB2aXNpb24uPGJyPg0KLTxicj4NCi08aW1nIHNyYz0iaW1nL3dlbF9tbC5qcGciIHdpZHRoPSI0NjAiIGhlaWdodD0iNDYwIiBhbHQ9IiI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvaW5zdGFsbC9mZWF0dXJlcyBzcGFjZS9mZWF0dXJlMy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc3NDFkOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9pbnN0YWxsL2ZlYXR1cmVzIHNwYWNlL2ZlYXR1cmUzL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTMiIGltYWdlPSJmZWF0dXJlMS5naWYiIGxhYmVsPSJUaGlyZCBGZWF0dXJlIiBwcm92aWRlci1uYW1lPSJTbWFydCBDb21wYW55IiB2ZXJzaW9uPSIxLjAuMCIgPg0KLSAgPGRlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4NCi0gIDxjb3B5cmlnaHQ+Y29weXJpZ2h0PC9jb3B5cmlnaHQ+DQotICA8bGljZW5zZT5saWNlbnNlPC9saWNlbnNlPg0KLSAgPHVybD4NCi0gICAgPHVwZGF0ZSBsYWJlbD0iVVJMIHRvIHVwZGF0ZSB0aGUgZmVhdHVyZSIgdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3BhdGgvZmVhdHVyZTEvIi8+DQotICAgIDxkaXNjb3ZlcnkgbGFiZWw9IkRpc2NvdmVyeSAxIiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciLz4NCi0gICAgPGRpc2NvdmVyeSBsYWJlbD0iRGlzY292ZXJ5IDIiIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIvPg0KLSAgPC91cmw+DQotPC9mZWF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMDcyMTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9QZGVfY29yZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9oZWxwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4NGY2Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1NpdGUgd2l0aCBzcGFjZS9wbHVnaW5zIHNwYWNlL2hlbHAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2UvcGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzU4N2IyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3BsdWdpbnMgc3BhY2UvanVuaXRfMy43LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvU2l0ZSB3aXRoIHNwYWNlL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDRiYmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9TaXRlIHdpdGggc3BhY2Uvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxzaXRlPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcyBzcGFjZS9oZWxwRmVhdHVyZS5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMgc3BhY2Uvc3BhY2UgZmVhdHVyZS5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9KMkVFIi8+DQotICA8L2ZlYXR1cmU+DQotDQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLmhlbHBfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvaGVscC5qYXIiLz4NCi0gIDxhcmNoaXZlIHBhdGg9InBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmVfMS4wLjAuamFyIiB1cmw9InBsdWdpbnMgc3BhY2UvUGRlX2NvcmUuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5qdW5pdF8zLjUuMC5qYXIiIHVybD0icGx1Z2lucyBzcGFjZS9qdW5pdF8zLjcuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5wbHVnaW4xXzEuMS4xIiB1cmw9InBsdWdpbnMgc3BhY2Uvb3JnLmVjbGlwc2UudXBkYXRlLnBsdWdpbjFfMS4xLjEiLz4gIA0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvaGVscEZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM2N2Q0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9mZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwYjQwYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3RvcF90aXRsc20uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE3YmI2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL2ltZy90b3BfdGl0bHNtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9pbmZvL2ltZy93ZWxfbWwuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3dlbF9tbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTMzZGYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vaW1nL3dlbF9tbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL2luZm8vc2l0ZUluZm8uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2NWFhMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvaW5mby9zaXRlSW5mby5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+DQotPGh0bWw+DQotPGhlYWQ+DQotPC9oZWFkPg0KLSAgPGJvZHk+DQotPGltZyBzcmM9ImltZy90b3BfdGl0bHNtLmdpZiIgYWx0PSIiIHdpZHRoPSI0NjAiIGhlaWdodD0iNTAiPg0KLTxicj4NCi08YnI+DQotICAgICBJdCBzdGFydGVkIHdpdGggU21hbGx0YWxrPGJyPg0KLSAgICBPVEkgaGFzIGJlZW4gYnVpbGRpbmcgdG9vbHMgZm9yIHBsYXRmb3JtLWluZGVwZW5kZW50IE9PIGRldmVsb3BtZW50IHNpbmNlDQotICAxOTg4LiBPdXIgRU5WWSZyZWc7IHRlY2hub2xvZ3kgZmlyc3QgYnJvdWdodCBjb2xsYWJvcmF0aXZlIHNvZnR3YXJlIGRldmVsb3BtZW50LA0KLSAgdmVyc2lvbiBtYW5hZ2VtZW50IGFuZCBzaGFyZWQgcmVwb3NpdG9yaWVzIHRvIFNtYWxsdGFsay4gSUJNIGlzIG9uZSBvZg0KLW1hbnkgICBjb21wYW5pZXMgdG8gbGljZW5zZSBFTlZZLCB3aGljaCBjb250aW51ZXMgdG8gYmUgdGhlIGZvdW5kYXRpb24gb2YNCi1WaXN1YWxBZ2UmcmVnOyAgIFNtYWxsdGFsay48YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgTmV4dCBjYW1lIEphdmEmIzg0ODI7PGJyPg0KLSAgICBCZWNhdXNlIG9mIG91ciBleHBlcnRpc2UgaW4gT08gdGVjaG5vbG9neSwgSUJNIHR1cm5lZCB0byBPVEkgZm9yIGEgbmV4dC1nZW5lcmF0aW9uDQotICBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBmb3IgSmF2YS4gVGhlIHJlc3VsdCBpcyBWaXN1YWxBZ2UgZm9yIEphdmEsIHdoaWNoDQotICBjb250aW51ZXMgdG8gd2luIGF3YXJkcyBmb3IgaXRzIGlubm92YXRpdmUgSURFIGFuZCB0ZWFtIHN1cHBvcnQuIEluZm9Xb3JsZA0KLSAgaGFzIGNob3NlbiBWaXN1YWxBZ2UgZm9yIEphdmEgYXMgZGV2ZWxvcG1lbnQgdG9vbCBvZiB0aGUgeWVhciAtIHllYXIgYWZ0ZXINCi0gIHllYXIgYWZ0ZXIgeWVhciE8YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotICAgICAgVGhlbiBwZXJ2YXNpdmUgY29tcHV0aW5nPGJyPg0KLSAgICBPVEkgY29udGludWVzIGl0cyBkZXZlbG9wbWVudCBvZiBJQk0ncyBWaXN1YWxBZ2UgTWljcm8gRWRpdGlvbiwgYSBzdGF0ZS1vZi10aGUtYXJ0DQotICBwbGF0Zm9ybSBmb3IgY29sbGFib3JhdGl2ZSBkZXZlbG9wbWVudCBvZiBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgYW5kIHN5c3RlbXMNCi0gIHRoYXQgYXJlIHZlcnkgbGVhbi4gQXMgdGhlIHN0ZWFkeSBzdHJlYW0gb2YgcHJlc3MgcmVsZWFzZXMgYXR0ZXN0cywgVmlzdWFsQWdlDQotICBNaWNybyBFZGl0aW9uIGlzIGFscmVhZHkgbGljZW5zZWQgdG8gdGhlIGxlYWRpbmcgbWljcm9jaGlwIG1hbnVmYWN0dXJlcnMsDQotICBtaWNyb2tlcm5lbCBkZXZlbG9wZXJzLCBhbmQgcHJvZHVjZXJzIG9mIGhhbmRoZWxkIGFuZCBjb25zdW1lciBkZXZpY2VzLjxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi0gICAgICBOb3cgaXQncyBFY2xpcHNlPGJyPg0KLSAgICBPVEkgaGFzIGJ1aWx0IHRoZSBuZXh0IGdlbmVyYXRpb24gSUJNIGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IHRvb2xzIHBsYXRmb3JtLg0KLSAgRWNsaXBzZSBpcyBhIGtpbmQgb2YgdW5pdmVyc2FsIHRvb2wgcGxhdGZvcm0gLSBhbiBvcGVuIGV4dGVuc2libGUgSURFIGZvcg0KLSAgYW55dGhpbmcgYW5kIG5vdGhpbmcgaW4gcGFydGljdWxhci4gVGhlIHJlYWwgdmFsdWUgY29tZXMgZnJvbSB0b29sIHBsdWctaW5zDQotICB0aGF0ICJ0ZWFjaCIgRWNsaXBzZSBob3cgdG8gd29yayB3aXRoIHRoaW5ncyAtIGphdmEgZmlsZXMsIHdlYiBjb250ZW50LA0KLWdyYXBoaWNzLCAgdmlkZW8gLSBhbG1vc3QgYW55dGhpbmcgeW91IGNhbiBpbWFnaW5lLiBFY2xpcHNlIGFsbG93cyB5b3UgdG8NCi1pbmRlcGVuZGVudGx5ICBkZXZlbG9wIHRvb2xzIHRoYXQgaW50ZWdyYXRlIHdpdGggb3RoZXIgcGVvcGxlJ3MgdG9vbHMgc28NCi1zZWFtbGVzc2x5IHlvdSB3b24ndCBrbm93IHdoZXJlIG9uZSB0b29sIGVuZHMgYW5kIGFub3RoZXIgc3RhcnRzLiBUaGUgSUJNDQotc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhpcyB0ZWNobm9sb2d5LCBXZWJTcGhlcmUgU3R1ZGlvIFdvcmtiZW5jaCwgd2lsbCBiZQ0KLXRoZSBjb3JlIG9mIHRoZSBuZXh0ICBnZW5lcmF0aW9uIG9mIElCTSBhbmQgSUJNIEJ1c2luZXNzIFBhcnRuZXIgZS1idXNpbmVzcw0KLXRvb2xzIG9wdGltaXplZCBmb3IgIHRoZSBXZWJTcGhlcmUgc29mdHdhcmUgcGxhdGZvcm0uPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLSAgICAgIFNvIHdoYXQncyBuZXh0Pzxicj4NCi0gICAgT1RJIGNvbnRpbnVlcyB0byBkZWxpdmVyIG9iamVjdC1vcmllbnRlZCB0ZWNobm9sb2d5IHRoYXQgc2NhbGVzIGFjcm9zcw0KLSBwbGF0Zm9ybXMsICBhY3Jvc3MgdGVhbXMgYW5kIGFjcm9zcyBwcm9qZWN0IHNpemUuIEZyb20gYSBtYWluZnJhbWUgdG8gYQ0KLXdhdGNoICAtIHdlJ3JlICBjbG9zaW5nIGluIG9uIHRoYXQgdmlzaW9uLjxicj4NCi08YnI+DQotPGltZyBzcmM9ImltZy93ZWxfbWwuanBnIiB3aWR0aD0iNDYwIiBoZWlnaHQ9IjQ2MCIgYWx0PSIiPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTxicj4NCi08YnI+DQotPGJyPg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvUGRlX2NvcmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvUGRlX2NvcmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTA3MjE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL1BkZV9jb3JlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9wbHVnaW5zL2hlbHAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvaGVscC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ODRmNjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvaGVscC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3BsdWdpbnMvanVuaXRfMy43LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1ODdiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIvcGx1Z2lucy9qdW5pdF8zLjcuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTVmZGE3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlci9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHNpdGUgPg0KLTxkZXNjcmlwdGlvbiB1cmw9ImluZm8vc2l0ZUluZm8uaHRtbCIvPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9oZWxwRmVhdHVyZS5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iZWNsaXBzZS9VTUwiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLmZlYXR1cmVfMS4wLjAuamFyIj4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuZWNsaXBzZS5oZWxwXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL2hlbHAuamFyIi8+DQotICA8YXJjaGl2ZSBwYXRoPSJwbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlXzEuMC4wLmphciIgdXJsPSJwbHVnaW5zL1BkZV9jb3JlLmphciIvPg0KLSAgPGFyY2hpdmUgcGF0aD0icGx1Z2lucy9vcmcuanVuaXRfMy41LjAuamFyIiB1cmw9InBsdWdpbnMvanVuaXRfMy43LmphciIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iSUJNIFdTQUQgVG9vbHMiIG5hbWU9ImVjbGlwc2UiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkoyRUUgdG9vbHMiIG5hbWU9ImVjbGlwc2UvSjJFRSIvPg0KLSAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iRUpCIFRvb2xzIiBuYW1lPSJlY2xpcHNlL0oyRUUvRUpCIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJVTUwgdG9vbHMiIG5hbWU9ImVjbGlwc2UvVU1MIi8+DQotICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNZXNzYWdpbmcgVG9vbHMiIG5hbWU9IkIyQiIvPiAgDQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvZmVhdHVyZXMyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkZjcyYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxYWVlM2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS50ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxNWZmNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxXzEuMC40LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlMzhkMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL2ZlYXR1cmVzL29yZy5lY2xpcHNlX3Rlc3RfZmVhdHVyZS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuY2hpbGRyZW5mZWF0dXJlXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyNjY1Yy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9mZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5jaGlsZHJlbmZlYXR1cmVfMi4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvZmVhdHVyZXMvcm9vdGZlYXR1cmUuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTE5ODAzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L2ZlYXR1cmVzL3Jvb3RmZWF0dXJlLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjFfMy41LjYuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDlmNWJjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0YjA0YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL25lc3RlZEZlYXR1cmVTaXRlVGVzdC9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMjA4ZmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3QvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4yXzUuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvbmVzdGVkRmVhdHVyZVNpdGVUZXN0L3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMDljODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9uZXN0ZWRGZWF0dXJlU2l0ZVRlc3Qvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9yb290ZmVhdHVyZS5qYXIiIG9zPSIqIi8+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwZDg4Mi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMS5wbHVnaW4xXzEuMS4xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5OTVkNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTEucGx1Z2luMV8xLjEuMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuZmVhdHVyZTIucGx1Z2luMl8yLjIuMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTk1ZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyLnBsdWdpbjJfMi4yLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5kdW1teV83LjkuOC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NzM3ZjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmR1bW15XzcuOS44LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvVXBkYXRlTWFuYWdlcjIvcGx1Z2lucy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMS5wbHVnaW4xXzMuNS42LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4NjkwZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMV8zLjUuNi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3BsdWdpbnMvb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMuZmVhdHVyZTEucGx1Z2luMl81LjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYTYxMmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9wbHVnaW5zL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLnRlc3RzLmZlYXR1cmUxLnBsdWdpbjJfNS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxY2VkNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotZHJpdmVycz1SZXF1aXJlZCBEcml2ZXJzDQotc2VjdXJpdHk9U2VjdXJpdHkgRml4ZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9VcGRhdGVNYW5hZ2VyMi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3ZDliMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL1VwZGF0ZU1hbmFnZXIyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08c2l0ZSBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUudGVzdHMiIG5hbWU9IlRlc3RzIiB2ZXJzaW9uPSIwLjAuMSI+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRlc3QuZmVhdHVyZV8xLjAuMC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2ZlYXR1cmVzMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxL3N1YmNhdDEiLz4NCi0gICAgPGNhdGVnb3J5IG5hbWU9ImNhdGVnb3J5MiIvPg0KLSAgPC9mZWF0dXJlPg0KLSAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS50ZXN0cy5mZWF0dXJlMV8xLjAuNC5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICAgIDxjYXRlZ29yeSBuYW1lPSJjYXRlZ29yeTIiLz4NCi0gIDwvZmVhdHVyZT4NCi0gIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2VfdGVzdF9mZWF0dXJlLmphciIvPg0KLSAgPGZlYXR1cmUgdXJsPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8xLjAuMC9vcmcuZWNsaXBzZS51cGRhdGUuY29yZS5mZWF0dXJlMl8yLjIuMi5qYXIiPg0KLSAgICA8Y2F0ZWdvcnkgbmFtZT0iY2F0ZWdvcnkxIi8+DQotICA8L2ZlYXR1cmU+DQotICA8ZmVhdHVyZSB1cmw9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzEuMC4wL29yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmZlYXR1cmUyXzIuMi4yLmphciI+DQotICA8L2ZlYXR1cmU+DQotDQotICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImNhdGVnb3J5MS9zdWJjYXQxIiBsYWJlbD0iU3BlY2lhbCBGaXgiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkxIiBsYWJlbD0iJWRyaXZlcnMiLz4NCi0gIDxjYXRlZ29yeS1kZWYgbmFtZT0iY2F0ZWdvcnkyIiBsYWJlbD0iJXNlY3VyaXR5Ii8+DQotPC9zaXRlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvV0VCLUlORi93ZWIueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNmQ5MDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+DQotDQotDQotPCFET0NUWVBFIHdlYi1hcHANCi0gICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iDQotICAgICJodHRwOi8vamF2YS5zdW4uY29tL2oyZWUvZHRkcy93ZWItYXBwXzIuMi5kdGQiPg0KLQ0KLTx3ZWItYXBwPg0KLSAgICANCi08L3dlYi1hcHA+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL2ZlYXR1cmVzL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9mZWF0dXJlcy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDM1ODkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL2ZlYXR1cmVzL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpXzEuMC4wLmphciBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5ZDJjZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnRfMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRiMDJiYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aV8yLjAuMC5qYXIgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpXzIuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlYzAyYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvcGx1Z2lucy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZS9wbHVnaW5zL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW5fMS4wLjAuamFyIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWI2OTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3BsdWdpbnMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvc2l0ZS54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYjEzMzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlXzEuMC4wLmphciIgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iQnVuZGxlRmVhdHVyZSIvPgotICAgPC9mZWF0dXJlPgotICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJCdW5kbGVGZWF0dXJlIiBsYWJlbD0iRmVhdHVyZSB3aXRoIEJ1bmRsZXMiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMjA5MDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjwvcHJvamVjdD4KLQkJPHByb2plY3Q+Y29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy50ZW1wbGF0ZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS8udGVtcGxhdGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmNkNDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpLy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Zm9ybT4NCi0gICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4NCi08L2Zvcm0+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWQ2ODZmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotR2VuZXJhdGVkLWZyb206IDEwNzcwNjI5NzQ0NTENCi1CdW5kbGUtTmFtZTogVWkgRnJhZ21lbnQNCi1CdW5kbGUtVmVyc2lvbjogMS4wLjANCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aQ0KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnDQotQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyDQotTGVnYWN5OiB0cnVlDQotRnJhZ21lbnQtSG9zdDogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aTsgYnVuZGxlLXZlcnNpb249Mi4wLjANCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdlZTQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UudWkuamFyID0gc3JjLwotb3V0cHV0LnVpLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdWkuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvZnJhZ21lbnQueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpL2ZyYWdtZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0ODRiMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVkbGUuZnJhZ21lbnQudWkvZnJhZ21lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudAotICAgaWQ9ImNvbS5leGFtcGxlLmJ1ZGxlLmZyYWdtZW50LnVpIgotICAgbmFtZT0iVWkgRnJhZ21lbnQiCi0gICB2ZXJzaW9uPSIxLjAuMCIKLSAgIHByb3ZpZGVyLW5hbWU9IkVjbGlwc2Uub3JnIgotICAgcGx1Z2luLWlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpIgotICAgcGx1Z2luLXZlcnNpb249IjIuMC4wIgotICAgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSJ1aS5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0KLTwvZnJhZ21lbnQ+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmM2U0YmMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+Y29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGY5M2E5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI0MTA0My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSJjb20uZXhhbXBsZS5idW5kbGUuZmVhdHVyZSIKLSAgICAgIHZlcnNpb249IjEuMC4wIgotICAgICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciPgotCi0gICA8bGljZW5zZT4KLSAgICAgIEEgcGxhY2Vob2xkZXIgbGljZW5zZSBmb3IgdGhlIGZlYXR1cmUuCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbnN0YWxsLWhhbmRsZXIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idWRsZS5mcmFnbWVudC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDBjMjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCQk8cHJvamVjdD5jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0PgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50Ly50ZW1wbGF0ZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvLnRlbXBsYXRlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxmb3JtPg0KLSAgIDxwLz48cD48Yj5UaXBzIG9uIHdvcmtpbmcgd2l0aCB0aGlzIHBsdWctaW4gcHJvamVjdDwvYj48L3A+PGxpPkZvciB0aGUgdmlldyBvZiB0aGUgbmV3IHBsdWctaW4gYXQgYSBnbGFuY2UsIGdvIHRvIHRoZSA8aW1nIGhyZWY9InBhZ2VJbWFnZSIvPjxhIGhyZWY9Ik92ZXJ2aWV3UGFnZSI+T3ZlcnZpZXc8L2E+LjwvbGk+PGxpPllvdSBjYW4gdGVzdCB0aGUgY29udHJpYnV0aW9ucyBvZiB0aGlzIHBsdWctaW4gYnkgbGF1bmNoaW5nIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlIHdvcmtiZW5jaC4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgY2xpY2sgPGI+UnVuIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLnJ1biI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPjxsaT5Zb3UgY2FuIGFkZCBtb3JlIGZ1bmN0aW9uYWxpdHkgdG8gdGhpcyBwbHVnLWluIGJ5IGFkZGluZyBleHRlbnNpb25zIHVzaW5nIHRoZSA8YSBocmVmPSJhY3Rpb24ubmV3RXh0ZW5zaW9uIj5OZXcgRXh0ZW5zaW9uIFdpemFyZDwvYT4uPC9saT48bGk+VGhlIHBsdWctaW4gcHJvamVjdCBjb250YWlucyBKYXZhIGNvZGUgdGhhdCB5b3UgY2FuIGRlYnVnLiBQbGFjZSBicmVha3BvaW50cyBpbiBKYXZhIGNsYXNzZXMuIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIHNlbGVjdCA8Yj5EZWJ1ZyBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5kZWJ1ZyI+UnVuLXRpbWUgV29ya2JlbmNoPC9hPiBmcm9tIHRoZSBhdmFpbGFibGUgY2hvaWNlcy48L2xpPg0KLTwvZm9ybT4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2NjQ4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2MjkwOTQ4Nw0KLUJ1bmRsZS1OYW1lOiBGcmFnbWVudCBGcmFnbWVudA0KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMA0KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudA0KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnDQotQnVuZGxlLUNsYXNzUGF0aDogZnJhZ21lbnQuamFyDQotTGVnYWN5OiB0cnVlDQotRnJhZ21lbnQtSG9zdDogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjsgYnVuZGxlLXZlcnNpb249MS4wLjANCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlN2UwZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zb3VyY2UuZnJhZ21lbnQuamFyID0gc3JjLwotb3V0cHV0LmZyYWdtZW50LmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IGZyYWdtZW50LnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgZnJhZ21lbnQuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLmZyYWdtZW50L2ZyYWdtZW50LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTVjZDZlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUuZnJhZ21lbnQvZnJhZ21lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxmcmFnbWVudAotICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5mcmFnbWVudCIKLSAgIG5hbWU9IkZyYWdtZW50IEZyYWdtZW50IgotICAgdmVyc2lvbj0iMS4wLjAiCi0gICBwcm92aWRlci1uYW1lPSJFY2xpcHNlLm9yZyIKLSAgIHBsdWdpbi1pZD0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbiIKLSAgIHBsdWdpbi12ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iZnJhZ21lbnQuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotCi08L2ZyYWdtZW50PgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NWFjMDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzM1NTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JCTxwcm9qZWN0PmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L3Byb2plY3Q+Ci0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLmNvcmUucnVudGltZTwvcHJvamVjdD4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy50ZW1wbGF0ZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLy50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiY2Q0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS8udGVtcGxhdGUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotICAgPHAvPjxwPjxiPlRpcHMgb24gd29ya2luZyB3aXRoIHRoaXMgcGx1Zy1pbiBwcm9qZWN0PC9iPjwvcD48bGk+Rm9yIHRoZSB2aWV3IG9mIHRoZSBuZXcgcGx1Zy1pbiBhdCBhIGdsYW5jZSwgZ28gdG8gdGhlIDxpbWcgaHJlZj0icGFnZUltYWdlIi8+PGEgaHJlZj0iT3ZlcnZpZXdQYWdlIj5PdmVydmlldzwvYT4uPC9saT48bGk+WW91IGNhbiB0ZXN0IHRoZSBjb250cmlidXRpb25zIG9mIHRoaXMgcGx1Zy1pbiBieSBsYXVuY2hpbmcgYW5vdGhlciBpbnN0YW5jZSBvZiB0aGUgd29ya2JlbmNoLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBjbGljayA8Yj5SdW4gQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24ucnVuIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+PGxpPllvdSBjYW4gYWRkIG1vcmUgZnVuY3Rpb25hbGl0eSB0byB0aGlzIHBsdWctaW4gYnkgYWRkaW5nIGV4dGVuc2lvbnMgdXNpbmcgdGhlIDxhIGhyZWY9ImFjdGlvbi5uZXdFeHRlbnNpb24iPk5ldyBFeHRlbnNpb24gV2l6YXJkPC9hPi48L2xpPjxsaT5UaGUgcGx1Zy1pbiBwcm9qZWN0IGNvbnRhaW5zIEphdmEgY29kZSB0aGF0IHlvdSBjYW4gZGVidWcuIFBsYWNlIGJyZWFrcG9pbnRzIGluIEphdmEgY2xhc3Nlcy4gT24gdGhlIDxiPlJ1bjwvYj4gbWVudSwgc2VsZWN0IDxiPkRlYnVnIEFzPC9iPiBhbmQgY2hvb3NlIDxpbWcgaHJlZj0icnVuVGltZVdvcmtiZW5jaEltYWdlIi8+PGEgaHJlZj0iYWN0aW9uLmRlYnVnIj5SdW4tdGltZSBXb3JrYmVuY2g8L2E+IGZyb20gdGhlIGF2YWlsYWJsZSBjaG9pY2VzLjwvbGk+DQotPC9mb3JtPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTA3YTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi1HZW5lcmF0ZWQtZnJvbTogMTA3NzA2Mjk5OTgyNw0KLUJ1bmRsZS1OYW1lOiBVaSBQbHVnLWluDQotQnVuZGxlLVZlcnNpb246IDIuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aQ0KLUJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnDQotQnVuZGxlLUNsYXNzUGF0aDogdWkuamFyDQotTGVnYWN5OiB0cnVlDQotQnVuZGxlLUFjdGl2YXRvcjogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS5VaVBsdWdpbg0KLVJlcXVpcmUtQnVuZGxlOiANCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLA0KLSBvcmcuZWNsaXBzZS51aSwNCi0gY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbjsgYnVuZGxlLXZlcnNpb249MS4wLjA7dmVyc2lvbi1tYXRjaD1wZXJmZWN0DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvYmluL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3MzE4OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi91aS9VaVBsdWdpbi5jbGFzcworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzdkM2IzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXNvdXJjZS51aS5qYXIgPSBzcmMvCi1vdXRwdXQudWkuamFyID0gYmluLwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgdWkuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVmZmRlZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4KLSAgIGlkPSJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpIgotICAgbmFtZT0iVWkgUGx1Zy1pbiIKLSAgIHZlcnNpb249IjIuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBjbGFzcz0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aS5VaVBsdWdpbiI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idWkuamFyIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbiIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJwZXJmZWN0Ii8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvc3JjL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpL3NyYy9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL3VpL1VpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYWJhNTAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4udWkvc3JjL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vdWkvVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLXBhY2thZ2UgY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgVWlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVWlQbHVnaW4gcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLnVpLlVpUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVpUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVzb3VyY2VTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBVaVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoYnVuZGxlICE9IG51bGwpID8gYnVuZGxlLmdldFN0cmluZyhrZXkpIDoga2V5OwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1YWMwNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcxOWQ3My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPmNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lPC9wcm9qZWN0PgotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnRlbXBsYXRlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vLnRlbXBsYXRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JjZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luLy50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08Zm9ybT4NCi0gICA8cC8+PHA+PGI+VGlwcyBvbiB3b3JraW5nIHdpdGggdGhpcyBwbHVnLWluIHByb2plY3Q8L2I+PC9wPjxsaT5Gb3IgdGhlIHZpZXcgb2YgdGhlIG5ldyBwbHVnLWluIGF0IGEgZ2xhbmNlLCBnbyB0byB0aGUgPGltZyBocmVmPSJwYWdlSW1hZ2UiLz48YSBocmVmPSJPdmVydmlld1BhZ2UiPk92ZXJ2aWV3PC9hPi48L2xpPjxsaT5Zb3UgY2FuIHRlc3QgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgdGhpcyBwbHVnLWluIGJ5IGxhdW5jaGluZyBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSB3b3JrYmVuY2guIE9uIHRoZSA8Yj5SdW48L2I+IG1lbnUsIGNsaWNrIDxiPlJ1biBBczwvYj4gYW5kIGNob29zZSA8aW1nIGhyZWY9InJ1blRpbWVXb3JrYmVuY2hJbWFnZSIvPjxhIGhyZWY9ImFjdGlvbi5ydW4iPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT48bGk+WW91IGNhbiBhZGQgbW9yZSBmdW5jdGlvbmFsaXR5IHRvIHRoaXMgcGx1Zy1pbiBieSBhZGRpbmcgZXh0ZW5zaW9ucyB1c2luZyB0aGUgPGEgaHJlZj0iYWN0aW9uLm5ld0V4dGVuc2lvbiI+TmV3IEV4dGVuc2lvbiBXaXphcmQ8L2E+LjwvbGk+PGxpPlRoZSBwbHVnLWluIHByb2plY3QgY29udGFpbnMgSmF2YSBjb2RlIHRoYXQgeW91IGNhbiBkZWJ1Zy4gUGxhY2UgYnJlYWtwb2ludHMgaW4gSmF2YSBjbGFzc2VzLiBPbiB0aGUgPGI+UnVuPC9iPiBtZW51LCBzZWxlY3QgPGI+RGVidWcgQXM8L2I+IGFuZCBjaG9vc2UgPGltZyBocmVmPSJydW5UaW1lV29ya2JlbmNoSW1hZ2UiLz48YSBocmVmPSJhY3Rpb24uZGVidWciPlJ1bi10aW1lIFdvcmtiZW5jaDwvYT4gZnJvbSB0aGUgYXZhaWxhYmxlIGNob2ljZXMuPC9saT4NCi08L2Zvcm0+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxYWRhZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLUdlbmVyYXRlZC1mcm9tOiAxMDc3MDYyNjAzNzA4DQotQnVuZGxlLU5hbWU6IFBsdWdpbiBQbHVnLWluDQotQnVuZGxlLVZlcnNpb246IDEuMC4wDQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbg0KLUJ1bmRsZS1WZW5kb3I6IEVYQU1QTEUNCi1CdW5kbGUtQ2xhc3NQYXRoOiBwbHVnaW4uamFyDQotTGVnYWN5OiB0cnVlDQotQnVuZGxlLUFjdGl2YXRvcjogY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi5QbHVnaW5QbHVnaW4NCi1SZXF1aXJlLUJ1bmRsZTogDQotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwNCi0gb3JnLmVjbGlwc2UudWkNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9iaW4vY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uY2xhc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2Y2FmMDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYmluL2NvbS9leGFtcGxlL2J1bmRsZS9wbHVnaW4vUGx1Z2luUGx1Z2luLmNsYXNzCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTE2ZDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS50ZXN0cy5jb3JlL3dlYnNlcnZlci9idW5kbGVTaXRlc3JjL2NvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc291cmNlLnBsdWdpbi5qYXIgPSBzcmMvCi1vdXRwdXQucGx1Z2luLmphciA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5qYXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTdiYzc2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9ImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4iCi0gICBuYW1lPSJQbHVnaW4gUGx1Zy1pbiIKLSAgIHZlcnNpb249IjEuMC4wIgotICAgcHJvdmlkZXItbmFtZT0iRWNsaXBzZS5vcmciCi0gICBjbGFzcz0iY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi5QbHVnaW5QbHVnaW4iPgotCi0gICA8cnVudGltZT4KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InBsdWdpbi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICA8L2xpYnJhcnk+Ci0gICA8L3J1bnRpbWU+Ci0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnRlc3RzLmNvcmUvd2Vic2VydmVyL2J1bmRsZVNpdGVzcmMvY29tLmV4YW1wbGUuYnVuZGxlLnBsdWdpbi9zcmMvY29tL2V4YW1wbGUvYnVuZGxlL3BsdWdpbi9QbHVnaW5QbHVnaW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL3NyYy9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTBiMzkzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudGVzdHMuY29yZS93ZWJzZXJ2ZXIvYnVuZGxlU2l0ZXNyYy9jb20uZXhhbXBsZS5idW5kbGUucGx1Z2luL3NyYy9jb20vZXhhbXBsZS9idW5kbGUvcGx1Z2luL1BsdWdpblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotcGFja2FnZSBjb20uZXhhbXBsZS5idW5kbGUucGx1Z2luOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5QbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgUGx1Z2luUGx1Z2luIHBsdWdpbjsKLQkvL1Jlc291cmNlIGJ1bmRsZS4KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUGx1Z2luUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoImNvbS5leGFtcGxlLmJ1bmRsZS5wbHVnaW4uUGx1Z2luUGx1Z2luUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdXBvbiBwbHVnLWluIGFjdGl2YXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBsdWdpblBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gUGx1Z2luUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0U3RyaW5nKGtleSkgOiBrZXk7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmNsYXNzcGF0aCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ODI0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+DQotPC9jbGFzc3BhdGg+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQwZjllLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtczwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWkuaWRlPC9wcm9qZWN0Pg0KLQk8L3Byb2plY3RzPg0KLQk8YnVpbGRTcGVjPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+DQotCQkJPGFyZ3VtZW50cz4NCi0JCQk8L2FyZ3VtZW50cz4NCi0JCTwvYnVpbGRDb21tYW5kPg0KLQkJPGJ1aWxkQ29tbWFuZD4NCi0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCTwvYnVpbGRTcGVjPg0KLQk8bmF0dXJlcz4NCi0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+DQotCTwvbmF0dXJlcz4NCi08L3Byb2plY3REZXNjcmlwdGlvbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2Fib3V0Lmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYjQxMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPjIwdGggSnVuZSwgMjAwMjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci08cD5FY2xpcHNlLm9yZyBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtDUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBDUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIENQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+Q29udHJpYnV0aW9uczwvaDM+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwsIGFueSBDb250cmlidXRpb25zLCBhcyBkZWZpbmVkIGluIHRoZSBDUEwsIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZQotbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZSBob3N0IG9mIEVjbGlwc2Uub3JnIHdlYiBzaXRlLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaAotQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDUEwuPC9wPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgb3RoZXIgdGhhbiB0aGUgQ1BMICgmcXVvdDtPdGhlciBMaWNlbnNlJnF1b3Q7KSwgYW55IG1vZGlmaWNhdGlvbnMsIGVuaGFuY2VtZW50cyBhbmQvb3IKLW90aGVyIGNvZGUgYW5kL29yIGRvY3VtZW50YXRpb24gKCZxdW90O01vZGlmaWNhdGlvbnMmcXVvdDspIHVwbG9hZGVkLCBzdWJtaXR0ZWQsIG9yIG90aGVyd2lzZSBtYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlCi1ob3N0IG9mIEVjbGlwc2Uub3JnLCBieSB5b3UgdGhhdCByZWxhdGUgdG8gc3VjaCBDb250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgT3RoZXIgTGljZW5zZSBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlCi10byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBPdGhlciBMaWNlbnNlLiAgSW4gYWRkaXRpb24sIHdpdGggcmVnYXJkIHRvIE1vZGlmaWNhdGlvbnMgZm9yIHdoaWNoIHlvdSBhcmUgdGhlIGNvcHlyaWdodCBob2xkZXIsIHlvdSBhcmUgYWxzbwotcHJvdmlkaW5nIHRoZSBNb2RpZmljYXRpb25zIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBzdWNoIE1vZGlmaWNhdGlvbnMgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YKLXRoZSBDUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9idWlsZC5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGZkYTI1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXA0KLSAgICAgICAgICAgICAgICouamFyLFwNCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwNCi0gICAgICAgICAgICAgICBhYm91dC5odG1sDQotc291cmNlLmZvcm1zLmphciA9IHNyYy8NCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sDQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTk0NzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIw0KLSMgcGx1Z2luLnhtbCBwcm9wZXJ0aWVzDQotIw0KLQ0KLW5hbWUgPSBJbnN0YWxsL1VwZGF0ZSBGb3Jtcw0KLXByb3ZpZGVyLW5hbWUgPSBFY2xpcHNlLm9yZw0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIyYTE2Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08cGx1Z2luDQotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3JtcyINCi0gICBuYW1lPSIlbmFtZSINCi0gICB2ZXJzaW9uPSIzLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXItbmFtZSINCi0gICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1zUGx1Z2luIj4NCi0NCi0gICA8cnVudGltZT4NCi0gICAgICA8bGlicmFyeSBuYW1lPSJmb3Jtcy5qYXIiPg0KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPg0KLSAgICAgICAgIDxwYWNrYWdlcyBwcmVmaXhlcz0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsIi8+DQotICAgICAgPC9saWJyYXJ5Pg0KLSAgIDwvcnVudGltZT4NCi0gICA8cmVxdWlyZXM+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5Ii8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0NCi08L3BsdWdpbj4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjU0NDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Fic3RyYWN0Rm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgSUZvcm0gaW50ZXJmYWNlIGFuZA0KLSAqIHByb3ZpZGVzIHNvbWUgY29tbW9uIHNlcnZpY2VzIHRvIGl0cyBzdWJjbGFzc2VzLg0KLSAqIEl0IGhhbmRsZXMgc29tZSBjb21tb24gcHJvcGVydGllcyBsaWtlIGhlYWRpbmcNCi0gKiB0ZXh0LCBpbWFnZSBhbmQgY29sb3JzLCBhcyB3ZWxsIGFzDQotICogZm9udCBjaGFuZ2UgcHJvY2Vzc2luZy4NCi0gKi8NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGb3JtIGltcGxlbWVudHMgSUZvcm0sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCi0JcHJvdGVjdGVkIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3Rvcnk7DQotCXByb3RlY3RlZCBDb2xvciBoZWFkaW5nQmFja2dyb3VuZDsNCi0JcHJvdGVjdGVkIENvbG9yIGhlYWRpbmdGb3JlZ3JvdW5kOw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoZWFkaW5nVmlzaWJsZSA9IHRydWU7DQotCXByb3RlY3RlZCBJbWFnZSBoZWFkaW5nSW1hZ2U7DQotCXByb3RlY3RlZCBTdHJpbmcgaGVhZGluZ1RleHQ7DQotCXByb3RlY3RlZCBGb250IHRpdGxlRm9udDsNCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBoeXBlcmxpbmtDb2xvckxpc3RlbmVyOw0KLQ0KLQlwdWJsaWMgQWJzdHJhY3RGb3JtKCkgew0KLQkJZmFjdG9yeSA9IG5ldyBGb3JtV2lkZ2V0RmFjdG9yeSgpOw0KLQkJdGl0bGVGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOw0KLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuYWRkTGlzdGVuZXIodGhpcyk7DQotCQlJUHJlZmVyZW5jZVN0b3JlIHBzdG9yZSA9IEpGYWNlUHJlZmVyZW5jZXMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7DQotCQloeXBlcmxpbmtDb2xvckxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgew0KLQkJCQlpZiAoZS5nZXRQcm9wZXJ0eSgpLmVxdWFscyhKRmFjZVByZWZlcmVuY2VzLkhZUEVSTElOS19DT0xPUikNCi0JCQkJCXx8IGUuZ2V0UHJvcGVydHkoKS5lcXVhbHMoDQotCQkJCQkJSkZhY2VQcmVmZXJlbmNlcy5BQ1RJVkVfSFlQRVJMSU5LX0NPTE9SKSkgew0KLQkJCQkJdXBkYXRlSHlwZXJsaW5rQ29sb3JzKCk7DQotCQkJCX0NCi0JCQl9DQotCQl9Ow0KLQkJcHN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaHlwZXJsaW5rQ29sb3JMaXN0ZW5lcik7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUh5cGVybGlua0NvbG9ycygpIHsNCi0JCWZhY3RvcnkudXBkYXRlSHlwZXJsaW5rQ29sb3JzKCk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jY29tbWl0Q2hhbmdlcyhib29sZWFuKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyhib29sZWFuIG9uU2F2ZSkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsNCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZGlzcG9zZSgpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJZmFjdG9yeS5kaXNwb3NlKCk7DQotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5yZW1vdmVMaXN0ZW5lcih0aGlzKTsNCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHN0b3JlID0gSkZhY2VQcmVmZXJlbmNlcy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsNCi0JCXBzdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOw0KLQkJcHN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaHlwZXJsaW5rQ29sb3JMaXN0ZW5lcik7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZG9HbG9iYWxBY3Rpb24oU3RyaW5nKQ0KLQkgKi8NCi0JcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZXhwYW5kVG8oT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgZXhwYW5kVG8oT2JqZWN0IG9iamVjdCkgew0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2dldENvbnRyb2woKQ0KLQkgKi8NCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgZ2V0Q29udHJvbCgpOw0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNnZXRGYWN0b3J5KCkNCi0JICovDQotCXB1YmxpYyBGb3JtV2lkZ2V0RmFjdG9yeSBnZXRGYWN0b3J5KCkgew0KLQkJcmV0dXJuIGZhY3Rvcnk7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZ2V0SGVhZGluZ0JhY2tncm91bmQoKQ0KLQkgKi8NCi0JcHVibGljIENvbG9yIGdldEhlYWRpbmdCYWNrZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGhlYWRpbmdCYWNrZ3JvdW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2dldEhlYWRpbmdGb3JlZ3JvdW5kKCkNCi0JICovDQotCXB1YmxpYyBDb2xvciBnZXRIZWFkaW5nRm9yZWdyb3VuZCgpIHsNCi0JCXJldHVybiBoZWFkaW5nRm9yZWdyb3VuZDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNnZXRIZWFkaW5nSW1hZ2UoKQ0KLQkgKi8NCi0JcHVibGljIEltYWdlIGdldEhlYWRpbmdJbWFnZSgpIHsNCi0JCXJldHVybiBoZWFkaW5nSW1hZ2U7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jZ2V0SGVhZGluZygpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEhlYWRpbmdUZXh0KCkgew0KLQkJaWYgKGhlYWRpbmdUZXh0ID09IG51bGwpDQotCQkJcmV0dXJuICIiOw0KLQkJcmV0dXJuIGhlYWRpbmdUZXh0Ow0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI2luaXRpYWxpemUoT2JqZWN0KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgbW9kZWwpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNpc0hlYWRpbmdWaXNpYmxlKCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGluZ1Zpc2libGUoKSB7DQotCQlyZXR1cm4gaGVhZGluZ1Zpc2libGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uIHNlY3Rpb24pIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNzZXRGb2N1cygpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSNzZXRIZWFkaW5nQmFja2dyb3VuZChDb2xvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdCYWNrZ3JvdW5kKENvbG9yIG5ld0hlYWRpbmdCYWNrZ3JvdW5kKSB7DQotCQl0aGlzLmhlYWRpbmdCYWNrZ3JvdW5kID0gbmV3SGVhZGluZ0JhY2tncm91bmQ7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jc2V0SGVhZGluZ0ZvcmVncm91bmQoQ29sb3IpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nRm9yZWdyb3VuZChDb2xvciBuZXdIZWFkaW5nRm9yZWdyb3VuZCkgew0KLQkJdGhpcy5oZWFkaW5nRm9yZWdyb3VuZCA9IG5ld0hlYWRpbmdGb3JlZ3JvdW5kOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3NldEhlYWRpbmdJbWFnZShJbWFnZSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdJbWFnZShJbWFnZSBoZWFkaW5nSW1hZ2UpIHsNCi0JCXRoaXMuaGVhZGluZ0ltYWdlID0gaGVhZGluZ0ltYWdlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBAc2VlIElGb3JtI3NldEhlYWRpbmdWaXNpYmxlKGJvb2xlYW4pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVmlzaWJsZShib29sZWFuIG5ld0hlYWRpbmdWaXNpYmxlKSB7DQotCQl0aGlzLmhlYWRpbmdWaXNpYmxlID0gbmV3SGVhZGluZ1Zpc2libGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZvcm0jc2V0SGVhZGluZyhTdHJpbmcpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZ1RleHQpIHsNCi0JCXRoaXMuaGVhZGluZ1RleHQgPSBoZWFkaW5nVGV4dDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBJRm9ybSN1cGRhdGUoKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgew0KLQl9DQotDQotCXByb3RlY3RlZCBib29sZWFuIGNhblBlcmZvcm1EaXJlY3RseShTdHJpbmcgaWQsIENvbnRyb2wgY29udHJvbCkgew0KLQkJaWYgKGNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7DQotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpKSkgew0KLQkJCQl0ZXh0LmN1dCgpOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LkNPUFkuZ2V0SWQoKSkpIHsNCi0JCQkJdGV4dC5jb3B5KCk7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQlpZiAoaWQuZXF1YWxzKEFjdGlvbkZhY3RvcnkuUEFTVEUuZ2V0SWQoKSkpIHsNCi0JCQkJdGV4dC5wYXN0ZSgpOw0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCQl9DQotCQkJaWYgKGlkLmVxdWFscyhBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSkpIHsNCi0JCQkJdGV4dC5zZWxlY3RBbGwoKTsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJCWlmIChpZC5lcXVhbHMoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSkpIHsNCi0JCQkJaW50IGNvdW50ID0gdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpOw0KLQkJCQlpZiAoY291bnQgPT0gMCkgew0KLQkJCQkJaW50IGNhcmV0UG9zID0gdGV4dC5nZXRDYXJldFBvc2l0aW9uKCk7DQotCQkJCQl0ZXh0LnNldFNlbGVjdGlvbihjYXJldFBvcywgY2FyZXRQb3MgKyAxKTsNCi0JCQkJfQ0KLQkJCQl0ZXh0Lmluc2VydCgiIik7DQotCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RTZWN0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Fic3RyYWN0U2VjdGlvbkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5MDNjYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQWJzdHJhY3RTZWN0aW9uRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlNjcm9sbGVkQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGZvcm0gY2xhc3MgdW5kZXJzdGFuZHMgZm9ybSBzZWN0aW9ucy4NCi0gKiBJdCBhc3N1bWVzIHRoYXQgdGhleSBhcmUgcGFydCBvZiB0aGUgZm9ybQ0KLSAqIGFuZCBpdCBvZmZlcnMgbGlmZSBjeWNsZSBoYW5kbGluZyBvZiBzZWN0aW9ucw0KLSAqIG9uY2UgdGhleSBhcmUgcmVnaXN0ZXJlZC4NCi0gKi8NCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWN0aW9uRm9ybSBleHRlbmRzIEFic3RyYWN0Rm9ybSB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEhfU0NST0xMX0lOQ1JFTUVOVCA9IDU7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZfU0NST0xMX0lOQ1JFTUVOVCA9IDY0Ow0KLQlwcm90ZWN0ZWQgVmVjdG9yIHNlY3Rpb25zID0gbnVsbDsNCi0NCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uIHNlY3Rpb24pIHsNCi0JCWlmIChzZWN0aW9ucyA9PSBudWxsKQ0KLQkJCXNlY3Rpb25zID0gbmV3IFZlY3RvcigpOw0KLQkJaWYgKCFzZWN0aW9ucy5jb250YWlucyhzZWN0aW9uKSkNCi0JCQlzZWN0aW9ucy5hZGQoc2VjdGlvbik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlclNlY3Rpb24oRm9ybVNlY3Rpb24gc2VjdGlvbikgew0KLQkJaWYgKHNlY3Rpb25zICE9IG51bGwgJiYgc2VjdGlvbnMuY29udGFpbnMoc2VjdGlvbikpDQotCQkJc2VjdGlvbnMucmVtb3ZlKHNlY3Rpb24pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi5pbml0aWFsaXplKG1vZGVsKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Rm9jdXMoKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCAmJiBzZWN0aW9ucy5zaXplKCkgPiAwKSB7DQotCQkJRm9ybVNlY3Rpb24gZmlyc3RTZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBzZWN0aW9ucy5maXJzdEVsZW1lbnQoKTsNCi0JCQlmaXJzdFNlY3Rpb24uc2V0Rm9jdXMoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi51cGRhdGUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyhib29sZWFuIG9uU2F2ZSkgew0KLQkJaWYgKHNlY3Rpb25zICE9IG51bGwpIHsNCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWN0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQkJRm9ybVNlY3Rpb24gc2VjdGlvbiA9IChGb3JtU2VjdGlvbikgaXRlci5uZXh0KCk7DQotCQkJCWlmIChzZWN0aW9uLmlzRGlydHkoKSkNCi0JCQkJCXNlY3Rpb24uY29tbWl0Q2hhbmdlcyhvblNhdmUpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBkb0dsb2JhbEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsNCi0JCUNvbnRyb2wgZm9jdXNDb250cm9sID0gZ2V0Rm9jdXNDb250cm9sKCk7DQotCQlpZiAoZm9jdXNDb250cm9sID09IG51bGwpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQ0KLQkJaWYgKGNhblBlcmZvcm1EaXJlY3RseShhY3Rpb25JZCwgZm9jdXNDb250cm9sKSkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBmb2N1c0NvbnRyb2wuZ2V0UGFyZW50KCk7DQotCQlGb3JtU2VjdGlvbiB0YXJnZXRTZWN0aW9uID0gbnVsbDsNCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KLQkJCU9iamVjdCBkYXRhID0gcGFyZW50LmdldERhdGEoKTsNCi0JCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEgaW5zdGFuY2VvZiBGb3JtU2VjdGlvbikgew0KLQkJCQl0YXJnZXRTZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBkYXRhOw0KLQkJCQlicmVhazsNCi0JCQl9DQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOw0KLQkJfQ0KLQkJaWYgKHRhcmdldFNlY3Rpb24gIT0gbnVsbCkgew0KLQkJCXJldHVybiB0YXJnZXRTZWN0aW9uLmRvR2xvYmFsQWN0aW9uKGFjdGlvbklkKTsNCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXRGb2N1c0NvbnRyb2woKSB7DQotCQlDb250cm9sIGNvbnRyb2wgPSBnZXRDb250cm9sKCk7DQotCQlpZiAoY29udHJvbCA9PSBudWxsIHx8IGNvbnRyb2wuaXNEaXNwb3NlZCgpKQ0KLQkJCXJldHVybiBudWxsOw0KLQkJRGlzcGxheSBkaXNwbGF5ID0gY29udHJvbC5nZXREaXNwbGF5KCk7DQotCQlDb250cm9sIGZvY3VzQ29udHJvbCA9IGRpc3BsYXkuZ2V0Rm9jdXNDb250cm9sKCk7DQotCQlpZiAoZm9jdXNDb250cm9sID09IG51bGwgfHwgZm9jdXNDb250cm9sLmlzRGlzcG9zZWQoKSkNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCXJldHVybiBmb2N1c0NvbnRyb2w7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFzdGUoQ2xpcGJvYXJkIGNsaXBib2FyZCkgew0KLQkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBnZXRGb2N1c0NvbnRyb2woKTsNCi0JCWlmIChmb2N1c0NvbnRyb2wgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlDb21wb3NpdGUgcGFyZW50ID0gZm9jdXNDb250cm9sLmdldFBhcmVudCgpOw0KLQkJRm9ybVNlY3Rpb24gdGFyZ2V0U2VjdGlvbiA9IG51bGw7DQotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCi0JCQlPYmplY3QgZGF0YSA9IHBhcmVudC5nZXREYXRhKCk7DQotCQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhIGluc3RhbmNlb2YgRm9ybVNlY3Rpb24pIHsNCi0JCQkJdGFyZ2V0U2VjdGlvbiA9IChGb3JtU2VjdGlvbikgZGF0YTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCWlmICh0YXJnZXRTZWN0aW9uICE9IG51bGwpIHsNCi0JCQlyZXR1cm4gdGFyZ2V0U2VjdGlvbi5jYW5QYXN0ZShjbGlwYm9hcmQpOw0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlpZiAoc2VjdGlvbnMgIT0gbnVsbCkgew0KLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHNlY3Rpb25zLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi5kaXNwb3NlKCk7DQotCQkJfQ0KLQkJfQ0KLQkJc3VwZXIuZGlzcG9zZSgpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBDb250cm9sIGNvbnRyb2wpIHsNCi0JCVBvaW50IGNvbnRyb2xTaXplID0gY29udHJvbC5nZXRTaXplKCk7DQotCQlQb2ludCBjb250cm9sT3JpZ2luID0gZ2V0Q29udHJvbExvY2F0aW9uKHNjb21wLCBjb250cm9sKTsNCi0JCWVuc3VyZVZpc2libGUoc2NvbXAsIGNvbnRyb2xPcmlnaW4sIGNvbnRyb2xTaXplKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlVmlzaWJsZShTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgUG9pbnQgY29udHJvbE9yaWdpbiwgUG9pbnQgY29udHJvbFNpemUpIHsNCi0JCVBvaW50IGFyZWEgPSBzY29tcC5nZXRDb250ZW50KCkuZ2V0U2l6ZSgpOw0KLQkJUG9pbnQgc2NvbXBPcmlnaW4gPSBzY29tcC5nZXRPcmlnaW4oKTsNCi0NCi0JCWludCB4ID0gc2NvbXBPcmlnaW4ueDsNCi0JCWludCB5ID0gc2NvbXBPcmlnaW4ueTsNCi0NCi0JCWlmIChjb250cm9sT3JpZ2luLnggKyBjb250cm9sU2l6ZS54ID4gc2NvbXBPcmlnaW4ueCArIGFyZWEueCkgew0KLQkJCXggPSBjb250cm9sT3JpZ2luLnggKyBjb250cm9sU2l6ZS54IC0gYXJlYS54Ow0KLQkJfQkJDQotCQlpZiAoY29udHJvbE9yaWdpbi54IDwgeCApIHsNCi0JCQkgeCA9IGNvbnRyb2xPcmlnaW4ueDsNCi0JCSB9ICAgICAgICAgDQotCQkNCi0JCWlmIChjb250cm9sT3JpZ2luLnkgKyBjb250cm9sU2l6ZS55ID4gc2NvbXBPcmlnaW4ueSArIGFyZWEueSkgew0KLQkJCXkgPSBjb250cm9sT3JpZ2luLnkgKyBjb250cm9sU2l6ZS55IC0gYXJlYS55Ow0KLQkJfQ0KLQkJaWYgKGNvbnRyb2xPcmlnaW4ueSA8IHkgKSB7DQotCQkJIHkgPSBjb250cm9sT3JpZ2luLnk7DQotCQkgfSAgICAgICAgIA0KLQkJc2NvbXAuc2V0T3JpZ2luKHgsIHkpOw0KLQl9DQotCQ0KLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldENvbnRyb2xMb2NhdGlvbihTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgQ29udHJvbCBjb250cm9sKSB7DQotCQlpbnQgeCA9IDA7DQotCQlpbnQgeSA9IDA7DQotCQlDb250cm9sIGN1cnJlbnRDb250cm9sID0gY29udHJvbDsNCi0JCWZvciAoOzspIHsNCi0JCQlpZiAoY3VycmVudENvbnRyb2wgPT0gc2NvbXApDQotCQkJCWJyZWFrOw0KLQkJCWlmIChjdXJyZW50Q29udHJvbC5nZXRMb2NhdGlvbigpLnggPiAwKQ0KLQkJCQl4ICs9IGN1cnJlbnRDb250cm9sLmdldExvY2F0aW9uKCkueDsNCi0JCQlpZiAoY3VycmVudENvbnRyb2wuZ2V0TG9jYXRpb24oKS55ID4gMCkNCi0JCQkJeSArPSBjdXJyZW50Q29udHJvbC5nZXRMb2NhdGlvbigpLnk7DQotCQkJY3VycmVudENvbnRyb2wgPSBjdXJyZW50Q29udHJvbC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCXJldHVybiBuZXcgUG9pbnQoeCwgeSk7DQotCX0NCi0JDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxWZXJ0aWNhbChTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCwgYm9vbGVhbiB1cCkgew0KLQkJc2Nyb2xsKHNjb21wLCAwLCB1cCA/IC1WX1NDUk9MTF9JTkNSRU1FTlQgOiBWX1NDUk9MTF9JTkNSRU1FTlQpOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxIb3Jpem9udGFsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIGxlZnQpIHsNCi0JCXNjcm9sbChzY29tcCwgbGVmdCA/IC1IX1NDUk9MTF9JTkNSRU1FTlQgOiBIX1NDUk9MTF9JTkNSRU1FTlQsIDApOw0KLQl9DQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzY3JvbGxQYWdlKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBib29sZWFuIHVwKSB7DQotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IHNjb21wLmdldENsaWVudEFyZWEoKTsNCi0JCWludCBpbmNyZW1lbnQgPSB1cCA/IC1jbGllbnRBcmVhLmhlaWdodCA6IGNsaWVudEFyZWEuaGVpZ2h0Ow0KLQkJc2Nyb2xsKHNjb21wLCAwLCBpbmNyZW1lbnQpOw0KLQl9DQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2Nyb2xsKFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wLCBpbnQgeG9mZnNldCwgaW50IHlvZmZzZXQpIHsNCi0JCVBvaW50IG9yaWdpbiA9IHNjb21wLmdldE9yaWdpbigpOw0KLQkJUG9pbnQgY29udGVudFNpemUgPSBzY29tcC5nZXRDb250ZW50KCkuZ2V0U2l6ZSgpOw0KLQkJaW50IHhvcmlnaW4gPSBvcmlnaW4ueCArIHhvZmZzZXQ7DQotCQlpbnQgeW9yaWdpbiA9IG9yaWdpbi55ICsgeW9mZnNldDsNCi0JCXhvcmlnaW4gPSBNYXRoLm1heCh4b3JpZ2luLCAwKTsNCi0JCXhvcmlnaW4gPSBNYXRoLm1pbih4b3JpZ2luLCBjb250ZW50U2l6ZS54IC0gMSk7DQotCQl5b3JpZ2luID0gTWF0aC5tYXgoeW9yaWdpbiwgMCk7DQotCQl5b3JpZ2luID0gTWF0aC5taW4oeW9yaWdpbiwgY29udGVudFNpemUueSAtIDEpOw0KLQkJc2NvbXAuc2V0T3JpZ2luKHhvcmlnaW4sIHlvcmlnaW4pOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVQYWdlSW5jcmVtZW50KFNjcm9sbGVkQ29tcG9zaXRlIHNjb21wKSB7DQotCQlTY3JvbGxCYXIgdmJhciA9IHNjb21wLmdldFZlcnRpY2FsQmFyKCk7DQotCQlpZiAodmJhciAhPSBudWxsKSB7DQotCQkJUmVjdGFuZ2xlIGNsaWVudEFyZWEgPSBzY29tcC5nZXRDbGllbnRBcmVhKCk7DQotCQkJaW50IGluY3JlbWVudCA9IGNsaWVudEFyZWEuaGVpZ2h0IC0gNTsNCi0JCQl2YmFyLnNldFBhZ2VJbmNyZW1lbnQoaW5jcmVtZW50KTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvQ3VzdG9tV29ya2Jvb2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9DdXN0b21Xb3JrYm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODhlYmNjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9DdXN0b21Xb3JrYm9vay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7DQotDQotDQotcHVibGljIGNsYXNzIEN1c3RvbVdvcmtib29rIGltcGxlbWVudHMgSUZvcm1Xb3JrYm9vayB7DQotCXByaXZhdGUgSGFzaHRhYmxlIHBhZ2VzOw0KLQlwcml2YXRlIGJvb2xlYW4gZmlyc3RQYWdlU2VsZWN0ZWQ9dHJ1ZTsNCi0JcHJpdmF0ZSBDVGFiRm9sZGVyIHRhYkZvbGRlcjsNCi0JcHJpdmF0ZSBWZWN0b3IgbGlzdGVuZXJzPW5ldyBWZWN0b3IoKTsNCi0JcHJpdmF0ZSBJRm9ybVBhZ2UgY3VycmVudFBhZ2U7DQotDQotcHVibGljIEN1c3RvbVdvcmtib29rKCkgew0KLQlwYWdlcyA9IG5ldyBIYXNodGFibGUoKTsNCi19DQotcHVibGljIHZvaWQgYWRkRm9ybVNlbGVjdGlvbkxpc3RlbmVyKElGb3JtU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOw0KLX0NCi1wdWJsaWMgdm9pZCBhZGRQYWdlKElGb3JtUGFnZSBwYWdlKSB7DQotCUNUYWJJdGVtIGl0ZW0gPSBuZXcgQ1RhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTlVMTCk7DQotCWl0ZW0uc2V0VGV4dChwYWdlLmdldExhYmVsKCkpOw0KLQlpdGVtLnNldFRvb2xUaXBUZXh0KHBhZ2UuZ2V0VGl0bGUoKSk7DQotCWl0ZW0uc2V0RGF0YShwYWdlKTsNCi0JcGFnZXMucHV0KHBhZ2UsIGl0ZW0pOw0KLQkNCi0JaWYgKGZpcnN0UGFnZVNlbGVjdGVkICYmIGN1cnJlbnRQYWdlID09IG51bGwpDQotCQlzZWxlY3RQYWdlKHBhZ2UsIHRydWUpOw0KLX0NCi1wdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JdGFiRm9sZGVyID0gbmV3IENUYWJGb2xkZXIocGFyZW50LCBTV1QuQk9UVE9NKTsNCi0JdGFiRm9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCUNUYWJJdGVtIGl0ZW0gPSAoQ1RhYkl0ZW0pIGUuaXRlbTsNCi0JCQlJRm9ybVBhZ2UgcGFnZSA9IChJRm9ybVBhZ2UpIGl0ZW0uZ2V0RGF0YSgpOw0KLQkJCWlmIChwYWdlICE9IG51bGwpDQotCQkJCXNlbGVjdFBhZ2UocGFnZSwgdHJ1ZSk7DQotCQl9DQotCX0pOw0KLQkvLyBsaXN0ZW5lciB0byByZXNpemUgdmlzaWJsZSBjb21wb25lbnRzDQotCXRhYkZvbGRlci5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJaWYgKGN1cnJlbnRQYWdlICE9IG51bGwpDQotCQkJCXNldENvbnRyb2xTaXplKGN1cnJlbnRQYWdlLmdldENvbnRyb2woKSk7DQotCQl9DQotCX0pOw0KLX0NCi1wcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JZm9yIChJdGVyYXRvciBpdGVyID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IChJRm9ybVNlbGVjdGlvbkxpc3RlbmVyKSBpdGVyLm5leHQoKTsNCi0JCWxpc3RlbmVyLmZvcm1TZWxlY3RlZChwYWdlLCBzZXRGb2N1cyk7DQotCX0NCi19DQotcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsNCi0JcmV0dXJuIHRhYkZvbGRlcjsNCi19DQotcHVibGljIElGb3JtUGFnZSBnZXRDdXJyZW50UGFnZSgpIHsNCi0JcmV0dXJuIGN1cnJlbnRQYWdlOw0KLX0NCi1wdWJsaWMgYm9vbGVhbiBpc0ZpcnN0UGFnZVNlbGVjdGVkKCkgew0KLQlyZXR1cm4gZmlyc3RQYWdlU2VsZWN0ZWQ7DQotfQ0KLXB1YmxpYyB2b2lkIHJlbW92ZUZvcm1TZWxlY3Rpb25MaXN0ZW5lcihJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7DQotCWxpc3RlbmVycy5yZW1vdmVFbGVtZW50KGxpc3RlbmVyKTsNCi19DQotcHVibGljIHZvaWQgcmVtb3ZlUGFnZShJRm9ybVBhZ2UgcGFnZSkgew0KLQlDVGFiSXRlbSBpdGVtID0gKENUYWJJdGVtKSBwYWdlcy5nZXQocGFnZSk7DQotCWlmIChpdGVtICE9IG51bGwpDQotCQlpdGVtLmRpc3Bvc2UoKTsNCi19DQotcHJpdmF0ZSB2b2lkIHJlc2VsZWN0UGFnZShmaW5hbCBJRm9ybVBhZ2UgcGFnZSkgew0KLQl0YWJGb2xkZXIuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQlzZWxlY3RQYWdlKHBhZ2UsIHRydWUpOw0KLQkJfQ0KLQl9KTsNCi19DQotcHVibGljIHZvaWQgc2VsZWN0UGFnZShmaW5hbCBJRm9ybVBhZ2UgcGFnZSwgZmluYWwgYm9vbGVhbiBzZXRGb2N1cykgew0KLQlmaW5hbCBJRm9ybVBhZ2Ugb2xkUGFnZSA9IGN1cnJlbnRQYWdlOw0KLQljdXJyZW50UGFnZSA9IHBhZ2U7DQotDQotCS8vIEl0IG1heSB0YWtlIGEgd2hpbGUNCi0JQnVzeUluZGljYXRvci5zaG93V2hpbGUodGFiRm9sZGVyLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgew0KLQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCXN3aXRjaFBhZ2VzKG9sZFBhZ2UsIHBhZ2UsIHNldEZvY3VzKTsNCi0JCX0NCi0JfSk7DQotfQ0KLXByaXZhdGUgdm9pZCBzZXRDb250cm9sU2l6ZShDb250cm9sIGNvbnRyb2wpIHsNCi0JUmVjdGFuZ2xlIGJvdW5kcyA9IHRhYkZvbGRlci5nZXRCb3VuZHMoKTsNCi0JUmVjdGFuZ2xlIG9mZnNldCA9IHRhYkZvbGRlci5nZXRDbGllbnRBcmVhKCk7DQotCWJvdW5kcy54ICs9IG9mZnNldC54Ow0KLQlib3VuZHMueSArPSBvZmZzZXQueTsNCi0JYm91bmRzLndpZHRoID0gb2Zmc2V0LndpZHRoOw0KLQlib3VuZHMuaGVpZ2h0ID0gb2Zmc2V0LmhlaWdodDsNCi0JY29udHJvbC5zZXRCb3VuZHMoYm91bmRzKTsNCi0JY29udHJvbC5tb3ZlQWJvdmUodGFiRm9sZGVyKTsNCi19DQotcHJpdmF0ZSB2b2lkIHNldENvbnRyb2xWaXNpYmxlKENvbnRyb2wgY29udHJvbCkgew0KLQlpZiAoY29udHJvbCA9PSBudWxsKQ0KLQkJcmV0dXJuOw0KLQlzZXRDb250cm9sU2l6ZShjb250cm9sKTsNCi0JY29udHJvbC5zZXRWaXNpYmxlKHRydWUpOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXRGaXJzdFBhZ2VTZWxlY3RlZChib29sZWFuIG5ld0ZpcnN0UGFnZVNlbGVjdGVkKSB7DQotCWZpcnN0UGFnZVNlbGVjdGVkID0gbmV3Rmlyc3RQYWdlU2VsZWN0ZWQ7DQotfQ0KLXByaXZhdGUgdm9pZCBzd2l0Y2hQYWdlcyhJRm9ybVBhZ2Ugb2xkUGFnZSwgSUZvcm1QYWdlIG5ld1BhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JaWYgKG9sZFBhZ2UgIT0gbnVsbCAmJiBvbGRQYWdlIT1uZXdQYWdlKSB7DQotCQlib29sZWFuIG9rVG9Td2l0Y2ggPSBvbGRQYWdlLmJlY29tZXNJbnZpc2libGUobmV3UGFnZSk7DQotCQlpZiAoIW9rVG9Td2l0Y2gpIHsNCi0JCQkvLyBXZSBtdXN0IHRyeSB0byBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgcGFnZQ0KLQkJCXJlc2VsZWN0UGFnZShvbGRQYWdlKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0JaWYgKG5ld1BhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwpDQotCQluZXdQYWdlLmNyZWF0ZUNvbnRyb2wodGFiRm9sZGVyKTsNCi0JdGFiRm9sZGVyLnNldFNlbGVjdGlvbigoQ1RhYkl0ZW0pIHBhZ2VzLmdldChuZXdQYWdlKSk7DQotCWlmIChvbGRQYWdlICE9IG51bGwgJiYgb2xkUGFnZSAhPSBuZXdQYWdlKSB7DQotCQlDb250cm9sIG9sZENvbnRyb2wgPSBvbGRQYWdlLmdldENvbnRyb2woKTsNCi0JCWlmIChvbGRDb250cm9sIT1udWxsKSBvbGRDb250cm9sLnNldFZpc2libGUoZmFsc2UpOw0KLQl9DQotCUNvbnRyb2wgbmV3Q29udHJvbCA9IG5ld1BhZ2UuZ2V0Q29udHJvbCgpOw0KLQluZXdQYWdlLmJlY29tZXNWaXNpYmxlKG9sZFBhZ2UpOw0KLQlzZXRDb250cm9sVmlzaWJsZShuZXdDb250cm9sKTsNCi0JZmlyZVNlbGVjdGlvbkNoYW5nZWQobmV3UGFnZSwgc2V0Rm9jdXMpOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0V4cGFuZGFibGVHcm91cC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0V4cGFuZGFibGVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI1ZjhhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9FeHBhbmRhYmxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi0NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwYW5kYWJsZUdyb3VwIHsNCi0JcHJpdmF0ZSBTdHJpbmcgdGV4dDsNCi0JcHJpdmF0ZSBib29sZWFuIGV4cGFuZGVkOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBleHBhbnNpb247DQotCXByb3RlY3RlZCBTZWxlY3RhYmxlRm9ybUxhYmVsIHRleHRMYWJlbDsNCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsNCi0JcHJpdmF0ZSBib29sZWFuIGV4cGFuZGFibGU9dHJ1ZTsNCi0JDQotY2xhc3MgRXhwYW5kYWJsZUxheW91dCBleHRlbmRzIExheW91dCB7DQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsNCi0JCVBvaW50IHNpemUgPSB0ZXh0TGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCWludCB4ID0gMDsNCi0JCWludCB5ID0gMTsNCi0JCQ0KLQkJaWYgKGV4cGFuZGFibGUpIHsNCi0JCQl4ID0gOCArIDg7DQotCQl9DQotCQl0ZXh0TGFiZWwuc2V0Qm91bmRzKHgsIHksIHNpemUueCwgc2l6ZS55KTsNCi0JDQotCQlpZiAoZXhwYW5kYWJsZSkNCi0JCSAgIHkgPSBNYXRoLm1heChzaXplLnksIDgpICsgMiArIDI7DQotCQllbHNlDQotCQkgICB5ID0gc2l6ZS55ICsgMjsNCi0JCWlmIChleHBhbmRlZCkgew0KLQkJCWludCBhcmVhV2lkdGggPSBjbGllbnRBcmVhLndpZHRoIC0geDsNCi0JCQlzaXplID0gZXhwYW5zaW9uLmNvbXB1dGVTaXplKGFyZWFXaWR0aCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJCWV4cGFuc2lvbi5zZXRCb3VuZHMoeCwgeSwgc2l6ZS54LCBzaXplLnkpOw0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOw0KLQkJUG9pbnQgc2l6ZSA9IHRleHRMYWJlbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJd2lkdGggPSBzaXplLng7DQotCQloZWlnaHQgPSBzaXplLnkgKyAyICsgMjsNCi0JCWlmIChleHBhbmRlZCkgew0KLQkJCXNpemUgPSBleHBhbnNpb24uY29tcHV0ZVNpemUod0hpbnQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKTsNCi0JCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBzaXplLngpOw0KLQkJCWhlaWdodCArPSBzaXplLnk7DQotCQl9DQotCQlpZiAoZXhwYW5kYWJsZSkgew0KLQkJCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgOCk7DQotCQkJd2lkdGggKz0gOCArIDg7DQotCQl9DQotCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOw0KLQl9DQotfQ0KLQ0KLQlwdWJsaWMgRXhwYW5kYWJsZUdyb3VwKCkgew0KLQl9DQotCQ0KLQlwdWJsaWMgRXhwYW5kYWJsZUdyb3VwKGludCBzdHlsZSkgew0KLQkJLy90aGlzLnN0eWxlID0gc3R5bGU7DQotCX0NCi0JDQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7DQotCQlyZXR1cm4gY29udHJvbDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlmaW5hbCBDYW52YXMgY29udGFpbmVyID0gbmV3IENhbnZhcyhwYXJlbnQsIFNXVC5OVUxMKTsNCi0JCWNvbnRhaW5lci5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJY29udGFpbmVyLnNldExheW91dChuZXcgRXhwYW5kYWJsZUxheW91dCgpKTsNCi0JCWNvbnRhaW5lci5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJaWYgKGV4cGFuZGFibGUpIHJlcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQljb250YWluZXIuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBib3ggPSBnZXRCb3hCb3VuZHMobnVsbCk7DQotCQkJCWlmIChib3guY29udGFpbnMoZS54LCBlLnkpKSB7DQotCQkJCQljb250YWluZXIuc2V0Q3Vyc29yKGZhY3RvcnkuZ2V0QnVzeUN1cnNvcigpKTsNCi0JCQkJCXNldEV4cGFuZGVkKCFpc0V4cGFuZGVkKCkpOw0KLQkJCQkJY29udGFpbmVyLnNldEN1cnNvcihudWxsKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQkJdGV4dExhYmVsID0gY3JlYXRlVGV4dExhYmVsKGNvbnRhaW5lciwgZmFjdG9yeSk7DQotCQlnZXRIeXBlcmxpbmtIYW5kbGVyKGZhY3RvcnkpLnJlZ2lzdGVySHlwZXJsaW5rKHRleHRMYWJlbCwgbmV3IEh5cGVybGlua0FkYXB0ZXIgKCkgew0KLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7DQotCQkJCUV4cGFuZGFibGVHcm91cC50aGlzLmxpbmtBY3RpdmF0ZWQoKTsNCi0JCQkJaWYgKGV4cGFuZGFibGUpIHNldEV4cGFuZGVkKCFpc0V4cGFuZGVkKCkpOw0KLQkJCX0NCi0JCX0pOw0KLQkJdGV4dExhYmVsLmFkZEZvY3VzTGlzdGVuZXIoZmFjdG9yeS52aXNpYmlsaXR5SGFuZGxlcik7DQotCQl0ZXh0TGFiZWwuYWRkS2V5TGlzdGVuZXIoZmFjdG9yeS5rZXlib2FyZEhhbmRsZXIpOwkJDQotCQlpZiAodGV4dCE9bnVsbCkgdGV4dExhYmVsLnNldFRleHQodGV4dCk7DQotCQlleHBhbnNpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjb250YWluZXIpOw0KLQkJZmlsbEV4cGFuc2lvbihleHBhbnNpb24sIGZhY3RvcnkpOw0KLQkJdGhpcy5jb250cm9sID0gY29udGFpbmVyOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgU2VsZWN0YWJsZUZvcm1MYWJlbCBjcmVhdGVUZXh0TGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgew0KLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCB0ZXh0ID0gbmV3IFNlbGVjdGFibGVGb3JtTGFiZWwocGFyZW50LCBTV1QuV1JBUCk7DQotCQl0ZXh0LnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQkNCi0JcHJvdGVjdGVkIEh5cGVybGlua0hhbmRsZXIgZ2V0SHlwZXJsaW5rSGFuZGxlcihGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlyZXR1cm4gZmFjdG9yeS5nZXRIeXBlcmxpbmtIYW5kbGVyKCk7DQotCX0NCi0JDQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGZpbGxFeHBhbnNpb24oQ29tcG9zaXRlIGV4cGFuc2lvbiwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSk7DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotCQl0aGlzLnRleHQgPSB0ZXh0Ow0KLQkJaWYgKHRleHRMYWJlbCE9bnVsbCkNCi0JCSAgIHRleHRMYWJlbC5zZXRUZXh0KHRleHQpOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNFeHBhbmRlZCgpIHsNCi0JCXJldHVybiBleHBhbmRlZDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0RXhwYW5kYWJsZShib29sZWFuIGV4cGFuZGFibGUpIHsNCi0JCXRoaXMuZXhwYW5kYWJsZSA9IGV4cGFuZGFibGU7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzRXhwYW5kYWJsZSgpIHsNCi0JCXJldHVybiBleHBhbmRhYmxlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRlZChib29sZWFuIGV4cGFuZGVkKSB7DQotCQlpZiAodGhpcy5leHBhbmRlZCAhPSBleHBhbmRlZCkgew0KLQkJCWlmIChleHBhbmRlZCkgew0KLQkJCQlhYm91dFRvRXhwYW5kKCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlhYm91dFRvQ29sbGFwc2UoKTsNCi0JCQl9DQotCQkJdGhpcy5leHBhbmRlZCA9IGV4cGFuZGVkOw0KLQkJCWV4cGFuc2lvbi5zZXRWaXNpYmxlKGV4cGFuZGVkKTsNCi0JCQljb250cm9sLmxheW91dCgpOw0KLQkJCWlmIChleHBhbmRlZCkgew0KLQkJCQl0aGlzLmV4cGFuZGVkKCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQljb2xsYXBzZWQoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCByZXBhaW50KFBhaW50RXZlbnQgZSkgew0KLQkJR0MgZ2MgPSBlLmdjOw0KLQkJUmVjdGFuZ2xlIGJveCA9IGdldEJveEJvdW5kcyhnYyk7DQotCQlnYy5zZXRGb3JlZ3JvdW5kKGNvbnRyb2wuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTk9STUFMX1NIQURPVykpOw0KLQkJZ2MuZHJhd1JlY3RhbmdsZShib3gpOw0KLQkJZ2Muc2V0Rm9yZWdyb3VuZChjb250cm9sLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKSk7DQotCQlnYy5kcmF3TGluZShib3gueCsyLCBib3gueSs0LCBib3gueCs2LCBib3gueSs0KTsNCi0JCWlmICghaXNFeHBhbmRlZCgpKSB7DQotCQkJZ2MuZHJhd0xpbmUoYm94LngrNCwgYm94LnkrMiwgYm94LngrNCwgYm94LnkrNik7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgUmVjdGFuZ2xlIGdldEJveEJvdW5kcyhHQyBnYykgew0KLQkJaW50IHggPSAwOw0KLQkJaW50IHkgPSAwOw0KLQkJYm9vbGVhbiBub0dDID0gZmFsc2U7DQotCQ0KLQkJaWYgKGdjPT1udWxsKSB7DQotCQkJZ2MgPSBuZXcgR0MoY29udHJvbCk7DQotCQkJbm9HQyA9IHRydWU7DQotCQl9DQotCQlnYy5zZXRGb250KHRleHRMYWJlbC5nZXRGb250KCkpOw0KLQkJaW50IGhlaWdodCA9IGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCk7DQotCQl5ID0gaGVpZ2h0LzIgLSA0ICsxOw0KLQkJeSA9IE1hdGgubWF4KHksIDApOw0KLQkJaWYgKG5vR0MpIGdjLmRpc3Bvc2UoKTsNCi0JCXJldHVybiBuZXcgUmVjdGFuZ2xlKHgsIHksIDgsIDgpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMYXlvdXQoKSB7DQotCQljb250cm9sLmxheW91dCgpOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvRXhwYW5kKCkgew0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBhYm91dFRvQ29sbGFwc2UoKSB7DQotCX0NCi0JDQotCXByb3RlY3RlZCB2b2lkIGV4cGFuZGVkKCkgew0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGNvbGxhcHNlZCgpIHsNCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBsaW5rQWN0aXZhdGVkKCkgew0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtQnV0dG9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzA3ZWRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotDQotcHVibGljIGNsYXNzIEZvcm1CdXR0b24gew0KLQlwcml2YXRlIEJ1dHRvbiBidXR0b247DQotCXByaXZhdGUgSW1hZ2UgaW1hZ2U7DQotCXByaXZhdGUgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeTsNCi0JcHJpdmF0ZSBJbWFnZSBob3ZlckltYWdlOw0KLQlwcml2YXRlIGJvb2xlYW4gaW5zaWRlOw0KLQlwcml2YXRlIEltYWdlIGRpc2FibGVkSW1hZ2U7DQotDQotcHVibGljIEZvcm1CdXR0b24oQnV0dG9uIGJ1dHRvbiwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgew0KLQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsNCi0JdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsNCi0JYnV0dG9uLmFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCWluc2lkZT10cnVlOw0KLQkJCXVwZGF0ZUltYWdlKCk7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7DQotCQkJaW5zaWRlPWZhbHNlOw0KLQkJCXVwZGF0ZUltYWdlKCk7DQotCQl9DQotCX0pOw0KLX0NCi1wdWJsaWMgQnV0dG9uIGdldEJ1dHRvbigpIHsNCi0JcmV0dXJuIGJ1dHRvbjsNCi19DQotcHVibGljIEltYWdlIGdldERpc2FibGVkSW1hZ2UoKSB7DQotCXJldHVybiBkaXNhYmxlZEltYWdlOw0KLX0NCi1wdWJsaWMgSW1hZ2UgZ2V0SG92ZXJJbWFnZSgpIHsNCi0JcmV0dXJuIGhvdmVySW1hZ2U7DQotfQ0KLXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsNCi0JcmV0dXJuIGltYWdlOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXREaXNhYmxlZEltYWdlKEltYWdlIG5ld0Rpc2FibGVkSW1hZ2UpIHsNCi0JZGlzYWJsZWRJbWFnZSA9IG5ld0Rpc2FibGVkSW1hZ2U7DQotfQ0KLXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7DQotCWJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOw0KLQl1cGRhdGVJbWFnZSgpOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlKEltYWdlIG5ld0hvdmVySW1hZ2UpIHsNCi0JaG92ZXJJbWFnZSA9IG5ld0hvdmVySW1hZ2U7DQotfQ0KLXB1YmxpYyB2b2lkIHNldEltYWdlKEltYWdlIG5ld0ltYWdlKSB7DQotCWltYWdlID0gbmV3SW1hZ2U7DQotCWlmIChob3ZlckltYWdlPT1udWxsKSBob3ZlckltYWdlID0gaW1hZ2U7DQotCWlmIChkaXNhYmxlZEltYWdlPT1udWxsKSBkaXNhYmxlZEltYWdlID0gaW1hZ2U7DQotCXVwZGF0ZUltYWdlKCk7DQotfQ0KLXB1YmxpYyB2b2lkIHVwZGF0ZUltYWdlKCkgew0KLQlib29sZWFuIGVuYWJsZWQgPSBidXR0b24uaXNFbmFibGVkKCk7DQotCWlmIChlbmFibGVkID09IGZhbHNlKSB7DQotCQlidXR0b24uc2V0SW1hZ2UoZGlzYWJsZWRJbWFnZSk7DQotCX0gZWxzZSB7DQotCQlpZiAoaW5zaWRlKSB7DQotCQkJYnV0dG9uLnNldEN1cnNvcihmYWN0b3J5LmdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JCQlidXR0b24uc2V0SW1hZ2UoaG92ZXJJbWFnZSk7DQotCQl9IGVsc2Ugew0KLQkJCWJ1dHRvbi5zZXRDdXJzb3IobnVsbCk7DQotCQkJYnV0dG9uLnNldEltYWdlKGltYWdlKTsNCi0JCX0NCi0JfQ0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1FbnRyeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1FbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWU3ZTE0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotcHVibGljIGNsYXNzIEZvcm1FbnRyeSB7DQotCXByaXZhdGUgVGV4dCB0ZXh0Ow0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5Ow0KLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnM9bmV3IFZlY3RvcigpOw0KLQlib29sZWFuIGlnbm9yZU1vZGlmeT1mYWxzZTsNCi0NCi1wdWJsaWMgRm9ybUVudHJ5KFRleHQgdGV4dCkgew0KLQl0aGlzLnRleHQgPSB0ZXh0Ow0KLQl0aGlzLnZhbHVlID0gdGV4dC5nZXRUZXh0KCk7DQotCWFkZExpc3RlbmVycygpOw0KLX0NCi1wdWJsaWMgdm9pZCBhZGRGb3JtVGV4dExpc3RlbmVyKElGb3JtVGV4dExpc3RlbmVyIGxpc3RlbmVyKSB7DQotCWxpc3RlbmVycy5hZGRFbGVtZW50KGxpc3RlbmVyKTsNCi19DQotcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVycygpIHsNCi0JdGV4dC5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsNCi0JCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsNCi0JCQlrZXlSZWxlYXNlT2NjdXJlZChlKTsNCi0JCX0NCi0JfSk7DQotCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgew0KLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7DQotCQkJZWRpdE9jY3VyZWQoZSk7DQotCQl9DQotCX0pOw0KLQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIgKG5ldyBGb2N1c0FkYXB0ZXIoKSB7DQotCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJaWYgKGRpcnR5KSBjb21taXQoKTsNCi0JCX0NCi0JfSk7DQotfQ0KLXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsNCi0JaWYgKGRpcnR5KSB7DQotCQl2YWx1ZSA9IHRleHQuZ2V0VGV4dCgpOw0KLQkJLy9ub3RpZnkNCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQkoKElGb3JtVGV4dExpc3RlbmVyKSBpdGVyLm5leHQoKSkudGV4dFZhbHVlQ2hhbmdlZCh0aGlzKTsNCi0JCX0NCi0JfQ0KLQlkaXJ0eSA9IGZhbHNlOw0KLX0NCi1wcm90ZWN0ZWQgdm9pZCBlZGl0T2NjdXJlZChNb2RpZnlFdmVudCBlKSB7DQotCWlmIChpZ25vcmVNb2RpZnkpIHJldHVybjsNCi0JZGlydHkgPSB0cnVlOw0KLQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkoKElGb3JtVGV4dExpc3RlbmVyKSBpdGVyLm5leHQoKSkudGV4dERpcnR5KHRoaXMpOw0KLQl9DQotfQ0KLQ0KLXB1YmxpYyBUZXh0IGdldENvbnRyb2woKSB7DQotCXJldHVybiB0ZXh0Ow0KLX0NCi1wdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsNCi0JcmV0dXJuIHZhbHVlOw0KLX0NCi1wdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KLQlyZXR1cm4gZGlydHk7DQotfQ0KLXByb3RlY3RlZCB2b2lkIGtleVJlbGVhc2VPY2N1cmVkKEtleUV2ZW50IGUpIHsNCi0JaWYgKGUuY2hhcmFjdGVyID09ICdccicpIHsNCi0JCS8vIGNvbW1pdCB2YWx1ZQ0KLQkJaWYgKGRpcnR5KSBjb21taXQoKTsNCi0JfQ0KLQllbHNlIGlmIChlLmNoYXJhY3RlciA9PSAnXHUwMDFiJykgeyAvLyBFc2NhcGUgY2hhcmFjdGVyDQotCQl0ZXh0LnNldFRleHQodmFsdWUhPW51bGw/dmFsdWU6IiIpOyAvLyByZXN0b3JlIG9sZA0KLQkJZGlydHk9IGZhbHNlOw0KLQl9DQotfQ0KLXB1YmxpYyB2b2lkIHJlbW92ZUZvcm1UZXh0TGlzdGVuZXIoSUZvcm1UZXh0TGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOw0KLX0NCi1wdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIG5ld0RpcnR5KSB7DQotCWRpcnR5ID0gbmV3RGlydHk7DQotfQ0KLXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgew0KLQlpZiAodGV4dCE9bnVsbCkgdGV4dC5zZXRUZXh0KHZhbHVlIT1udWxsP3ZhbHVlOiIiKTsNCi0JdGhpcy52YWx1ZSA9IHZhbHVlOw0KLX0NCi0NCi1wdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gYmxvY2tOb3RpZmljYXRpb24pIHsNCi0JaWdub3JlTW9kaWZ5ID0gYmxvY2tOb3RpZmljYXRpb247DQotCXNldFZhbHVlKHZhbHVlKTsNCi0JaWdub3JlTW9kaWZ5ID0gZmFsc2U7DQotfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUxhYmVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWUxZTguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1MYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3I7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotLyoqDQotICogRm9ybVRleHQgaXMgYSB3aW5kb3dsZXNzIGNvbnRyb2wgdGhhdA0KLSAqIGRyYXdzIHRleHQgaW4gdGhlIHByb3ZpZGVkIGNvbnRleHQuDQotICovDQotcHVibGljIGNsYXNzIEZvcm1MYWJlbCBleHRlbmRzIENhbnZhcyB7DQotCXByaXZhdGUgU3RyaW5nIHRleHQgPSAiIjsNCi0JcHJvdGVjdGVkIGludCB0ZXh0TWFyZ2luV2lkdGggPSA1Ow0KLQlwcm90ZWN0ZWQgaW50IHRleHRNYXJnaW5IZWlnaHQgPSA1Ow0KLQlwcml2YXRlIGJvb2xlYW4gdW5kZXJsaW5lZDsNCi0NCi0JcHVibGljIEZvcm1MYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7DQotCQkJCXBhaW50KGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJaW5pdEFjY2Vzc2libGUoKTsNCi0JfQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7DQotCQlpZiAodGV4dCAhPSBudWxsKQ0KLQkJCXRoaXMudGV4dCA9IHRleHQ7DQotCQllbHNlDQotCQkJdGV4dCA9ICIiOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIGluaXRBY2Nlc3NpYmxlKCkgew0KLQkJQWNjZXNzaWJsZSBhY2Nlc3NpYmxlID0gZ2V0QWNjZXNzaWJsZSgpOw0KLQkJYWNjZXNzaWJsZS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldE5hbWUoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUZXh0KCk7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJYWNjZXNzaWJsZQ0KLQkJCS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZ2V0Q2hpbGRBdFBvaW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlQb2ludCBwdCA9IHRvQ29udHJvbChuZXcgUG9pbnQoZS54LCBlLnkpKTsNCi0JCQkJZS5jaGlsZElEID0NCi0JCQkJCShnZXRCb3VuZHMoKS5jb250YWlucyhwdCkpDQotCQkJCQkJPyBBQ0MuQ0hJTERJRF9TRUxGDQotCQkJCQkJOiBBQ0MuQ0hJTERJRF9OT05FOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRMb2NhdGlvbihBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUmVjdGFuZ2xlIGxvY2F0aW9uID0gZ2V0Qm91bmRzKCk7DQotCQkJCVBvaW50IHB0ID0gdG9EaXNwbGF5KG5ldyBQb2ludChsb2NhdGlvbi54LCBsb2NhdGlvbi55KSk7DQotCQkJCWUueCA9IHB0Lng7DQotCQkJCWUueSA9IHB0Lnk7DQotCQkJCWUud2lkdGggPSBsb2NhdGlvbi53aWR0aDsNCi0JCQkJZS5oZWlnaHQgPSBsb2NhdGlvbi5oZWlnaHQ7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQ291bnQoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gMDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9MQUJFTDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlNUQVRFX1JFQURPTkxZOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFVuZGVybGluZWQoYm9vbGVhbiB1bmRlcmxpbmVkKSB7DQotCQl0aGlzLnVuZGVybGluZWQgPSB1bmRlcmxpbmVkOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGlzVW5kZXJsaW5lZCgpIHsNCi0JCXJldHVybiB1bmRlcmxpbmVkOw0KLQl9DQotDQotCXB1YmxpYyBQb2ludCBjb21wdXRlU2l6ZShpbnQgd0hpbnQsIGludCBoSGludCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQljaGVja1dpZGdldCgpOw0KLQkJaW50IGlubmVyV2lkdGggPSB3SGludDsNCi0JCWlmIChpbm5lcldpZHRoICE9IFNXVC5ERUZBVUxUKQ0KLQkJCWlubmVyV2lkdGggLT0gdGV4dE1hcmdpbldpZHRoICogMjsNCi0JCVBvaW50IHRleHRTaXplID0gY29tcHV0ZVRleHRTaXplKGlubmVyV2lkdGgsIGhIaW50KTsNCi0JCWludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS54ICsgMiAqIHRleHRNYXJnaW5XaWR0aDsNCi0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueSArIDIgKiB0ZXh0TWFyZ2luSGVpZ2h0Ow0KLQkJcmV0dXJuIG5ldyBQb2ludCh0ZXh0V2lkdGgsIHRleHRIZWlnaHQpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVXcmFwSGVpZ2h0KEdDIGdjLCBTdHJpbmcgdGV4dCwgaW50IHdpZHRoKSB7DQotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsNCi0JCXdiLnNldFRleHQodGV4dCk7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQ0KLQkJaW50IHNhdmVkID0gMDsNCi0JCWludCBsYXN0ID0gMDsNCi0JCWludCBoZWlnaHQgPSBsaW5lSGVpZ2h0Ow0KLQ0KLQkJZm9yIChpbnQgbG9jID0gd2IuZmlyc3QoKTsNCi0JCQlsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOw0KLQkJCWxvYyA9IHdiLm5leHQoKSkgew0KLQkJCVN0cmluZyB3b3JkID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxvYyk7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh3b3JkKTsNCi0JCQlpZiAoZXh0ZW50LnggPiB3aWR0aCkgew0KLQkJCQkvLyBvdmVyZmxvdw0KLQkJCQlzYXZlZCA9IGxhc3Q7DQotCQkJCWhlaWdodCArPSBleHRlbnQueTsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCX0NCi0JCXJldHVybiBoZWlnaHQ7DQotCX0NCi0NCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlVGV4dFNpemUoaW50IHdIaW50LCBpbnQgaEhpbnQpIHsNCi0JCVBvaW50IGV4dGVudDsNCi0JCUdDIGdjID0gbmV3IEdDKHRoaXMpOw0KLQ0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkJaWYgKChnZXRTdHlsZSgpICYgU1dULldSQVApICE9IDAgJiYgd0hpbnQgIT0gU1dULkRFRkFVTFQpIHsNCi0JCQlpbnQgaGVpZ2h0ID0gY29tcHV0ZVdyYXBIZWlnaHQoZ2MsIHRleHQsIHdIaW50KTsNCi0JCQlleHRlbnQgPSBuZXcgUG9pbnQod0hpbnQsIGhlaWdodCk7DQotCQl9IGVsc2Ugew0KLQkJCWV4dGVudCA9IGdjLnRleHRFeHRlbnQoZ2V0VGV4dCgpKTsNCi0JCX0NCi0JCWdjLmRpc3Bvc2UoKTsNCi0JCXJldHVybiBleHRlbnQ7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhaW50V3JhcFRleHQoDQotCQlHQyBnYywNCi0JCVBvaW50IHNpemUsDQotCQlTdHJpbmcgdGV4dCwNCi0JCWludCBtYXJnaW5XaWR0aCwNCi0JCWludCBtYXJnaW5IZWlnaHQpIHsNCi0JCXBhaW50V3JhcFRleHQoZ2MsIHNpemUsIHRleHQsIG1hcmdpbldpZHRoLCBtYXJnaW5IZWlnaHQsIGZhbHNlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFpbnRXcmFwVGV4dCgNCi0JCUdDIGdjLA0KLQkJUG9pbnQgc2l6ZSwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJaW50IG1hcmdpbldpZHRoLA0KLQkJaW50IG1hcmdpbkhlaWdodCwNCi0JCWJvb2xlYW4gdW5kZXJsaW5lKSB7DQotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRXb3JkSW5zdGFuY2UoKTsNCi0JCXdiLnNldFRleHQodGV4dCk7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7DQotDQotCQlpbnQgc2F2ZWQgPSAwOw0KLQkJaW50IGxhc3QgPSAwOw0KLQkJaW50IHkgPSBtYXJnaW5IZWlnaHQ7DQotCQlpbnQgd2lkdGggPSBzaXplLnggLSBtYXJnaW5XaWR0aCAqIDI7DQotDQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOw0KLQkJCWxvYyAhPSBCcmVha0l0ZXJhdG9yLkRPTkU7DQotCQkJbG9jID0gd2IubmV4dCgpKSB7DQotCQkJU3RyaW5nIGxpbmUgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbG9jKTsNCi0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxpbmUpOw0KLQkJCWlmIChleHRlbnQueCA+IHdpZHRoKSB7DQotCQkJCS8vIG92ZXJmbG93DQotCQkJCVN0cmluZyBwcmV2TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCQkJZ2MuZHJhd1N0cmluZyhwcmV2TGluZSwgbWFyZ2luV2lkdGgsIHksIHRydWUpOw0KLQkJCQlpZiAodW5kZXJsaW5lKSB7DQotCQkJCQlQb2ludCBwcmV2RXh0ZW50ID0gZ2MudGV4dEV4dGVudChwcmV2TGluZSk7DQotCQkJCQlpbnQgbGluZVkgPSB5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCQkJZ2MuZHJhd0xpbmUobWFyZ2luV2lkdGgsIGxpbmVZLCBwcmV2RXh0ZW50LngsIGxpbmVZKTsNCi0JCQkJfQ0KLQ0KLQkJCQlzYXZlZCA9IGxhc3Q7DQotCQkJCXkgKz0gbGluZUhlaWdodDsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCX0NCi0JCS8vIHBhaW50IHRoZSBsYXN0IGxpbmUNCi0JCVN0cmluZyBsYXN0TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCWdjLmRyYXdTdHJpbmcobGFzdExpbmUsIG1hcmdpbldpZHRoLCB5LCB0cnVlKTsNCi0JCWlmICh1bmRlcmxpbmUpIHsNCi0JCQlpbnQgbGluZVkgPSB5ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCVBvaW50IGxhc3RFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxhc3RMaW5lKTsNCi0JCQlnYy5kcmF3TGluZShtYXJnaW5XaWR0aCwgbGluZVksIG1hcmdpbldpZHRoICsgbGFzdEV4dGVudC54LCBsaW5lWSk7DQotCQl9DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlHQyBnYyA9IGUuZ2M7DQotCQlQb2ludCBzaXplID0gZ2V0U2l6ZSgpOw0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOw0KLQkJaWYgKChnZXRTdHlsZSgpICYgU1dULldSQVApICE9IDApIHsNCi0JCQlwYWludFdyYXBUZXh0KA0KLQkJCQlnYywNCi0JCQkJc2l6ZSwNCi0JCQkJdGV4dCwNCi0JCQkJdGV4dE1hcmdpbldpZHRoLA0KLQkJCQl0ZXh0TWFyZ2luSGVpZ2h0LA0KLQkJCQl1bmRlcmxpbmVkKTsNCi0JCX0gZWxzZSB7DQotCQkJZ2MuZHJhd1RleHQoZ2V0VGV4dCgpLCB0ZXh0TWFyZ2luV2lkdGgsIHRleHRNYXJnaW5IZWlnaHQsIHRydWUpOw0KLQkJCWlmICh1bmRlcmxpbmVkKSB7DQotCQkJCUZvbnRNZXRyaWNzIGZtID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsNCi0JCQkJaW50IGRlc2NlbnQgPSBmbS5nZXREZXNjZW50KCk7DQotCQkJCWludCBsaW5lWSA9IHNpemUueSAtIHRleHRNYXJnaW5IZWlnaHQgLSBkZXNjZW50ICsgMTsNCi0JCQkJZ2MuZHJhd0xpbmUoDQotCQkJCQl0ZXh0TWFyZ2luV2lkdGgsDQotCQkJCQlsaW5lWSwNCi0JCQkJCXNpemUueCAtIHRleHRNYXJnaW5XaWR0aCwNCi0JCQkJCWxpbmVZKTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1TZWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyMjMxZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuQ2xpcGJvYXJkOw0KLQ0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3JtU2VjdGlvbiBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VMRUNUSU9OID0gMTsNCi0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyQ29sb3JLZXkgPSBGb3JtV2lkZ2V0RmFjdG9yeS5ERUZBVUxUX0hFQURFUl9DT0xPUjsNCi0JcHJpdmF0ZSBTdHJpbmcgaGVhZGVyVGV4dDsNCi0JcHJpdmF0ZSBDb250cm9sIGNsaWVudDsNCi0JcHJvdGVjdGVkIExhYmVsIGhlYWRlcjsNCi0JcHJvdGVjdGVkIENvbnRyb2wgc2VwYXJhdG9yOw0KLQlwcml2YXRlIFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIHNlY3Rpb25NYW5hZ2VyOw0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCi0JcHJpdmF0ZSBib29sZWFuIGRpcnR5Ow0KLQlwcm90ZWN0ZWQgTGFiZWwgZGVzY3JpcHRpb25MYWJlbDsNCi0JcHJpdmF0ZSBUb2dnbGVDb250cm9sIHRvZ2dsZTsNCi0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5Ow0KLQlwcml2YXRlIGJvb2xlYW4gYWRkU2VwYXJhdG9yID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGRlc2NyaXB0aW9uUGFpbnRlZCA9IHRydWU7DQotCXByaXZhdGUgYm9vbGVhbiBoZWFkZXJQYWludGVkID0gdHJ1ZTsNCi0JcHJpdmF0ZSBib29sZWFuIGNvbGxhcHNhYmxlID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBjb2xsYXBzZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBpbnQgd2lkdGhIaW50ID0gU1dULkRFRkFVTFQ7DQotCXByaXZhdGUgaW50IGhlaWdodEhpbnQgPSBTV1QuREVGQVVMVDsNCi0JcHJpdmF0ZSBDb21wb3NpdGUgY29udHJvbDsNCi0JcHVibGljIGJvb2xlYW4gY29tcGFjdE1vZGU9ZmFsc2U7DQotDQotCS8qDQotCSAqIFRoaXMgaXMgYSBzcGVjaWFsIGxheW91dCBmb3IgdGhlIHNlY3Rpb24uIEJvdGggdGhlDQotCSAqIGhlYWRlciBhbmQgdGhlIGRlc2NyaXB0aW9uIGxhYmVscyB3aWxsIHdyYXAgYW5kDQotCSAqIHRoZXkgd2lsbCB1c2UgY2xpZW50J3Mgc2l6ZSB0byBjYWxjdWxhdGUgbmVlZGVkDQotCSAqIGhlaWdodC4gVGhpcyBraW5kIG9mIGJlaGF2aW91ciBpcyBub3QgcG9zc2libGUNCi0JICogd2l0aCBzdG9jayBncmlkIGxheW91dC4NCi0JICovDQotCWNsYXNzIFNlY3Rpb25MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgaW1wbGVtZW50cyBJTGF5b3V0RXh0ZW5zaW9uIHsNCi0JCWludCB2c3BhY2luZyA9IDM7DQotCQlpbnQgc2VwSGVpZ2h0ID0gMjsNCi0NCi0JCXB1YmxpYyBpbnQgZ2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gZmx1c2gpIHsNCi0JCQlyZXR1cm4gMzA7DQotCQl9DQotDQotCQlwdWJsaWMgaW50IGdldE1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGZsdXNoKSB7DQotCQkJaW50IG1heFdpZHRoID0gMDsNCi0JCQlpZiAoY2xpZW50ICE9IG51bGwpIHsNCi0JCQkJaWYgKGNsaWVudCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgew0KLQkJCQkJTGF5b3V0IGNsID0gKChDb21wb3NpdGUpIGNsaWVudCkuZ2V0TGF5b3V0KCk7DQotCQkJCQlpZiAoY2wgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKQ0KLQkJCQkJCW1heFdpZHRoID0NCi0JCQkJCQkJKChJTGF5b3V0RXh0ZW5zaW9uKSBjbCkuZ2V0TWF4aW11bVdpZHRoKA0KLQkJCQkJCQkJKENvbXBvc2l0ZSkgY2xpZW50LA0KLQkJCQkJCQkJZmx1c2gpOw0KLQkJCQl9DQotCQkJCWlmIChtYXhXaWR0aCA9PSAwKSB7DQotCQkJCQlQb2ludCBjc2l6ZSA9DQotCQkJCQkJY2xpZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQkJbWF4V2lkdGggPSBjc2l6ZS54Ow0KLQkJCQl9DQotCQkJfQ0KLQkJCWlmIChoZWFkZXJQYWludGVkICYmIGhlYWRlciAhPSBudWxsKSB7DQotCQkJCVBvaW50IGhzaXplID0NCi0JCQkJCWhlYWRlci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQkJbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgaHNpemUueCk7DQotCQkJfQ0KLQkJCWlmIChkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7DQotCQkJCVBvaW50IGRzaXplID0NCi0JCQkJCWRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUoDQotCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJZmx1c2gpOw0KLQkJCQltYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBkc2l6ZS54KTsNCi0JCQl9DQotCQkJcmV0dXJuIG1heFdpZHRoOw0KLQkJfQ0KLQ0KLQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKA0KLQkJCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQkJaW50IHdIaW50LA0KLQkJCWludCBoSGludCwNCi0JCQlib29sZWFuIGZsdXNoKSB7DQotCQkJaW50IHdpZHRoID0gMDsNCi0JCQlpbnQgaGVpZ2h0ID0gMDsNCi0JCQlpbnQgY3dpZHRoID0gMDsNCi0JCQlpbnQgY29sbGFwc2VkSGVpZ2h0ID0gMDsNCi0NCi0JCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpDQotCQkJCXdpZHRoID0gd0hpbnQ7DQotCQkJaWYgKGhIaW50ICE9IFNXVC5ERUZBVUxUKQ0KLQkJCQloZWlnaHQgPSBoSGludDsNCi0NCi0JCQljd2lkdGggPSB3aWR0aDsNCi0NCi0JCQlpZiAoY2xpZW50ICE9IG51bGwgJiYgIWNsaWVudC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQkJaWYgKHRvZ2dsZSAhPSBudWxsICYmIHRvZ2dsZS5nZXRTZWxlY3Rpb24oKSAmJiBjb21wYWN0TW9kZSkgew0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkvL1BvaW50IGNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQlQb2ludCBjc2l6ZSA9IGNsaWVudC5jb21wdXRlU2l6ZSh3SGludCwgU1dULkRFRkFVTFQpOw0KLQkJCQlpZiAod2lkdGggPT0gMCkgew0KLQkJCQkJd2lkdGggPSBjc2l6ZS54Ow0KLQkJCQkJY3dpZHRoID0gd2lkdGg7DQotCQkJCX0NCi0JCQkJaWYgKGhlaWdodCA9PSAwKQ0KLQkJCQkJaGVpZ2h0ID0gY3NpemUueTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlQb2ludCB0b2dnbGVTaXplID0gbnVsbDsNCi0NCi0JCQlpZiAoY29sbGFwc2FibGUgJiYgdG9nZ2xlICE9IG51bGwpDQotCQkJCXRvZ2dsZVNpemUgPQ0KLQkJCQkJdG9nZ2xlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQ0KLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBoZWFkZXJQYWludGVkICYmIGhlYWRlciAhPSBudWxsKSB7DQotCQkJCWludCBod2lkdGggPSBjd2lkdGg7DQotCQkJCWlmICh0b2dnbGVTaXplICE9IG51bGwpDQotCQkJCQlod2lkdGggPSBjd2lkdGggLSB0b2dnbGVTaXplLnggLSA1Ow0KLQkJCQlQb2ludCBoc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCWhlaWdodCArPSBoc2l6ZS55Ow0KLQkJCQljb2xsYXBzZWRIZWlnaHQgPSBoc2l6ZS55Ow0KLQkJCQloZWlnaHQgKz0gdnNwYWNpbmc7DQotCQkJfQ0KLQ0KLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVCAmJiBhZGRTZXBhcmF0b3IpIHsNCi0JCQkJaGVpZ2h0ICs9IHNlcEhlaWdodDsNCi0JCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOw0KLQkJCQljb2xsYXBzZWRIZWlnaHQgKz0gdnNwYWNpbmcgKyBzZXBIZWlnaHQ7DQotCQkJfQ0KLQkJCWlmIChoSGludCA9PSBTV1QuREVGQVVMVA0KLQkJCQkmJiBkZXNjcmlwdGlvblBhaW50ZWQNCi0JCQkJJiYgZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7DQotCQkJCVBvaW50IGRzaXplID0NCi0JCQkJCWRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUoY3dpZHRoLCBTV1QuREVGQVVMVCwgZmx1c2gpOw0KLQkJCQloZWlnaHQgKz0gZHNpemUueTsNCi0JCQkJaGVpZ2h0ICs9IHZzcGFjaW5nOw0KLQkJCX0NCi0JCQlpZiAodG9nZ2xlICE9IG51bGwgJiYgdG9nZ2xlLmdldFNlbGVjdGlvbigpKSB7DQotCQkJCS8vIGNvbGxhcHNlZCBzdGF0ZQ0KLQkJCQloZWlnaHQgPSBjb2xsYXBzZWRIZWlnaHQ7DQotCQkJfQ0KLQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7DQotCQl9DQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBmbHVzaCkgew0KLQkJCWludCB3aWR0aCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkud2lkdGg7DQotCQkJaW50IGhlaWdodCA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0Ow0KLQkJCWludCB5ID0gMDsNCi0JCQlQb2ludCB0b2dnbGVTaXplID0gbnVsbDsNCi0NCi0JCQlpZiAoY29sbGFwc2FibGUpIHsNCi0JCQkJdG9nZ2xlU2l6ZSA9DQotCQkJCQl0b2dnbGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJfQ0KLQkJCWlmIChoZWFkZXJQYWludGVkICYmIGhlYWRlciAhPSBudWxsKSB7DQotCQkJCVBvaW50IGhzaXplOw0KLQ0KLQkJCQlpbnQgYXZhaWxhYmxlV2lkdGggPSB3aWR0aDsNCi0JCQkJaWYgKHRvZ2dsZVNpemUgIT0gbnVsbCkNCi0JCQkJCWF2YWlsYWJsZVdpZHRoID0gd2lkdGggLSB0b2dnbGVTaXplLnggLSA1Ow0KLQkJCQloc2l6ZSA9IGhlYWRlci5jb21wdXRlU2l6ZShhdmFpbGFibGVXaWR0aCwgU1dULkRFRkFVTFQsIGZsdXNoKTsNCi0JCQkJaW50IGh4ID0gMDsNCi0JCQkJaWYgKHRvZ2dsZSAhPSBudWxsKSB7DQotCQkJCQlpbnQgdHkgPSB5ICsgaHNpemUueSAtIHRvZ2dsZVNpemUueTsNCi0JCQkJCXRvZ2dsZS5zZXRCb3VuZHMoMCwgdHksIHRvZ2dsZVNpemUueCwgdG9nZ2xlU2l6ZS55KTsNCi0JCQkJCWh4ID0gdG9nZ2xlU2l6ZS54OyAvLyArIDU7DQotCQkJCX0NCi0JCQkJaGVhZGVyLnNldEJvdW5kcyhoeCwgeSwgYXZhaWxhYmxlV2lkdGgsIGhzaXplLnkpOw0KLQ0KLQkJCQl5ICs9IGhzaXplLnkgKyB2c3BhY2luZzsNCi0JCQl9DQotCQkJaWYgKGFkZFNlcGFyYXRvciAmJiBzZXBhcmF0b3IgIT0gbnVsbCkgew0KLQkJCQlzZXBhcmF0b3Iuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCAyKTsNCi0JCQkJeSArPSBzZXBIZWlnaHQgKyB2c3BhY2luZzsNCi0JCQl9DQotCQkJaWYgKHRvZ2dsZSAhPSBudWxsICYmIHRvZ2dsZS5nZXRTZWxlY3Rpb24oKSkgew0KLQkJCQlyZXR1cm47DQotCQkJfQ0KLQkJCWlmIChkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb25MYWJlbCAhPSBudWxsKSB7DQotCQkJCVBvaW50IGRzaXplID0NCi0JCQkJCWRlc2NyaXB0aW9uTGFiZWwuY29tcHV0ZVNpemUod2lkdGgsIFNXVC5ERUZBVUxULCBmbHVzaCk7DQotCQkJCWRlc2NyaXB0aW9uTGFiZWwuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBkc2l6ZS55KTsNCi0JCQkJeSArPSBkc2l6ZS55ICsgdnNwYWNpbmc7DQotCQkJfQ0KLQkJCWlmIChjbGllbnQgIT0gbnVsbCkgew0KLQkJCQljbGllbnQuc2V0Qm91bmRzKDAsIHksIHdpZHRoLCBoZWlnaHQgLSB5KTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLyoqDQotCSAqIEByZXR1cm4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGFjdE1vZGUoKSB7DQotCQlyZXR1cm4gY29tcGFjdE1vZGU7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBjb21wYWN0TW9kZQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0Q29tcGFjdE1vZGUoYm9vbGVhbiBjb21wYWN0TW9kZSkgew0KLQkJdGhpcy5jb21wYWN0TW9kZSA9IGNvbXBhY3RNb2RlOw0KLQl9DQotDQotCXB1YmxpYyBGb3JtU2VjdGlvbigpIHsNCi0JCS8qDQotCQkvLyBEZXNjcmlwdGlvbiBjYXVzZXMgcHJvYmxlbXMgcmUgd29yZCB3cmFwcGluZw0KLQkJLy8gYW5kIGNhdXNlcyBiYWQgbGF5b3V0IGluIHNjaGVtYSBhbmQNCi0JCS8vIGZlYXR1cmUgZWRpdG9ycyB3aGVuIGluIE1vdGlmIC0gdHVybmluZyBvZmYNCi0JCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIikpIHsNCi0JCQlkZXNjcmlwdGlvblBhaW50ZWQgPSBmYWxzZTsNCi0JCX0NCi0JCSovDQotCQlKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5hZGRMaXN0ZW5lcih0aGlzKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBjb21taXRDaGFuZ2VzKGJvb2xlYW4gb25TYXZlKSB7DQotCX0NCi0JcHVibGljIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVDbGllbnQoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSk7DQotCXB1YmxpYyBmaW5hbCBDb250cm9sIGNyZWF0ZUNvbnRyb2woDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJZmluYWwgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgew0KLQkJQ29tcG9zaXRlIHNlY3Rpb24gPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOw0KLQkJU2VjdGlvbkxheW91dCBzbGF5b3V0ID0gbmV3IFNlY3Rpb25MYXlvdXQoKTsNCi0JCXNlY3Rpb24uc2V0TGF5b3V0KHNsYXlvdXQpOw0KLQkJc2VjdGlvbi5zZXREYXRhKHRoaXMpOw0KLQ0KLQkJaWYgKGhlYWRlclBhaW50ZWQpIHsNCi0JCQlDb2xvciBoZWFkZXJDb2xvciA9IGZhY3RvcnkuZ2V0Q29sb3IoZ2V0SGVhZGVyQ29sb3JLZXkoKSk7DQotCQkJaGVhZGVyID0NCi0JCQkJZmFjdG9yeS5jcmVhdGVIZWFkaW5nTGFiZWwoDQotCQkJCQlzZWN0aW9uLA0KLQkJCQkJZ2V0SGVhZGVyVGV4dCgpLA0KLQkJCQkJaGVhZGVyQ29sb3IsDQotCQkJCQlTV1QuV1JBUCk7DQotCQkJaWYgKGNvbGxhcHNhYmxlKSB7DQotCQkJCXRvZ2dsZSA9IG5ldyBUb2dnbGVDb250cm9sKHNlY3Rpb24sIFNXVC5OVUxMKTsNCi0JCQkJdG9nZ2xlLnNldFNlbGVjdGlvbihjb2xsYXBzZWQpOw0KLQkJCQl0b2dnbGUuc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsNCi0JCQkJdG9nZ2xlLnNldEFjdGl2ZURlY29yYXRpb25Db2xvcihmYWN0b3J5LmdldEh5cGVybGlua0NvbG9yKCkpOw0KLQkJCQl0b2dnbGUuc2V0RGVjb3JhdGlvbkNvbG9yKA0KLQkJCQkJZmFjdG9yeS5nZXRDb2xvcigNCi0JCQkJCQlGb3JtV2lkZ2V0RmFjdG9yeS5DT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SKSk7DQotCQkJCXRvZ2dsZS5zZXRBY3RpdmVDdXJzb3IoZmFjdG9yeS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCQkJCXRvZ2dsZS5hZGRGb2N1c0xpc3RlbmVyKGZhY3RvcnkudmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJCQl0b2dnbGUuYWRkS2V5TGlzdGVuZXIoZmFjdG9yeS5rZXlib2FyZEhhbmRsZXIpOw0KLQkJCQl0b2dnbGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCQkJZG9Ub2dnbGUoKTsNCi0JCQkJCX0NCi0JCQkJfSk7DQotCQkJCWhlYWRlci5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7DQotCQkJCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7DQotCQkJCQkJdG9nZ2xlLnNldFNlbGVjdGlvbighdG9nZ2xlLmdldFNlbGVjdGlvbigpKTsNCi0JCQkJCQl0b2dnbGUucmVkcmF3KCk7DQotCQkJCQkJZG9Ub2dnbGUoKTsNCi0JCQkJCX0NCi0JCQkJfSk7DQotCQkJCWhlYWRlci5hZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tBZGFwdGVyKCkgew0KLQkJCQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJCQloZWFkZXIuc2V0Q3Vyc29yKGZhY3RvcnkuZ2V0SHlwZXJsaW5rQ3Vyc29yKCkpOw0KLQkJCQkJfQ0KLQkJCQkJcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgew0KLQkJCQkJCWhlYWRlci5zZXRDdXJzb3IobnVsbCk7DQotCQkJCQl9DQotCQkJCX0pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCWlmIChhZGRTZXBhcmF0b3IpIHsNCi0JCQkvL3NlcGFyYXRvciA9IGZhY3RvcnkuY3JlYXRlU2VwYXJhdG9yKHNlY3Rpb24sIFNXVC5IT1JJWk9OVEFMKTsNCi0JCQlzZXBhcmF0b3IgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihzZWN0aW9uKTsNCi0JCX0NCi0NCi0JCWlmIChkZXNjcmlwdGlvblBhaW50ZWQgJiYgZGVzY3JpcHRpb24gIT0gbnVsbCkgew0KLQkJCWRlc2NyaXB0aW9uTGFiZWwgPQ0KLQkJCQlmYWN0b3J5LmNyZWF0ZUxhYmVsKHNlY3Rpb24sIGRlc2NyaXB0aW9uLCBTV1QuV1JBUCk7DQotCQl9DQotCQljbGllbnQgPSBjcmVhdGVDbGllbnQoc2VjdGlvbiwgZmFjdG9yeSk7DQotCQlzZWN0aW9uLnNldERhdGEodGhpcyk7DQotCQljb250cm9sID0gc2VjdGlvbjsNCi0JCXJldHVybiBzZWN0aW9uOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBkb1RvZ2dsZSgpIHsNCi0JCWNvbGxhcHNlZCA9IHRvZ2dsZS5nZXRTZWxlY3Rpb24oKTsNCi0JCXJlZmxvdygpOw0KLQkJaWYgKGRlc2NyaXB0aW9uTGFiZWwgIT0gbnVsbCkNCi0JCQlkZXNjcmlwdGlvbkxhYmVsLnNldFZpc2libGUoIWNvbGxhcHNlZCk7DQotCQlpZiAoY2xpZW50ICE9IG51bGwpDQotCQkJY2xpZW50LnNldFZpc2libGUoIWNvbGxhcHNlZCk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcmVmbG93KCkgew0KLQkJY29udHJvbC5zZXRSZWRyYXcoZmFsc2UpOw0KLQkJY29udHJvbC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcoZmFsc2UpOw0KLQkJY29udHJvbC5sYXlvdXQodHJ1ZSk7DQotCQljb250cm9sLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsNCi0JCWNvbnRyb2wuc2V0UmVkcmF3KHRydWUpOw0KLQkJY29udHJvbC5nZXRQYXJlbnQoKS5zZXRSZWRyYXcodHJ1ZSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgbGFiZWwsDQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIGxhYmVsLCBmYWN0b3J5LCAxKTsNCi0JfQ0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0KA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyBsYWJlbCwNCi0JCUZvcm1XaWRnZXRGYWN0b3J5IGZhY3RvcnksDQotCQlpbnQgc3Bhbikgew0KLQkJZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsNCi0JCVRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsICIiKTsNCi0JCWludCBoZmlsbCA9DQotCQkJc3BhbiA9PSAxDQotCQkJCT8gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMDQotCQkJCTogR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoaGZpbGwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOw0KLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOw0KLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJU3RyaW5nIGxhYmVsLA0KLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSwNCi0JCWludCBzcGFuLA0KLQkJaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsID0gZmFjdG9yeS5jcmVhdGVMYWJlbChwYXJlbnQsIGxhYmVsKTsNCi0JCWlmICgoc3R5bGUgJiBTV1QuTVVMVEkpICE9IDApIHsNCi0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOw0KLQkJCWwuc2V0TGF5b3V0RGF0YShnZCk7DQotCQl9DQotCQlUZXh0IHRleHQgPSBmYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCAiIiwgc3R5bGUpOw0KLQkJaW50IGhmaWxsID0NCi0JCQlzcGFuID09IDENCi0JCQkJPyBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwNCi0JCQkJOiBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7DQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShoZmlsbCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0NFTlRFUik7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47DQotCQl0ZXh0LnNldExheW91dERhdGEoZ2QpOw0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0JcHJvdGVjdGVkIFRleHQgY3JlYXRlVGV4dCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5LA0KLQkJaW50IHNwYW4pIHsNCi0JCVRleHQgdGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChwYXJlbnQsICIiKTsNCi0JCWludCBoZmlsbCA9DQotCQkJc3BhbiA9PSAxDQotCQkJCT8gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMDQotCQkJCTogR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoaGZpbGwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVIpOw0KLQkJLy9nZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsNCi0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkucmVtb3ZlTGlzdGVuZXIodGhpcyk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JcHVibGljIHZvaWQgZXhwYW5kVG8oT2JqZWN0IG9iamVjdCkgew0KLQl9DQotCXB1YmxpYyBmaW5hbCB2b2lkIGZpcmVDaGFuZ2VOb3RpZmljYXRpb24oDQotCQlpbnQgY2hhbmdlVHlwZSwNCi0JCU9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JCWlmIChzZWN0aW9uTWFuYWdlciA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCXNlY3Rpb25NYW5hZ2VyLmRpc3BhdGNoTm90aWZpY2F0aW9uKHRoaXMsIGNoYW5nZVR5cGUsIGNoYW5nZU9iamVjdCk7DQotCX0NCi0JcHVibGljIGZpbmFsIHZvaWQgZmlyZVNlbGVjdGlvbk5vdGlmaWNhdGlvbihPYmplY3QgY2hhbmdlT2JqZWN0KSB7DQotCQlmaXJlQ2hhbmdlTm90aWZpY2F0aW9uKFNFTEVDVElPTiwgY2hhbmdlT2JqZWN0KTsNCi0JfQ0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiBkZXNjcmlwdGlvbjsNCi0JfQ0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJDb2xvcktleSgpIHsNCi0JCXJldHVybiBoZWFkZXJDb2xvcktleTsNCi0JfQ0KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRIZWFkZXJUZXh0KCkgew0KLQkJcmV0dXJuIGhlYWRlclRleHQ7DQotCX0NCi0JcHVibGljIGludCBnZXRIZWlnaHRIaW50KCkgew0KLQkJcmV0dXJuIGhlaWdodEhpbnQ7DQotCX0NCi0JcHVibGljIGludCBnZXRXaWR0aEhpbnQoKSB7DQotCQlyZXR1cm4gd2lkdGhIaW50Ow0KLQl9DQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IGlucHV0KSB7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaXNBZGRTZXBhcmF0b3IoKSB7DQotCQlyZXR1cm4gYWRkU2VwYXJhdG9yOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzRGVzY3JpcHRpb25QYWludGVkKCkgew0KLQkJcmV0dXJuIGRlc2NyaXB0aW9uUGFpbnRlZDsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgew0KLQkJcmV0dXJuIGRpcnR5Ow0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzSGVhZGVyUGFpbnRlZCgpIHsNCi0JCXJldHVybiBoZWFkZXJQYWludGVkOw0KLQl9DQotCXB1YmxpYyBib29sZWFuIGlzUmVhZE9ubHkoKSB7DQotCQlyZXR1cm4gcmVhZE9ubHk7DQotCX0NCi0JcHVibGljIHZvaWQgc2VjdGlvbkNoYW5nZWQoDQotCQlGb3JtU2VjdGlvbiBzb3VyY2UsDQotCQlpbnQgY2hhbmdlVHlwZSwNCi0JCU9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRBZGRTZXBhcmF0b3IoYm9vbGVhbiBuZXdBZGRTZXBhcmF0b3IpIHsNCi0JCWFkZFNlcGFyYXRvciA9IG5ld0FkZFNlcGFyYXRvcjsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyB0cmltTmV3TGluZXMoU3RyaW5nIHRleHQpIHsNCi0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAoYyA9PSAnXG4nKQ0KLQkJCQlidWZmLmFwcGVuZCgnICcpOw0KLQkJCWVsc2UNCi0JCQkJYnVmZi5hcHBlbmQoYyk7DQotCQl9DQotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcgbmV3RGVzY3JpcHRpb24pIHsNCi0JCS8vIHdlIHdpbGwgdHJpbSB0aGUgbmV3IGxpbmVzIHNvIHRoYXQgd2UgY2FuDQotCQkvLyB1c2UgbGF5b3V0LWJhc2VkIHdvcmQgd3JhcHBpbmcgaW5zdGVhZA0KLQkJLy8gb2YgaGFyZC1jb2RlZCBvbmUNCi0JCWRlc2NyaXB0aW9uID0gdHJpbU5ld0xpbmVzKG5ld0Rlc2NyaXB0aW9uKTsNCi0JCS8vZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsNCi0JCWlmIChkZXNjcmlwdGlvbkxhYmVsICE9IG51bGwpDQotCQkJZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KG5ld0Rlc2NyaXB0aW9uKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblBhaW50ZWQoYm9vbGVhbiBuZXdEZXNjcmlwdGlvblBhaW50ZWQpIHsNCi0JCWRlc2NyaXB0aW9uUGFpbnRlZCA9IG5ld0Rlc2NyaXB0aW9uUGFpbnRlZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eShib29sZWFuIG5ld0RpcnR5KSB7DQotCQlkaXJ0eSA9IG5ld0RpcnR5Ow0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgew0KLQkJaWYgKHRvZ2dsZSAhPSBudWxsKQ0KLQkJCXRvZ2dsZS5zZXRGb2N1cygpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEhlYWRlckNvbG9yS2V5KGphdmEubGFuZy5TdHJpbmcgbmV3SGVhZGVyQ29sb3JLZXkpIHsNCi0JCWhlYWRlckNvbG9yS2V5ID0gbmV3SGVhZGVyQ29sb3JLZXk7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGVyUGFpbnRlZChib29sZWFuIG5ld0hlYWRlclBhaW50ZWQpIHsNCi0JCWhlYWRlclBhaW50ZWQgPSBuZXdIZWFkZXJQYWludGVkOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEhlYWRlclRleHQoamF2YS5sYW5nLlN0cmluZyBuZXdIZWFkZXJUZXh0KSB7DQotCQloZWFkZXJUZXh0ID0gbmV3SGVhZGVyVGV4dDsNCi0JCWlmIChoZWFkZXIgIT0gbnVsbCkNCi0JCQloZWFkZXIuc2V0VGV4dChoZWFkZXJUZXh0KTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWlnaHRIaW50KGludCBuZXdIZWlnaHRIaW50KSB7DQotCQloZWlnaHRIaW50ID0gbmV3SGVpZ2h0SGludDsNCi0JfQ0KLQl2b2lkIHNldE1hbmFnZXIoU2VjdGlvbkNoYW5nZU1hbmFnZXIgbWFuYWdlcikgew0KLQkJdGhpcy5zZWN0aW9uTWFuYWdlciA9IG1hbmFnZXI7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0UmVhZE9ubHkoYm9vbGVhbiBuZXdSZWFkT25seSkgew0KLQkJcmVhZE9ubHkgPSBuZXdSZWFkT25seTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRXaWR0aEhpbnQoaW50IG5ld1dpZHRoSGludCkgew0KLQkJd2lkdGhIaW50ID0gbmV3V2lkdGhIaW50Ow0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGFyZzApIHsNCi0JCWlmIChjb250cm9sICE9IG51bGwgJiYgaGVhZGVyICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpICYmICFoZWFkZXIuaXNEaXNwb3NlZCgpKSB7DQotCQkJaGVhZGVyLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgY29sbGFwc2FibGUuDQotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4NCi0JICovDQotCXB1YmxpYyBib29sZWFuIGdldENvbGxhcHNhYmxlKCkgew0KLQkJcmV0dXJuIGNvbGxhcHNhYmxlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBTZXRzIHRoZSBjb2xsYXBzYWJsZS4NCi0JICogQHBhcmFtIGNvbGxhcHNhYmxlIFRoZSBjb2xsYXBzYWJsZSB0byBzZXQNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldENvbGxhcHNhYmxlKGJvb2xlYW4gY29sbGFwc2FibGUpIHsNCi0JCXRoaXMuY29sbGFwc2FibGUgPSBjb2xsYXBzYWJsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRDb2xsYXBzZWQoYm9vbGVhbiBjb2xsYXBzZWQpIHsNCi0JCXRoaXMuY29sbGFwc2VkID0gY29sbGFwc2VkOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbGxhcHNlZCgpIHsNCi0JCXJldHVybiBjb2xsYXBzZWQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gY2FuUGFzdGUoQ2xpcGJvYXJkIGNsaXBib2FyZCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3JtV2lkZ2V0RmFjdG9yeS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjljZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lLkZvcm1FbmdpbmU7DQotDQotcHVibGljIGNsYXNzIEZvcm1XaWRnZXRGYWN0b3J5IHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RSQVdfQk9SREVSID0gIkZvcm1XaWRnZXRGYWN0b3J5LmRyYXdCb3JkZXIiOw0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkVFX0JPUkRFUiA9ICJ0cmVlQm9yZGVyIjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9IRUFERVJfQ09MT1IgPSAiX19kZWZhdWx0X19oZWFkZXJfXyI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0JPUkRFUiA9ICJfX2JvcmRlciI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX0NPTVBPU0lURV9TRVBBUkFUT1IgPSAiX19jb21wU2VwIjsNCi0NCi0JcHJpdmF0ZSBIYXNodGFibGUgY29sb3JSZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsNCi0JcHJpdmF0ZSBDb2xvciBiYWNrZ3JvdW5kQ29sb3I7DQotCXByaXZhdGUgS2V5TGlzdGVuZXIgZGVsZXRlTGlzdGVuZXI7DQotCXByaXZhdGUgQ29sb3IgZm9yZWdyb3VuZENvbG9yOw0KLQlwcml2YXRlIERpc3BsYXkgZGlzcGxheTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9SREVSX1NUWUxFID0gU1dULk5PTkU7IC8vU1dULkJPUkRFUjsNCi0JcHJpdmF0ZSBCb3JkZXJQYWludGVyIGJvcmRlclBhaW50ZXI7DQotCXByaXZhdGUgQ29sb3IgYm9yZGVyQ29sb3I7DQotCXByaXZhdGUgSHlwZXJsaW5rSGFuZGxlciBoeXBlcmxpbmtIYW5kbGVyOw0KLQkvKiBkZWZhdWx0ICovIFZpc2liaWxpdHlIYW5kbGVyIHZpc2liaWxpdHlIYW5kbGVyOw0KLQkvKiBkZWZhdWx0ICovIEtleWJvYXJkSGFuZGxlciBrZXlib2FyZEhhbmRsZXI7DQotDQotCWNsYXNzIEJvcmRlclBhaW50ZXIgaW1wbGVtZW50cyBQYWludExpc3RlbmVyIHsNCi0JCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7DQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIGV2ZW50LndpZGdldDsNCi0JCQlDb250cm9sW10gY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJCUNvbnRyb2wgYyA9IGNoaWxkcmVuW2ldOw0KLQkJCQlib29sZWFuIGluYWN0aXZlQm9yZGVyPWZhbHNlOw0KLQkJCQlpZiAoYy5nZXRFbmFibGVkKCkgPT0gZmFsc2UgJiYgIShjIGluc3RhbmNlb2YgQ0NvbWJvKSkNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQlpZiAoYyBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpDQotCQkJCQljb250aW51ZTsNCi0JCQkJT2JqZWN0IGZsYWcgPSBjLmdldERhdGEoS0VZX0RSQVdfQk9SREVSKTsNCi0JCQkJaWYgKGZsYWchPW51bGwpIHsNCi0JCQkJCWlmIChmbGFnLmVxdWFscyhCb29sZWFuLkZBTFNFKSkgY29udGludWU7DQotCQkJCQlpZiAoZmxhZy5lcXVhbHMoVFJFRV9CT1JERVIpKSBpbmFjdGl2ZUJvcmRlcj10cnVlOw0KLQkJCQl9DQotCQkJCSANCi0JCQkJaWYgKCFpbmFjdGl2ZUJvcmRlciAmJiAoYyBpbnN0YW5jZW9mIFRleHQgfHwgYyBpbnN0YW5jZW9mIENhbnZhcyB8fCBjIGluc3RhbmNlb2YgQ0NvbWJvKSkgew0KLQkJCQkJUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOw0KLQkJCQkJR0MgZ2MgPSBldmVudC5nYzsNCi0JCQkJCWdjLnNldEZvcmVncm91bmQoYy5nZXRCYWNrZ3JvdW5kKCkpOw0KLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMSwgYi5oZWlnaHQgKyAxKTsNCi0JCQkJCWdjLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCQkJCWlmIChjIGluc3RhbmNlb2YgQ0NvbWJvKQ0KLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMSwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMSk7DQotCQkJCQllbHNlIA0KLQkJCQkJCWdjLmRyYXdSZWN0YW5nbGUoYi54IC0gMSwgYi55IC0gMiwgYi53aWR0aCArIDEsIGIuaGVpZ2h0ICsgMyk7DQotCQkJCX0gZWxzZSBpZiAoaW5hY3RpdmVCb3JkZXIgfHxjIGluc3RhbmNlb2YgVGFibGUgfHwgYyBpbnN0YW5jZW9mIFRyZWUgfHwgYyBpbnN0YW5jZW9mIFRhYmxlVHJlZSkgew0KLQkJCQkJUmVjdGFuZ2xlIGIgPSBjLmdldEJvdW5kcygpOw0KLQkJCQkJR0MgZ2MgPSBldmVudC5nYzsNCi0JCQkJCWdjLnNldEZvcmVncm91bmQoYm9yZGVyQ29sb3IpOw0KLQkJCQkJLy9nYy5kcmF3UmVjdGFuZ2xlKGIueCAtIDIsIGIueSAtIDIsIGIud2lkdGggKyAzLCBiLmhlaWdodCArIDMpOw0KLQkJCQkJZ2MuZHJhd1JlY3RhbmdsZShiLnggLSAxLCBiLnkgLSAxLCBiLndpZHRoICsgMiwgYi5oZWlnaHQgKyAyKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBWaXNpYmlsaXR5SGFuZGxlciBleHRlbmRzIEZvY3VzQWRhcHRlciB7DQotCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsNCi0JCQlXaWRnZXQgdyA9IGUud2lkZ2V0Ow0KLQkJCWlmICh3IGluc3RhbmNlb2YgQ29udHJvbCkgew0KLQkJCQllbnN1cmVWaXNpYmxlKChDb250cm9sKSB3KTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JY2xhc3MgS2V5Ym9hcmRIYW5kbGVyIGV4dGVuZHMgS2V5QWRhcHRlciB7DQotCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsNCi0JCQlXaWRnZXQgdyA9IGUud2lkZ2V0Ow0KLQkJCWlmICh3IGluc3RhbmNlb2YgQ29udHJvbCkgew0KLQkJCQlwcm9jZXNzS2V5KGUua2V5Q29kZSwgKENvbnRyb2wpIHcpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkoKSB7DQotCQl0aGlzKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgRm9ybVdpZGdldEZhY3RvcnkoRGlzcGxheSBkaXNwbGF5KSB7DQotCQl0aGlzLmRpc3BsYXkgPSBkaXNwbGF5Ow0KLQkJaW5pdGlhbGl6ZSgpOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgU2Nyb2xsZWRDb21wb3NpdGUgZ2V0U2Nyb2xsZWRDb21wb3NpdGUoQ29udHJvbCBjKSB7DQotCQlDb21wb3NpdGUgcGFyZW50ID0gYy5nZXRQYXJlbnQoKTsNCi0NCi0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgew0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgew0KLQkJCQlyZXR1cm4gKFNjcm9sbGVkQ29tcG9zaXRlKSBwYXJlbnQ7DQotCQkJfQ0KLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnQoKTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlbnN1cmVWaXNpYmxlKENvbnRyb2wgYykgew0KLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXAgPSBnZXRTY3JvbGxlZENvbXBvc2l0ZShjKTsNCi0JCWlmIChzY29tcCAhPSBudWxsKSB7DQotCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5lbnN1cmVWaXNpYmxlKHNjb21wLCBjKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc0tleShpbnQga2V5Q29kZSwgQ29udHJvbCBjKSB7DQotCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9IGdldFNjcm9sbGVkQ29tcG9zaXRlKGMpOw0KLQkJaWYgKHNjb21wICE9IG51bGwpIHsNCi0JCQlzd2l0Y2ggKGtleUNvZGUpIHsNCi0JCQkJY2FzZSBTV1QuQVJST1dfRE9XTiA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbFZlcnRpY2FsKHNjb21wLCBmYWxzZSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTV1QuQVJST1dfVVAgOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxWZXJ0aWNhbChzY29tcCwgdHJ1ZSk7DQotCQkJCQlicmVhazsNCi0JCQkJY2FzZSBTV1QuQVJST1dfTEVGVCA6DQotCQkJCQlBYnN0cmFjdFNlY3Rpb25Gb3JtLnNjcm9sbEhvcml6b250YWwoc2NvbXAsIHRydWUpOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU1dULkFSUk9XX1JJR0hUIDoNCi0JCQkJCUFic3RyYWN0U2VjdGlvbkZvcm0uc2Nyb2xsSG9yaXpvbnRhbChzY29tcCwgZmFsc2UpOw0KLQkJCQkJYnJlYWs7DQotCQkJCWNhc2UgU1dULlBBR0VfVVAgOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxQYWdlKHNjb21wLCB0cnVlKTsNCi0JCQkJCWJyZWFrOw0KLQkJCQljYXNlIFNXVC5QQUdFX0RPV04gOg0KLQkJCQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5zY3JvbGxQYWdlKHNjb21wLCBmYWxzZSk7DQotCQkJCQlicmVhazsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgew0KLQkJaW50IGZsYXRTdHlsZSA9IEJPUkRFUl9TVFlMRSA9PSBTV1QuQk9SREVSID8gU1dULk5VTEwgOiBTV1QuRkxBVDsNCi0JCS8vaW50IGZsYXRTdHlsZSA9IFNXVC5OVUxMOw0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBzdHlsZSB8IGZsYXRTdHlsZSk7DQotCQlidXR0b24uc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJYnV0dG9uLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJYnV0dG9uLnNldFRleHQodGV4dCk7DQotCQlidXR0b24uYWRkRm9jdXNMaXN0ZW5lcih2aXNpYmlsaXR5SGFuZGxlcik7DQotCQlyZXR1cm4gYnV0dG9uOw0KLQl9DQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXJldHVybiBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7DQotCX0NCi0JcHVibGljIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlKTsNCi0JCWNvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQljb21wb3NpdGUuYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlUHJlc3NlZChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJKChDb250cm9sKSBlLndpZGdldCkuc2V0Rm9jdXMoKTsNCi0JCQl9DQotCQl9KTsNCi0JCWNvbXBvc2l0ZS5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsNCi0JfQ0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZVNlcGFyYXRvcihDb21wb3NpdGUgcGFyZW50KSB7DQotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsNCi0JCWNvbXBvc2l0ZS5hZGRMaXN0ZW5lcihTV1QuUGFpbnQsIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCWlmIChjb21wb3NpdGUuaXNEaXNwb3NlZCgpKSByZXR1cm47DQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjb21wb3NpdGUuZ2V0Qm91bmRzKCk7DQotCQkJCUdDIGdjID0gZS5nYzsNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRDb2xvcihDT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SKSk7DQotCQkJCWdjLnNldEJhY2tncm91bmQoZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJCQlnYy5maWxsR3JhZGllbnRSZWN0YW5nbGUoMCwgMCwgYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0LCBmYWxzZSk7CQ0KLQkJCX0NCi0JCX0pOw0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gY3JlYXRlSGVhZGluZ0xhYmVsKHBhcmVudCwgdGV4dCwgbnVsbCwgU1dULk5PTkUpOw0KLQl9DQotDQotCXB1YmxpYyBMYWJlbCBjcmVhdGVIZWFkaW5nTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgew0KLQkJcmV0dXJuIGNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQsIG51bGwsIHN0eWxlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTGFiZWwgY3JlYXRlSGVhZGluZ0xhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBDb2xvciBiZykgew0KLQkJcmV0dXJuIGNyZWF0ZUhlYWRpbmdMYWJlbChwYXJlbnQsIHRleHQsIGJnLCBTV1QuTk9ORSk7DQotCX0NCi0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUhlYWRpbmdMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCwNCi0JCUNvbG9yIGJnLA0KLQkJaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIHN0eWxlKTsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsNCi0JCWxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0Rm9udFJlZ2lzdHJ5KCkuZ2V0KEpGYWNlUmVzb3VyY2VzLkJBTk5FUl9GT05UKSk7DQotCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUh5cGVybGlua0xhYmVsKA0KLQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCVN0cmluZyB0ZXh0LA0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGxpc3RlbmVyKSB7DQotCQlyZXR1cm4gY3JlYXRlSHlwZXJsaW5rTGFiZWwocGFyZW50LCB0ZXh0LCBsaXN0ZW5lciwgU1dULk5VTEwpOw0KLQl9DQotCXB1YmxpYyBMYWJlbCBjcmVhdGVIeXBlcmxpbmtMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCwNCi0JCUlIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lciwNCi0JCWludCBzdHlsZSkgew0KLQkJTGFiZWwgbGFiZWwgPSBjcmVhdGVMYWJlbChwYXJlbnQsIHRleHQsIHN0eWxlKTsNCi0JCXR1cm5JbnRvSHlwZXJsaW5rKGxhYmVsLCBsaXN0ZW5lcik7DQotCQlyZXR1cm4gbGFiZWw7DQotCX0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7DQotCQlyZXR1cm4gY3JlYXRlTGFiZWwocGFyZW50LCB0ZXh0LCBTV1QuTk9ORSk7DQotCX0NCi0JcHVibGljIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsNCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgc3R5bGUpOw0KLQkJaWYgKHRleHQgIT0gbnVsbCkNCi0JCQlsYWJlbC5zZXRUZXh0KHRleHQpOw0KLQkJbGFiZWwuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJbGFiZWwuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJcmV0dXJuIGxhYmVsOw0KLQl9DQotDQotCXB1YmxpYyBTZWxlY3RhYmxlRm9ybUxhYmVsIGNyZWF0ZVNlbGVjdGFibGVMYWJlbCgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlTdHJpbmcgdGV4dCkgew0KLQkJcmV0dXJuIGNyZWF0ZVNlbGVjdGFibGVMYWJlbChwYXJlbnQsIHRleHQsIFNXVC5OT05FKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU2VsZWN0YWJsZUZvcm1MYWJlbCBjcmVhdGVTZWxlY3RhYmxlTGFiZWwoDQotCQlDb21wb3NpdGUgcGFyZW50LA0KLQkJU3RyaW5nIHRleHQsDQotCQlpbnQgc3R5bGUpIHsNCi0JCVNlbGVjdGFibGVGb3JtTGFiZWwgbGFiZWwgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChwYXJlbnQsIHN0eWxlKTsNCi0JCWlmICh0ZXh0ICE9IG51bGwpDQotCQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsNCi0JCWxhYmVsLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCWxhYmVsLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWxhYmVsLmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJbGFiZWwuYWRkS2V5TGlzdGVuZXIoa2V5Ym9hcmRIYW5kbGVyKTsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQ0KLQlwdWJsaWMgRm9ybUVuZ2luZSBjcmVhdGVGb3JtRW5naW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXJldHVybiBjcmVhdGVGb3JtRW5naW5lKHBhcmVudCwgZmFsc2UpOw0KLQl9DQotCQ0KLQlwdWJsaWMgRm9ybUVuZ2luZSBjcmVhdGVGb3JtRW5naW5lKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gdHJhY2tGb2N1cykgew0KLQkJRm9ybUVuZ2luZSBlbmdpbmUgPSBuZXcgRm9ybUVuZ2luZShwYXJlbnQsIFNXVC5XUkFQKTsNCi0JCWVuZ2luZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQllbmdpbmUuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kQ29sb3IpOw0KLQkJZW5naW5lLm1hcmdpbldpZHRoID0gMTsNCi0JCWVuZ2luZS5tYXJnaW5IZWlnaHQgPSAwOw0KLQkJZW5naW5lLnNldEh5cGVybGlua1NldHRpbmdzKGdldEh5cGVybGlua0hhbmRsZXIoKSk7DQotCQlpZiAodHJhY2tGb2N1cykgZW5naW5lLmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJZW5naW5lLmFkZEtleUxpc3RlbmVyKGtleWJvYXJkSGFuZGxlcik7DQotCQllbmdpbmUuc2V0TWVudShwYXJlbnQuZ2V0TWVudSgpKTsNCi0JCXJldHVybiBlbmdpbmU7DQotCX0NCi0JDQotCXB1YmxpYyBMYWJlbCBjcmVhdGVTZXBhcmF0b3IoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBzdHlsZSk7DQotCQlsYWJlbC5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQlsYWJlbC5zZXRGb3JlZ3JvdW5kKGJvcmRlckNvbG9yKTsNCi0JCXJldHVybiBsYWJlbDsNCi0JfQ0KLQlwdWJsaWMgVGFibGUgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShwYXJlbnQsIEJPUkRFUl9TVFlMRSB8IHN0eWxlKTsNCi0JCXRhYmxlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsNCi0JCXRhYmxlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWhvb2tEZWxldGVMaXN0ZW5lcih0YWJsZSk7DQotCQlyZXR1cm4gdGFibGU7DQotCX0NCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdmFsdWUpIHsNCi0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgdmFsdWUsIEJPUkRFUl9TVFlMRSB8IFNXVC5TSU5HTEUpOw0KLQl9DQotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHZhbHVlLCBpbnQgc3R5bGUpIHsNCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgc3R5bGUpOw0KLQkJaWYgKHZhbHVlICE9IG51bGwpDQotCQkJdGV4dC5zZXRUZXh0KHZhbHVlKTsNCi0JCXRleHQuc2V0QmFja2dyb3VuZChiYWNrZ3JvdW5kQ29sb3IpOw0KLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGZvcmVncm91bmRDb2xvcik7DQotCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIodmlzaWJpbGl0eUhhbmRsZXIpOw0KLQkJcmV0dXJuIHRleHQ7DQotCX0NCi0JcHVibGljIFRyZWUgY3JlYXRlVHJlZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCVRyZWUgdHJlZSA9IG5ldyBUcmVlKHBhcmVudCwgQk9SREVSX1NUWUxFIHwgc3R5bGUpOw0KLQkJdHJlZS5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQl0cmVlLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZENvbG9yKTsNCi0JCWhvb2tEZWxldGVMaXN0ZW5lcih0cmVlKTsNCi0JCXJldHVybiB0cmVlOw0KLQl9DQotCXByaXZhdGUgdm9pZCBkZWxldGVLZXlQcmVzc2VkKFdpZGdldCB3aWRnZXQpIHsNCi0JCWlmICghKHdpZGdldCBpbnN0YW5jZW9mIENvbnRyb2wpKQ0KLQkJCXJldHVybjsNCi0JCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSB3aWRnZXQ7DQotCQlmb3IgKENvbnRyb2wgcGFyZW50ID0gY29udHJvbC5nZXRQYXJlbnQoKTsNCi0JCQlwYXJlbnQgIT0gbnVsbDsNCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCkpIHsNCi0JCQlpZiAocGFyZW50LmdldERhdGEoKSBpbnN0YW5jZW9mIEZvcm1TZWN0aW9uKSB7DQotCQkJCUZvcm1TZWN0aW9uIHNlY3Rpb24gPSAoRm9ybVNlY3Rpb24pIHBhcmVudC5nZXREYXRhKCk7DQotCQkJCXNlY3Rpb24uZG9HbG9iYWxBY3Rpb24oQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJRW51bWVyYXRpb24gY29sb3JzID0gY29sb3JSZWdpc3RyeS5lbGVtZW50cygpOw0KLQkJd2hpbGUgKGNvbG9ycy5oYXNNb3JlRWxlbWVudHMoKSkgew0KLQkJCUNvbG9yIGMgPSAoQ29sb3IpIGNvbG9ycy5uZXh0RWxlbWVudCgpOw0KLQkJCWMuZGlzcG9zZSgpOw0KLQkJfQ0KLQkJaHlwZXJsaW5rSGFuZGxlci5kaXNwb3NlKCk7DQotCQljb2xvclJlZ2lzdHJ5ID0gbnVsbDsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0QmFja2dyb3VuZENvbG9yKCkgew0KLQkJcmV0dXJuIGJhY2tncm91bmRDb2xvcjsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0Qm9yZGVyQ29sb3IoKSB7DQotCQlyZXR1cm4gYm9yZGVyQ29sb3I7DQotCX0NCi0JcHVibGljIEN1cnNvciBnZXRCdXN5Q3Vyc29yKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0hhbmRsZXIuZ2V0QnVzeUN1cnNvcigpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRDb2xvcihTdHJpbmcga2V5KSB7DQotCQlyZXR1cm4gKENvbG9yKSBjb2xvclJlZ2lzdHJ5LmdldChrZXkpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kQ29sb3IoKSB7DQotCQlyZXR1cm4gZm9yZWdyb3VuZENvbG9yOw0KLQl9DQotCXB1YmxpYyBIeXBlcmxpbmtIYW5kbGVyIGdldEh5cGVybGlua0hhbmRsZXIoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rSGFuZGxlcjsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldEh5cGVybGlua0N1cnNvcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEh5cGVybGlua0N1cnNvcigpOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRIeXBlcmxpbmtDb2xvcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEZvcmVncm91bmQoKTsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0SHlwZXJsaW5rSG92ZXJDb2xvcigpIHsNCi0JCXJldHVybiBoeXBlcmxpbmtIYW5kbGVyLmdldEFjdGl2ZUZvcmVncm91bmQoKTsNCi0JfQ0KLQlwdWJsaWMgaW50IGdldEh5cGVybGlua1VuZGVybGluZU1vZGUoKSB7DQotCQlyZXR1cm4gaHlwZXJsaW5rSGFuZGxlci5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk7DQotCX0NCi0JcHVibGljIHZvaWQgaG9va0RlbGV0ZUxpc3RlbmVyKENvbnRyb2wgY29udHJvbCkgew0KLQkJaWYgKGRlbGV0ZUxpc3RlbmVyID09IG51bGwpIHsNCi0JCQlkZWxldGVMaXN0ZW5lciA9IG5ldyBLZXlBZGFwdGVyKCkgew0KLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGV2ZW50KSB7DQotCQkJCQlpZiAoZXZlbnQuY2hhcmFjdGVyID09IFNXVC5ERUwgJiYgZXZlbnQuc3RhdGVNYXNrID09IDApIHsNCi0JCQkJCQlkZWxldGVLZXlQcmVzc2VkKGV2ZW50LndpZGdldCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9Ow0KLQkJfQ0KLQkJY29udHJvbC5hZGRLZXlMaXN0ZW5lcihkZWxldGVMaXN0ZW5lcik7DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7DQotCQliYWNrZ3JvdW5kQ29sb3IgPSBkaXNwbGF5LmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOw0KLQkJcmVnaXN0ZXJDb2xvcihDT0xPUl9CT1JERVIsIDE5NSwgMTkxLCAxNzkpOw0KLQkJcmVnaXN0ZXJDb2xvcihDT0xPUl9DT01QT1NJVEVfU0VQQVJBVE9SLCAxNTIsIDE3MCwgMjAzKTsNCi0JCXJlZ2lzdGVyQ29sb3IoREVGQVVMVF9IRUFERVJfQ09MT1IsIDB4NDgsIDB4NzAsIDB4OTgpOw0KLQkJaWYgKGlzV2hpdGVCYWNrZ3JvdW5kKCkpDQotCQkJYm9yZGVyQ29sb3IgPSBnZXRDb2xvcihDT0xPUl9CT1JERVIpOw0KLQkJZWxzZQ0KLQkJCWJvcmRlckNvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0lER0VUX0JBQ0tHUk9VTkQpOw0KLQkJZm9yZWdyb3VuZENvbG9yID0gZGlzcGxheS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsNCi0JCWh5cGVybGlua0hhbmRsZXIgPSBuZXcgSHlwZXJsaW5rSGFuZGxlcigpOw0KLQkJaHlwZXJsaW5rSGFuZGxlci5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmRDb2xvcik7DQotCQl1cGRhdGVIeXBlcmxpbmtDb2xvcnMoKTsNCi0JCXZpc2liaWxpdHlIYW5kbGVyID0gbmV3IFZpc2liaWxpdHlIYW5kbGVyKCk7DQotCQlrZXlib2FyZEhhbmRsZXIgPSBuZXcgS2V5Ym9hcmRIYW5kbGVyKCk7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVCYWNrZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGJhY2tncm91bmRDb2xvci5nZXRSZWQoKT09MjU1ICYmIGJhY2tncm91bmRDb2xvci5nZXRHcmVlbigpPT0yNTUgJiYNCi0JCQliYWNrZ3JvdW5kQ29sb3IuZ2V0Qmx1ZSgpPT0yNTU7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdXBkYXRlSHlwZXJsaW5rQ29sb3JzKCkgew0KLQkJQ29sb3IgaHlwZXJsaW5rQ29sb3IgPSBKRmFjZUNvbG9ycy5nZXRIeXBlcmxpbmtUZXh0KGRpc3BsYXkpOw0KLQkJQ29sb3IgYWN0aXZlSHlwZXJsaW5rQ29sb3IgPSBKRmFjZUNvbG9ycy5nZXRBY3RpdmVIeXBlcmxpbmtUZXh0KGRpc3BsYXkpOw0KLQkJaHlwZXJsaW5rSGFuZGxlci5zZXRGb3JlZ3JvdW5kKGh5cGVybGlua0NvbG9yKTsNCi0JCWh5cGVybGlua0hhbmRsZXIuc2V0QWN0aXZlRm9yZWdyb3VuZChhY3RpdmVIeXBlcmxpbmtDb2xvcik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFpbnRCb3JkZXJzRm9yKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCWlmIChCT1JERVJfU1RZTEUgPT0gU1dULkJPUkRFUikNCi0JCQlyZXR1cm47DQotCQlpZiAoYm9yZGVyUGFpbnRlciA9PSBudWxsKQ0KLQkJCWJvcmRlclBhaW50ZXIgPSBuZXcgQm9yZGVyUGFpbnRlcigpOw0KLQkJcGFyZW50LmFkZFBhaW50TGlzdGVuZXIoYm9yZGVyUGFpbnRlcik7DQotCX0NCi0JcHVibGljIENvbG9yIHJlZ2lzdGVyQ29sb3IoU3RyaW5nIGtleSwgaW50IHIsIGludCBnLCBpbnQgYikgew0KLQkJQ29sb3IgYyA9IG5ldyBDb2xvcihkaXNwbGF5LCByLCBnLCBiKTsNCi0JCWNvbG9yUmVnaXN0cnkucHV0KGtleSwgYyk7DQotCQlyZXR1cm4gYzsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IgY29sb3IpIHsNCi0JCWJhY2tncm91bmRDb2xvciA9IGNvbG9yOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0NvbG9yKENvbG9yIGNvbG9yKSB7DQotCQloeXBlcmxpbmtIYW5kbGVyLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua0hvdmVyQ29sb3Iob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yIGhvdmVyQ29sb3IpIHsNCi0JCWh5cGVybGlua0hhbmRsZXIuc2V0QWN0aXZlRm9yZWdyb3VuZChob3ZlckNvbG9yKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKGludCBuZXdIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKSB7DQotCQloeXBlcmxpbmtIYW5kbGVyLnNldEh5cGVybGlua1VuZGVybGluZU1vZGUobmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSk7DQotCX0NCi0JcHVibGljIHZvaWQgdHVybkludG9IeXBlcmxpbmsoQ29udHJvbCBjb250cm9sLCBJSHlwZXJsaW5rTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWh5cGVybGlua0hhbmRsZXIucmVnaXN0ZXJIeXBlcmxpbmsoY29udHJvbCwgbGlzdGVuZXIpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDgwOTMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0Zvcm1zUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRm9ybXNQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQlwcml2YXRlIHN0YXRpYyBGb3Jtc1BsdWdpbiBpbnN0YW5jZTsKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEZvcm1zUGx1Z2luLgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIEZvcm1zUGx1Z2luKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCWluc3RhbmNlID0gdGhpczsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0KLQkJCQlSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCi0JCQkJCSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuRm9ybXNQbHVnaW5SZXNvdXJjZXMiKTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCXJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cmluZyBmcm9tIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICogb3IgJ2tleScgaWYgbm90IGZvdW5kLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJRm9ybXNQbHVnaW4gaW5zdCA9IEZvcm1zUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJaWYgKGluc3Q9PW51bGwpIHJldHVybiBrZXk7Ci0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEZvcm1zUGx1Z2luLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRSZXNvdXJjZVN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIGFyZ3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotCQlTdHJpbmcgdGV4dCA9IGdldFJlc291cmNlU3RyaW5nKGtleSk7Ci0JCXJldHVybiBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdC5mb3JtYXQodGV4dCwgbmV3IE9iamVjdFtdIHsgYXJnIH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEZvcm1zUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJV29ya2JlbmNoUGFnZSBpbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKSB7Ci0JCXJldHVybiBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJcmV0dXJuIGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoV2luZG93IGdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJbG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCWdldFBsdWdpbklkKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCWUpOwotCQl9Ci0JCWxvZyhzdGF0dXMsIHNob3dFcnJvckRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKHNob3dFcnJvckRpYWxvZykKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMpOwotCQlQbGF0Zm9ybS5nZXRQbHVnaW4oIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvRm9ybXNQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDQ1ZTA2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Gb3Jtc1BsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotRm9ybUVnaW5lLmxpbmtQb3B1cC5vcGVuID0gJk9wZW4KLUZvcm1FZ2luZS5saW5rUG9wdXAuY29weVNob3J0Y3V0ID0gJkNvcHkgYXMgU2hvcnRjdXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSFRNTFRhYmxlTGF5b3V0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSFRNTFRhYmxlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZDIxMjYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0hUTUxUYWJsZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotLyoqDQotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbGF5b3V0IGFsZ29yaXRobSBhdHRlbXB0cyB0byBwb3NpdGlvbiBjb250cm9scyBpbg0KLSAqIHRoZSBjb21wb3NpdGUgdXNpbmcgYSB0d28tcGFzcyBhdXRvbGF5b3V0IEhUTUwgdGFibGUgYWx0b3JpdGhtIHJlY29tbWVkZWQgYnkNCi0gKiBIVE1MIDQuMDEgVzNDIHNwZWNpZmljYXRpb24uIFRoZSBtYWluIGRpZmZlcmVuY2VzIHdpdGggR3JpZExheW91dCBpcyB0aGF0IGl0DQotICogaGFzIHR3byBwYXNzZXMgYW5kIHRoYXQgd2lkdGggYW5kIGhlaWdodCBhcmUgbm90IGNhbGN1bGF0ZWQgaW4gdGhlIHNhbWUNCi0gKiBwYXNzLg0KLSAqIDxwPg0KLSAqIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIGFsZ29yaXRobSBvdmVyIEdyaWRMYXlvdXQgaXMgdGhhdCBpdCBpcyBjYXBhYmxlIG9mDQotICogZmxvd2luZyB0ZXh0IGNvbnRyb2xzIGNhcGFibGUgb2YgbGluZSB3cmFwLiBUaGVzZSBjb250cm9scyBkbyBub3QgaGF2ZQ0KLSAqIG5hdHVyYWwgJ3ByZWZlcnJlZCBzaXplJy4gSW5zdGVhZCwgdGhleSBhcmUgY2FwYWJsZSBvZiBwcm92aWRpbmcgdGhlDQotICogcmVxdWlyZWQgaGVpZ2h0IGlmIHRoZSB3aWR0aCBpcyBzZXQuIENvbnNlcXVlbnRseSwgdGhpcyBhbGdvcml0aG0gZmlyc3QNCi0gKiBjYWxjdWxhdGVzIHRoZSB3aWR0aHMgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGNvbHVtbnMsIGFuZCB0aGVuIHBhc3Nlcw0KLSAqIHRob3NlIHdpZHRocyB0byB0aGUgY29udHJvbHMgdG8gY2FsY3VsYXRlIHRoZSBoZWlnaHQuIFdoZW4gYSBjb21wb3NpdGUgd2l0aA0KLSAqIHRoaXMgbGF5b3V0IGlzIGEgY2hpbGQgb2YgdGhlIHNjcm9sbGluZyBjb21wb3NpdGUsIHRoZXkgc2hvdWxkIGludGVyYWN0IGluDQotICogc3VjaCBhIHdheSB0aGF0IHJlZHVjdGlvbiBpbiB0aGUgc2Nyb2xsaW5nIGNvbXBvc2l0ZSB3aWR0aCByZXN1bHRzIGluIHRoZQ0KLSAqIHJlZmxvdyBhbmQgaW5jcmVhc2Ugb2YgdGhlIG92ZXJhbGwgaGVpZ2h0Lg0KLSAqIDxwPg0KLSAqIElmIG5vbmUgb2YgdGhlIGNvbHVtbnMgY29udGFpbiBleHBhbmRhYmxlIGFuZCB3cmFwcGFibGUgY29udHJvbHMsIHRoZQ0KLSAqIGVuZC1yZXN1bHQgd2lsbCBiZSBzaW1pbGFyIHRvIHRoZSBvbmUgcHJvdmlkZWQgYnkgR3JpZExheW91dC4gVGhlIGRpZmZlcmVuY2UNCi0gKiB3aWxsIHNob3cgdXAgZm9yIGxheW91dHMgdGhhdCBjb250YWluIGNvbnRyb2xzIHdob3NlIG1pbmltdW0gYW5kIG1heGltdW0NCi0gKiB3aWR0aHMgYXJlIG5vdCB0aGUgc2FtZS4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgSFRNTFRhYmxlTGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7DQotCXB1YmxpYyBpbnQgbnVtQ29sdW1ucyA9IDE7DQotCXB1YmxpYyBpbnQgbGVmdE1hcmdpbiA9IDU7DQotCXB1YmxpYyBpbnQgcmlnaHRNYXJnaW4gPSA1Ow0KLQlwdWJsaWMgaW50IHRvcE1hcmdpbiA9IDU7DQotCXB1YmxpYyBpbnQgYm90dG9tTWFyZ2luID0gNTsNCi0JcHVibGljIGludCBob3Jpem9udGFsU3BhY2luZyA9IDU7DQotCXB1YmxpYyBpbnQgdmVydGljYWxTcGFjaW5nID0gNTsNCi0JcHVibGljIGJvb2xlYW4gbWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7DQotDQotCXByaXZhdGUgYm9vbGVhbiBpbml0aWFsTGF5b3V0ID0gdHJ1ZTsNCi0JcHJpdmF0ZSBWZWN0b3IgZ3JpZCA9IG51bGw7DQotCXByaXZhdGUgaW50W10gbWluQ29sdW1uV2lkdGhzLCBtYXhDb2x1bW5XaWR0aHM7DQotCXByaXZhdGUgaW50IHdpZGVzdENvbHVtbldpZHRoOw0KLQlwcml2YXRlIGludFtdIGdyb3dpbmdDb2x1bW5zOw0KLQ0KLQlwdWJsaWMgaW50IGdldE1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWNoYW5nZWQgPSB0cnVlOw0KLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsNCi0JCX0NCi0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWdyaWQgPSBuZXcgVmVjdG9yKCk7DQotCQkJY3JlYXRlR3JpZChwYXJlbnQpOw0KLQkJfQ0KLQkJaWYgKG1pbkNvbHVtbldpZHRocyA9PSBudWxsKQ0KLQkJCW1pbkNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1pbkNvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlyZXR1cm4gaW50ZXJuYWxHZXRNaW5pbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgaW50IGdldE1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWNoYW5nZWQgPSB0cnVlOw0KLQkJaW5pdGlhbGl6ZUlmTmVlZGVkKHBhcmVudCwgY2hhbmdlZCk7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWluaXRpYWxMYXlvdXQgPSBmYWxzZTsNCi0JCX0NCi0JCWlmIChncmlkID09IG51bGwgfHwgY2hhbmdlZCkgew0KLQkJCWNoYW5nZWQgPSB0cnVlOw0KLQkJCWdyaWQgPSBuZXcgVmVjdG9yKCk7DQotCQkJY3JlYXRlR3JpZChwYXJlbnQpOw0KLQkJfQ0KLQkJaWYgKG1heENvbHVtbldpZHRocyA9PSBudWxsKQ0KLQkJCW1heENvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1heENvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlyZXR1cm4gaW50ZXJuYWxHZXRNYXhpbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBMYXlvdXQjbGF5b3V0KENvbXBvc2l0ZSwgYm9vbGVhbikNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOw0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKQ0KLQkJCXJldHVybjsNCi0JCWludCBwYXJlbnRXaWR0aCA9IGNsaWVudEFyZWEud2lkdGg7DQotCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCWluaXRpYWxpemVJZk5lZWRlZChwYXJlbnQsIGNoYW5nZWQpOw0KLQkJaWYgKGluaXRpYWxMYXlvdXQpIHsNCi0JCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQlpbml0aWFsTGF5b3V0ID0gZmFsc2U7DQotCQl9DQotCQlpZiAoZ3JpZCA9PSBudWxsIHx8IGNoYW5nZWQpIHsNCi0JCQljaGFuZ2VkID0gdHJ1ZTsNCi0JCQlncmlkID0gbmV3IFZlY3RvcigpOw0KLQkJCWNyZWF0ZUdyaWQocGFyZW50KTsNCi0JCX0NCi0JCXJlc2V0Q29sdW1uV2lkdGhzKCk7DQotCQlpbnQgbWluV2lkdGggPSBpbnRlcm5hbEdldE1pbmltdW1XaWR0aChwYXJlbnQsIGNoYW5nZWQpOw0KLQkJaW50IG1heFdpZHRoID0gaW50ZXJuYWxHZXRNYXhpbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0NCi0JCWludCB0YWJsZVdpZHRoID0gcGFyZW50V2lkdGg7DQotDQotCQlpbnRbXSBjb2x1bW5XaWR0aHM7DQotDQotCQlpZiAocGFyZW50V2lkdGggPCBtaW5XaWR0aCkgew0KLQkJCXRhYmxlV2lkdGggPSBtaW5XaWR0aDsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSB3aWRlc3RDb2x1bW5XaWR0aDsNCi0JCQkJfQ0KLQkJCX0gZWxzZQ0KLQkJCQljb2x1bW5XaWR0aHMgPSBtaW5Db2x1bW5XaWR0aHM7DQotCQl9IGVsc2UgaWYgKHBhcmVudFdpZHRoID4gbWF4V2lkdGgpIHsNCi0JCQlpZiAoZ3Jvd2luZ0NvbHVtbnMubGVuZ3RoID09IDApIHsNCi0JCQkJdGFibGVXaWR0aCA9IG1heFdpZHRoOw0KLQkJCQljb2x1bW5XaWR0aHMgPSBtYXhDb2x1bW5XaWR0aHM7DQotCQkJfSBlbHNlIHsNCi0JCQkJY29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsNCi0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJCQlpbnQgZXh0cmEgPSBwYXJlbnRXaWR0aCAtIG1heFdpZHRoOw0KLQkJCQlpbnQgY29sRXh0cmEgPSBleHRyYSAvIGdyb3dpbmdDb2x1bW5zLmxlbmd0aDsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWNvbHVtbldpZHRoc1tpXSA9IG1heENvbHVtbldpZHRoc1tpXTsNCi0NCi0JCQkJCWlmIChpc0dyb3dpbmdDb2x1bW4oaSkpIHsNCi0JCQkJCQljb2x1bW5XaWR0aHNbaV0gKz0gY29sRXh0cmE7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCWNvbHVtbldpZHRocyA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQlpbnQgY29sU3BhY2UgPSB0YWJsZVdpZHRoIC0gbGVmdE1hcmdpbiAtIHJpZ2h0TWFyZ2luOw0KLQkJCQljb2xTcGFjZSAtPSAobnVtQ29sdW1ucyAtIDEpICogaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCWludCBjb2wgPSBjb2xTcGFjZSAvIG51bUNvbHVtbnM7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBjb2w7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlpbnRbXSBleHRyYVNwYWNlID0NCi0JCQkJCWNhbGN1bGF0ZUV4dHJhU3BhY2UodGFibGVXaWR0aCwgbWF4V2lkdGgsIG1pbldpZHRoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJCWludCBtaW5DV2lkdGggPSBtaW5Db2x1bW5XaWR0aHNbaV07DQotCQkJCQljb2x1bW5XaWR0aHNbaV0gPSBtaW5DV2lkdGggKyBleHRyYVNwYWNlW2ldOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJaW50IHggPSAwOw0KLQkJaW50IHkgPSB0b3BNYXJnaW47DQotCQkvLyBhc3NpZ24gd2lkdGhzDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCS8vIGFzc2lnbiB3aWR0aHMsIGNhbGN1bGF0ZSBoZWlnaHRzDQotCQkJaW50IHJvd0hlaWdodCA9IDA7DQotCQkJeCA9IGxlZnRNYXJnaW47DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsNCi0JCQkJVGFibGVEYXRhIHRkID0gcm93W2pdOw0KLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgc3BhbiA9IHRkLmNvbHNwYW47DQotCQkJCWludCBjd2lkdGggPSAwOw0KLQkJCQlmb3IgKGludCBrID0gajsgayA8IGogKyBzcGFuOyBrKyspIHsNCi0JCQkJCWN3aWR0aCArPSBjb2x1bW5XaWR0aHNba107DQotCQkJCQlpZiAoayA8IGogKyBzcGFuIC0gMSkNCi0JCQkJCQljd2lkdGggKz0gaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCX0NCi0JCQkJUG9pbnQgc2l6ZSA9IGNvbXB1dGVTaXplKGNoaWxkLCBjd2lkdGgsIGNoYW5nZWQpOw0KLQkJCQl0ZC5jb21wV2lkdGggPSBjd2lkdGg7DQotCQkJCWlmICh0ZC5oZWlnaHRIaW50ICE9IFNXVC5ERUZBVUxUKSB7DQotCQkJCQlzaXplID0gbmV3IFBvaW50KHNpemUueCwgdGQuaGVpZ2h0SGludCk7DQotCQkJCX0NCi0JCQkJdGQuY29tcFNpemUgPSBzaXplOw0KLQkJCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHNpemUueSk7DQotCQkJfQ0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7DQotCQkJCVRhYmxlRGF0YSB0ZCA9IHJvd1tqXTsNCi0JCQkJaWYgKHRkLmlzSXRlbURhdGEgPT0gZmFsc2UpIHsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsNCi0JCQkJcGxhY2VDb250cm9sKGNoaWxkLCB0ZCwgeCwgeSwgcm93SGVpZ2h0KTsNCi0JCQkJeCArPSB0ZC5jb21wV2lkdGg7DQotCQkJCWlmIChqIDwgbnVtQ29sdW1ucyAtIDEpDQotCQkJCQl4ICs9IGhvcml6b250YWxTcGFjaW5nOw0KLQkJCX0NCi0JCQl5ICs9IHJvd0hlaWdodCArIHZlcnRpY2FsU3BhY2luZzsNCi0JCX0NCi0JfQ0KLQ0KLQlib29sZWFuIGlzR3Jvd2luZ0NvbHVtbihpbnQgY29sKSB7DQotCQlpZiAoZ3Jvd2luZ0NvbHVtbnMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2x1bW5zLmxlbmd0aDsgaSsrKSB7DQotCQkJaWYgKGNvbCA9PSBncm93aW5nQ29sdW1uc1tpXSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0NCi0JaW50W10gY2FsY3VsYXRlRXh0cmFTcGFjZShpbnQgdGFibGVXaWR0aCwgaW50IG1heFdpZHRoLCBpbnQgbWluV2lkdGgpIHsNCi0JCWludCBmaXhlZFBhcnQgPQ0KLQkJCWxlZnRNYXJnaW4gKyByaWdodE1hcmdpbiArIChudW1Db2x1bW5zIC0gMSkgKiBob3Jpem9udGFsU3BhY2luZzsNCi0JCWludCBEID0gbWF4V2lkdGggLSBtaW5XaWR0aDsNCi0NCi0JCWludCBXID0gdGFibGVXaWR0aCAtIGZpeGVkUGFydCAtIG1pbldpZHRoOw0KLQ0KLQkJaW50IGV4dHJhU3BhY2VbXSA9IG5ldyBpbnRbbnVtQ29sdW1uc107DQotDQotCQlpbnQgcmVtID0gMDsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJaW50IGNtaW4gPSBtaW5Db2x1bW5XaWR0aHNbaV07DQotCQkJaW50IGNtYXggPSBtYXhDb2x1bW5XaWR0aHNbaV07DQotCQkJaW50IGQgPSBjbWF4IC0gY21pbjsNCi0JCQlpbnQgZXh0cmEgPSBEICE9IDAgPyAoZCAqIFcpIC8gRCA6IDA7DQotCQkJaWYgKGkgPCBudW1Db2x1bW5zIC0gMSkgew0KLQkJCQlleHRyYVNwYWNlW2ldID0gZXh0cmE7DQotCQkJCXJlbSArPSBleHRyYTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlleHRyYVNwYWNlW2ldID0gVyAtIHJlbTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gZXh0cmFTcGFjZTsNCi0JfQ0KLQ0KLQlQb2ludCBjb21wdXRlU2l6ZShDb250cm9sIGNoaWxkLCBpbnQgd2lkdGgsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaW50IHdpZHRoQXJnID0gd2lkdGg7DQotCQlpZiAoIWlzV3JhcChjaGlsZCkpDQotCQkJd2lkdGhBcmcgPSBTV1QuREVGQVVMVDsNCi0JCVBvaW50IHNpemUgPSBjaGlsZC5jb21wdXRlU2l6ZSh3aWR0aEFyZywgU1dULkRFRkFVTFQsIGNoYW5nZWQpOw0KLQkJcmV0dXJuIHNpemU7DQotCX0NCi0NCi0Jdm9pZCBwbGFjZUNvbnRyb2woDQotCQlDb250cm9sIGNvbnRyb2wsDQotCQlUYWJsZURhdGEgdGQsDQotCQlpbnQgeCwNCi0JCWludCB5LA0KLQkJaW50IHJvd0hlaWdodCkgew0KLQkJaW50IHhsb2MgPSB4ICsgdGQuaW5kZW50Ow0KLQkJaW50IHlsb2MgPSB5Ow0KLQkJaW50IHdpZHRoID0gdGQuY29tcFNpemUueDsNCi0JCWludCBoZWlnaHQgPSB0ZC5jb21wU2l6ZS55Ow0KLQkJaW50IGNvbFdpZHRoID0gdGQuY29tcFdpZHRoOw0KLQ0KLQkJLy8gYWxpZ24gaG9yaXpvbnRhbGx5DQotCQlpZiAodGQuYWxpZ24gPT0gVGFibGVEYXRhLkNFTlRFUikgew0KLQkJCXhsb2MgPSB4ICsgY29sV2lkdGggLyAyIC0gd2lkdGggLyAyOw0KLQkJfSBlbHNlIGlmICh0ZC5hbGlnbiA9PSBUYWJsZURhdGEuUklHSFQpIHsNCi0JCQl4bG9jID0geCArIGNvbFdpZHRoIC0gd2lkdGg7DQotCQl9IGVsc2UgaWYgKHRkLmFsaWduID09IFRhYmxlRGF0YS5GSUxMKSB7DQotCQkJd2lkdGggPSBjb2xXaWR0aDsNCi0JCX0NCi0JCS8vIGFsaWduIHZlcnRpY2FsbHkNCi0JCWlmICh0ZC52YWxpZ24gPT0gVGFibGVEYXRhLk1JRERMRSkgew0KLQkJCXlsb2MgPSB5ICsgcm93SGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7DQotCQl9IGVsc2UgaWYgKHRkLnZhbGlnbiA9PSBUYWJsZURhdGEuQk9UVE9NKSB7DQotCQkJeWxvYyA9IHkgKyByb3dIZWlnaHQgLSBoZWlnaHQ7DQotCQl9IGVsc2UgaWYgKHRkLnZhbGlnbiA9PSBUYWJsZURhdGEuRklMTCkgew0KLQkJCWhlaWdodCA9IHJvd0hlaWdodDsNCi0JCX0NCi0JCWNvbnRyb2wuc2V0Qm91bmRzKHhsb2MsIHlsb2MsIHdpZHRoLCBoZWlnaHQpOw0KLQl9DQotDQotCXZvaWQgY3JlYXRlR3JpZChDb21wb3NpdGUgY29tcG9zaXRlKSB7DQotCQlpbnQgcm93LCBjb2x1bW4sIHJvd0ZpbGwsIGNvbHVtbkZpbGw7DQotCQlDb250cm9sW10gY2hpbGRyZW47DQotCQlUYWJsZURhdGEgc3BhY2VyU3BlYzsNCi0JCVZlY3RvciBncm93aW5nQ29scyA9IG5ldyBWZWN0b3IoKTsNCi0NCi0JCS8vIA0KLQkJY2hpbGRyZW4gPSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKTsNCi0JCWlmIChjaGlsZHJlbi5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm47DQotDQotCQkvLyANCi0JCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsNCi0JCXJvdyA9IDA7DQotCQljb2x1bW4gPSAwOw0KLQ0KLQkJLy8gTG9vcCB0aHJvdWdoIHRoZSBjaGlsZHJlbiBhbmQgcGxhY2UgdGhlaXIgYXNzb2NpYXRlZCBsYXlvdXQgc3BlY3MgaW4NCi0JCS8vIHRoZQ0KLQkJLy8gZ3JpZC4gUGxhY2VtZW50IG9jY3VycyBsZWZ0IHRvIHJpZ2h0LCB0b3AgdG8gYm90dG9tIChpLmUuLCBieSByb3cpLg0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCS8vIEZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBzcG90IGluIHRoZSBncmlkLg0KLQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlbltpXTsNCi0JCQlUYWJsZURhdGEgc3BlYyA9IChUYWJsZURhdGEpIGNoaWxkLmdldExheW91dERhdGEoKTsNCi0JCQl3aGlsZSAoKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93KSlbY29sdW1uXSAhPSBudWxsKSB7DQotCQkJCWNvbHVtbiA9IGNvbHVtbiArIDE7DQotCQkJCWlmIChjb2x1bW4gPj0gbnVtQ29sdW1ucykgew0KLQkJCQkJcm93ID0gcm93ICsgMTsNCi0JCQkJCWNvbHVtbiA9IDA7DQotCQkJCQlpZiAocm93ID49IGdyaWQuc2l6ZSgpKSB7DQotCQkJCQkJZ3JpZC5hZGRFbGVtZW50KGNyZWF0ZUVtcHR5Um93KCkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIFNlZSBpZiB0aGUgcGxhY2Ugd2lsbCBzdXBwb3J0IHRoZSB3aWRnZXQncyBob3Jpem9udGFsIHNwYW4uIElmDQotCQkJLy8gbm90LCBnbyB0byB0aGUNCi0JCQkvLyBuZXh0IHJvdy4NCi0JCQlpZiAoY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMSA+PSBudW1Db2x1bW5zKSB7DQotCQkJCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsNCi0JCQkJcm93ID0gcm93ICsgMTsNCi0JCQkJY29sdW1uID0gMDsNCi0JCQl9DQotDQotCQkJLy8gVGhlIHZlcnRpY2FsIHNwYW4gZm9yIHRoZSBpdGVtIHdpbGwgYmUgYXQgbGVhc3QgMS4gSWYgaXQgaXMgPiAxLA0KLQkJCS8vIGFkZCBvdGhlciByb3dzIHRvIHRoZSBncmlkLg0KLQkJCWZvciAoaW50IGogPSAyOyBqIDw9IHNwZWMucm93c3BhbjsgaisrKSB7DQotCQkJCWlmIChyb3cgKyBqID4gZ3JpZC5zaXplKCkpIHsNCi0JCQkJCWdyaWQuYWRkRWxlbWVudChjcmVhdGVFbXB0eVJvdygpKTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBTdG9yZSB0aGUgbGF5b3V0IHNwZWMuIEFsc28gY2FjaGUgdGhlIGNoaWxkSW5kZXguIE5PVEU6IFRoYXQgd2UNCi0JCQkvLyBhc3N1bWUgdGhlIGNoaWxkcmVuIG9mIGENCi0JCQkvLyBjb21wb3NpdGUgYXJlIG1haW50YWluZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGNyZWF0ZWQNCi0JCQkvLyBhbmQgYWRkZWQgdG8gdGhlIGNvbXBvc2l0ZS4NCi0JCQkgKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93KSlbY29sdW1uXSA9IHNwZWM7DQotCQkJc3BlYy5jaGlsZEluZGV4ID0gaTsNCi0NCi0JCQlpZiAoc3BlYy5ncmFiSG9yaXpvbnRhbCkgew0KLQkJCQl1cGRhdGVHcm93aW5nQ29sdW1ucyhncm93aW5nQ29scywgc3BlYywgY29sdW1uKTsNCi0JCQl9DQotDQotCQkJLy8gUHV0IHNwYWNlcnMgaW4gdGhlIGdyaWQgdG8gYWNjb3VudCBmb3IgdGhlIGl0ZW0ncyB2ZXJ0aWNhbCBhbmQNCi0JCQkvLyBob3Jpem9udGFsDQotCQkJLy8gc3Bhbi4NCi0JCQlyb3dGaWxsID0gc3BlYy5yb3dzcGFuIC0gMTsNCi0JCQljb2x1bW5GaWxsID0gc3BlYy5jb2xzcGFuIC0gMTsNCi0JCQlmb3IgKGludCByID0gMTsgciA8PSByb3dGaWxsOyByKyspIHsNCi0JCQkJZm9yIChpbnQgYyA9IDA7IGMgPCBzcGVjLmNvbHNwYW47IGMrKykgew0KLQkJCQkJc3BhY2VyU3BlYyA9IG5ldyBUYWJsZURhdGEoKTsNCi0JCQkJCXNwYWNlclNwZWMuaXNJdGVtRGF0YSA9IGZhbHNlOw0KLQkJCQkJKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQocm93ICsgcikpW2NvbHVtbiArIGNdID0NCi0JCQkJCQlzcGFjZXJTcGVjOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWZvciAoaW50IGMgPSAxOyBjIDw9IGNvbHVtbkZpbGw7IGMrKykgew0KLQkJCQlmb3IgKGludCByID0gMDsgciA8IHNwZWMucm93c3BhbjsgcisrKSB7DQotCQkJCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlRGF0YSgpOw0KLQkJCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7DQotCQkJCQkoKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChyb3cgKyByKSlbY29sdW1uICsgY10gPQ0KLQkJCQkJCXNwYWNlclNwZWM7DQotCQkJCX0NCi0JCQl9DQotCQkJY29sdW1uID0gY29sdW1uICsgc3BlYy5jb2xzcGFuIC0gMTsNCi0JCX0NCi0NCi0JCS8vIEZpbGwgb3V0IGVtcHR5IGdyaWQgY2VsbHMgd2l0aCBzcGFjZXJzLg0KLQkJZm9yIChpbnQgayA9IGNvbHVtbiArIDE7IGsgPCBudW1Db2x1bW5zOyBrKyspIHsNCi0JCQlzcGFjZXJTcGVjID0gbmV3IFRhYmxlRGF0YSgpOw0KLQkJCXNwYWNlclNwZWMuaXNJdGVtRGF0YSA9IGZhbHNlOw0KLQkJCSgoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KHJvdykpW2tdID0gc3BhY2VyU3BlYzsNCi0JCX0NCi0JCWZvciAoaW50IGsgPSByb3cgKyAxOyBrIDwgZ3JpZC5zaXplKCk7IGsrKykgew0KLQkJCXNwYWNlclNwZWMgPSBuZXcgVGFibGVEYXRhKCk7DQotCQkJc3BhY2VyU3BlYy5pc0l0ZW1EYXRhID0gZmFsc2U7DQotCQkJKChUYWJsZURhdGFbXSkgZ3JpZC5lbGVtZW50QXQoaykpW2NvbHVtbl0gPSBzcGFjZXJTcGVjOw0KLQkJfQ0KLQkJZ3Jvd2luZ0NvbHVtbnMgPSBuZXcgaW50W2dyb3dpbmdDb2xzLnNpemUoKV07DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2xzLnNpemUoKTsgaSsrKSB7DQotCQkJZ3Jvd2luZ0NvbHVtbnNbaV0gPSAoKEludGVnZXIpIGdyb3dpbmdDb2xzLmdldChpKSkuaW50VmFsdWUoKTsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3Jvd2luZ0NvbHVtbnMoDQotCQlWZWN0b3IgZ3Jvd2luZ0NvbHVtbnMsDQotCQlUYWJsZURhdGEgc3BlYywNCi0JCWludCBjb2x1bW4pIHsNCi0JCWludCBhZmZlY3RlZENvbHVtbiA9IGNvbHVtbiArIHNwZWMuY29sc3BhbiAtIDE7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyb3dpbmdDb2x1bW5zLnNpemUoKTsgaSsrKSB7DQotCQkJSW50ZWdlciBjb2wgPSAoSW50ZWdlcikgZ3Jvd2luZ0NvbHVtbnMuZ2V0KGkpOw0KLQkJCWlmIChjb2wuaW50VmFsdWUoKSA9PSBhZmZlY3RlZENvbHVtbikNCi0JCQkJcmV0dXJuOw0KLQkJfQ0KLQkJZ3Jvd2luZ0NvbHVtbnMuYWRkKG5ldyBJbnRlZ2VyKGFmZmVjdGVkQ29sdW1uKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBUYWJsZURhdGFbXSBjcmVhdGVFbXB0eVJvdygpIHsNCi0JCVRhYmxlRGF0YVtdIHJvdyA9IG5ldyBUYWJsZURhdGFbbnVtQ29sdW1uc107DQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykNCi0JCQlyb3dbaV0gPSBudWxsOw0KLQkJcmV0dXJuIHJvdzsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBMYXlvdXQjY29tcHV0ZVNpemUoQ29tcG9zaXRlLCBpbnQsIGludCwgYm9vbGVhbikNCi0JICovDQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZSgNCi0JCUNvbXBvc2l0ZSBwYXJlbnQsDQotCQlpbnQgd0hpbnQsDQotCQlpbnQgaEhpbnQsDQotCQlib29sZWFuIGNoYW5nZWQpIHsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOw0KLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA9PSAwKSB7DQotCQkJcmV0dXJuIG5ldyBQb2ludCgwLCAwKTsNCi0JCX0NCi0JCWludCBwYXJlbnRXaWR0aCA9IHdIaW50Ow0KLQkJY2hhbmdlZCA9IHRydWU7DQotCQlpbml0aWFsaXplSWZOZWVkZWQocGFyZW50LCBjaGFuZ2VkKTsNCi0JCWlmIChpbml0aWFsTGF5b3V0KSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOw0KLQkJfQ0KLQkJaWYgKGdyaWQgPT0gbnVsbCB8fCBjaGFuZ2VkKSB7DQotCQkJY2hhbmdlZCA9IHRydWU7DQotCQkJZ3JpZCA9IG5ldyBWZWN0b3IoKTsNCi0JCQljcmVhdGVHcmlkKHBhcmVudCk7DQotCQl9DQotCQlyZXNldENvbHVtbldpZHRocygpOw0KLQkJaW50IG1pbldpZHRoID0gaW50ZXJuYWxHZXRNaW5pbXVtV2lkdGgocGFyZW50LCBjaGFuZ2VkKTsNCi0JCWludCBtYXhXaWR0aCA9IGludGVybmFsR2V0TWF4aW11bVdpZHRoKHBhcmVudCwgY2hhbmdlZCk7DQotDQotCQlpbnQgdGFibGVXaWR0aCA9IHBhcmVudFdpZHRoOw0KLQ0KLQkJaW50W10gY29sdW1uV2lkdGhzOw0KLQ0KLQkJaWYgKHBhcmVudFdpZHRoIDwgbWluV2lkdGgpIHsNCi0JCQl0YWJsZVdpZHRoID0gbWluV2lkdGg7DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gd2lkZXN0Q29sdW1uV2lkdGg7DQotCQkJCX0NCi0JCQl9IGVsc2UNCi0JCQkJY29sdW1uV2lkdGhzID0gbWluQ29sdW1uV2lkdGhzOw0KLQkJfSBlbHNlIGlmIChwYXJlbnRXaWR0aCA+IG1heFdpZHRoKSB7DQotCQkJaWYgKG1ha2VDb2x1bW5zRXF1YWxXaWR0aCkgew0KLQkJCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCQlpbnQgY29sU3BhY2UgPSBwYXJlbnRXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsNCi0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJCQlpbnQgY29sID0gY29sU3BhY2UgLyBudW1Db2x1bW5zOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gY29sOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJdGFibGVXaWR0aCA9IG1heFdpZHRoOw0KLQkJCQljb2x1bW5XaWR0aHMgPSBtYXhDb2x1bW5XaWR0aHM7DQotCQkJfQ0KLQkJfSBlbHNlIHsNCi0JCQljb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJCWlmIChtYWtlQ29sdW1uc0VxdWFsV2lkdGgpIHsNCi0JCQkJaW50IGNvbFNwYWNlID0gdGFibGVXaWR0aCAtIGxlZnRNYXJnaW4gLSByaWdodE1hcmdpbjsNCi0JCQkJY29sU3BhY2UgLT0gKG51bUNvbHVtbnMgLSAxKSAqIGhvcml6b250YWxTcGFjaW5nOw0KLQkJCQlpbnQgY29sID0gY29sU3BhY2UgLyBudW1Db2x1bW5zOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gY29sOw0KLQkJCQl9DQotCQkJfSBlbHNlIHsNCi0JCQkJaW50W10gZXh0cmFTcGFjZSA9DQotCQkJCQljYWxjdWxhdGVFeHRyYVNwYWNlKHRhYmxlV2lkdGgsIG1heFdpZHRoLCBtaW5XaWR0aCk7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29sdW1uczsgaSsrKSB7DQotCQkJCQlpbnQgbWluQ1dpZHRoID0gbWluQ29sdW1uV2lkdGhzW2ldOw0KLQkJCQkJY29sdW1uV2lkdGhzW2ldID0gbWluQ1dpZHRoICsgZXh0cmFTcGFjZVtpXTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JCWludCB0b3RhbEhlaWdodCA9IDA7DQotCQlpbnQgeSA9IHRvcE1hcmdpbjsNCi0JCS8vIGNvbXB1dGUgd2lkdGhzDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCS8vIGFzc2lnbiB3aWR0aHMsIGNhbGN1bGF0ZSBoZWlnaHRzDQotCQkJaW50IHJvd0hlaWdodCA9IDA7DQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBudW1Db2x1bW5zOyBqKyspIHsNCi0JCQkJVGFibGVEYXRhIHRkID0gcm93W2pdOw0KLQkJCQlpZiAodGQuaXNJdGVtRGF0YSA9PSBmYWxzZSkgew0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgc3BhbiA9IHRkLmNvbHNwYW47DQotCQkJCWludCBjd2lkdGggPSAwOw0KLQkJCQlmb3IgKGludCBrID0gajsgayA8IGogKyBzcGFuOyBrKyspIHsNCi0JCQkJCWlmIChrID4gaikNCi0JCQkJCQljd2lkdGggKz0gaG9yaXpvbnRhbFNwYWNpbmc7DQotCQkJCQljd2lkdGggKz0gY29sdW1uV2lkdGhzW2tdOw0KLQkJCQl9DQotCQkJCWludCBjeSA9IHRkLmhlaWdodEhpbnQ7DQotCQkJCWlmIChjeSA9PSBTV1QuREVGQVVMVCkgew0KLQkJCQkJUG9pbnQgc2l6ZSA9IGNvbXB1dGVTaXplKGNoaWxkLCBjd2lkdGgsIGNoYW5nZWQpOw0KLQkJCQkJY3kgPSBzaXplLnk7DQotCQkJCX0NCi0JCQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBjeSk7DQotCQkJfQ0KLQkJCXkgKz0gcm93SGVpZ2h0ICsgdmVydGljYWxTcGFjaW5nOw0KLQkJfQ0KLQkJdG90YWxIZWlnaHQgPSB5ICsgYm90dG9tTWFyZ2luOw0KLQkJcmV0dXJuIG5ldyBQb2ludCh0YWJsZVdpZHRoLCB0b3RhbEhlaWdodCk7DQotCX0NCi0NCi0JaW50IGludGVybmFsR2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaWYgKGNoYW5nZWQpDQotCQkJY2FsY3VsYXRlTWluaW11bUNvbHVtbldpZHRocyhwYXJlbnQsIHRydWUpOw0KLQkJaW50IG1pbmltdW1XaWR0aCA9IDA7DQotDQotCQl3aWRlc3RDb2x1bW5XaWR0aCA9IDA7DQotDQotCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKSB7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQkJd2lkZXN0Q29sdW1uV2lkdGggPQ0KLQkJCQkJTWF0aC5tYXgod2lkZXN0Q29sdW1uV2lkdGgsIG1pbkNvbHVtbldpZHRoc1tpXSk7DQotCQkJfQ0KLQkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQlpZiAoaSA+IDApDQotCQkJCW1pbmltdW1XaWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsNCi0JCQlpZiAobWFrZUNvbHVtbnNFcXVhbFdpZHRoKQ0KLQkJCQltaW5pbXVtV2lkdGggKz0gd2lkZXN0Q29sdW1uV2lkdGg7DQotCQkJZWxzZQ0KLQkJCQltaW5pbXVtV2lkdGggKz0gbWluQ29sdW1uV2lkdGhzW2ldOw0KLQkJfQ0KLQkJLy8gYWRkIG1hcmdpbnMNCi0JCW1pbmltdW1XaWR0aCArPSBsZWZ0TWFyZ2luICsgcmlnaHRNYXJnaW47DQotCQlyZXR1cm4gbWluaW11bVdpZHRoOw0KLQl9DQotDQotCWludCBpbnRlcm5hbEdldE1heGltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWlmIChjaGFuZ2VkKQ0KLQkJCWNhbGN1bGF0ZU1heGltdW1Db2x1bW5XaWR0aHMocGFyZW50LCB0cnVlKTsNCi0JCWludCBtYXhpbXVtV2lkdGggPSAwOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQlpZiAoaSA+IDApDQotCQkJCW1heGltdW1XaWR0aCArPSBob3Jpem9udGFsU3BhY2luZzsNCi0JCQltYXhpbXVtV2lkdGggKz0gbWF4Q29sdW1uV2lkdGhzW2ldOw0KLQkJfQ0KLQkJLy8gYWRkIG1hcmdpbnMNCi0JCW1heGltdW1XaWR0aCArPSBsZWZ0TWFyZ2luICsgcmlnaHRNYXJnaW47DQotCQlyZXR1cm4gbWF4aW11bVdpZHRoOw0KLQl9DQotDQotCXZvaWQgcmVzZXRDb2x1bW5XaWR0aHMoKSB7DQotCQlpZiAobWluQ29sdW1uV2lkdGhzID09IG51bGwpDQotCQkJbWluQ29sdW1uV2lkdGhzID0gbmV3IGludFtudW1Db2x1bW5zXTsNCi0JCWlmIChtYXhDb2x1bW5XaWR0aHMgPT0gbnVsbCkNCi0JCQltYXhDb2x1bW5XaWR0aHMgPSBuZXcgaW50W251bUNvbHVtbnNdOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQltaW5Db2x1bW5XaWR0aHNbaV0gPSAwOw0KLQkJfQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2x1bW5zOyBpKyspIHsNCi0JCQltYXhDb2x1bW5XaWR0aHNbaV0gPSAwOw0KLQkJfQ0KLQl9DQotDQotCXZvaWQgY2FsY3VsYXRlTWluaW11bUNvbHVtbldpZHRocyhDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCUNvbnRyb2xbXSBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZHJlbigpOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBncmlkLnNpemUoKTsgaSsrKSB7DQotCQkJVGFibGVEYXRhW10gcm93ID0gKFRhYmxlRGF0YVtdKSBncmlkLmVsZW1lbnRBdChpKTsNCi0JCQlmb3IgKGludCBqID0gMDsgaiA8IG51bUNvbHVtbnM7IGorKykgew0KLQkJCQlUYWJsZURhdGEgdGQgPSByb3dbal07DQotCQkJCWlmICh0ZC5pc0l0ZW1EYXRhID09IGZhbHNlKQ0KLQkJCQkJY29udGludWU7DQotCQkJCUNvbnRyb2wgY2hpbGQgPSBjaGlsZHJlblt0ZC5jaGlsZEluZGV4XTsNCi0JCQkJaW50IG1pbldpZHRoID0gLTE7DQotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgew0KLQkJCQkJQ29tcG9zaXRlIGNjID0gKENvbXBvc2l0ZSkgY2hpbGQ7DQotCQkJCQlMYXlvdXQgbCA9IGNjLmdldExheW91dCgpOw0KLQkJCQkJaWYgKGwgaW5zdGFuY2VvZiBJTGF5b3V0RXh0ZW5zaW9uKSB7DQotCQkJCQkJbWluV2lkdGggPQ0KLQkJCQkJCQkoKElMYXlvdXRFeHRlbnNpb24pIGwpLmdldE1pbmltdW1XaWR0aChjYywgY2hhbmdlZCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYgKG1pbldpZHRoID09IC0xKSB7DQotCQkJCQlpZiAoaXNXcmFwKGNoaWxkKSkgew0KLQkJCQkJCS8vIFNob3VsZCBiZSB0aGUgd2lkdGggb2YgdGhlDQotCQkJCQkJLy8gbG9uZ2VzdCB3b3JkLCB3ZSdsbCBwaWNrDQotCQkJCQkJLy8gc29tZSBzbWFsbCBudW1iZXIgaW5zdGVhZA0KLQkJCQkJCW1pbldpZHRoID0gMzA7DQotCQkJCQl9IGVsc2Ugew0KLQkJCQkJCVBvaW50IHNpemUgPQ0KLQkJCQkJCQljaGlsZC5jb21wdXRlU2l6ZSgNCi0JCQkJCQkJCVNXVC5ERUZBVUxULA0KLQkJCQkJCQkJU1dULkRFRkFVTFQsDQotCQkJCQkJCQljaGFuZ2VkKTsNCi0JCQkJCQltaW5XaWR0aCA9IHNpemUueDsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQltaW5XaWR0aCArPSB0ZC5pbmRlbnQ7DQotCQkJCW1pbkNvbHVtbldpZHRoc1tqXSA9IE1hdGgubWF4KG1pbkNvbHVtbldpZHRoc1tqXSwgbWluV2lkdGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlib29sZWFuIGlzV3JhcChDb250cm9sIGNvbnRyb2wpIHsNCi0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgQ29tcG9zaXRlDQotCQkJJiYgKChDb21wb3NpdGUpIGNvbnRyb2wpLmdldExheW91dCgpIGluc3RhbmNlb2YgSUxheW91dEV4dGVuc2lvbikNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0JCXJldHVybiAoY29udHJvbC5nZXRTdHlsZSgpICYgU1dULldSQVApICE9IDA7DQotCX0NCi0NCi0Jdm9pZCBjYWxjdWxhdGVNYXhpbXVtQ29sdW1uV2lkdGhzKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gcGFyZW50LmdldENoaWxkcmVuKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bUNvbHVtbnM7IGkrKykgew0KLQkJCW1heENvbHVtbldpZHRoc1tpXSA9IDA7DQotCQl9DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGdyaWQuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWJsZURhdGFbXSByb3cgPSAoVGFibGVEYXRhW10pIGdyaWQuZWxlbWVudEF0KGkpOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgbnVtQ29sdW1uczsgaisrKSB7DQotCQkJCVRhYmxlRGF0YSB0ZCA9IHJvd1tqXTsNCi0JCQkJaWYgKHRkLmlzSXRlbURhdGEgPT0gZmFsc2UpDQotCQkJCQljb250aW51ZTsNCi0JCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW3RkLmNoaWxkSW5kZXhdOw0KLQkJCQlpbnQgbWF4V2lkdGggPSAtMTsNCi0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ29tcG9zaXRlKSB7DQotCQkJCQlDb21wb3NpdGUgY2MgPSAoQ29tcG9zaXRlKSBjaGlsZDsNCi0JCQkJCUxheW91dCBsID0gY2MuZ2V0TGF5b3V0KCk7DQotCQkJCQlpZiAobCBpbnN0YW5jZW9mIElMYXlvdXRFeHRlbnNpb24pIHsNCi0JCQkJCQltYXhXaWR0aCA9DQotCQkJCQkJCSgoSUxheW91dEV4dGVuc2lvbikgbCkuZ2V0TWF4aW11bVdpZHRoKGNjLCBjaGFuZ2VkKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAobWF4V2lkdGggPT0gLTEpIHsNCi0JCQkJCVBvaW50IHNpemUgPQ0KLQkJCQkJCWNoaWxkLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJCQltYXhXaWR0aCA9IHNpemUueDsNCi0JCQkJfQ0KLQkJCQltYXhXaWR0aCArPSB0ZC5pbmRlbnQ7DQotCQkJCWlmICh0ZC5jb2xzcGFuID09IDEpDQotCQkJCQltYXhDb2x1bW5XaWR0aHNbal0gPSBNYXRoLm1heChtYXhDb2x1bW5XaWR0aHNbal0sIG1heFdpZHRoKTsNCi0JCQkJZWxzZSB7DQotCQkJCQkvLyBncm93IHRoZSBsYXN0IGNvbHVtbg0KLQkJCQkJaW50IGxhc3QgPSBqICsgdGQuY29sc3BhbiAtIDE7DQotCQkJCQlpbnQgcmVtID0gMDsNCi0JCQkJCWZvciAoaW50IGsgPSBqOyBrIDwgaiArIHRkLmNvbHNwYW4gLSAxOyBrKyspIHsNCi0JCQkJCQlyZW0gKz0gbWF4Q29sdW1uV2lkdGhzW2tdOw0KLQkJCQkJfQ0KLQkJCQkJaW50IHJlZHVjZWQgPSBtYXhXaWR0aCAtIHJlbTsNCi0JCQkJCW1heENvbHVtbldpZHRoc1tsYXN0XSA9DQotCQkJCQkJTWF0aC5tYXgobWF4Q29sdW1uV2lkdGhzW2xhc3RdLCByZWR1Y2VkKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUlmTmVlZGVkKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJaWYgKGNoYW5nZWQpDQotCQkJaW5pdGlhbExheW91dCA9IHRydWU7DQotCQlpZiAoaW5pdGlhbExheW91dCkgew0KLQkJCWluaXRpYWxpemVMYXlvdXREYXRhKHBhcmVudCk7DQotCQkJaW5pdGlhbExheW91dCA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCXZvaWQgaW5pdGlhbGl6ZUxheW91dERhdGEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgew0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7DQotCQkJQ29udHJvbCBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLQkJCWlmIChjaGlsZC5nZXRMYXlvdXREYXRhKCkgPT0gbnVsbCkgew0KLQkJCQljaGlsZC5zZXRMYXlvdXREYXRhKG5ldyBUYWJsZURhdGEoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSHlwZXJsaW5rQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTgwYTJkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotcHVibGljIGNsYXNzIEh5cGVybGlua0FkYXB0ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIgew0KLQ0KLXB1YmxpYyBIeXBlcmxpbmtBZGFwdGVyKCkgew0KLQlzdXBlcigpOw0KLX0NCi1wdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQ0KLXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2wgbGlua0xhYmVsKSB7fQ0KLXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbCBsaW5rTGFiZWwpIHt9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtIYW5kbGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSHlwZXJsaW5rSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzFhZWY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7DQotDQotcHVibGljIGNsYXNzIEh5cGVybGlua0hhbmRsZXINCi0JZXh0ZW5kcyBIeXBlcmxpbmtTZXR0aW5ncw0KLQlpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIsIE1vdXNlVHJhY2tMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIFBhaW50TGlzdGVuZXIgew0KLQlwcml2YXRlIEhhc2h0YWJsZSBoeXBlcmxpbmtMaXN0ZW5lcnM7DQotCXByaXZhdGUgQ29udHJvbCBsYXN0QWN0aXZhdGVkOw0KLQlwcml2YXRlIENvbnRyb2wgbGFzdEVudGVyZWQ7DQotDQotCXB1YmxpYyBIeXBlcmxpbmtIYW5kbGVyKCkgew0KLQkJaHlwZXJsaW5rTGlzdGVuZXJzID0gbmV3IEhhc2h0YWJsZSgpOw0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGdldExhc3RMaW5rKCkgew0KLQkJcmV0dXJuIGxhc3RBY3RpdmF0ZWQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7DQotCQlpZiAoZS5idXR0b24gPT0gMSkNCi0JCQlyZXR1cm47DQotCQlsYXN0QWN0aXZhdGVkID0gKENvbnRyb2wpIGUud2lkZ2V0Ow0KLQl9DQotCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIoTW91c2VFdmVudCBlKSB7DQotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlsaW5rRW50ZXJlZChjb250cm9sKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBtb3VzZUV4aXQoTW91c2VFdmVudCBlKSB7DQotCQlDb250cm9sIGNvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlsaW5rRXhpdGVkKGNvbnRyb2wpOw0KLQl9DQotCXB1YmxpYyB2b2lkIG1vdXNlSG92ZXIoTW91c2VFdmVudCBlKSB7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsNCi0JCWlmIChlLmJ1dHRvbiAhPSAxKQ0KLQkJCXJldHVybjsNCi0JCUNvbnRyb2wgbGlua0NvbnRyb2wgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlQb2ludCBzaXplID0gbGlua0NvbnRyb2wuZ2V0U2l6ZSgpOw0KLQkJLy8gRmlsdGVyIG91dCBtb3VzZSB1cCBldmVudHMgb3V0c2lkZQ0KLQkJLy8gdGhlIGxpbmsuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIG1vdXNlIGlzDQotCQkvLyBjbGlja2VkLCBkcmFnZ2VkIG91dHNpZGUgdGhlIGxpbmssIHRoZW4NCi0JCS8vIHJlbGVhc2VkLg0KLQkJaWYgKGUueCA8IDApDQotCQkJcmV0dXJuOw0KLQkJaWYgKGUueSA8IDApDQotCQkJcmV0dXJuOw0KLQkJaWYgKGUueCA+PSBzaXplLngpDQotCQkJcmV0dXJuOw0KLQkJaWYgKGUueSA+PSBzaXplLnkpDQotCQkJcmV0dXJuOw0KLQkJbGlua0FjdGl2YXRlZChsaW5rQ29udHJvbCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCUNvbnRyb2wgbGluayA9IChDb250cm9sKSBlLndpZGdldDsNCi0JCWxpbmtBY3RpdmF0ZWQobGluayk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJQ29udHJvbCBsaW5rID0gKENvbnRyb2wpIGUud2lkZ2V0Ow0KLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCBsID0gKFNlbGVjdGFibGVGb3JtTGFiZWwpIGxpbms7DQotCQlpZiAobC5nZXRTZWxlY3Rpb24oKSkNCi0JCQlsaW5rRW50ZXJlZChsaW5rKTsNCi0JCWVsc2UNCi0JCQlsaW5rRXhpdGVkKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGluaykgew0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9DQotCQkJKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChsaW5rKTsNCi0JCWlmIChhY3Rpb24gIT0gbnVsbCkgew0KLQkJCWxpbmsuc2V0Q3Vyc29yKGdldEJ1c3lDdXJzb3IoKSk7DQotCQkJYWN0aW9uLmxpbmtBY3RpdmF0ZWQobGluayk7DQotCQkJaWYgKCFsaW5rLmlzRGlzcG9zZWQoKSkNCi0JCQkJbGluay5zZXRDdXJzb3IoDQotCQkJCQlpc0h5cGVybGlua0N1cnNvclVzZWQoKSA/IGdldEh5cGVybGlua0N1cnNvcigpIDogbnVsbCk7DQotCQl9DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGxpbmtFbnRlcmVkKENvbnRyb2wgbGluaykgew0KLQkJaWYgKGxhc3RFbnRlcmVkICE9IG51bGwNCi0JCQkmJiBsYXN0RW50ZXJlZCBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpIHsNCi0JCQlTZWxlY3RhYmxlRm9ybUxhYmVsIGZsID0gKFNlbGVjdGFibGVGb3JtTGFiZWwpIGxhc3RFbnRlcmVkOw0KLQkJCWxpbmtFeGl0ZWQoZmwpOw0KLQkJfQ0KLQkJaWYgKGlzSHlwZXJsaW5rQ3Vyc29yVXNlZCgpKQ0KLQkJCWxpbmsuc2V0Q3Vyc29yKGdldEh5cGVybGlua0N1cnNvcigpKTsNCi0JCWlmIChhY3RpdmVCYWNrZ3JvdW5kICE9IG51bGwpDQotCQkJbGluay5zZXRCYWNrZ3JvdW5kKGFjdGl2ZUJhY2tncm91bmQpOw0KLQkJaWYgKGFjdGl2ZUZvcmVncm91bmQgIT0gbnVsbCkNCi0JCQlsaW5rLnNldEZvcmVncm91bmQoYWN0aXZlRm9yZWdyb3VuZCk7DQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfUk9MTE9WRVIpDQotCQkJdW5kZXJsaW5lKGxpbmssIHRydWUpOw0KLQ0KLQkJSUh5cGVybGlua0xpc3RlbmVyIGFjdGlvbiA9DQotCQkJKElIeXBlcmxpbmtMaXN0ZW5lcikgaHlwZXJsaW5rTGlzdGVuZXJzLmdldChsaW5rKTsNCi0JCWlmIChhY3Rpb24gIT0gbnVsbCkNCi0JCQlhY3Rpb24ubGlua0VudGVyZWQobGluayk7DQotCQlsYXN0RW50ZXJlZCA9IGxpbms7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rKSB7DQotCQlpZiAoaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkpDQotCQkJbGluay5zZXRDdXJzb3IobnVsbCk7DQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfUk9MTE9WRVIpDQotCQkJdW5kZXJsaW5lKGxpbmssIGZhbHNlKTsNCi0JCWlmIChiYWNrZ3JvdW5kICE9IG51bGwpDQotCQkJbGluay5zZXRCYWNrZ3JvdW5kKGJhY2tncm91bmQpOw0KLQkJaWYgKGZvcmVncm91bmQgIT0gbnVsbCkNCi0JCQlsaW5rLnNldEZvcmVncm91bmQoZm9yZWdyb3VuZCk7DQotCQlJSHlwZXJsaW5rTGlzdGVuZXIgYWN0aW9uID0NCi0JCQkoSUh5cGVybGlua0xpc3RlbmVyKSBoeXBlcmxpbmtMaXN0ZW5lcnMuZ2V0KGxpbmspOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRXhpdGVkKGxpbmspOw0KLQkJaWYgKGxhc3RFbnRlcmVkID09IGxpbmspDQotCQkJbGFzdEVudGVyZWQgPSBudWxsOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCUNvbnRyb2wgbGFiZWwgPSAoQ29udHJvbCkgZS53aWRnZXQ7DQotCQlpZiAoaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9PSBVTkRFUkxJTkVfQUxXQVlTKQ0KLQkJCUh5cGVybGlua0hhbmRsZXIudW5kZXJsaW5lKGxhYmVsLCB0cnVlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCByZWdpc3Rlckh5cGVybGluaygNCi0JCUNvbnRyb2wgY29udHJvbCwNCi0JCUlIeXBlcmxpbmtMaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJaWYgKGJhY2tncm91bmQgIT0gbnVsbCkNCi0JCQljb250cm9sLnNldEJhY2tncm91bmQoYmFja2dyb3VuZCk7DQotCQlpZiAoZm9yZWdyb3VuZCAhPSBudWxsKQ0KLQkJCWNvbnRyb2wuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsNCi0JCWNvbnRyb2wuYWRkTW91c2VMaXN0ZW5lcih0aGlzKTsNCi0JCWNvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOw0KLQ0KLQkJaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGUgPT0gVU5ERVJMSU5FX0FMV0FZUw0KLQkJCSYmIGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkNCi0JCQljb250cm9sLmFkZFBhaW50TGlzdGVuZXIodGhpcyk7DQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpIHsNCi0JCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHNsID0gKFNlbGVjdGFibGVGb3JtTGFiZWwpIGNvbnRyb2w7DQotCQkJc2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7DQotCQkJaWYgKGh5cGVybGlua1VuZGVybGluZU1vZGUgPT0gVU5ERVJMSU5FX0FMV0FZUykNCi0JCQkJc2wuc2V0VW5kZXJsaW5lZCh0cnVlKTsNCi0JCX0NCi0JCWh5cGVybGlua0xpc3RlbmVycy5wdXQoY29udHJvbCwgbGlzdGVuZXIpOw0KLQkJcmVtb3ZlRGlzcG9zZWRMaW5rcygpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCByZW1vdmVEaXNwb3NlZExpbmtzKCkgew0KLQkJZm9yIChFbnVtZXJhdGlvbiBrZXlzID0gaHlwZXJsaW5rTGlzdGVuZXJzLmtleXMoKTsNCi0JCQlrZXlzLmhhc01vcmVFbGVtZW50cygpOw0KLQkJCSkgew0KLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBrZXlzLm5leHRFbGVtZW50KCk7DQotCQkJaWYgKGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7DQotCQkJCWh5cGVybGlua0xpc3RlbmVycy5yZW1vdmUoY29udHJvbCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgew0KLQkJaHlwZXJsaW5rTGlzdGVuZXJzLmNsZWFyKCk7DQotCX0NCi0NCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVybGluZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gaW5zaWRlKSB7DQotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFNlbGVjdGFibGVGb3JtTGFiZWwpIHsNCi0JCQlTZWxlY3RhYmxlRm9ybUxhYmVsIGwgPSAoU2VsZWN0YWJsZUZvcm1MYWJlbCkgY29udHJvbDsNCi0JCQlsLnNldFVuZGVybGluZWQoaW5zaWRlKTsNCi0JCQlsLnJlZHJhdygpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCWlmICghKGNvbnRyb2wgaW5zdGFuY2VvZiBMYWJlbCkpDQotCQkJcmV0dXJuOw0KLQkJQ29tcG9zaXRlIHBhcmVudCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7DQotCQlSZWN0YW5nbGUgYm91bmRzID0gY29udHJvbC5nZXRCb3VuZHMoKTsNCi0JCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7DQotCQlDb2xvciBjb2xvciA9DQotCQkJaW5zaWRlID8gY29udHJvbC5nZXRGb3JlZ3JvdW5kKCkgOiBjb250cm9sLmdldEJhY2tncm91bmQoKTsNCi0JCWdjLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJaW50IHkgPSBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQ7DQotCQlnYy5kcmF3TGluZShib3VuZHMueCwgeSwgYm91bmRzLnggKyBib3VuZHMud2lkdGgsIHkpOw0KLQkJZ2MuZGlzcG9zZSgpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEZvcmVncm91bmQoQ29sb3IgY29sb3IpIHsNCi0JCXN1cGVyLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJcmVtb3ZlRGlzcG9zZWRMaW5rcygpOw0KLQkJZm9yIChFbnVtZXJhdGlvbiBsaW5rcyA9IGh5cGVybGlua0xpc3RlbmVycy5rZXlzKCk7DQotCQkJbGlua3MuaGFzTW9yZUVsZW1lbnRzKCk7DQotCQkJKSB7DQotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIGxpbmtzLm5leHRFbGVtZW50KCk7DQotCQkJY29udHJvbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSHlwZXJsaW5rU2V0dGluZ3MuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTFjNmEwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9IeXBlcmxpbmtTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtTZXR0aW5ncyB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9ORVZFUiA9IDE7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9ST0xMT1ZFUiA9IDI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOREVSTElORV9BTFdBWVMgPSAzOw0KLQ0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoeXBlcmxpbmtDdXJzb3JVc2VkID0gdHJ1ZTsNCi0JcHJvdGVjdGVkIGludCBoeXBlcmxpbmtVbmRlcmxpbmVNb2RlID0gVU5ERVJMSU5FX0FMV0FZUzsNCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmQ7DQotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kOw0KLQlwcm90ZWN0ZWQgQ29sb3IgYWN0aXZlQmFja2dyb3VuZDsNCi0JcHJvdGVjdGVkIENvbG9yIGFjdGl2ZUZvcmVncm91bmQ7DQotCXByb3RlY3RlZCBzdGF0aWMgQ3Vyc29ycyBjdXJzb3JzID0gbmV3IEN1cnNvcnMoKTsNCi0NCi0Jc3RhdGljIGNsYXNzIEN1cnNvcnMgew0KLQkJQ3Vyc29yIGh5cGVybGlua0N1cnNvcjsNCi0JCUN1cnNvciBidXN5Q3Vyc29yOw0KLQkJQ3Vyc29yIHRleHRDdXJzb3I7DQotCQlpbnQgY291bnRlciA9IDA7DQotDQotCQlwdWJsaWMgdm9pZCBhbGxvY2F0ZSgpIHsNCi0JCQlpZiAoY291bnRlciA9PSAwKSB7DQotCQkJCWh5cGVybGlua0N1cnNvciA9DQotCQkJCQluZXcgQ3Vyc29yKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBTV1QuQ1VSU09SX0hBTkQpOw0KLQkJCQlidXN5Q3Vyc29yID0gbmV3IEN1cnNvcihEaXNwbGF5LmdldEN1cnJlbnQoKSwgU1dULkNVUlNPUl9XQUlUKTsNCi0JCQkJdGV4dEN1cnNvciA9IG5ldyBDdXJzb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIFNXVC5DVVJTT1JfSUJFQU0pOw0KLQkJCX0NCi0JCQljb3VudGVyKys7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgew0KLQkJCWNvdW50ZXItLTsNCi0JCQlpZiAoY291bnRlciA9PSAwKSB7DQotCQkJCWh5cGVybGlua0N1cnNvci5kaXNwb3NlKCk7DQotCQkJCWJ1c3lDdXJzb3IuZGlzcG9zZSgpOw0KLQkJCQl0ZXh0Q3Vyc29yLmRpc3Bvc2UoKTsNCi0JCQkJaHlwZXJsaW5rQ3Vyc29yID0gbnVsbDsNCi0JCQkJYnVzeUN1cnNvciA9IG51bGw7DQotCQkJCXRleHRDdXJzb3IgPSBudWxsOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgSHlwZXJsaW5rU2V0dGluZ3MoKSB7DQotCQljdXJzb3JzLmFsbG9jYXRlKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCWlmIChjdXJzb3JzICE9IG51bGwpDQotCQkJY3Vyc29ycy5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHVibGljIENvbG9yIGdldEFjdGl2ZUJhY2tncm91bmQoKSB7DQotCQlyZXR1cm4gYWN0aXZlQmFja2dyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgQ29sb3IgZ2V0QWN0aXZlRm9yZWdyb3VuZCgpIHsNCi0JCXJldHVybiBhY3RpdmVGb3JlZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRCYWNrZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGJhY2tncm91bmQ7DQotCX0NCi0JcHVibGljIEN1cnNvciBnZXRCdXN5Q3Vyc29yKCkgew0KLQkJcmV0dXJuIGN1cnNvcnMuYnVzeUN1cnNvcjsNCi0JfQ0KLQlwdWJsaWMgQ3Vyc29yIGdldFRleHRDdXJzb3IoKSB7DQotCQlyZXR1cm4gY3Vyc29ycy50ZXh0Q3Vyc29yOw0KLQl9DQotCXB1YmxpYyBDb2xvciBnZXRGb3JlZ3JvdW5kKCkgew0KLQkJcmV0dXJuIGZvcmVncm91bmQ7DQotCX0NCi0JcHVibGljIEN1cnNvciBnZXRIeXBlcmxpbmtDdXJzb3IoKSB7DQotCQlyZXR1cm4gY3Vyc29ycy5oeXBlcmxpbmtDdXJzb3I7DQotCX0NCi0JcHVibGljIGludCBnZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua1VuZGVybGluZU1vZGU7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNIeXBlcmxpbmtDdXJzb3JVc2VkKCkgew0KLQkJcmV0dXJuIGh5cGVybGlua0N1cnNvclVzZWQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlQmFja2dyb3VuZChDb2xvciBuZXdBY3RpdmVCYWNrZ3JvdW5kKSB7DQotCQlhY3RpdmVCYWNrZ3JvdW5kID0gbmV3QWN0aXZlQmFja2dyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVGb3JlZ3JvdW5kKENvbG9yIG5ld0FjdGl2ZUZvcmVncm91bmQpIHsNCi0JCWFjdGl2ZUZvcmVncm91bmQgPSBuZXdBY3RpdmVGb3JlZ3JvdW5kOw0KLQl9DQotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoQ29sb3IgbmV3QmFja2dyb3VuZCkgew0KLQkJYmFja2dyb3VuZCA9IG5ld0JhY2tncm91bmQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0Rm9yZWdyb3VuZChDb2xvciBuZXdGb3JlZ3JvdW5kKSB7DQotCQlmb3JlZ3JvdW5kID0gbmV3Rm9yZWdyb3VuZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtDdXJzb3JVc2VkKGJvb2xlYW4gbmV3SHlwZXJsaW5rQ3Vyc29yVXNlZCkgew0KLQkJaHlwZXJsaW5rQ3Vyc29yVXNlZCA9IG5ld0h5cGVybGlua0N1cnNvclVzZWQ7DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShpbnQgbmV3SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSkgew0KLQkJaHlwZXJsaW5rVW5kZXJsaW5lTW9kZSA9IG5ld0h5cGVybGlua1VuZGVybGluZU1vZGU7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2MTQ4NS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybSB7DQotcHVibGljIHZvaWQgY29tbWl0Q2hhbmdlcyhib29sZWFuIG9uU2F2ZSk7DQotcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsNCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCk7DQotcHVibGljIGJvb2xlYW4gZG9HbG9iYWxBY3Rpb24oU3RyaW5nIGFjdGlvbklkKTsNCi1wdWJsaWMgdm9pZCBleHBhbmRUbyhPYmplY3Qgb2JqZWN0KTsNCi1wdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCk7DQotcHVibGljIEZvcm1XaWRnZXRGYWN0b3J5IGdldEZhY3RvcnkoKTsNCi1wdWJsaWMgQ29sb3IgZ2V0SGVhZGluZ0JhY2tncm91bmQoKTsNCi1wdWJsaWMgQ29sb3IgZ2V0SGVhZGluZ0ZvcmVncm91bmQoKTsNCi1wdWJsaWMgSW1hZ2UgZ2V0SGVhZGluZ0ltYWdlKCk7DQotcHVibGljIFN0cmluZyBnZXRIZWFkaW5nVGV4dCgpOw0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKTsNCi1wdWJsaWMgYm9vbGVhbiBpc0hlYWRpbmdWaXNpYmxlKCk7DQotcHVibGljIHZvaWQgcmVnaXN0ZXJTZWN0aW9uKEZvcm1TZWN0aW9uIHNlY3Rpb24pOw0KLXB1YmxpYyB2b2lkIHNldEZvY3VzKCk7DQotcHVibGljIHZvaWQgc2V0SGVhZGluZ0JhY2tncm91bmQoQ29sb3IgbmV3SGVhZGluZ0JhY2tncm91bmQpOw0KLXB1YmxpYyB2b2lkIHNldEhlYWRpbmdGb3JlZ3JvdW5kKENvbG9yIG5ld0hlYWRpbmdGb3JlZ3JvdW5kKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nSW1hZ2UoSW1hZ2UgaGVhZGluZ0ltYWdlKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nVmlzaWJsZShib29sZWFuIG5ld0hlYWRpbmdWaXNpYmxlKTsNCi1wdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZyk7DQotcHVibGljIHZvaWQgdXBkYXRlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzOTU5OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybVBhZ2Ugew0KLQ0KLWJvb2xlYW4gYmVjb21lc0ludmlzaWJsZShJRm9ybVBhZ2UgbmV3UGFnZSk7DQotdm9pZCBiZWNvbWVzVmlzaWJsZShJRm9ybVBhZ2UgcHJldmlvdXNQYWdlKTsNCi12b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCk7DQotQ29udHJvbCBnZXRDb250cm9sKCk7DQotU3RyaW5nIGdldExhYmVsKCk7DQotU3RyaW5nIGdldFRpdGxlKCk7DQotYm9vbGVhbiBpc1NvdXJjZSgpOw0KLWJvb2xlYW4gaXNWaXNpYmxlKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1TZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzM0ZDQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIHsNCi0JcHVibGljIHZvaWQgZm9ybVNlbGVjdGVkKElGb3JtUGFnZSBwYWdlLCBib29sZWFuIHNldEZvY3VzKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lGb3JtVGV4dExpc3RlbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1UZXh0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3ZjcxNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1UZXh0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtVGV4dExpc3RlbmVyIHsNCi0JcHVibGljIHZvaWQgdGV4dFZhbHVlQ2hhbmdlZChGb3JtRW50cnkgdGV4dCk7DQotCXB1YmxpYyB2b2lkIHRleHREaXJ0eShGb3JtRW50cnkgdGV4dCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVdvcmtib29rLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUZvcm1Xb3JrYm9vay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU3OGFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JRm9ybVdvcmtib29rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotcHVibGljIGludGVyZmFjZSBJRm9ybVdvcmtib29rIHsNCi0NCi0Jdm9pZCBhZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7DQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSUZvcm1QYWdlIHBhZ2UpOw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpOw0KLQlDb250cm9sIGdldENvbnRyb2woKTsNCi0JcHVibGljIElGb3JtUGFnZSBnZXRDdXJyZW50UGFnZSgpOw0KLQlib29sZWFuIGlzRmlyc3RQYWdlU2VsZWN0ZWQoKTsNCi0Jdm9pZCByZW1vdmVGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7DQotCXB1YmxpYyB2b2lkIHJlbW92ZVBhZ2UoSUZvcm1QYWdlIHBhZ2UpOw0KLQlwdWJsaWMgdm9pZCBzZWxlY3RQYWdlKGZpbmFsIElGb3JtUGFnZSBwYWdlLCBib29sZWFuIHNldEZvY3VzKTsNCi0Jdm9pZCBzZXRGaXJzdFBhZ2VTZWxlY3RlZChib29sZWFuIHNlbGVjdGVkKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lIeXBlcmxpbmtMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjlhZjM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9JSHlwZXJsaW5rTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElIeXBlcmxpbmtMaXN0ZW5lciB7DQotDQotcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChDb250cm9sIGxpbmtMYWJlbCk7DQotcHVibGljIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rTGFiZWwpOw0KLXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rTGFiZWwpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUxheW91dEV4dGVuc2lvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL0lMYXlvdXRFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZkOTQ3Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvSUxheW91dEV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQ2xhc3NlcyB0aGF0IGV4dGVuZCBhYnN0cmFjdCBjbGFzcyBMYXlvdXQgYW5kIGltcGxlbWVudAotICogdGhpcyBpbnRlcmZhY2UgY2FuIHRha2UgcGFydCBpbiBsYXlvdXQgY29tcHV0YXRpb24gb2YKLSAqIHRoZSBIVE1MVGFibGVMYXlvdXQgbWFuYWdlci4gVGhlIHNhaWQgbGF5b3V0IHVzZXMKLSAqIGFsdGVybmF0aXZlIGFsZ29yaXRobSB0aGF0IGNvbXB1dGVzIGNvbHVtbnMgYmVmb3JlIHJvd3MuCi0gKiBJdCBhbGxvd3MgaXQgdG8gJ2Zsb3cnIHdyYXBwZWQgdGV4dCBwcm9wb3J0aW9uYWxseQotICogKGFzIGluIHRoZSBwb3B1bGFyIHdlYiBicm93c2VycykuIEN1c3RvbSBsYXlvdXQgbWFuYWdlcnMKLSAqIHRoYXQgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGFsbG93IHJlY3Vyc2l2ZSByZWZsb3cKLSAqIHRvIGJlIHBlcmZvcm1lZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTGF5b3V0RXh0ZW5zaW9uIHsKLQlwdWJsaWMgaW50IGdldE1pbmltdW1XaWR0aChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGNoYW5nZWQpOwotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCk7IAotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL05vVGFic1dvcmtib29rLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvTm9UYWJzV29ya2Jvb2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1NTUwMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvTm9UYWJzV29ya2Jvb2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7DQotDQotcHVibGljIGNsYXNzIE5vVGFic1dvcmtib29rIGltcGxlbWVudHMgSUZvcm1Xb3JrYm9vayB7DQotCXByaXZhdGUgVmVjdG9yIHBhZ2VzOw0KLQlwcml2YXRlIGJvb2xlYW4gZmlyc3RQYWdlU2VsZWN0ZWQgPSB0cnVlOw0KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOw0KLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7DQotCXByaXZhdGUgSUZvcm1QYWdlIGN1cnJlbnRQYWdlOw0KLQ0KLQlwdWJsaWMgTm9UYWJzV29ya2Jvb2soKSB7DQotCQlwYWdlcyA9IG5ldyBWZWN0b3IoKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBhZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJbGlzdGVuZXJzLmFkZEVsZW1lbnQobGlzdGVuZXIpOw0KLQl9DQotCXB1YmxpYyB2b2lkIGFkZFBhZ2UoSUZvcm1QYWdlIHBhZ2UpIHsNCi0JCXBhZ2VzLmFkZChwYWdlKTsNCi0NCi0JCWlmIChmaXJzdFBhZ2VTZWxlY3RlZCAmJiBjdXJyZW50UGFnZSA9PSBudWxsKQ0KLQkJCXNlbGVjdFBhZ2UocGFnZSwgdHJ1ZSk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OVUxMKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsNCi0JCQlJRm9ybVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gKElGb3JtU2VsZWN0aW9uTGlzdGVuZXIpIGl0ZXIubmV4dCgpOw0KLQkJCWxpc3RlbmVyLmZvcm1TZWxlY3RlZChwYWdlLCBzZXRGb2N1cyk7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyBJRm9ybVBhZ2UgW10gZ2V0UGFnZXMoKSB7DQotCQlyZXR1cm4gKElGb3JtUGFnZVtdKXBhZ2VzLnRvQXJyYXkobmV3IElGb3JtUGFnZVtwYWdlcy5zaXplKCldKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIHBhZ2VCb29rOw0KLQl9DQotDQotCXB1YmxpYyBJRm9ybVBhZ2UgZ2V0Q3VycmVudFBhZ2UoKSB7DQotCQlyZXR1cm4gY3VycmVudFBhZ2U7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNGaXJzdFBhZ2VTZWxlY3RlZCgpIHsNCi0JCXJldHVybiBmaXJzdFBhZ2VTZWxlY3RlZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVGb3JtU2VsZWN0aW9uTGlzdGVuZXIoSUZvcm1TZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgew0KLQkJbGlzdGVuZXJzLnJlbW92ZUVsZW1lbnQobGlzdGVuZXIpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHJlbW92ZVBhZ2UoSUZvcm1QYWdlIHBhZ2UpIHsNCi0JCWlmIChwYWdlcy5jb250YWlucyhwYWdlKSkgew0KLQkJCUNvbnRyb2wgYyA9IHBhZ2UuZ2V0Q29udHJvbCgpOw0KLQkJCWlmIChjIT1udWxsICYmICFjLmlzRGlzcG9zZWQoKSkNCi0JCQkJYy5kaXNwb3NlKCk7DQotCQkJcGFnZXMucmVtb3ZlKHBhZ2UpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNlbGVjdFBhZ2UoZmluYWwgSUZvcm1QYWdlIHBhZ2UsIGZpbmFsIGJvb2xlYW4gc2V0Rm9jdXMpIHsNCi0JCWZpbmFsIElGb3JtUGFnZSBvbGRQYWdlID0gY3VycmVudFBhZ2U7DQotCQljdXJyZW50UGFnZSA9IHBhZ2U7DQotDQotCQlpZiAocGFnZUJvb2sgIT0gbnVsbCkgew0KLQ0KLQkJCS8vIEl0IG1heSB0YWtlIGEgd2hpbGUNCi0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShwYWdlQm9vay5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsNCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQkJc3dpdGNoUGFnZXMob2xkUGFnZSwgcGFnZSwgc2V0Rm9jdXMpOw0KLQkJCQl9DQotCQkJfSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0Rmlyc3RQYWdlU2VsZWN0ZWQoYm9vbGVhbiBuZXdGaXJzdFBhZ2VTZWxlY3RlZCkgew0KLQkJZmlyc3RQYWdlU2VsZWN0ZWQgPSBuZXdGaXJzdFBhZ2VTZWxlY3RlZDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgc3dpdGNoUGFnZXMoSUZvcm1QYWdlIG9sZFBhZ2UsIElGb3JtUGFnZSBuZXdQYWdlLCBib29sZWFuIHNldEZvY3VzKSB7DQotCQlpZiAob2xkUGFnZSAhPSBudWxsICYmIG9sZFBhZ2UgIT0gbmV3UGFnZSkgew0KLQkJCW9sZFBhZ2UuYmVjb21lc0ludmlzaWJsZShuZXdQYWdlKTsNCi0JCX0NCi0JCWlmIChuZXdQYWdlLmdldENvbnRyb2woKSA9PSBudWxsKQ0KLQkJCW5ld1BhZ2UuY3JlYXRlQ29udHJvbChwYWdlQm9vayk7DQotCQlwYWdlQm9vay5zaG93UGFnZShuZXdQYWdlLmdldENvbnRyb2woKSk7DQotDQotCQluZXdQYWdlLmJlY29tZXNWaXNpYmxlKG9sZFBhZ2UpOw0KLQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQobmV3UGFnZSwgc2V0Rm9jdXMpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TY3JvbGxhYmxlU2VjdGlvbkZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TY3JvbGxhYmxlU2VjdGlvbkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFiZDFmZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2Nyb2xsYWJsZVNlY3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLQ0KLS8qKg0KLSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgc2VjdGlvbiBmb3JtIGFkZHMgc2Nyb2xsaW5nDQotICogY2FwYWJpbGl0eS4gSG93ZXZlciwgc2Nyb2xsaW5nIGNhbiBiZSBkaXNhYmxlZA0KLSAqIHVzaW5nICdzZXRTY3JvbGxhYmxlJyBtZXRob2QuIEZvciB0aGlzIHJlYXNvbiwNCi0gKiB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIFNlY3Rpb25Gb3JtLg0KLSAqLw0KLQ0KLXB1YmxpYyBjbGFzcyBTY3JvbGxhYmxlU2VjdGlvbkZvcm0gZXh0ZW5kcyBTZWN0aW9uRm9ybSB7DQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRhaW5lcjsNCi0JcHJpdmF0ZSBib29sZWFuIHZlcnRpY2FsRml0Ow0KLQlwcml2YXRlIGJvb2xlYW4gc2Nyb2xsYWJsZSA9IHRydWU7DQotDQotCXB1YmxpYyBTY3JvbGxhYmxlU2VjdGlvbkZvcm0oKSB7DQotCX0NCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7DQotCQljb250YWluZXIgPSBjcmVhdGVQYXJlbnQocGFyZW50KTsNCi0JCUNvbnRyb2wgZm9ybUNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250cm9sKGNvbnRhaW5lcik7DQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsNCi0JCQlTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29udGFpbmVyOw0KLQkJCXNjLnNldENvbnRlbnQoZm9ybUNvbnRyb2wpOw0KLQkJfQ0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCi0JCWZvcm1Db250cm9sLnNldExheW91dERhdGEoZ2QpOw0KLQkJY29udGFpbmVyLnNldEJhY2tncm91bmQoZm9ybUNvbnRyb2wuZ2V0QmFja2dyb3VuZCgpKTsNCi0JCXJldHVybiBjb250YWluZXI7DQotCX0NCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVQYXJlbnQoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIHJlc3VsdCA9IG51bGw7DQotCQlpZiAoaXNTY3JvbGxhYmxlKCkpIHsNCi0JCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9DQotCQkJCW5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7DQotCQkJaWYgKGlzVmVydGljYWxGaXQoKSkgew0KLQkJCQlzY29tcC5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOw0KLQkJCQlzY29tcC5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsNCi0JCQl9DQotCQkJaW5pdGlhbGl6ZVNjcm9sbEJhcnMoc2NvbXApOw0KLQkJCXJlc3VsdCA9IHNjb21wOw0KLQkJfSBlbHNlIHsNCi0JCQlyZXN1bHQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOw0KLQkJCXJlc3VsdC5zZXRMYXlvdXQobGF5b3V0KTsNCi0JCX0NCi0JCXJlc3VsdC5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1Njcm9sbGFibGUoKSB7DQotCQlyZXR1cm4gc2Nyb2xsYWJsZTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZlcnRpY2FsRml0KCkgew0KLQkJcmV0dXJuIHZlcnRpY2FsRml0Ow0KLQl9DQotCXB1YmxpYyB2b2lkIHNldFNjcm9sbGFibGUoYm9vbGVhbiBuZXdTY3JvbGxhYmxlKSB7DQotCQlzY3JvbGxhYmxlID0gbmV3U2Nyb2xsYWJsZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRWZXJ0aWNhbEZpdChib29sZWFuIG5ld1ZlcnRpY2FsRml0KSB7DQotCQl2ZXJ0aWNhbEZpdCA9IG5ld1ZlcnRpY2FsRml0Ow0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2Nyb2xsQmFycyhTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCkgew0KLQkJU2Nyb2xsQmFyIGhiYXIgPSBzY29tcC5nZXRIb3Jpem9udGFsQmFyKCk7DQotCQlpZiAoaGJhciAhPSBudWxsKSB7DQotCQkJaGJhci5zZXRJbmNyZW1lbnQoSF9TQ1JPTExfSU5DUkVNRU5UKTsNCi0JCX0NCi0JCVNjcm9sbEJhciB2YmFyID0gc2NvbXAuZ2V0VmVydGljYWxCYXIoKTsNCi0JCWlmICh2YmFyICE9IG51bGwpIHsNCi0JCQl2YmFyLnNldEluY3JlbWVudChWX1NDUk9MTF9JTkNSRU1FTlQpOw0KLQkJfQ0KLQkJdXBkYXRlUGFnZUluY3JlbWVudChzY29tcCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgew0KLQkJc3VwZXIudXBkYXRlKCk7DQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsNCi0JCQl1cGRhdGVTY3JvbGxlZENvbXBvc2l0ZSgpOw0KLQkJfSBlbHNlIHsNCi0JCQljb250YWluZXIubGF5b3V0KHRydWUpOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIHVwZGF0ZVNjcm9sbEJhcnMoKSB7DQotCQlpZiAoY29udGFpbmVyIGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpIHsNCi0JCQl1cGRhdGVTY3JvbGxlZENvbXBvc2l0ZSgpOw0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIHVwZGF0ZVNjcm9sbGVkQ29tcG9zaXRlKCkgew0KLQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MgPSAoU2Nyb2xsZWRDb21wb3NpdGUpIGNvbnRhaW5lcjsNCi0JCUNvbnRyb2wgZm9ybUNvbnRyb2wgPSBnZXRDb250cm9sKCk7DQotCQlQb2ludCBuZXdTaXplID0gZm9ybUNvbnRyb2wuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsNCi0JCWZvcm1Db250cm9sLnNldFNpemUobmV3U2l6ZSk7DQotCQlzYy5zZXRNaW5TaXplKG5ld1NpemUpOw0KLQkJdXBkYXRlUGFnZUluY3JlbWVudChzYyk7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlY3Rpb25DaGFuZ2VNYW5hZ2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkNoYW5nZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkMzAxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkNoYW5nZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotcHVibGljIGNsYXNzIFNlY3Rpb25DaGFuZ2VNYW5hZ2VyIHsNCi0JSGFzaHRhYmxlIHNvdXJjZXMgPSBuZXcgSGFzaHRhYmxlKCk7DQotDQotCXB1YmxpYyBTZWN0aW9uQ2hhbmdlTWFuYWdlcigpIHsNCi0JCXN1cGVyKCk7DQotCX0NCi0JcHVibGljIHZvaWQgZGlzcGF0Y2hOb3RpZmljYXRpb24oDQotCQlGb3JtU2VjdGlvbiBzb3VyY2UsDQotCQlpbnQgdHlwZSwNCi0JCU9iamVjdCBjaGFuZ2VPYmplY3QpIHsNCi0JCVZlY3RvciB0YXJnZXRzID0gKFZlY3Rvcikgc291cmNlcy5nZXQoc291cmNlKTsNCi0JCWlmICh0YXJnZXRzICE9IG51bGwpIHsNCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB0YXJnZXRzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCQlGb3JtU2VjdGlvbiBzZWN0aW9uID0gKEZvcm1TZWN0aW9uKSBpdGVyLm5leHQoKTsNCi0JCQkJc2VjdGlvbi5zZWN0aW9uQ2hhbmdlZChzb3VyY2UsIHR5cGUsIGNoYW5nZU9iamVjdCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXB1YmxpYyB2b2lkIGxpbmtTZWN0aW9ucyhGb3JtU2VjdGlvbiBzb3VyY2UsIEZvcm1TZWN0aW9uIHRhcmdldCkgew0KLQkJc291cmNlLnNldE1hbmFnZXIodGhpcyk7DQotCQlWZWN0b3IgdGFyZ2V0cyA9IG51bGw7DQotDQotCQl0YXJnZXRzID0gKFZlY3Rvcikgc291cmNlcy5nZXQoc291cmNlKTsNCi0JCWlmICh0YXJnZXRzID09IG51bGwpIHsNCi0JCQl0YXJnZXRzID0gbmV3IFZlY3RvcigpOw0KLQkJCXNvdXJjZXMucHV0KHNvdXJjZSwgdGFyZ2V0cyk7DQotCQl9DQotCQl0YXJnZXRzLmFkZEVsZW1lbnQodGFyZ2V0KTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VjdGlvbkZvcm0uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTI4YjZjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWN0aW9uRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsNCi0NCi0vKioNCi0gKiBUaGlzIGZvcm0gaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGl0IGNvbnRhaW5zDQotICogZm9ybSBzZWN0aW9ucyBhbmQgdGhhdCB0aGV5IGZpbGwgdXAgdGhlIHNjcmVlbi4NCi0gKiBUeXBpY2FsbHksIHRoZSBmb3JtIGNsaWVudCB3aWxsIHVzZSB1cCB0aGUgZW50aXJlDQotICogcGFyZW50IGFyZWEgYmVsb3cgdGhlIGhlYWRpbmcuIFNlY3Rpb25zIG11c3QNCi0gKiBiZSBhYmxlIHRvIHJldHVybiB0aGVpciBwcmVmZXJyZWQgc2l6ZSBpbiBib3RoDQotICogZGltZW5zaW9ucy4gSWYgdGhleSBjb250YWluIHdyYXBwYWJsZSB0ZXh0LA0KLSAqIFdlYkZvcm0gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgU2VjdGlvbkZvcm0gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb25Gb3JtIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7DQotCXByaXZhdGUgQ29tcG9zaXRlIGNvbnRyb2w7DQotCXByaXZhdGUgaW50IFRJVExFX0hNQVJHSU4gPSAxMDsNCi0JcHJpdmF0ZSBpbnQgVElUTEVfVk1BUkdJTiA9IDU7DQotDQotCWNsYXNzIEZvcm1MYXlvdXQgZXh0ZW5kcyBMYXlvdXQgew0KLQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKA0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUsDQotCQkJaW50IHdIaW50LA0KLQkJCWludCBoSGludCwNCi0JCQlib29sZWFuIGZsdXNoQ2FjaGUpIHsNCi0JCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpDQotCQkJCXJldHVybiBuZXcgUG9pbnQod0hpbnQsIGhIaW50KTsNCi0JCQlDb250cm9sIGNsaWVudCA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOw0KLQkJCVBvaW50IGNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKHdpZHRoSGludCwgaGVpZ2h0SGludCwgZmx1c2hDYWNoZSk7DQotCQkJaWYgKGhlYWRpbmdWaXNpYmxlKQ0KLQkJCQljc2l6ZS55ICs9IGdldFRpdGxlSGVpZ2h0KCk7DQotCQkJcmV0dXJuIGNzaXplOw0KLQkJfQ0KLQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgew0KLQkJCVJlY3RhbmdsZSBjbGllbnRBcmVhID0gY29tcG9zaXRlLmdldENsaWVudEFyZWEoKTsNCi0JCQlDb250cm9sIGNsaWVudCA9IGNvbXBvc2l0ZS5nZXRDaGlsZHJlbigpWzBdOw0KLQkJCWlmIChjbGllbnQgIT0gbnVsbCAmJiAhY2xpZW50LmlzRGlzcG9zZWQoKSkgew0KLQkJCQlpbnQgdGhlaWdodCA9IGhlYWRpbmdWaXNpYmxlID8gZ2V0VGl0bGVIZWlnaHQoKSA6IDA7DQotCQkJCWNsaWVudC5zZXRCb3VuZHMoDQotCQkJCQljbGllbnRBcmVhLngsDQotCQkJCQljbGllbnRBcmVhLnkgKyB0aGVpZ2h0LA0KLQkJCQkJY2xpZW50QXJlYS53aWR0aCwNCi0JCQkJCWNsaWVudEFyZWEuaGVpZ2h0IC0gdGhlaWdodCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCXByaXZhdGUgaW50IHdpZHRoSGludCA9IFNXVC5ERUZBVUxUOw0KLQlwcml2YXRlIGludCBoZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7DQotDQotCXB1YmxpYyBTZWN0aW9uRm9ybSgpIHsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCUNvbXBvc2l0ZSBjYW52YXMgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOw0KLQkJY2FudmFzLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotCQljYW52YXMuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEZvcmVncm91bmRDb2xvcigpKTsNCi0JCWNhbnZhcy5hZGRQYWludExpc3RlbmVyKHRoaXMpOw0KLQkJY2FudmFzLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsNCi0JCWNhbnZhcy5zZXRNZW51KHBhcmVudC5nZXRNZW51KCkpOw0KLQkJQ29tcG9zaXRlIGZvcm1QYXJlbnQgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShjYW52YXMpOw0KLQkJY3JlYXRlRm9ybUNsaWVudChmb3JtUGFyZW50KTsNCi0JCXRoaXMuY29udHJvbCA9IGNhbnZhczsNCi0JCS8vY2FudmFzLnNldEZvY3VzKCk7DQotCQlyZXR1cm4gY2FudmFzOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1DbGllbnQoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgew0KLQkJcmV0dXJuIGNvbnRyb2w7DQotCX0NCi0NCi0JcHJpdmF0ZSBpbnQgZ2V0VGl0bGVIZWlnaHQoKSB7DQotCQlpbnQgaW1hZ2VIZWlnaHQgPSAwOw0KLQkJaWYgKGhlYWRpbmdJbWFnZSAhPSBudWxsDQotCQkJJiYgU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJtb3RpZiIpID09IGZhbHNlKSB7DQotCQkJaW1hZ2VIZWlnaHQgPSBoZWFkaW5nSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0Ow0KLQkJfQ0KLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7DQotCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgZm9udEhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJZ2MuZGlzcG9zZSgpOw0KLQ0KLQkJaW50IGhlaWdodCA9IGZvbnRIZWlnaHQgKyBUSVRMRV9WTUFSR0lOICsgVElUTEVfVk1BUkdJTjsNCi0JCXJldHVybiBNYXRoLm1heChoZWlnaHQsIGltYWdlSGVpZ2h0KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGFpbnQoQ29udHJvbCBmb3JtLCBHQyBnYykgew0KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGZvcm0uZ2V0Qm91bmRzKCk7DQotCQlpbnQgaGVpZ2h0ID0gZ2V0VGl0bGVIZWlnaHQoKTsNCi0JCWlmIChoZWFkaW5nSW1hZ2UgIT0gbnVsbCkgew0KLQkJCVJlY3RhbmdsZSBpbWFnZUJvdW5kcyA9IGhlYWRpbmdJbWFnZS5nZXRCb3VuZHMoKTsNCi0JCQlpbnQgeCA9IGJvdW5kcy53aWR0aCAtIGltYWdlQm91bmRzLndpZHRoOw0KLQkJCWludCB5ID0gMDsNCi0JCQkvL3ggPSBNYXRoLm1heCh4LCAwKTsNCi0JCQl4ID0gMDsNCi0JCQlpZiAoaGVhZGluZ0JhY2tncm91bmQgIT0gbnVsbCkgew0KLQkJCQlnYy5zZXRCYWNrZ3JvdW5kKGhlYWRpbmdCYWNrZ3JvdW5kKTsNCi0JCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCAwLCBib3VuZHMud2lkdGgsIGhlaWdodCk7DQotCQkJfQ0KLQkJCWlmIChTV1QuZ2V0UGxhdGZvcm0oKS5lcXVhbHMoIm1vdGlmIikgPT0gZmFsc2UpIHsNCi0JCQkJZ2MuZHJhd0ltYWdlKGhlYWRpbmdJbWFnZSwgeCwgeSk7DQotCQkJfQ0KLQkJCWlmIChoZWFkaW5nRm9yZWdyb3VuZCAhPSBudWxsKQ0KLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGhlYWRpbmdGb3JlZ3JvdW5kKTsNCi0JCQllbHNlDQotCQkJCWdjLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7DQotCQkJZ2Muc2V0Rm9udCh0aXRsZUZvbnQpOw0KLQkJCWdjLmRyYXdUZXh0KGdldEhlYWRpbmdUZXh0KCksIFRJVExFX0hNQVJHSU4sIFRJVExFX1ZNQVJHSU4sIHRydWUpOw0KLQkJfSBlbHNlIHsNCi0JCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQkJZ2Muc2V0QmFja2dyb3VuZChmYWN0b3J5LmdldENvbG9yKEZvcm1XaWRnZXRGYWN0b3J5LkRFRkFVTFRfSEVBREVSX0NPTE9SKSk7DQotCQkJLy9nYy5maWxsUmVjdGFuZ2xlKFRJVExFX0hNQVJHSU4sIFRJVExFX1ZNQVJHSU4sIGJvdW5kcy53aWR0aC1USVRMRV9ITUFSR0lOKjIsIGhlaWdodC1USVRMRV9WTUFSR0lOKjIpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7DQotCQkJZ2MuZHJhd1RleHQoZ2V0SGVhZGluZ1RleHQoKSwgVElUTEVfSE1BUkdJTiwgVElUTEVfVk1BUkdJTiwgdHJ1ZSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIGZpbmFsIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsNCi0JCWlmICghaGVhZGluZ1Zpc2libGUpDQotCQkJcmV0dXJuOw0KLQkJR0MgZ2MgPSBldmVudC5nYzsNCi0JCUNvbnRyb2wgZm9ybSA9IChDb250cm9sKSBldmVudC53aWRnZXQ7DQotCQlwYWludChmb3JtLCBnYyk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ1Zpc2libGUoYm9vbGVhbiBuZXdIZWFkaW5nVmlzaWJsZSkgew0KLQkJc3VwZXIuc2V0SGVhZGluZ1Zpc2libGUobmV3SGVhZGluZ1Zpc2libGUpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVGV4dChTdHJpbmcgaGVhZGluZ1RleHQpIHsNCi0JCXN1cGVyLnNldEhlYWRpbmdUZXh0KGhlYWRpbmdUZXh0KTsNCi0JCWlmIChjb250cm9sICE9IG51bGwpIHsNCi0JCQljb250cm9sLmxheW91dCh0cnVlKTsNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsNCi0JCXRpdGxlRm9udCA9IEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKTsNCi0JCWlmIChjb250cm9sICE9IG51bGwgJiYgIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7DQotCQkJY29udHJvbC5sYXlvdXQodHJ1ZSk7DQotCQkJY29udHJvbC5yZWRyYXcoKTsNCi0JCX0NCi0JfQ0KLQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvU2VsZWN0YWJsZUNvbnRyb2wuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc5MTMzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlQ29udHJvbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi0NCi0vKioNCi0gKiBGb3JtVGV4dCBpcyBhIHdpbmRvd2xlc3MgY29udHJvbCB0aGF0DQotICogZHJhd3MgdGV4dCBpbiB0aGUgcHJvdmlkZWQgY29udGV4dC4NCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VsZWN0YWJsZUNvbnRyb2wgZXh0ZW5kcyBDYW52YXMgew0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRm9jdXM7DQotDQotCXB1YmxpYyBTZWxlY3RhYmxlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7DQotCQkJCXBhaW50KGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTW91c2VMaXN0ZW5lcihuZXcgTW91c2VBZGFwdGVyICgpIHsNCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgew0KLQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRLZXlMaXN0ZW5lcihuZXcgS2V5QWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsNCi0JCQkJaWYgKGUuY2hhcmFjdGVyID09ICdccicpIHsNCi0JCQkJCS8vIEFjdGl2YXRpb24NCi0JCQkJCW5vdGlmeUxpc3RlbmVycyhTV1QuU2VsZWN0aW9uKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTGlzdGVuZXIoU1dULlRyYXZlcnNlLCBuZXcgTGlzdGVuZXIgKCkgew0KLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsNCi0JCQkJaWYgKGUuZGV0YWlsICE9IFNXVC5UUkFWRVJTRV9SRVRVUk4pDQotCQkJCQllLmRvaXQgPSB0cnVlOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkRm9jdXNMaXN0ZW5lcihuZXcgRm9jdXNMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsNCi0JCQkJaWYgKCFoYXNGb2N1cykgew0KLQkJCQkgICBoYXNGb2N1cz10cnVlOw0KLQkJCQkgICByZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmIChoYXNGb2N1cykgew0KLQkJCQkJaGFzRm9jdXM9ZmFsc2U7DQotCQkJCQlyZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByb3RlY3RlZCB2b2lkIHBhaW50KFBhaW50RXZlbnQgZSkgew0KLQkJR0MgZ2MgPSBlLmdjOw0KLQkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsNCi0JICAgCWdjLnNldEZvbnQoZ2V0Rm9udCgpKTsNCi0JICAgCXBhaW50KGdjKTsNCi0JCWlmIChoYXNGb2N1cykgew0KLQkgICAJCWdjLnNldEZvcmVncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JICAgCQlnYy5kcmF3Rm9jdXMoMCwgMCwgc2l6ZS54LCBzaXplLnkpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwYWludChHQyBnYyk7DQotCQ0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsNCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7DQotCQlldmVudC50eXBlID0gZXZlbnRUeXBlOw0KLQkJZXZlbnQud2lkZ2V0ID0gdGhpczsNCi0JCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUsIGV2ZW50KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCVR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7DQotCQlhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCXJlbW92ZUxpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVGb3JtTGFiZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9TZWxlY3RhYmxlRm9ybUxhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWQ1YzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1NlbGVjdGFibGVGb3JtTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWw7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7DQotDQotcHVibGljIGNsYXNzIFNlbGVjdGFibGVGb3JtTGFiZWwgZXh0ZW5kcyBGb3JtTGFiZWwgew0KLQlwcml2YXRlIGJvb2xlYW4gaGFzRm9jdXM7DQotDQotCXB1YmxpYyBib29sZWFuIGdldFNlbGVjdGlvbigpIHsNCi0JCXJldHVybiBoYXNGb2N1czsNCi0JfQ0KLQkNCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBTZWxlY3RhYmxlRm9ybUxhYmVsDQotCSAqLw0KLQlwdWJsaWMgU2VsZWN0YWJsZUZvcm1MYWJlbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkS2V5TGlzdGVuZXIobmV3IEtleUFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7DQotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXHInKSB7DQotCQkJCQkvLyBBY3RpdmF0aW9uDQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULkRlZmF1bHRTZWxlY3Rpb24pOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lciAoKSB7DQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgew0KLQkJCQlzd2l0Y2ggKGUuZGV0YWlsKSB7DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX05FWFQ6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfTkVYVDoNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX1BSRVZJT1VTOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfUkVUVVJOOg0KLQkJCQkJZS5kb2l0ID0gZmFsc2U7DQotCQkJCQlyZXR1cm47DQotCQkJCX0NCi0JCQkJZS5kb2l0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9KTsNCi0JCWFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmICghaGFzRm9jdXMpIHsNCi0JCQkJICAgaGFzRm9jdXM9dHJ1ZTsNCi0JCQkJICAgbm90aWZ5TGlzdGVuZXJzKFNXVC5TZWxlY3Rpb24pOw0KLQkJCQkgICByZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0xvc3QoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmIChoYXNGb2N1cykgew0KLQkJCQkJaGFzRm9jdXM9ZmFsc2U7DQotCQkJCQlub3RpZnlMaXN0ZW5lcnMoU1dULlNlbGVjdGlvbik7DQotCQkJCQlyZWRyYXcoKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQkJdGV4dE1hcmdpbldpZHRoID0gMTsNCi0JCXRleHRNYXJnaW5IZWlnaHQgPSAxOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsNCi0JCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsNCi0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0VGV4dCgpOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWFjY2Vzc2libGUNCi0JCQkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGUueCwgZS55KSk7DQotCQkJCWUuY2hpbGRJRCA9DQotCQkJCQkoZ2V0Qm91bmRzKCkuY29udGFpbnMocHQpKQ0KLQkJCQkJCT8gQUNDLkNISUxESURfU0VMRg0KLQkJCQkJCTogQUNDLkNISUxESURfTk9ORTsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcygpOw0KLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOw0KLQkJCQllLnggPSBwdC54Ow0KLQkJCQllLnkgPSBwdC55Ow0KLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7DQotCQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0Ow0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IDA7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlJPTEVfUFVTSEJVVFRPTjsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gU2VsZWN0YWJsZUZvcm1MYWJlbC50aGlzLmdldFNlbGVjdGlvbigpP0FDQy5TVEFURV9TRUxFQ1RFRDpBQ0MuU1RBVEVfTk9STUFMOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKGludCBldmVudFR5cGUpIHsNCi0JCUV2ZW50IGV2ZW50ID0gbmV3IEV2ZW50KCk7DQotCQlldmVudC50eXBlID0gZXZlbnRUeXBlOw0KLQkJZXZlbnQud2lkZ2V0ID0gdGhpczsNCi0JCW5vdGlmeUxpc3RlbmVycyhldmVudFR5cGUsIGV2ZW50KTsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBwYWludChQYWludEV2ZW50IGUpIHsNCi0JCXN1cGVyLnBhaW50KGUpOw0KLQkgICAJaWYgKGhhc0ZvY3VzKSB7DQotCSAgIAkJR0MgZ2MgPSBlLmdjOw0KLQkgICAJCVBvaW50IHNpemUgPSBnZXRTaXplKCk7DQotCSAgIAkJZ2Muc2V0Rm9yZWdyb3VuZChnZXRGb3JlZ3JvdW5kKCkpOw0KLQkgICAJCWdjLmRyYXdGb2N1cygwLCAwLCBzaXplLngsIHNpemUueSk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCVR5cGVkTGlzdGVuZXIgdHlwZWRMaXN0ZW5lciA9IG5ldyBUeXBlZExpc3RlbmVyIChsaXN0ZW5lcik7DQotCQlhZGRMaXN0ZW5lciAoU1dULlNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsNCi0JCWFkZExpc3RlbmVyIChTV1QuRGVmYXVsdFNlbGVjdGlvbix0eXBlZExpc3RlbmVyKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWNoZWNrV2lkZ2V0ICgpOw0KLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHJldHVybjsNCi0JCXJlbW92ZUxpc3RlbmVyIChTV1QuU2VsZWN0aW9uLCBsaXN0ZW5lcik7DQotCQlyZW1vdmVMaXN0ZW5lciAoU1dULkRlZmF1bHRTZWxlY3Rpb24sIGxpc3RlbmVyKTsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVEYXRhLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkM2NmYzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1RhYmxlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7DQotDQotLyoqDQotICogDQotICogQGF1dGhvciBkZWphbg0KLSAqDQotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvDQotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBHZW5lcmF0aW9uIC0gQ29kZSBhbmQgQ29tbWVudHMNCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVGFibGVEYXRhIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVCA9IDE7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENFTlRFUiA9IDI7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUID0gMzsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gNDsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlERExFID0gNTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gNjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklMTCA9IDc7DQotCXB1YmxpYyBpbnQgY29sc3Bhbj0xOw0KLQlwdWJsaWMgaW50IHJvd3NwYW49MTsNCi0JcHVibGljIGludCBhbGlnbiA9IExFRlQ7DQotCXB1YmxpYyBpbnQgdmFsaWduID0gVE9QOw0KLQlwdWJsaWMgaW50IGluZGVudCA9IDA7DQotCXB1YmxpYyBpbnQgbWF4V2lkdGggPSBTV1QuREVGQVVMVDsNCi0JcHVibGljIGludCBtYXhIZWlnaHQgPSBTV1QuREVGQVVMVDsNCi0JcHVibGljIGludCBoZWlnaHRIaW50ID0gU1dULkRFRkFVTFQ7DQotCXB1YmxpYyBib29sZWFuIGdyYWJIb3Jpem9udGFsPWZhbHNlOw0KLQkNCi0JLy9wcml2YXRlDQotCWludCBjaGlsZEluZGV4Ow0KLQlib29sZWFuIGlzSXRlbURhdGE9dHJ1ZTsgDQotCWludCBjb21wV2lkdGg7DQotCVBvaW50IGNvbXBTaXplOw0KLQkJDQotCXB1YmxpYyBUYWJsZURhdGEoKSB7DQotCX0NCi0JDQotCXB1YmxpYyBUYWJsZURhdGEoaW50IGFsaWduLCBpbnQgdmFsaWduKSB7DQotCQl0aGlzKGFsaWduLCB2YWxpZ24sIDEsIDEpOw0KLQl9DQotCQ0KLQlwdWJsaWMgVGFibGVEYXRhKGludCBhbGlnbiwgaW50IHZhbGlnbiwgaW50IHJvd3NwYW4sIGludCBjb2xzcGFuKSB7DQotCQl0aGlzLmFsaWduID0gYWxpZ247DQotCQl0aGlzLnZhbGlnbiA9IHZhbGlnbjsNCi0JCXRoaXMucm93c3BhbiA9IHJvd3NwYW47DQotCQl0aGlzLmNvbHNwYW4gPSBjb2xzcGFuOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZUxheW91dFRlc3QuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9UYWJsZUxheW91dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3ZTRlMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVGFibGVMYXlvdXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU3RhdHVzTGluZU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LlJvd0xheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KLQ0KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dFRlc3Qgew0KLQ0KLXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgW10gYXJncykgew0KLSAgICAgRGlzcGxheSBkaXNwbGF5ID0gbmV3IERpc3BsYXkgKCk7DQotICAgICBTaGVsbCBzaGVsbCA9IG5ldyBTaGVsbCAoZGlzcGxheSk7DQotICAgICBzaGVsbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7DQotICAgICBmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYyA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShzaGVsbCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsNCi0gICAgLy8gc2Muc2V0QWx3YXlzU2hvd1Njcm9sbEJhcnModHJ1ZSk7DQotICAgICBzYy5zZXRCYWNrZ3JvdW5kKHNjLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfV0hJVEUpKTsNCi0gICAgIGZpbmFsIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShzYywgU1dULk5PTkUpOw0KLSAgICAgLy9jLnNldEJhY2tncm91bmQoYy5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX1JFRCkpOw0KLSAgICAgc2Muc2V0Q29udGVudChjKTsNCi0gICAgIHNjLmFkZExpc3RlbmVyIChTV1QuUmVzaXplLCAgbmV3IExpc3RlbmVyICgpIHsNCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50IChFdmVudCBlKSB7DQotCQkJUmVjdGFuZ2xlIHNzaXplID0gc2MuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJCWludCBzd2lkdGggPSBzc2l6ZS53aWR0aDsNCi0JCQlIVE1MVGFibGVMYXlvdXQgbGF5b3V0ID0gKEhUTUxUYWJsZUxheW91dCljLmdldExheW91dCgpOw0KLQkJCVBvaW50IHNpemUgPSBsYXlvdXQuY29tcHV0ZVNpemUoYywgc3dpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJLy9pZiAoc2l6ZS54IDwgc3dpZHRoKSBzaXplLnggPSBzd2lkdGg7DQotCQkJUmVjdGFuZ2xlIHRyaW0gPSBjLmNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsNCi0JCQlzaXplID0gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsNCi0JCQkvKg0KLQkJCVBvaW50IHNpemUgPSBjLmNvbXB1dGVTaXplKHN3aWR0aCwgU1dULkRFRkFVTFQsIHRydWUpOw0KLQkJCSovDQotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImluOiAiK3N3aWR0aCsiLCBvdXQ6ICIrc2l6ZS54KTsNCi0JCQljLnNldFNpemUoc2l6ZSk7DQotCQl9DQotCX0pOw0KLSAgICAgYy5zZXRCYWNrZ3JvdW5kKGMuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSElURSkpOw0KLSAgICAgSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBIVE1MVGFibGVMYXlvdXQoKTsNCi0gICAgIGxheW91dC5udW1Db2x1bW5zID0gMjsNCi0gICAgIC8vbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsNCi0gICAgIGxheW91dC5sZWZ0TWFyZ2luID0gMDsNCi0gICAgIGxheW91dC5yaWdodE1hcmdpbiA9IDA7DQotICAgICBsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoPWZhbHNlOw0KLSAgICAgLy9sYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0gICAgIC8vbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsNCi0gICAgIGMuc2V0TGF5b3V0KGxheW91dCk7DQotICAgICANCi0gICAgIExhYmVsIGxhYmVsOw0KLSAgICAgQnV0dG9uIGI7DQotICAgICBUYWJsZURhdGEgdGQ7DQotLyogICAgIA0KLSAgICAgbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULk5VTEwpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiU2luZ2xlIGxpbmUxIik7DQotICAgICANCi0gICAgIC8vbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULldSQVApOw0KLSAgICAgVGV4dCB0ZXh0ID0gbmV3IFRleHQoYywgU1dULk1VTFRJIHwgU1dULldSQVApOw0KLSAgICAgdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7DQotICAgICB0ZXh0LnNldFRleHQoIlRoaXMgaXMgYSBtdWNoIGxvbmdlciB0ZXh0IHRoYXQgSSB3YW50IHdyYXBwZWQsIisNCi0gICAgICIgYnV0IGRlcGVuZGluZyBvbiB0aGUgd2luZG93IHNpemUgaXQgY2FuIGJlIHJlbmRlcmVkIGNvbXBsZXRlbHkuIik7DQotICAgICANCi0gICAgIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5QVVNIKTsNCi0gICAgIGIuc2V0VGV4dCgiU2ltcGxlIGJ1dHRvbiIpOw0KLSAgICAgDQotICAgICBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuV1JBUCk7DQotICAgICBsYWJlbC5zZXRUZXh0KCJBbm90aGVyIHRleHQgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSB3cmFwcGVkIik7DQotDQotICAgICBsYWJlbCA9IG5ldyBMYWJlbChjLCBTV1QuTlVMTCk7DQotICAgICB0ZCA9IG5ldyBUYWJsZURhdGEoVGFibGVEYXRhLlJJR0hULCBUYWJsZURhdGEuQk9UVE9NKTsNCi0gICAgIGxhYmVsLnNldExheW91dERhdGEodGQpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiRml4ZWQgbGFiZWwiKTsNCi0gICAgIA0KLSAgICAgQ29tcG9zaXRlIG5lc3RlZCA9IG5ldyBDb21wb3NpdGUoYywgU1dULk5VTEwpOw0KLSAgICAgbGF5b3V0ID0gbmV3IEhUTUxUYWJsZUxheW91dCgpOw0KLSAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLSAgICAgbmVzdGVkLnNldExheW91dChsYXlvdXQpOw0KLSAgICAgYiA9IG5ldyBCdXR0b24obmVzdGVkLCBTV1QuUFVTSCk7DQotICAgICBiLnNldFRleHQoIkJ1dHRvbjIiKTsNCi0gICAgIGxhYmVsID0gbmV3IExhYmVsKG5lc3RlZCwgU1dULldSQVApOw0KLSAgICAgdGQgPSBuZXcgVGFibGVEYXRhKFRhYmxlRGF0YS5MRUZULCBUYWJsZURhdGEuTUlERExFKTsNCi0gICAgIGxhYmVsLnNldExheW91dERhdGEodGQpOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiU29tZSB0ZXh0IGluIHRoZSBuZXN0ZWQgbGFiZWwgdGhhdCBjYW4gYmUgd3JhcHBlZCIpOw0KLSovICAgICANCi0gICAgIGxhYmVsID0gbmV3IExhYmVsKGMsIFNXVC5OVUxMKTsNCi0gICAgIGxhYmVsLnNldFRleHQoIlRleHQgaW4gdGhlIGxlZnQgY29sdW1uIik7DQotICAgICANCi0gICAgIGIgPSBuZXcgQnV0dG9uKGMsIFNXVC5DSEVDSyk7DQotICAgICBiLnNldFRleHQoIkNoZWNrYm94IGluIHRoZSByaWdodCBjb2x1bW4iKTsNCi0NCi0gICAgIA0KLSAgICAgbGFiZWwgPSBuZXcgTGFiZWwoYywgU1dULldSQVApOw0KLSAgICAgbGFiZWwuc2V0VGV4dCgiVGhpcyBhc3NpZ25tZW50IHN0ZXAgaXMgdGhlbiByZXBlYXRlZCBmb3IgbmVzdGVkIHRhYmxlcyB1c2luZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB3aWR0aHMgZGVyaXZlZCBmb3IgYWxsIHN1Y2ggdGFibGVzIGluIHRoZSBmaXJzdCBwYXNzLiBJbiB0aGlzIGNhc2UsIHRoZSB3aWR0aCBvZiB0aGUgcGFyZW50IHRhYmxlIGNlbGwgcGxheXMgdGhlIHJvbGUgb2YgdGhlIGN1cnJlbnQgd2luZG93IHNpemUgaW4gdGhlIGFib3ZlIGRlc2NyaXB0aW9uLiBUaGlzIHByb2Nlc3MgaXMgcmVwZWF0ZWQgcmVjdXJzaXZlbHkgZm9yIGFsbCBuZXN0ZWQgdGFibGVzLiBUaGUgdG9wbW9zdCB0YWJsZSBpcyB0aGVuIHJlbmRlcmVkIHVzaW5nIHRoZSBhc3NpZ25lZCB3aWR0aHMuIE5lc3RlZCB0YWJsZXMgYXJlIHN1YnNlcXVlbnRseSByZW5kZXJlZCBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQgdGFibGUncyBjZWxsIGNvbnRlbnRzLiIpOw0KLSAgICAgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotICAgICB0ZC5jb2xzcGFuID0gMjsNCi0gICAgIHRkLmFsaWduID0gVGFibGVEYXRhLkZJTEw7DQotICAgICBsYWJlbC5zZXRMYXlvdXREYXRhKHRkKTsNCi0gICAgIA0KLSAgICAgRXhwYW5kYWJsZUdyb3VwIGV4cCA9IG5ldyBFeHBhbmRhYmxlR3JvdXAgKFNXVC5XUkFQKSB7DQotICAgICAJcHVibGljIHZvaWQgZmlsbEV4cGFuc2lvbihDb21wb3NpdGUgY29udGFpbmVyLCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7DQotICAgICAJCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7DQotICAgICAJCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsNCi0gICAgIAkJbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAwOw0KLSAgICAgCQlCdXR0b24gYnV0dG9uID0gZmFjdG9yeS5jcmVhdGVCdXR0b24oY29udGFpbmVyLCBudWxsLCBTV1QuUFVTSCk7DQotICAgICAJCWJ1dHRvbi5zZXRUZXh0KCJCdXR0b24iKTsNCi0gICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBleHBhbmRlZCgpIHsNCi0gICAgIAkJYy5sYXlvdXQodHJ1ZSk7DQotICAgICAJCXVwZGF0ZVNpemUoc2MsIGMpOw0KLSAgICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBjb2xsYXBzZWQoKSB7DQotICAgICAJCWMubGF5b3V0KHRydWUpOw0KLSAgICAgCQl1cGRhdGVTaXplKHNjLCBjKTsNCi0gICAgIAl9DQotICAgICB9Ow0KLSAgICAgZXhwLnNldFRleHQoIkV4cGFuZGFibGUgU2VjdGlvbiIpOw0KLSAgICAgLy9leHAuc2V0RXhwYW5kYWJsZShmYWxzZSk7DQotICAgICBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5ID0gbmV3IEZvcm1XaWRnZXRGYWN0b3J5KCk7DQotICAgICBleHAuY3JlYXRlQ29udHJvbChjLCBmYWN0b3J5KTsNCi0gICAgIC8vZXhwLmdldENvbnRyb2woKS5zZXRCYWNrZ3JvdW5kKGxhYmVsLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfR1JFRU4pKTsNCi0gICAgIHRkID0gbmV3IFRhYmxlRGF0YSgpOw0KLSAgICAgdGQuY29sc3BhbiA9IDI7DQotICAgICB0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLSAgICAgZXhwLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKHRkKTsNCi0gICAgIA0KLQkgU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlciA9IG5ldyBTdGF0dXNMaW5lTWFuYWdlcigpOw0KLSAgICAgLy9hZGRGb3JtRW5naW5lKGMsIGZhY3RvcnksIG1hbmFnZXIpOw0KLSAgICAgLy9hZGRGb3JtRW5naW5lKGMsIGZhY3RvcnksIG1hbmFnZXIpOw0KLSAgICAgLy9hZGRGb3JtRW5naW5lKGMsIGZhY3RvcnksIG1hbmFnZXIpOw0KLSAgICAgDQotICAgICBhZGRSb3coYyk7DQotIA0KLSAgICAgQ29udHJvbCBtY29udHJvbCA9IG1hbmFnZXIuY3JlYXRlQ29udHJvbChjKTsNCi0gICAgIHRkID0gbmV3IFRhYmxlRGF0YSgpOw0KLSAgICAgdGQuY29sc3BhbiA9IDI7DQotICAgICB0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLSAgICAgbWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7DQotICAgICANCi0gICAgIGZhY3Rvcnkuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZShIeXBlcmxpbmtIYW5kbGVyLlVOREVSTElORV9ST0xMT1ZFUik7DQotICAgICANCi0gICAgIFNlbGVjdGFibGVGb3JtTGFiZWwgZnQgPSBuZXcgU2VsZWN0YWJsZUZvcm1MYWJlbChjLCBTV1QuV1JBUCk7DQotICAgICBmdC5zZXRUZXh0KCJTb21lIHRleHQgaW4gdGhlIGZvcm0gdGV4dCB0aGF0IHNob3VsZCBhbHNvIHdyYXAiKTsNCi0gICAgIGZhY3RvcnkudHVybkludG9IeXBlcmxpbmsoZnQsIG5ldyBJSHlwZXJsaW5rTGlzdGVuZXIoKSB7DQotICAgICAJcHVibGljIHZvaWQgbGlua0VudGVyZWQoQ29udHJvbCBsaW5rKSB7DQotICAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiTGluayBlbnRlcmVkIik7DQotICAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGxpbmtFeGl0ZWQoQ29udHJvbCBsaW5rKSB7DQotICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGV4aXRlZCIpOw0KLSAgICAgCX0NCi0gICAgIAlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGluaykgew0KLSAgICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgYWN0aXZhdGVkIik7DQotICAgICAJfQ0KLSAgICAgfSk7DQotDQotICAgICBmdCA9IG5ldyBTZWxlY3RhYmxlRm9ybUxhYmVsKGMsIFNXVC5XUkFQKTsNCi0gICAgIGZ0LnNldFRleHQoIlNvbWUgbW9yZSBmb3JtIHRleHQgaGVyZSIpOw0KLSAgICAgZmFjdG9yeS50dXJuSW50b0h5cGVybGluayhmdCwgbmV3IElIeXBlcmxpbmtMaXN0ZW5lcigpIHsNCi0gICAgIAlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChDb250cm9sIGxpbmspIHsNCi0gICAgIAkJU3lzdGVtLm91dC5wcmludGxuKCJMaW5rIGVudGVyZWQiKTsNCi0gICAgIAl9DQotICAgICAJcHVibGljIHZvaWQgbGlua0V4aXRlZChDb250cm9sIGxpbmspIHsNCi0gICAgCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxpbmsgZXhpdGVkIik7DQotICAgICAJfQ0KLSAgICAgCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7DQotICAgICAJCVN5c3RlbS5vdXQucHJpbnRsbigiTGluayBhY3RpdmF0ZWQiKTsNCi0gICAgIAl9DQotICAgICB9KTsNCi0gICANCi0gICAgIHNoZWxsLm9wZW4gKCk7DQotICAgICB3aGlsZSAoIXNoZWxsLmlzRGlzcG9zZWQgKCkpIHsNCi0gICAgICAgICAgaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCAoKSkgZGlzcGxheS5zbGVlcCAoKTsNCi0gICAgIH0NCi0gICAgIGRpc3BsYXkuZGlzcG9zZSAoKTsNCi19DQotDQotLyoNCi0NCi1wdWJsaWMgc3RhdGljIHZvaWQgYWRkRm9ybUVuZ2luZShDb21wb3NpdGUgYywgRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSwgSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsNCi0gICAgIG5ldyBMYWJlbChjLCBTV1QuTlVMTCk7DQotICAgICBSaWNoVGV4dCBodG1sID0gbmV3IFJpY2hUZXh0KGMsIFNXVC5XUkFQKTsNCi0gICAgIGh0bWwuc2V0SHlwZXJsaW5rU2V0dGluZ3MoZmFjdG9yeS5nZXRIeXBlcmxpbmtIYW5kbGVyKCkpOw0KLSAgICAgUmljaFRleHRIVFRQQWN0aW9uIGFjdGlvbiA9IG5ldyBSaWNoVGV4dEhUVFBBY3Rpb24obWFuYWdlcik7DQotICAgICBVUkwgaTFVUkwgPSBUYWJsZUxheW91dFRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoImltYWdlMS5naWYiKTsNCi0gICAgIEltYWdlRGVzY3JpcHRvciBpZDEgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpMVVSTCk7DQotICAgICBodG1sLnJlZ2lzdGVyVGV4dE9iamVjdCgidXJsSGFuZGxlciIsIGFjdGlvbik7DQotICAgICBodG1sLnJlZ2lzdGVyVGV4dE9iamVjdCgiaW1hZ2UxIiwgaWQxLmNyZWF0ZUltYWdlKCkpOw0KLSAgICAgLy9odG1sLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7DQotICAgICBodG1sLnNldEZvcmVncm91bmQoZmFjdG9yeS5nZXRGb3JlZ3JvdW5kQ29sb3IoKSk7DQotICAgICBJbnB1dFN0cmVhbSBpcyA9IFRhYmxlTGF5b3V0VGVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCJpbmRleC54bWwiKTsNCi0gICAgIC8vaHRtbC5zZXRQYXJhZ3JhcGhzU2VwYXJhdGVkKGZhbHNlKTsNCi0gICAgIGh0bWwuc2V0Q29udGVudHMoaXMsIHRydWUpOw0KLSAgICAgVGFibGVEYXRhIHRkID0gbmV3IFRhYmxlRGF0YSgpOw0KLSAgICAgdGQuY29sc3BhbiA9IDE7DQotICAgICB0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLSAgICAgaHRtbC5zZXRMYXlvdXREYXRhKHRkKTsNCi19DQotKi8NCi0NCi1wdWJsaWMgc3RhdGljIHZvaWQgYWRkUm93KENvbXBvc2l0ZSBjKSB7DQotCUNvbXBvc2l0ZSByb3cgPSBuZXcgQ29tcG9zaXRlKGMsIFNXVC5XUkFQKTsNCi0JUm93TGF5b3V0IGxheW91dCA9IG5ldyBSb3dMYXlvdXQoKTsNCi0JbGF5b3V0LndyYXAgPSB0cnVlOw0KLQlyb3cuc2V0TGF5b3V0KGxheW91dCk7DQotCQ0KLQlmb3IgKGludCBpPTA7IGk8MTA7IGkrKykgew0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocm93LCBTV1QuUFVTSCk7DQotCQlidXR0b24uc2V0VGV4dCgiQnV0dG9uIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQiKTsNCi0JfQ0KLQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7DQotCXRkLmNvbHNwYW4gPSAyOw0KLQl0ZC5hbGlnbiA9IFRhYmxlRGF0YS5GSUxMOw0KLQl0ZC5ncmFiSG9yaXpvbnRhbCA9IHRydWU7DQotCXJvdy5zZXRMYXlvdXREYXRhKHRkKTsNCi19DQotDQotcHJpdmF0ZSBzdGF0aWMgdm9pZCB1cGRhdGVTaXplKFNjcm9sbGVkQ29tcG9zaXRlIHNjLCBDb21wb3NpdGUgYykgew0KLQlSZWN0YW5nbGUgc3NpemUgPSBzYy5nZXRDbGllbnRBcmVhKCk7DQotCWludCBzd2lkdGggPSBzc2l6ZS53aWR0aDsNCi0JSFRNTFRhYmxlTGF5b3V0IGxheW91dCA9IChIVE1MVGFibGVMYXlvdXQpYy5nZXRMYXlvdXQoKTsNCi0JUG9pbnQgc2l6ZSA9IGxheW91dC5jb21wdXRlU2l6ZShjLCBzd2lkdGgsIFNXVC5ERUZBVUxULCB0cnVlKTsNCi0JUmVjdGFuZ2xlIHRyaW0gPSBjLmNvbXB1dGVUcmltKDAsIDAsIHNpemUueCwgc2l6ZS55KTsNCi0Jc2l6ZSA9IG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7DQotCWMuc2V0U2l6ZShzaXplKTsNCi19DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ub2dnbGVDb250cm9sLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvVG9nZ2xlQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGExMjdlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9Ub2dnbGVDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7DQotDQotcHVibGljIGNsYXNzIFRvZ2dsZUNvbnRyb2wgZXh0ZW5kcyBTZWxlY3RhYmxlQ29udHJvbCB7DQotCXByaXZhdGUgYm9vbGVhbiBzZWxlY3Rpb247DQotCXByaXZhdGUgQ29sb3IgZGVjb3JhdGlvbkNvbG9yOw0KLQlwcml2YXRlIENvbG9yIGFjdGl2ZUNvbG9yOw0KLQlwcml2YXRlIEN1cnNvciBhY3RpdmVDdXJzb3I7DQotCXByaXZhdGUgYm9vbGVhbiBob3Zlcj1mYWxzZTsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1hcmdpbldpZHRoID0gMjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IG1hcmdpbkhlaWdodCA9IDI7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSURUSCA9IDk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIRUlHSFQgPSA5Ow0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gb2ZmUG9pbnRzID0geyAwLDIsIDgsMiwgNCw2IH07DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBvblBvaW50cyA9IHsgMiwgLTEsIDIsOCwgNiw0IH07CQ0KLQ0KLQlwdWJsaWMgVG9nZ2xlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsNCi0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOw0KLQkJYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlzZWxlY3Rpb24gPSAhc2VsZWN0aW9uOw0KLQkJCQlyZWRyYXcoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWFkZE1vdXNlVHJhY2tMaXN0ZW5lcihuZXcgTW91c2VUcmFja0FkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgbW91c2VFbnRlcihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaG92ZXIgPSB0cnVlOw0KLQkJCQlpZiAoYWN0aXZlQ3Vyc29yIT1udWxsKQ0KLQkJCQkgICBzZXRDdXJzb3IoYWN0aXZlQ3Vyc29yKTsNCi0JCQkJcmVkcmF3KCk7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaG92ZXIgPSBmYWxzZTsNCi0JCQkJaWYgKGFjdGl2ZUN1cnNvciE9bnVsbCkNCi0JCQkJICAgc2V0Q3Vyc29yKG51bGwpOw0KLQkJCQlyZWRyYXcoKTsNCi0JCQl9DQotCQl9KTsNCi0JCWluaXRBY2Nlc3NpYmxlKCk7DQotCX0NCi0Jdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsNCi0JCWdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldEhlbHAoQWNjZXNzaWJsZUV2ZW50IGUpIHsNCi0JCQkJZS5yZXN1bHQgPSBnZXRUb29sVGlwVGV4dCgpOw0KLQkJCX0NCi0JCX0pOw0KLQkJDQotCQlnZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUG9pbnQgdGVzdFBvaW50ID0gdG9Db250cm9sKG5ldyBQb2ludChlLngsIGUueSkpOw0KLQkJCQlpZiAoZ2V0Qm91bmRzKCkuY29udGFpbnModGVzdFBvaW50KSkgew0KLQkJCQkJZS5jaGlsZElEID0gQUNDLkNISUxESURfU0VMRjsNCi0JCQkJfQ0KLQkJCX0NCi0JCQ0KLQkJCXB1YmxpYyB2b2lkIGdldExvY2F0aW9uKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQlSZWN0YW5nbGUgbG9jYXRpb24gPSBnZXRCb3VuZHMoKTsNCi0JCQkJUG9pbnQgcHQgPSB0b0Rpc3BsYXkobmV3IFBvaW50KGxvY2F0aW9uLngsIGxvY2F0aW9uLnkpKTsNCi0JCQkJZS54ID0gcHQueDsNCi0JCQkJZS55ID0gcHQueTsNCi0JCQkJZS53aWR0aCA9IGxvY2F0aW9uLndpZHRoOw0KLQkJCQllLmhlaWdodCA9IGxvY2F0aW9uLmhlaWdodDsNCi0JCQl9DQotCQkNCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IDA7DQotCQkJfQ0KLQkJDQotCQkJcHVibGljIHZvaWQgZ2V0Um9sZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJZS5kZXRhaWwgPSBBQ0MuUk9MRV9UUkVFOw0KLQkJCX0NCi0JCQ0KLQkJCXB1YmxpYyB2b2lkIGdldFN0YXRlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IFRvZ2dsZUNvbnRyb2wudGhpcy5nZXRTZWxlY3Rpb24oKT9BQ0MuU1RBVEVfRVhQQU5ERUQ6QUNDLlNUQVRFX0NPTExBUFNFRDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gVG9nZ2xlQ29udHJvbC50aGlzLmdldFNlbGVjdGlvbigpPyIxIjoiMCI7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldERlY29yYXRpb25Db2xvcihDb2xvciBkZWNvcmF0aW9uQ29sb3IpIHsNCi0JCXRoaXMuZGVjb3JhdGlvbkNvbG9yID0gZGVjb3JhdGlvbkNvbG9yOw0KLQl9DQotCQ0KLQlwdWJsaWMgQ29sb3IgZ2V0RGVjb3JhdGlvbkNvbG9yKCkgew0KLQkJcmV0dXJuIGRlY29yYXRpb25Db2xvcjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRGVjb3JhdGlvbkNvbG9yKENvbG9yIGFjdGl2ZUNvbG9yKSB7DQotCQl0aGlzLmFjdGl2ZUNvbG9yID0gYWN0aXZlQ29sb3I7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUN1cnNvcihDdXJzb3IgYWN0aXZlQ3Vyc29yKSB7DQotCQl0aGlzLmFjdGl2ZUN1cnNvciA9IGFjdGl2ZUN1cnNvcjsNCi0JfQ0KLQkNCi0JcHVibGljIENvbG9yIGdldEFjdGl2ZURlY29yYXRpb25Db2xvcigpIHsNCi0JCXJldHVybiBhY3RpdmVDb2xvcjsNCi0JfQ0KLQkNCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsNCi0JCWludCB3aWR0aCwgaGVpZ2h0Ow0KLQkJDQotCQlpZiAod0hpbnQhPVNXVC5ERUZBVUxUKSB3aWR0aCA9IHdIaW50OyANCi0JCWVsc2UgDQotCQkgICB3aWR0aCA9IFdJRFRIICsgMiptYXJnaW5XaWR0aDsNCi0JCWlmIChoSGludCE9U1dULkRFRkFVTFQpIGhlaWdodCA9IGhIaW50Ow0KLQkJZWxzZSBoZWlnaHQgPSBIRUlHSFQgKyAyKm1hcmdpbkhlaWdodDsNCi0JCXJldHVybiBuZXcgUG9pbnQod2lkdGgsIGhlaWdodCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBTZWxlY3RhYmxlQ29udHJvbCNwYWludChHQykNCi0JICovDQotCXByb3RlY3RlZCB2b2lkIHBhaW50KEdDIGdjKSB7DQotCQlpZiAoaG92ZXIgJiYgYWN0aXZlQ29sb3IhPW51bGwpDQotCQkJZ2Muc2V0QmFja2dyb3VuZChhY3RpdmVDb2xvcik7DQotCQllbHNlIGlmIChkZWNvcmF0aW9uQ29sb3IhPW51bGwpDQotCSAgIAkgICBnYy5zZXRCYWNrZ3JvdW5kKGRlY29yYXRpb25Db2xvcik7DQotCSAgIAllbHNlDQotCSAgIAkJCWdjLnNldEJhY2tncm91bmQoZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JCWludCBbXSBkYXRhOw0KLQkJUG9pbnQgc2l6ZSA9IGdldFNpemUoKTsNCi0JCWludCB4ID0gKHNpemUueCAtIDkpLzI7DQotCQlpbnQgeSA9IChzaXplLnkgLSA5KS8yOw0KLQkJaWYgKHNlbGVjdGlvbikNCi0JCQlkYXRhID0gdHJhbnNsYXRlKG9uUG9pbnRzLCB4LCB5KTsNCi0JCWVsc2UgDQotCQkJZGF0YSA9IHRyYW5zbGF0ZShvZmZQb2ludHMsIHgsIHkpOw0KLQkJZ2MuZmlsbFBvbHlnb24oZGF0YSk7DQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7DQotCX0NCi0JDQotCXByaXZhdGUgaW50IFtdIHRyYW5zbGF0ZShpbnQgW10gZGF0YSwgaW50IHgsIGludCB5KSB7DQotCQlpbnQgW10gdGFyZ2V0ID0gbmV3IGludCBbZGF0YS5sZW5ndGhdOw0KLQkJZm9yIChpbnQgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKz0yKSB7DQotCQkJdGFyZ2V0W2ldID0gZGF0YVtpXSsgeDsNCi0JCX0NCi0JCWZvciAoaW50IGk9MTsgaTxkYXRhLmxlbmd0aDsgaSs9Mikgew0KLQkJCXRhcmdldFtpXSA9IGRhdGFbaV0reTsNCi0JCX0NCi0JCXJldHVybiB0YXJnZXQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gZ2V0U2VsZWN0aW9uKCkgew0KLQkJcmV0dXJuIHNlbGVjdGlvbjsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKGJvb2xlYW4gc2VsZWN0aW9uKSB7DQotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvV2ViRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL1dlYkZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2Yzc2ZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvV2ViRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi0NCi0vKioNCi0gKiBUaGlzIGZvcm0gaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IGl0IGNvbnRhaW5zDQotICogY2hpbGRyZW4gdGhhdCBkbyBub3QgaGF2ZSBpbmRlcGVuZGVudCBkaW1lbnNpb25zLg0KLSAqIEluIG90aGVyIHdvcmRzLCB0aGVzZSB3aWRnZXRzIGFyZSBub3QgY2FwYWJsZQ0KLSAqIG9mIGFuc3dlcmluZyB0aGVpciBwcmVmZXJyZWQgc2l6ZS4gSW5zdGVhZCwNCi0gKiBkZXNpcmVkIHdpZHRoIG11c3QgYmUgc3VwcGxpZWQgdG8gZ2V0IHRoZQ0KLSAqIHByZWZlcnJlZCBoZWlnaHQuIFRoZXNlIGZvcm1zIGFyZSBsYXllZCBvdXQNCi0gKiB0b3AgdG8gYm90dG9tLCBsZWZ0IHRvIHJpZ2h0IGFuZCB1c2UNCi0gKiBhIGxheW91dCBhbGdvcml0aG0gdmVyeSBzaW1pbGFyIHRvDQotICogSFRNTCB0YWJsZXMuIFNjcm9sbGluZyBpcyBub3Qgb3B0aW9uYWwNCi0gKiBmb3IgdGhpcyB0eXBlIG9mIHByZXNlbnRhdGlvbiAtIA0KLSAqIHNjcm9sbCBiYXJzIHdpbGwgc2hvdyB1cCB3aGVuIG5lZWRlZC4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgV2ViRm9ybSBleHRlbmRzIEFic3RyYWN0U2VjdGlvbkZvcm0gew0KLQlwcm90ZWN0ZWQgU2Nyb2xsZWRDb21wb3NpdGUgc2Nyb2xsQ29tcG9zaXRlOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOw0KLQlwcml2YXRlIENvbXBvc2l0ZSBjbGllbnQ7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBITUFSR0lOID0gNTsNCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFZNQVJHSU4gPSA1Ow0KLQlwcml2YXRlIEltYWdlIGhlYWRpbmdVbmRlcmxpbmVJbWFnZTsNCi0NCi0JY2xhc3MgV2ViRm9ybUxheW91dCBleHRlbmRzIExheW91dCB7DQotDQotCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7DQotCQkJaW50IHggPSAwOw0KLQkJCWludCB5ID0gMDsNCi0JCQlpZiAoaXNIZWFkaW5nVmlzaWJsZSgpKSB7DQotCQkJCXkgPSBnZXRIZWFkaW5nSGVpZ2h0KHBhcmVudCk7DQotCQkJfQ0KLQkJCVBvaW50IGNzaXplOw0KLQ0KLQkJCUxheW91dCBsYXlvdXQgPSBjbGllbnQuZ2V0TGF5b3V0KCk7DQotCQkJaWYgKGxheW91dCAhPSBudWxsICYmIGxheW91dCBpbnN0YW5jZW9mIEhUTUxUYWJsZUxheW91dCkgew0KLQkJCQlIVE1MVGFibGVMYXlvdXQgaGxheW91dCA9IChIVE1MVGFibGVMYXlvdXQpIGxheW91dDsNCi0JCQkJY3NpemUgPSBobGF5b3V0LmNvbXB1dGVTaXplKGNsaWVudCwgYm91bmRzLndpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJCWlmIChjc2l6ZS54IDwgYm91bmRzLndpZHRoKQ0KLQkJCQkJY3NpemUueCA9IGJvdW5kcy53aWR0aDsNCi0JCQkJUmVjdGFuZ2xlIHRyaW0gPSBjb250cm9sLmNvbXB1dGVUcmltKDAsIDAsIGNzaXplLngsIGNzaXplLnkpOw0KLQkJCQljc2l6ZSA9IG5ldyBQb2ludCh0cmltLndpZHRoLCB0cmltLmhlaWdodCk7DQotCQkJfSBlbHNlIHsNCi0JCQkJY3NpemUgPSBjbGllbnQuY29tcHV0ZVNpemUoYm91bmRzLndpZHRoLCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJfQ0KLQkJCWNsaWVudC5zZXRCb3VuZHMoeCwgeSwgY3NpemUueCwgY3NpemUueSk7DQotCQl9DQotDQotCQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoDQotCQkJQ29tcG9zaXRlIHBhcmVudCwNCi0JCQlpbnQgd0hpbnQsDQotCQkJaW50IGhIaW50LA0KLQkJCWJvb2xlYW4gY2hhbmdlZCkgew0KLQkJCWludCB3aWR0aCA9IHdIaW50Ow0KLQkJCWludCBoZWlnaHQgPSAwOw0KLQkJCWlmIChpc0hlYWRpbmdWaXNpYmxlKCkpIHsNCi0JCQkJaGVpZ2h0ID0gZ2V0SGVhZGluZ0hlaWdodChwYXJlbnQpOw0KLQkJCX0NCi0JCQlQb2ludCBjc2l6ZTsNCi0JCQlMYXlvdXQgbGF5b3V0ID0gY2xpZW50LmdldExheW91dCgpOw0KLQ0KLQkJCWlmIChsYXlvdXQgIT0gbnVsbCAmJiBsYXlvdXQgaW5zdGFuY2VvZiBIVE1MVGFibGVMYXlvdXQpIHsNCi0JCQkJSFRNTFRhYmxlTGF5b3V0IGhsYXlvdXQgPSAoSFRNTFRhYmxlTGF5b3V0KSBsYXlvdXQ7DQotCQkJCWNzaXplID0gaGxheW91dC5jb21wdXRlU2l6ZShjbGllbnQsIHdpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQkJCWlmIChjc2l6ZS54IDwgd2lkdGgpDQotCQkJCQljc2l6ZS54ID0gd2lkdGg7DQotCQkJCVJlY3RhbmdsZSB0cmltID0gY29udHJvbC5jb21wdXRlVHJpbSgwLCAwLCBjc2l6ZS54LCBjc2l6ZS55KTsNCi0JCQkJY3NpemUgPSBuZXcgUG9pbnQodHJpbS53aWR0aCwgdHJpbS5oZWlnaHQpOw0KLQkJCX0gZWxzZSB7DQotCQkJCWNzaXplID0gY2xpZW50LmNvbXB1dGVTaXplKHdpZHRoLCBTV1QuREVGQVVMVCwgY2hhbmdlZCk7DQotCQkJfQ0KLQkJCXdpZHRoID0gY3NpemUueDsNCi0JCQloZWlnaHQgKz0gY3NpemUueTsNCi0JCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoLCBoZWlnaHQpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBXZWJGb3JtKCkgew0KLQl9DQotDQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJc2Nyb2xsQ29tcG9zaXRlID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsNCi0JCXNjcm9sbENvbXBvc2l0ZS5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOw0KLQkJc2Nyb2xsQ29tcG9zaXRlLnNldE1lbnUocGFyZW50LmdldE1lbnUoKSk7DQotCQlmaW5hbCBDb21wb3NpdGUgZm9ybSA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHNjcm9sbENvbXBvc2l0ZSk7DQotDQotCQlzY3JvbGxDb21wb3NpdGUuc2V0Q29udGVudChmb3JtKTsNCi0JCXNjcm9sbENvbXBvc2l0ZS5hZGRMaXN0ZW5lcihTV1QuUmVzaXplLCBuZXcgTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgew0KLQkJCQl1cGRhdGVTaXplKCk7DQotCQkJfQ0KLQkJfSk7DQotCQlXZWJGb3JtTGF5b3V0IGxheW91dCA9IG5ldyBXZWJGb3JtTGF5b3V0KCk7DQotCQlmb3JtLnNldExheW91dChsYXlvdXQpOw0KLQkJZm9ybS5hZGRQYWludExpc3RlbmVyKG5ldyBQYWludExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsNCi0JCQkJcGFpbnQoZSk7DQotCQkJfQ0KLQkJfSk7DQotCQl0aGlzLmNvbnRyb2wgPSBmb3JtOw0KLQkJY2xpZW50ID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUoZm9ybSk7DQotCQljcmVhdGVDb250ZW50cyhjbGllbnQpOw0KLQkJaW5pdGlhbGl6ZVNjcm9sbEJhcnMoc2Nyb2xsQ29tcG9zaXRlKTsNCi0JCS8vZm9ybS5zZXRGb2N1cygpOw0KLQkJcmV0dXJuIHNjcm9sbENvbXBvc2l0ZTsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNjcm9sbEJhcnMoU2Nyb2xsZWRDb21wb3NpdGUgc2NvbXApIHsNCi0JCVNjcm9sbEJhciBoYmFyID0gc2NvbXAuZ2V0SG9yaXpvbnRhbEJhcigpOw0KLQkJaWYgKGhiYXIgIT0gbnVsbCkgew0KLQkJCWhiYXIuc2V0SW5jcmVtZW50KEhfU0NST0xMX0lOQ1JFTUVOVCk7DQotCQl9DQotCQlTY3JvbGxCYXIgdmJhciA9IHNjb21wLmdldFZlcnRpY2FsQmFyKCk7DQotCQlpZiAodmJhciAhPSBudWxsKSB7DQotCQkJdmJhci5zZXRJbmNyZW1lbnQoVl9TQ1JPTExfSU5DUkVNRU5UKTsNCi0JCX0NCi0JCXVwZGF0ZVBhZ2VJbmNyZW1lbnQoc2NvbXApOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0SGVhZGluZ0hlaWdodChDb21wb3NpdGUgcGFyZW50KSB7DQotCQlpbnQgd2lkdGggPSBwYXJlbnQuZ2V0U2l6ZSgpLng7DQotCQlpbnQgaGVpZ2h0ID0gMDsNCi0JCWludCBpbWFnZUhlaWdodCA9IDA7DQotCQlpZiAoZ2V0SGVhZGluZ0ltYWdlKCkgIT0gbnVsbCkgew0KLQkJCVJlY3RhbmdsZSBpYm91bmRzID0gZ2V0SGVhZGluZ0ltYWdlKCkuZ2V0Qm91bmRzKCk7DQotCQkJaW1hZ2VIZWlnaHQgPSBpYm91bmRzLmhlaWdodDsNCi0JCX0NCi0JCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7DQotCQlnYy5zZXRGb250KHRpdGxlRm9udCk7DQotCQlpbnQgdGV4dFdpZHRoID0gd2lkdGggLSAyICogSE1BUkdJTjsNCi0JCWhlaWdodCA9IEZvcm1MYWJlbC5jb21wdXRlV3JhcEhlaWdodChnYywgZ2V0SGVhZGluZ1RleHQoKSwgdGV4dFdpZHRoKTsNCi0JCWhlaWdodCArPSAyICogVk1BUkdJTjsNCi0JCWhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgaW1hZ2VIZWlnaHQpOw0KLQkJaWYgKGhlYWRpbmdVbmRlcmxpbmVJbWFnZSAhPSBudWxsKSB7DQotCQkJUmVjdGFuZ2xlIGlib3VuZHMgPSBoZWFkaW5nVW5kZXJsaW5lSW1hZ2UuZ2V0Qm91bmRzKCk7DQotCQkJaGVpZ2h0ICs9IGlib3VuZHMuaGVpZ2h0Ow0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJcmV0dXJuIGhlaWdodDsNCi0JfQ0KLQ0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7DQotCX0NCi0NCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsNCi0JCXJldHVybiBjb250cm9sOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEhlYWRpbmdWaXNpYmxlKGJvb2xlYW4gbmV3SGVhZGluZ1Zpc2libGUpIHsNCi0JCXN1cGVyLnNldEhlYWRpbmdWaXNpYmxlKG5ld0hlYWRpbmdWaXNpYmxlKTsNCi0JCWlmIChjb250cm9sICE9IG51bGwpDQotCQkJY29udHJvbC5sYXlvdXQoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SGVhZGluZ1VuZGVybGluZUltYWdlKCkgew0KLQkJcmV0dXJuIGhlYWRpbmdVbmRlcmxpbmVJbWFnZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRIZWFkaW5nVW5kZXJsaW5lSW1hZ2UoSW1hZ2UgaW1hZ2UpIHsNCi0JCXRoaXMuaGVhZGluZ1VuZGVybGluZUltYWdlID0gaW1hZ2U7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgew0KLQkJdGl0bGVGb250ID0gSkZhY2VSZXNvdXJjZXMuZ2V0SGVhZGVyRm9udCgpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQljb250cm9sLmxheW91dCgpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIeXBlcmxpbmtDb2xvcnMoKSB7DQotCQlmYWN0b3J5LnVwZGF0ZUh5cGVybGlua0NvbG9ycygpOw0KLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCAmJiAhY29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHVwZGF0ZVNpemUoKSB7DQotCQlSZWN0YW5nbGUgc3NpemUgPSBzY3JvbGxDb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOw0KLQkJaW50IHN3aWR0aCA9IHNzaXplLndpZHRoOw0KLQkJV2ViRm9ybUxheW91dCBsYXlvdXQgPSAoV2ViRm9ybUxheW91dCkgY29udHJvbC5nZXRMYXlvdXQoKTsNCi0JCVBvaW50IHNpemUgPSBsYXlvdXQuY29tcHV0ZVNpemUoY29udHJvbCwgc3dpZHRoLCBTV1QuREVGQVVMVCwgdHJ1ZSk7DQotCQlpZiAoc2l6ZS54IDwgc3dpZHRoKQ0KLQkJCXNpemUueCA9IHN3aWR0aDsNCi0JCVJlY3RhbmdsZSB0cmltID0gY29udHJvbC5jb21wdXRlVHJpbSgwLCAwLCBzaXplLngsIHNpemUueSk7DQotCQlzaXplID0gbmV3IFBvaW50KHRyaW0ud2lkdGgsIHRyaW0uaGVpZ2h0KTsNCi0JCWNvbnRyb2wuc2V0U2l6ZShzaXplKTsNCi0JCXVwZGF0ZVBhZ2VJbmNyZW1lbnQoc2Nyb2xsQ29tcG9zaXRlKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlpZiAoaXNIZWFkaW5nVmlzaWJsZSgpID09IGZhbHNlKQ0KLQkJCXJldHVybjsNCi0JCUdDIGdjID0gZS5nYzsNCi0JCWlmIChoZWFkaW5nSW1hZ2UgIT0gbnVsbCkgew0KLQkJCWdjLmRyYXdJbWFnZShoZWFkaW5nSW1hZ2UsIDAsIDApOw0KLQkJfQ0KLQkJUG9pbnQgc2l6ZSA9IGNvbnRyb2wuZ2V0U2l6ZSgpOw0KLQkJaWYgKGdldEhlYWRpbmdCYWNrZ3JvdW5kKCkgIT0gbnVsbCkNCi0JCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEhlYWRpbmdCYWNrZ3JvdW5kKCkpOw0KLQkJaWYgKGdldEhlYWRpbmdGb3JlZ3JvdW5kKCkgIT0gbnVsbCkNCi0JCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEhlYWRpbmdGb3JlZ3JvdW5kKCkpOw0KLQkJZ2Muc2V0Rm9udCh0aXRsZUZvbnQpOw0KLQkJRm9ybUxhYmVsLnBhaW50V3JhcFRleHQoZ2MsIHNpemUsIGdldEhlYWRpbmdUZXh0KCksIEhNQVJHSU4sIFZNQVJHSU4pOw0KLQkJaWYgKGhlYWRpbmdVbmRlcmxpbmVJbWFnZSAhPSBudWxsKSB7DQotCQkJaW50IHkgPQ0KLQkJCQlnZXRIZWFkaW5nSGVpZ2h0KGNvbnRyb2wpDQotCQkJCQktIGhlYWRpbmdVbmRlcmxpbmVJbWFnZS5nZXRCb3VuZHMoKS5oZWlnaHQ7DQotCQkJZ2MuZHJhd0ltYWdlKGhlYWRpbmdVbmRlcmxpbmVJbWFnZSwgMCwgeSk7DQotCQl9DQotCX0NCi0JcHVibGljIHZvaWQgc2V0SGVhZGluZ1RleHQoU3RyaW5nIGhlYWRpbmdUZXh0KSB7DQotCQlzdXBlci5zZXRIZWFkaW5nVGV4dChoZWFkaW5nVGV4dCk7DQotCQlpZiAoY29udHJvbCE9bnVsbCkNCi0JCQljb250cm9sLnJlZHJhdygpOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvQnVsbGV0UGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0J1bGxldFBhcmFncmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTNmODM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvQnVsbGV0UGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLQotcHVibGljIGNsYXNzIEJ1bGxldFBhcmFncmFwaCBleHRlbmRzIFBhcmFncmFwaCBpbXBsZW1lbnRzIElCdWxsZXRQYXJhZ3JhcGggewotCXByaXZhdGUgaW50IHN0eWxlID0gQ0lSQ0xFOwotCXByaXZhdGUgU3RyaW5nIHRleHQ7Ci0JcHJpdmF0ZSBpbnQgQ0lSQ0xFX0RJQU0gPSA1OwotCXByaXZhdGUgaW50IFNQQUNJTkcgPSAxMDsKLQlwcml2YXRlIGludCBpbmRlbnQgPSAtMTsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQnVsbGV0UGFyYWdyYXBoLgotCSAqIEBwYXJhbSBhZGRWZXJ0aWNhbFNwYWNlCi0JICovCi0JcHVibGljIEJ1bGxldFBhcmFncmFwaChib29sZWFuIGFkZFZlcnRpY2FsU3BhY2UpIHsKLQkJc3VwZXIoYWRkVmVydGljYWxTcGFjZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbmRlbnQoKSB7Ci0JCWlmIChpbmRlbnQgIT0gLTEpCi0JCQlyZXR1cm4gaW5kZW50OwotCQlzd2l0Y2ggKHN0eWxlKSB7Ci0JCQljYXNlIENJUkNMRSA6Ci0JCQkJcmV0dXJuIENJUkNMRV9ESUFNICsgU1BBQ0lORzsKLQkJfQotCQlyZXR1cm4gMjA7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElCdWxsZXRQYXJhZ3JhcGgjZ2V0QnVsbGV0U3R5bGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QnVsbGV0U3R5bGUoKSB7Ci0JCXJldHVybiBzdHlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWxsZXRTdHlsZShpbnQgc3R5bGUpIHsKLQkJdGhpcy5zdHlsZSA9IHN0eWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ1bGxldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy50ZXh0ID0gdGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmRlbnQoaW50IGluZGVudCkgewotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSUJ1bGxldFBhcmFncmFwaCNnZXRCdWxsZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bGxldFRleHQoKSB7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50KAotCQlHQyBnYywKLQkJaW50IHdpZHRoLAotCQlMb2NhdG9yIGxvYywKLQkJaW50IGxpbmVIZWlnaHQsCi0JCUhhc2h0YWJsZSBvYmplY3RUYWJsZSwKLQkJSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rKSB7Ci0JCXBhaW50QnVsbGV0KGdjLCBsb2MsIGxpbmVIZWlnaHQsIG9iamVjdFRhYmxlKTsKLQkJc3VwZXIucGFpbnQoZ2MsIHdpZHRoLCBsb2MsIGxpbmVIZWlnaHQsIG9iamVjdFRhYmxlLCBzZWxlY3RlZExpbmspOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50QnVsbGV0KAotCQlHQyBnYywKLQkJTG9jYXRvciBsb2MsCi0JCWludCBsaW5lSGVpZ2h0LAotCQlIYXNodGFibGUgb2JqZWN0VGFibGUpIHsKLQkJaW50IHggPSBsb2MueCAtIGdldEluZGVudCgpOwotCQlpZiAoc3R5bGUgPT0gQ0lSQ0xFKSB7Ci0JCQlpbnQgeSA9IGxvYy55ICsgbGluZUhlaWdodCAvIDIgLSBDSVJDTEVfRElBTSAvIDI7Ci0JCQlDb2xvciBiZyA9IGdjLmdldEJhY2tncm91bmQoKTsKLQkJCUNvbG9yIGZnID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChmZyk7Ci0JCQlnYy5maWxsUmVjdGFuZ2xlKHgsIHkgKyAxLCA1LCAzKTsKLQkJCWdjLmZpbGxSZWN0YW5nbGUoeCArIDEsIHksIDMsIDUpOwotCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7Ci0JCX0gZWxzZSBpZiAoc3R5bGUgPT0gVEVYVCAmJiB0ZXh0ICE9IG51bGwpIHsKLQkJCWdjLmRyYXdUZXh0KHRleHQsIHgsIGxvYy55KTsKLQkJfSBlbHNlIGlmIChzdHlsZSA9PSBJTUFHRSAmJiB0ZXh0ICE9IG51bGwpIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBvYmplY3RUYWJsZS5nZXQodGV4dCk7Ci0JCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJCWludCB5ID0gbG9jLnkgKyBsaW5lSGVpZ2h0IC8gMiAtIGltYWdlLmdldEJvdW5kcygpLmhlaWdodCAvIDI7Ci0JCQkJZ2MuZHJhd0ltYWdlKGltYWdlLCB4LCB5KTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0Zvcm1FbmdpbmUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2M4YzdmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7DQotDQotcHVibGljIGNsYXNzIEZvcm1FbmdpbmUgZXh0ZW5kcyBDYW52YXMgew0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfSEFORExFUl9JRCA9ICJ1cmxIYW5kbGVyIjsNCi0JYm9vbGVhbiBoYXNGb2N1czsNCi0JYm9vbGVhbiBwYXJhZ3JhcGhzU2VwYXJhdGVkID0gdHJ1ZTsNCi0JVGV4dE1vZGVsIG1vZGVsOw0KLQlIYXNodGFibGUgb2JqZWN0VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7DQotCXB1YmxpYyBpbnQgbWFyZ2luV2lkdGggPSAwOw0KLQlwdWJsaWMgaW50IG1hcmdpbkhlaWdodCA9IDE7DQotCUlIeXBlcmxpbmtTZWdtZW50IGVudGVyZWQ7DQotCWJvb2xlYW4gbW91c2VEb3duID0gZmFsc2U7DQotCVBvaW50IGRyYWdPcmlnaW47DQotCXByaXZhdGUgQWN0aW9uIG9wZW5BY3Rpb247DQotCXByaXZhdGUgQWN0aW9uIGNvcHlTaG9ydGN1dEFjdGlvbjsNCi0JcHJpdmF0ZSBib29sZWFuIGxvYWRpbmc9dHJ1ZTsNCi0JcHJpdmF0ZSBTdHJpbmcgbG9hZGluZ1RleHQ9IkxvYWRpbmcuLi4iOw0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb2N1cygpIHsNCi0JCXJldHVybiBoYXNGb2N1czsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNMb2FkaW5nKCkgew0KLQkJcmV0dXJuIGxvYWRpbmc7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9hZGluZ1RleHQoKSB7DQotCQlyZXR1cm4gbG9hZGluZ1RleHQ7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldExvYWRpbmdUZXh0KFN0cmluZyBsb2FkaW5nVGV4dCkgew0KLQkJdGhpcy5sb2FkaW5nVGV4dCA9IGxvYWRpbmdUZXh0Ow0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0UGFyYWdyYXBoU3BhY2luZyhpbnQgbGluZUhlaWdodCkgew0KLQkJcmV0dXJuIGxpbmVIZWlnaHQgLyAyOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldFBhcmFncmFwaHNTZXBhcmF0ZWQoYm9vbGVhbiB2YWx1ZSkgew0KLQkJcGFyYWdyYXBoc1NlcGFyYXRlZCA9IHZhbHVlOw0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2VsZWN0YWJsZUZvcm1MYWJlbA0KLQkgKi8NCi0JcHVibGljIEZvcm1FbmdpbmUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7DQotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsNCi0JCXNldExheW91dChuZXcgRm9ybUVuZ2luZUxheW91dCgpKTsNCi0JCW1vZGVsID0gbmV3IFRleHRNb2RlbCgpOw0KLQ0KLQkJYWRkRGlzcG9zZUxpc3RlbmVyKG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsNCi0JCQkJbW9kZWwuZGlzcG9zZSgpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBwYWludENvbnRyb2woUGFpbnRFdmVudCBlKSB7DQotCQkJCXBhaW50KGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTGlzdGVuZXIoU1dULktleURvd24sIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCWlmIChlLmNoYXJhY3RlciA9PSAnXHInKSB7DQotCQkJCQlhY3RpdmF0ZVNlbGVjdGVkTGluaygpOw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRMaXN0ZW5lcihTV1QuVHJhdmVyc2UsIG5ldyBMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBlKSB7DQotCQkJCXN3aXRjaCAoZS5kZXRhaWwpIHsNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX1BBR0VfTkVYVCA6DQotCQkJCQljYXNlIFNXVC5UUkFWRVJTRV9QQUdFX1BSRVZJT1VTIDoNCi0JCQkJCWNhc2UgU1dULlRSQVZFUlNFX0FSUk9XX05FWFQgOg0KLQkJCQkJY2FzZSBTV1QuVFJBVkVSU0VfQVJST1dfUFJFVklPVVMgOg0KLQkJCQkJCWUuZG9pdCA9IGZhbHNlOw0KLQkJCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQlpZiAoIW1vZGVsLmhhc0ZvY3VzU2VnbWVudHMoKSkgew0KLQkJCQkJZS5kb2l0ID0gdHJ1ZTsNCi0JCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQlpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9ORVhUKQ0KLQkJCQkJZS5kb2l0ID0gYWR2YW5jZSh0cnVlKTsNCi0JCQkJZWxzZSBpZiAoZS5kZXRhaWwgPT0gU1dULlRSQVZFUlNFX1RBQl9QUkVWSU9VUykNCi0JCQkJCWUuZG9pdCA9IGFkdmFuY2UoZmFsc2UpOw0KLQkJCQllbHNlIGlmIChlLmRldGFpbCAhPSBTV1QuVFJBVkVSU0VfUkVUVVJOKQ0KLQkJCQkJZS5kb2l0ID0gdHJ1ZTsNCi0JCQl9DQotCQl9KTsNCi0JCWFkZEZvY3VzTGlzdGVuZXIobmV3IEZvY3VzTGlzdGVuZXIoKSB7DQotCQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7DQotCQkJCWlmICghaGFzRm9jdXMpIHsNCi0JCQkJCWhhc0ZvY3VzID0gdHJ1ZTsNCi0JCQkJCWhhbmRsZUZvY3VzQ2hhbmdlKCk7DQotCQkJCX0NCi0JCQl9DQotCQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgew0KLQkJCQlpZiAoaGFzRm9jdXMpIHsNCi0JCQkJCWhhc0ZvY3VzID0gZmFsc2U7DQotCQkJCQloYW5kbGVGb2N1c0NoYW5nZSgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsNCi0JCQkJLy8gc2VsZWN0IGEgbGluaw0KLQkJCQloYW5kbGVNb3VzZUNsaWNrKGUsIHRydWUpOw0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgew0KLQkJCQkvLyBhY3RpdmF0ZSBhIGxpbmsNCi0JCQkJaGFuZGxlTW91c2VDbGljayhlLCBmYWxzZSk7DQotCQkJfQ0KLQkJfSk7DQotCQlhZGRNb3VzZVRyYWNrTGlzdGVuZXIobmV3IE1vdXNlVHJhY2tMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUVudGVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCQloYW5kbGVNb3VzZU1vdmUoZSk7DQotCQkJfQ0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlRXhpdChNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaWYgKGVudGVyZWQgIT0gbnVsbCkgew0KLQkJCQkJZXhpdExpbmsoZW50ZXJlZCk7DQotCQkJCQlwYWludExpbmtIb3ZlcihlbnRlcmVkLCBmYWxzZSk7DQotCQkJCQllbnRlcmVkID0gbnVsbDsNCi0JCQkJCXNldEN1cnNvcihudWxsKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgew0KLQkJCQloYW5kbGVNb3VzZUhvdmVyKGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkTW91c2VNb3ZlTGlzdGVuZXIobmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsNCi0JCQkJaGFuZGxlTW91c2VNb3ZlKGUpOw0KLQkJCX0NCi0JCX0pOw0KLQkJaW5pdEFjY2Vzc2libGUoKTsNCi0JCW1ha2VBY3Rpb25zKCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgew0KLQkJb3BlbkFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlhY3RpdmF0ZVNlbGVjdGVkTGluaygpOw0KLQkJCX0NCi0JCX07DQotCQlvcGVuQWN0aW9uLnNldFRleHQoDQotCQkJRm9ybXNQbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoIkZvcm1FZ2luZS5saW5rUG9wdXAub3BlbiIpKTsNCi0JCWNvcHlTaG9ydGN1dEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQljb3B5U2hvcnRjdXQoZ2V0U2VsZWN0ZWRMaW5rKCkpOw0KLQkJCX0NCi0JCX07DQotCQljb3B5U2hvcnRjdXRBY3Rpb24uc2V0VGV4dCgNCi0JCQlGb3Jtc1BsdWdpbi5nZXRSZXNvdXJjZVN0cmluZygiRm9ybUVnaW5lLmxpbmtQb3B1cC5jb3B5U2hvcnRjdXQiKSk7DQotCX0NCi0NCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QWNlc3NpYmxlVGV4dCgpIHsNCi0JCXJldHVybiBtb2RlbC5nZXRBY2Nlc3NpYmxlVGV4dCgpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBpbml0QWNjZXNzaWJsZSgpIHsNCi0JCUFjY2Vzc2libGUgYWNjZXNzaWJsZSA9IGdldEFjY2Vzc2libGUoKTsNCi0JCWFjY2Vzc2libGUuYWRkQWNjZXNzaWJsZUxpc3RlbmVyKG5ldyBBY2Nlc3NpYmxlQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBnZXROYW1lKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0QWNlc3NpYmxlVGV4dCgpOw0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRIZWxwKEFjY2Vzc2libGVFdmVudCBlKSB7DQotCQkJCWUucmVzdWx0ID0gZ2V0VG9vbFRpcFRleHQoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWFjY2Vzc2libGUNCi0JCQkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGdldENoaWxkQXRQb2ludChBY2Nlc3NpYmxlQ29udHJvbEV2ZW50IGUpIHsNCi0JCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGUueCwgZS55KSk7DQotCQkJCWUuY2hpbGRJRCA9DQotCQkJCQkoZ2V0Qm91bmRzKCkuY29udGFpbnMocHQpKQ0KLQkJCQkJCT8gQUNDLkNISUxESURfU0VMRg0KLQkJCQkJCTogQUNDLkNISUxESURfTk9ORTsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0TG9jYXRpb24oQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCVJlY3RhbmdsZSBsb2NhdGlvbiA9IGdldEJvdW5kcygpOw0KLQkJCQlQb2ludCBwdCA9IHRvRGlzcGxheShuZXcgUG9pbnQobG9jYXRpb24ueCwgbG9jYXRpb24ueSkpOw0KLQkJCQllLnggPSBwdC54Ow0KLQkJCQllLnkgPSBwdC55Ow0KLQkJCQllLndpZHRoID0gbG9jYXRpb24ud2lkdGg7DQotCQkJCWUuaGVpZ2h0ID0gbG9jYXRpb24uaGVpZ2h0Ow0KLQkJCX0NCi0NCi0JCQlwdWJsaWMgdm9pZCBnZXRDaGlsZENvdW50KEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgew0KLQkJCQllLmRldGFpbCA9IDA7DQotCQkJfQ0KLQ0KLQkJCXB1YmxpYyB2b2lkIGdldFJvbGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlJPTEVfVEVYVDsNCi0JCQl9DQotDQotCQkJcHVibGljIHZvaWQgZ2V0U3RhdGUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7DQotCQkJCWUuZGV0YWlsID0gQUNDLlNUQVRFX1JFQURPTkxZOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZUNsaWNrKE1vdXNlRXZlbnQgZSwgYm9vbGVhbiBkb3duKSB7DQotCQlpZiAoZG93bikgew0KLQkJCS8vIHNlbGVjdCBhIGh5cGVybGluaw0KLQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnRVbmRlciA9IG1vZGVsLmZpbmRIeXBlcmxpbmtBdChlLngsIGUueSk7DQotCQkJaWYgKHNlZ21lbnRVbmRlciAhPSBudWxsKSB7DQotCQkJCUlIeXBlcmxpbmtTZWdtZW50IG9sZExpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JCQkJbW9kZWwuc2VsZWN0TGluayhzZWdtZW50VW5kZXIpOw0KLQkJCQllbnRlckxpbmsoc2VnbWVudFVuZGVyKTsNCi0JCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG9sZExpbmssIHNlZ21lbnRVbmRlcik7DQotCQkJfQ0KLQkJCW1vdXNlRG93biA9IHRydWU7DQotCQkJZHJhZ09yaWdpbiA9IG5ldyBQb2ludChlLngsIGUueSk7DQotCQl9IGVsc2Ugew0KLQkJCWlmIChlLmJ1dHRvbiA9PSAxKSB7DQotCQkJCUlIeXBlcmxpbmtTZWdtZW50IHNlZ21lbnRVbmRlciA9DQotCQkJCQltb2RlbC5maW5kSHlwZXJsaW5rQXQoZS54LCBlLnkpOw0KLQkJCQlpZiAoc2VnbWVudFVuZGVyICE9IG51bGwpIHsNCi0JCQkJCWFjdGl2YXRlTGluayhzZWdtZW50VW5kZXIpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCW1vdXNlRG93biA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgew0KLQl9DQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb3VzZU1vdmUoTW91c2VFdmVudCBlKSB7DQotCQlpZiAobW91c2VEb3duKSB7DQotCQkJaGFuZGxlRHJhZyhlKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlJVGV4dFNlZ21lbnQgc2VnbWVudFVuZGVyID0gbW9kZWwuZmluZFNlZ21lbnRBdChlLngsIGUueSk7DQotDQotCQlpZiAoc2VnbWVudFVuZGVyID09IG51bGwpIHsNCi0JCQlpZiAoZW50ZXJlZCAhPSBudWxsKSB7DQotCQkJCWV4aXRMaW5rKGVudGVyZWQpOw0KLQkJCQlwYWludExpbmtIb3ZlcihlbnRlcmVkLCBmYWxzZSk7DQotCQkJCWVudGVyZWQgPSBudWxsOw0KLQkJCX0NCi0JCQlzZXRDdXJzb3IobnVsbCk7DQotCQl9IGVsc2Ugew0KLQkJCWlmIChzZWdtZW50VW5kZXIgaW5zdGFuY2VvZiBJSHlwZXJsaW5rU2VnbWVudCkgew0KLQkJCQlJSHlwZXJsaW5rU2VnbWVudCBsaW5rVW5kZXIgPSAoSUh5cGVybGlua1NlZ21lbnQpIHNlZ21lbnRVbmRlcjsNCi0JCQkJaWYgKGVudGVyZWQgPT0gbnVsbCkgew0KLQkJCQkJZW50ZXJlZCA9IGxpbmtVbmRlcjsNCi0JCQkJCWVudGVyTGluayhsaW5rVW5kZXIpOw0KLQkJCQkJcGFpbnRMaW5rSG92ZXIoZW50ZXJlZCwgdHJ1ZSk7DQotCQkJCQlzZXRDdXJzb3IoDQotCQkJCQkJbW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCQkJCX0NCi0JCQl9IGVsc2Ugew0KLQkJCQlpZiAoZW50ZXJlZCAhPSBudWxsKSB7DQotCQkJCQlleGl0TGluayhlbnRlcmVkKTsNCi0JCQkJCXBhaW50TGlua0hvdmVyKGVudGVyZWQsIGZhbHNlKTsNCi0JCQkJCWVudGVyZWQgPSBudWxsOw0KLQkJCQl9DQotCQkJCXNldEN1cnNvcihtb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpLmdldFRleHRDdXJzb3IoKSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBoYW5kbGVEcmFnKE1vdXNlRXZlbnQgZSkgew0KLQl9DQotDQotCXB1YmxpYyBIeXBlcmxpbmtTZXR0aW5ncyBnZXRIeXBlcmxpbmtTZXR0aW5ncygpIHsNCi0JCXJldHVybiBtb2RlbC5nZXRIeXBlcmxpbmtTZXR0aW5ncygpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1NldHRpbmdzKEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7DQotCQltb2RlbC5zZXRIeXBlcmxpbmtTZXR0aW5ncyhzZXR0aW5ncyk7DQotCX0NCi0NCi0JcHJpdmF0ZSBib29sZWFuIGFkdmFuY2UoYm9vbGVhbiBuZXh0KSB7DQotCQlJSHlwZXJsaW5rU2VnbWVudCBjdXJyZW50ID0gbW9kZWwuZ2V0U2VsZWN0ZWRMaW5rKCk7DQotCQlpZiAoY3VycmVudCAhPSBudWxsKQ0KLQkJCWV4aXRMaW5rKGN1cnJlbnQpOw0KLQ0KLQkJYm9vbGVhbiB2YWxpZCA9IG1vZGVsLnRyYXZlcnNlTGlua3MobmV4dCk7DQotCQkNCi0JCUlIeXBlcmxpbmtTZWdtZW50IG5ld0xpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0NCi0JCWlmICh2YWxpZCkNCi0JCQllbnRlckxpbmsobmV3TGluayk7DQotCQlwYWludEZvY3VzVHJhbnNmZXIoY3VycmVudCwgbmV3TGluayk7DQotCQlpZiAobmV3TGluayE9bnVsbCkgZW5zdXJlVmlzaWJsZShuZXdMaW5rKTsNCi0JCXJldHVybiAhdmFsaWQ7DQotCX0NCi0NCi0JcHVibGljIElIeXBlcmxpbmtTZWdtZW50IGdldFNlbGVjdGVkTGluaygpIHsNCi0JCXJldHVybiBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRm9jdXNDaGFuZ2UoKSB7DQotCQlpZiAoaGFzRm9jdXMpIHsNCi0JCQltb2RlbC50cmF2ZXJzZUxpbmtzKHRydWUpOw0KLQkJCWVudGVyTGluayhtb2RlbC5nZXRTZWxlY3RlZExpbmsoKSk7DQotCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG51bGwsIG1vZGVsLmdldFNlbGVjdGVkTGluaygpKTsNCi0JCX0gZWxzZSB7DQotCQkJcGFpbnRGb2N1c1RyYW5zZmVyKG1vZGVsLmdldFNlbGVjdGVkTGluaygpLCBudWxsKTsNCi0JCQltb2RlbC5zZWxlY3RMaW5rKG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBlbnRlckxpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJaWYgKGxpbmsgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlIeXBlcmxpbmtBY3Rpb24gYWN0aW9uID0gbGluay5nZXRBY3Rpb24ob2JqZWN0VGFibGUpOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRW50ZXJlZChsaW5rKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgZXhpdExpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJaWYgKGxpbmsgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlIeXBlcmxpbmtBY3Rpb24gYWN0aW9uID0gbGluay5nZXRBY3Rpb24ob2JqZWN0VGFibGUpOw0KLQkJaWYgKGFjdGlvbiAhPSBudWxsKQ0KLQkJCWFjdGlvbi5saW5rRXhpdGVkKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwYWludExpbmtIb3ZlcihJSHlwZXJsaW5rU2VnbWVudCBsaW5rLCBib29sZWFuIGhvdmVyKSB7DQotCQlHQyBnYyA9IG5ldyBHQyh0aGlzKTsNCi0NCi0JCUh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzID0gZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKTsNCi0NCi0JCWdjLnNldEZvcmVncm91bmQoDQotCQkJaG92ZXIgPyBzZXR0aW5ncy5nZXRBY3RpdmVGb3JlZ3JvdW5kKCkgOiBzZXR0aW5ncy5nZXRGb3JlZ3JvdW5kKCkpOw0KLQkJZ2Muc2V0QmFja2dyb3VuZChnZXRCYWNrZ3JvdW5kKCkpOw0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChsaW5rID09IGdldFNlbGVjdGVkTGluaygpKTsNCi0JCWxpbmsucmVwYWludChnYywgaG92ZXIpOw0KLQkJaWYgKHNlbGVjdGVkKSB7DQotCQkJbGluay5wYWludEZvY3VzKGdjLCBnZXRCYWNrZ3JvdW5kKCksIGdldEZvcmVncm91bmQoKSwgZmFsc2UpOw0KLQkJCWxpbmsucGFpbnRGb2N1cyhnYywgZ2V0QmFja2dyb3VuZCgpLCBnZXRGb3JlZ3JvdW5kKCksIHRydWUpOw0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZVNlbGVjdGVkTGluaygpIHsNCi0JCUlIeXBlcmxpbmtTZWdtZW50IGxpbmsgPSBtb2RlbC5nZXRTZWxlY3RlZExpbmsoKTsNCi0JCWlmIChsaW5rICE9IG51bGwpDQotCQkJYWN0aXZhdGVMaW5rKGxpbmspOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUxpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJc2V0Q3Vyc29yKG1vZGVsLmdldEh5cGVybGlua1NldHRpbmdzKCkuZ2V0QnVzeUN1cnNvcigpKTsNCi0JCUh5cGVybGlua0FjdGlvbiBhY3Rpb24gPSBsaW5rLmdldEFjdGlvbihvYmplY3RUYWJsZSk7DQotCQlpZiAoYWN0aW9uICE9IG51bGwpDQotCQkJYWN0aW9uLmxpbmtBY3RpdmF0ZWQobGluayk7DQotCQlpZiAoIWlzRGlzcG9zZWQoKSkNCi0JCQlzZXRDdXJzb3IobW9kZWwuZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKS5nZXRIeXBlcmxpbmtDdXJzb3IoKSk7DQotCX0NCi0NCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7DQotCQlpbnQgd2lkdGggPSBnZXRDbGllbnRBcmVhKCkud2lkdGg7DQotDQotCQlHQyBnYyA9IGUuZ2M7DQotCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQlnYy5zZXRGb3JlZ3JvdW5kKGdldEZvcmVncm91bmQoKSk7DQotCQlnYy5zZXRCYWNrZ3JvdW5kKGdldEJhY2tncm91bmQoKSk7DQotDQotCQlMb2NhdG9yIGxvYyA9IG5ldyBMb2NhdG9yKCk7DQotCQlsb2MubWFyZ2luV2lkdGggPSBtYXJnaW5XaWR0aDsNCi0JCWxvYy5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7DQotCQlsb2MueCA9IG1hcmdpbldpZHRoOw0KLQkJbG9jLnkgPSBtYXJnaW5IZWlnaHQ7DQotDQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQkJDQotCQlpZiAobG9hZGluZykgew0KLQkJCWludCB0ZXh0V2lkdGggPSBnYy50ZXh0RXh0ZW50KGxvYWRpbmdUZXh0KS54Ow0KLQkJCWdjLmRyYXdUZXh0KGxvYWRpbmdUZXh0LCB3aWR0aC8yLXRleHRXaWR0aC8yLCBnZXRDbGllbnRBcmVhKCkuaGVpZ2h0LzItbGluZUhlaWdodC8yKTsNCi0JCQlyZXR1cm47DQotCQl9DQotCQkNCi0JCUlQYXJhZ3JhcGhbXSBwYXJhZ3JhcGhzID0gbW9kZWwuZ2V0UGFyYWdyYXBocygpOw0KLQ0KLQkJSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rID0gbW9kZWwuZ2V0U2VsZWN0ZWRMaW5rKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFncmFwaHMubGVuZ3RoOyBpKyspIHsNCi0JCQlJUGFyYWdyYXBoIHAgPSBwYXJhZ3JhcGhzW2ldOw0KLQ0KLQkJCWlmIChpID4gMCAmJiBwYXJhZ3JhcGhzU2VwYXJhdGVkICYmIHAuZ2V0QWRkVmVydGljYWxTcGFjZSgpKQ0KLQkJCQlsb2MueSArPSBnZXRQYXJhZ3JhcGhTcGFjaW5nKGxpbmVIZWlnaHQpOw0KLQ0KLQkJCWxvYy5pbmRlbnQgPSBwLmdldEluZGVudCgpOw0KLQkJCWxvYy5yZXNldENhcmV0KCk7DQotCQkJbG9jLnJvd0hlaWdodCA9IDA7DQotCQkJcC5wYWludChnYywgd2lkdGgsIGxvYywgbGluZUhlaWdodCwgb2JqZWN0VGFibGUsIHNlbGVjdGVkTGluayk7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJUZXh0T2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgew0KLQkJb2JqZWN0VGFibGUucHV0KGtleSwgdmFsdWUpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGxvYWQoU3RyaW5nIHRleHQsIGJvb2xlYW4gcGFyc2VUYWdzLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCXRyeSB7DQotCQkJaWYgKHBhcnNlVGFncykNCi0JCQkJbW9kZWwucGFyc2VUYWdnZWRUZXh0KHRleHQsIGV4cGFuZFVSTHMpOw0KLQkJCWVsc2UNCi0JCQkJbW9kZWwucGFyc2VSZWd1bGFyVGV4dCh0ZXh0LCBleHBhbmRVUkxzKTsNCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCUZvcm1zUGx1Z2luLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCX0NCi0JCWZpbmFsbHkgew0KLQkJCWxvYWRpbmcgPSBmYWxzZTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgdm9pZCBsb2FkKElucHV0U3RyZWFtIGlzLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCXRyeSB7DQotCQkJbW9kZWwucGFyc2VJbnB1dFN0cmVhbShpcywgZXhwYW5kVVJMcyk7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlGb3Jtc1BsdWdpbi5sb2dFeGNlcHRpb24oZSk7DQotCQl9DQotCQlmaW5hbGx5IHsNCi0JCQlsb2FkaW5nID0gZmFsc2U7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gc2V0Rm9jdXMoKSB7DQotCQkvKg0KLQkJaWYgKCFtb2RlbC5oYXNGb2N1c1NlZ21lbnRzKCkpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJKi8NCi0JCXJldHVybiBzdXBlci5zZXRGb2N1cygpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwYWludEZvY3VzVHJhbnNmZXIoDQotCQlJSHlwZXJsaW5rU2VnbWVudCBvbGRMaW5rLA0KLQkJSUh5cGVybGlua1NlZ21lbnQgbmV3TGluaykgew0KLQkJR0MgZ2MgPSBuZXcgR0ModGhpcyk7DQotCQlDb2xvciBiZyA9IGdldEJhY2tncm91bmQoKTsNCi0JCUNvbG9yIGZnID0gZ2V0Rm9yZWdyb3VuZCgpOw0KLQ0KLQkJZ2Muc2V0Rm9udChnZXRGb250KCkpOw0KLQ0KLQkJaWYgKG9sZExpbmsgIT0gbnVsbCkgew0KLQkJCWdjLnNldEJhY2tncm91bmQoYmcpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoZmcpOw0KLQkJCW9sZExpbmsucGFpbnRGb2N1cyhnYywgYmcsIGZnLCBmYWxzZSk7DQotCQl9DQotCQlpZiAobmV3TGluayAhPSBudWxsKSB7DQotCQkJLy9lbnN1cmVWaXNpYmxlKG5ld0xpbmspOw0KLQkJCWdjLnNldEJhY2tncm91bmQoYmcpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoZmcpOw0KLQkJCW5ld0xpbmsucGFpbnRGb2N1cyhnYywgYmcsIGZnLCB0cnVlKTsNCi0JCX0NCi0JCWdjLmRpc3Bvc2UoKTsNCi0JfQ0KLQkvKioNCi0JICogR2V0cyB0aGUgbWFyZ2luV2lkdGguDQotCSAqIEByZXR1cm4gUmV0dXJucyBhIGludA0KLQkgKi8NCi0JcHVibGljIGludCBnZXRNYXJnaW5XaWR0aCgpIHsNCi0JCXJldHVybiBtYXJnaW5XaWR0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbWFyZ2luV2lkdGguDQotCSAqIEBwYXJhbSBtYXJnaW5XaWR0aCBUaGUgbWFyZ2luV2lkdGggdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5XaWR0aChpbnQgbWFyZ2luV2lkdGgpIHsNCi0JCXRoaXMubWFyZ2luV2lkdGggPSBtYXJnaW5XaWR0aDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogR2V0cyB0aGUgbWFyZ2luSGVpZ2h0Lg0KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBpbnQNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0TWFyZ2luSGVpZ2h0KCkgew0KLQkJcmV0dXJuIG1hcmdpbkhlaWdodDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogU2V0cyB0aGUgbWFyZ2luSGVpZ2h0Lg0KLQkgKiBAcGFyYW0gbWFyZ2luSGVpZ2h0IFRoZSBtYXJnaW5IZWlnaHQgdG8gc2V0DQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5IZWlnaHQoaW50IG1hcmdpbkhlaWdodCkgew0KLQkJdGhpcy5tYXJnaW5IZWlnaHQgPSBtYXJnaW5IZWlnaHQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgY29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgew0KLQkJSUh5cGVybGlua1NlZ21lbnQgbGluayA9IGdldFNlbGVjdGVkTGluaygpOw0KLQkJaWYgKGxpbmsgIT0gbnVsbCkNCi0JCQljb250cmlidXRlTGlua0FjdGlvbnMobWFuYWdlciwgbGluayk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVMaW5rQWN0aW9ucygNCi0JCUlNZW51TWFuYWdlciBtYW5hZ2VyLA0KLQkJSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJbWFuYWdlci5hZGQob3BlbkFjdGlvbik7DQotCQltYW5hZ2VyLmFkZChjb3B5U2hvcnRjdXRBY3Rpb24pOw0KLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY29weVNob3J0Y3V0KElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCVN0cmluZyB0ZXh0ID0gbGluay5nZXRUZXh0KCk7DQotCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChnZXREaXNwbGF5KCkpOw0KLQkJY2xpcGJvYXJkLnNldENvbnRlbnRzKA0KLQkJCW5ldyBPYmplY3RbXSB7IHRleHQgfSwNCi0JCQluZXcgVHJhbnNmZXJbXSB7IFRleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVZpc2libGUoSUh5cGVybGlua1NlZ21lbnQgc2VnbWVudCkgew0KLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IHNlZ21lbnQuZ2V0Qm91bmRzKCk7DQotCQlTY3JvbGxlZENvbXBvc2l0ZSBzY29tcCA9IGdldFNjcm9sbGVkQ29tcG9zaXRlKCk7DQotCQlpZiAoc2NvbXAgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlQb2ludCBvcmlnaW4gPSBBYnN0cmFjdFNlY3Rpb25Gb3JtLmdldENvbnRyb2xMb2NhdGlvbihzY29tcCwgdGhpcyk7DQotCQlvcmlnaW4ueCArPSBib3VuZHMueDsNCi0JCW9yaWdpbi55ICs9IGJvdW5kcy55Ow0KLQkJQWJzdHJhY3RTZWN0aW9uRm9ybS5lbnN1cmVWaXNpYmxlKA0KLQkJCXNjb21wLA0KLQkJCW9yaWdpbiwNCi0JCQluZXcgUG9pbnQoYm91bmRzLndpZHRoLCBib3VuZHMuaGVpZ2h0KSk7DQotCX0NCi0JU2Nyb2xsZWRDb21wb3NpdGUgZ2V0U2Nyb2xsZWRDb21wb3NpdGUoKSB7DQotCQlDb21wb3NpdGUgcGFyZW50ID0gZ2V0UGFyZW50KCk7DQotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsNCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2Nyb2xsZWRDb21wb3NpdGUpDQotCQkJCXJldHVybiAoU2Nyb2xsZWRDb21wb3NpdGUpIHBhcmVudDsNCi0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50KCk7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0Zvcm1FbmdpbmVMYXlvdXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZUxheW91dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2FlZTRkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvRm9ybUVuZ2luZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSUxheW91dEV4dGVuc2lvbjsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBGb3JtRW5naW5lTGF5b3V0IGV4dGVuZHMgTGF5b3V0IGltcGxlbWVudHMgSUxheW91dEV4dGVuc2lvbiB7DQotDQotCXB1YmxpYyBpbnQgZ2V0TWF4aW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJcmV0dXJuIGNvbXB1dGVTaXplKHBhcmVudCwgU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCBjaGFuZ2VkKS54Ow0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0TWluaW11bVdpZHRoKENvbXBvc2l0ZSBwYXJlbnQsIGJvb2xlYW4gY2hhbmdlZCkgew0KLQkJcmV0dXJuIDMwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgTGF5b3V0I2NvbXB1dGVTaXplKENvbXBvc2l0ZSwgaW50LCBpbnQsIGJvb2xlYW4pDQotCSAqLw0KLQ0KLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoDQotCQlDb21wb3NpdGUgY29tcG9zaXRlLA0KLQkJaW50IHdIaW50LA0KLQkJaW50IGhIaW50LA0KLQkJYm9vbGVhbiBjaGFuZ2VkKSB7DQotCQlGb3JtRW5naW5lIGVuZ2luZSA9IChGb3JtRW5naW5lKSBjb21wb3NpdGU7DQotCQlpbnQgaW5uZXJXaWR0aCA9IHdIaW50Ow0KLQkJaWYgKGVuZ2luZS5pc0xvYWRpbmcoKSkgew0KLQkJCXJldHVybiBjb21wdXRlTG9hZGluZyhlbmdpbmUpOw0KLQkJfQ0KLQkJaWYgKGlubmVyV2lkdGggIT0gU1dULkRFRkFVTFQpDQotCQkJaW5uZXJXaWR0aCAtPSBlbmdpbmUubWFyZ2luV2lkdGggKiAyOw0KLQkJUG9pbnQgdGV4dFNpemUgPSBjb21wdXRlVGV4dFNpemUoZW5naW5lLCBpbm5lcldpZHRoKTsNCi0JCWludCB0ZXh0V2lkdGggPSB0ZXh0U2l6ZS54ICsgMiAqIGVuZ2luZS5tYXJnaW5XaWR0aDsNCi0JCWludCB0ZXh0SGVpZ2h0ID0gdGV4dFNpemUueSArIDIgKiBlbmdpbmUubWFyZ2luSGVpZ2h0Ow0KLQkJUG9pbnQgcmVzdWx0ID0gbmV3IFBvaW50KHRleHRXaWR0aCwgdGV4dEhlaWdodCk7DQotCQlyZXR1cm4gcmVzdWx0Ow0KLQl9DQotCQ0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVMb2FkaW5nKEZvcm1FbmdpbmUgZW5naW5lKSB7DQotCQlHQyBnYyA9IG5ldyBHQyhlbmdpbmUpOw0KLQkJZ2Muc2V0Rm9udChlbmdpbmUuZ2V0Rm9udCgpKTsNCi0JCVN0cmluZyBsb2FkaW5nVGV4dCA9IGVuZ2luZS5nZXRMb2FkaW5nVGV4dCgpOw0KLQkJUG9pbnQgc2l6ZSA9IGdjLnRleHRFeHRlbnQobG9hZGluZ1RleHQpOw0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJc2l6ZS54ICs9IDIgKiBlbmdpbmUubWFyZ2luV2lkdGg7DQotCQlzaXplLnkgKz0gMiAqIGVuZ2luZS5tYXJnaW5IZWlnaHQ7DQotCQlyZXR1cm4gc2l6ZTsNCi0JfQ0KLQ0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVUZXh0U2l6ZShGb3JtRW5naW5lIGVuZ2luZSwgaW50IHdIaW50KSB7DQotCQlJUGFyYWdyYXBoW10gcGFyYWdyYXBocyA9IGVuZ2luZS5tb2RlbC5nZXRQYXJhZ3JhcGhzKCk7DQotDQotCQlHQyBnYyA9IG5ldyBHQyhlbmdpbmUpOw0KLQkJZ2Muc2V0Rm9udChlbmdpbmUuZ2V0Rm9udCgpKTsNCi0NCi0JCUxvY2F0b3IgbG9jID0gbmV3IExvY2F0b3IoKTsNCi0NCi0JCWludCB3aWR0aCA9IHdIaW50ICE9IFNXVC5ERUZBVUxUID8gd0hpbnQgOiAwOw0KLQ0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5sZW5ndGg7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IHBhcmFncmFwaHNbaV07DQotDQotCQkJaWYgKGkgPiAwICYmIGVuZ2luZS5wYXJhZ3JhcGhzU2VwYXJhdGVkICYmIHAuZ2V0QWRkVmVydGljYWxTcGFjZSgpKQ0KLQkJCQlsb2MueSArPSBlbmdpbmUuZ2V0UGFyYWdyYXBoU3BhY2luZyhsaW5lSGVpZ2h0KTsNCi0NCi0JCQlsb2Mucm93SGVpZ2h0ID0gMDsNCi0JCQlsb2MuaW5kZW50ID0gcC5nZXRJbmRlbnQoKTsNCi0JCQlsb2MueCA9IHAuZ2V0SW5kZW50KCk7DQotDQotCQkJSVBhcmFncmFwaFNlZ21lbnRbXSBzZWdtZW50cyA9IHAuZ2V0U2VnbWVudHMoKTsNCi0JCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkgew0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHNlZ21lbnRzLmxlbmd0aDsgaisrKSB7DQotCQkJCQlJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbal07DQotCQkJCQlzZWdtZW50LmFkdmFuY2VMb2NhdG9yKGdjLCB3SGludCwgbG9jLCBlbmdpbmUub2JqZWN0VGFibGUpOw0KLQkJCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbG9jLndpZHRoKTsNCi0JCQkJfQ0KLQkJCQlsb2MueSArPSBsb2Mucm93SGVpZ2h0Ow0KLQkJCX0gZWxzZSB7DQotCQkJCS8vIGVtcHR5IG5ldyBsaW5lDQotCQkJCWxvYy55ICs9IGxpbmVIZWlnaHQ7DQotCQkJfQ0KLQkJfQ0KLQkJZ2MuZGlzcG9zZSgpOw0KLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgbG9jLnkpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgTGF5b3V0I2xheW91dChDb21wb3NpdGUsIGJvb2xlYW4pDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9IVFRQQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0hUVFBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzZDBiNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0hUVFBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5wcm9ncmFtLlByb2dyYW07DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgSFRUUEFjdGlvbiBleHRlbmRzIEh5cGVybGlua0FjdGlvbiB7DQotCXB1YmxpYyBIVFRQQWN0aW9uICgpIHsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlQcm9ncmFtLmxhdW5jaChsaW5rLmdldFRleHQoKSk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsNCi0JCXNldERlc2NyaXB0aW9uKGxpbmsuZ2V0VGV4dCgpKTsNCi0JCXN1cGVyLmxpbmtFbnRlcmVkKGxpbmspOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjExYTY4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSHlwZXJsaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIEh5cGVybGlua0FjdGlvbiB7DQotCUlTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyOw0KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsNCi0JDQotCXB1YmxpYyBIeXBlcmxpbmtBY3Rpb24oKSB7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoZmluYWwgSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBsaW5rRW50ZXJlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobWFuYWdlciE9bnVsbCAmJiBkZXNjcmlwdGlvbiE9bnVsbCkgew0KLQkJCW1hbmFnZXIuc2V0TWVzc2FnZShkZXNjcmlwdGlvbik7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgbGlua0V4aXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7DQotCQlpZiAobWFuYWdlciE9bnVsbCAmJiBkZXNjcmlwdGlvbiE9bnVsbCkgew0KLQkJCW1hbmFnZXIuc2V0TWVzc2FnZShudWxsKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0U3RhdHVzTGluZU1hbmFnZXIoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsNCi0JCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7DQotCQlyZXR1cm4gZGVzY3JpcHRpb247DQotCX0NCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7DQotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9IeXBlcmxpbmtTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua1NlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0MTU4Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0h5cGVybGlua1NlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBIeXBlcmxpbmtTZWdtZW50DQotCWV4dGVuZHMgVGV4dFNlZ21lbnQNCi0JaW1wbGVtZW50cyBJSHlwZXJsaW5rU2VnbWVudCB7DQotCXByaXZhdGUgU3RyaW5nIGFjdGlvbklkOw0KLQlwcml2YXRlIFN0cmluZyBhcmc7DQotCXByaXZhdGUgSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3M7DQotCQ0KLQlwdWJsaWMgSHlwZXJsaW5rU2VnbWVudChTdHJpbmcgdGV4dCwgSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MsIFN0cmluZyBmb250SWQpIHsNCi0JCXN1cGVyKHRleHQsIGZvbnRJZCk7DQotCQl0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7DQotCQl1bmRlcmxpbmUgPSBzZXR0aW5ncy5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk9PUh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9BTFdBWVM7DQotCX0NCi0JDQotCS8qDQotCSAqIEBzZWUgSUh5cGVybGlua1NlZ21lbnQjZ2V0TGlzdGVuZXIoSGFzaHRhYmxlKQ0KLQkgKi8NCi0JcHVibGljIEh5cGVybGlua0FjdGlvbiBnZXRBY3Rpb24oSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlpZiAoYWN0aW9uSWQ9PW51bGwpIHJldHVybiBudWxsOw0KLQkJT2JqZWN0IG9iaiA9IG9iamVjdFRhYmxlLmdldChhY3Rpb25JZCk7DQotCQlpZiAob2JqPT1udWxsKSByZXR1cm4gbnVsbDsNCi0JCWlmIChvYmogaW5zdGFuY2VvZiBIeXBlcmxpbmtBY3Rpb24pIHJldHVybiAoSHlwZXJsaW5rQWN0aW9uKW9iajsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQkvKg0KLQkgKiBAc2VlIElPYmplY3RSZWZlcmVuY2UjZ2V0T2JqZWN0SWQoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPYmplY3RJZCgpIHsNCi0JCXJldHVybiBhY3Rpb25JZDsNCi0JfQ0KLQkNCi0Jdm9pZCBzZXRBY3Rpb25JZChTdHJpbmcgaWQpIHsNCi0JCXRoaXMuYWN0aW9uSWQgPSBpZDsNCi0JfQ0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvY2F0b3IsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSwgYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJc2V0Q29sb3Ioc2V0dGluZ3MuZ2V0Rm9yZWdyb3VuZCgpKTsNCi0JCXN1cGVyLnBhaW50KGdjLCB3aWR0aCwgbG9jYXRvciwgb2JqZWN0VGFibGUsIHNlbGVjdGVkKTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVwYWludChHQyBnYywgYm9vbGVhbiBob3Zlcikgew0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0JCWludCBkZXNjZW50ID0gZm0uZ2V0RGVzY2VudCgpOw0KLQkJYm9vbGVhbiByb2xsb3Zlck1vZGUgPSBzZXR0aW5ncy5nZXRIeXBlcmxpbmtVbmRlcmxpbmVNb2RlKCk9PUh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9ST0xMT1ZFUjsNCi0JCWZvciAoaW50IGk9MDsgaTxhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgew0KLQkJCUFyZWFSZWN0YW5nbGUgYXJlYVJlY3RhbmdsZSA9IChBcmVhUmVjdGFuZ2xlKWFyZWFSZWN0YW5nbGVzLmdldChpKTsNCi0JCQlSZWN0YW5nbGUgcmVjdCA9IGFyZWFSZWN0YW5nbGUucmVjdDsNCi0JCQlTdHJpbmcgdGV4dCA9IGFyZWFSZWN0YW5nbGUuZ2V0VGV4dCgpOw0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7DQotCQkJaW50IHRleHRYID0gcmVjdC54ICsgMTsNCi0JCQlnYy5kcmF3U3RyaW5nKHRleHQsIHRleHRYLCByZWN0LnksIHRydWUpOw0KLQkJCWlmICh1bmRlcmxpbmUgfHwgaG92ZXIgfHwgcm9sbG92ZXJNb2RlKSB7DQotCQkJCWludCBsaW5lWSA9IHJlY3QueSArIGxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMTsNCi0JCQkJQ29sb3Igc2F2ZWQ9bnVsbDsNCi0JCQkJaWYgKHJvbGxvdmVyTW9kZSAmJiAhaG92ZXIpIHsNCi0JCQkJCXNhdmVkID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOw0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChnYy5nZXRCYWNrZ3JvdW5kKCkpOw0KLQkJCQl9DQotCQkJCWdjLmRyYXdMaW5lKHRleHRYLCBsaW5lWSwgdGV4dFgrZXh0ZW50LngsIGxpbmVZKTsNCi0JCQkJaWYgKHNhdmVkIT1udWxsKQ0KLQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChzYXZlZCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBAcmV0dXJuDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldEFyZygpIHsNCi0JCXJldHVybiBhcmc7DQotCX0NCi0NCi0JLyoqDQotCSAqIEBwYXJhbSBzdHJpbmcNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldEFyZyhTdHJpbmcgc3RyaW5nKSB7DQotCQlhcmcgPSBzdHJpbmc7DQotCX0NCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JQnVsbGV0UGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lCdWxsZXRQYXJhZ3JhcGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmMzM4My4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lCdWxsZXRQYXJhZ3JhcGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1bGxldFBhcmFncmFwaCBleHRlbmRzIElQYXJhZ3JhcGggewotCWludCBDSVJDTEUgPSAwOwotCWludCBURVhUID0gMTsKLQlpbnQgSU1BR0UgPSAyOwotCXB1YmxpYyBpbnQgZ2V0QnVsbGV0U3R5bGUoKTsKLQlwdWJsaWMgU3RyaW5nIGdldEJ1bGxldFRleHQoKTsKLQotCXB1YmxpYyB2b2lkIHBhaW50QnVsbGV0KEdDIGdjLCBMb2NhdG9yIGxvYywgaW50IGxpbmVIZWlnaHQsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSHlwZXJsaW5rU2VnbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSHlwZXJsaW5rU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTViNThhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSUh5cGVybGlua1NlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUh5cGVybGlua1NlZ21lbnQgZXh0ZW5kcyBJVGV4dFNlZ21lbnQsIElPYmplY3RSZWZlcmVuY2Ugew0KLQlIeXBlcmxpbmtBY3Rpb24gZ2V0QWN0aW9uKEhhc2h0YWJsZSBvYmplY3RUYWJsZSk7DQotCQ0KLQlib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSk7DQotCQ0KLQlTdHJpbmcgZ2V0QXJnKCk7DQotCQ0KLQlwdWJsaWMgdm9pZCByZXBhaW50KEdDIGdjLCBib29sZWFuIGhvdmVyKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JSW1hZ2VTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lJbWFnZVNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5YmQ1Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lJbWFnZVNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSUltYWdlU2VnbWVudCBleHRlbmRzIElQYXJhZ3JhcGhTZWdtZW50LCBJT2JqZWN0UmVmZXJlbmNlIHsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QID0gMTsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlERExFID0gMjsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQk9UVE9NID0gMzsNCi0JDQotCXB1YmxpYyBpbnQgZ2V0VmVydGljYWxBbGlnbm1lbnQoKTsNCi0NCi0JSW1hZ2UgZ2V0SW1hZ2UoSGFzaHRhYmxlIG9iamVjdFRhYmxlKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JT2JqZWN0UmVmZXJlbmNlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lPYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyYTdlYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElPYmplY3RSZWZlcmVuY2Ugew0KLQlwdWJsaWMgU3RyaW5nIGdldE9iamVjdElkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVBhcmFncmFwaC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMzM2ZWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7DQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElQYXJhZ3JhcGggew0KLQlwdWJsaWMgaW50IGdldEluZGVudCgpOw0KLQlwdWJsaWMgSVBhcmFncmFwaFNlZ21lbnQgW10gZ2V0U2VnbWVudHMoKTsNCi0JcHVibGljIHZvaWQgYWRkU2VnbWVudChJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50KTsNCi0JcHVibGljIGJvb2xlYW4gZ2V0QWRkVmVydGljYWxTcGFjZSgpOw0KLQlwdWJsaWMgSVRleHRTZWdtZW50IGZpbmRTZWdtZW50QXQoaW50IHgsIGludCB5KTsNCi0JcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIGludCB3aWR0aCwgTG9jYXRvciBsb2MsIGludCBsaW5lSGVpZ2h0LCBIYXNodGFibGUgb2JqZWN0VGFibGUsIElIeXBlcmxpbmtTZWdtZW50IHNlbGVjdGVkTGluayk7DQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZVRleHQoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoU2VnbWVudC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JUGFyYWdyYXBoU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE3MTA1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVBhcmFncmFwaFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBpbnRlcmZhY2UgSVBhcmFncmFwaFNlZ21lbnQgew0KLQkNCi0JcHVibGljIHZvaWQgYWR2YW5jZUxvY2F0b3IoR0MgZ2MsIGludCB3SGludCwgTG9jYXRvciBsb2MsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSk7DQotCQ0KLQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgaW50IHdpZHRoLCBMb2NhdG9yIGxvYywgSGFzaHRhYmxlIG9iamVjdFRhYmxlLCBib29sZWFuIHNlbGVjdGVkKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dE1vZGVsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3MWFkMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0lUZXh0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJVGV4dE1vZGVsIHsNCi0JSVBhcmFncmFwaCBbXSBnZXRQYXJhZ3JhcGhzKCk7DQotCXB1YmxpYyB2b2lkIHBhcnNlVGFnZ2VkVGV4dChTdHJpbmcgdGFnZ2VkVGV4dCwgYm9vbGVhbiBleHBhbmRVUkxzKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsNCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dChTdHJpbmcgcmVndWxhclRleHQsIGJvb2xlYW4gZXhwYW5kVVJMcykgdGhyb3dzIENvcmVFeGNlcHRpb247DQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dFNlZ21lbnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSVRleHRTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZTVmYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9JVGV4dFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGludGVyZmFjZSBJVGV4dFNlZ21lbnQgZXh0ZW5kcyBJUGFyYWdyYXBoU2VnbWVudCB7DQotCVN0cmluZyBnZXRUZXh0KCk7DQotCUNvbG9yIGdldENvbG9yKCk7DQotCUZvbnQgZ2V0Rm9udCgpOw0KLQlib29sZWFuIGlzV29yZFdyYXBBbGxvd2VkKCk7DQotCWJvb2xlYW4gaXNTZWxlY3RhYmxlKCk7DQotCWJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KTsNCi0JUmVjdGFuZ2xlIGdldEJvdW5kcygpOw0KLQl2b2lkIHBhaW50Rm9jdXMoR0MgZ2MsIENvbG9yIGJnLCBDb2xvciBmZywgYm9vbGVhbiBzZWxlY3RlZCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSW1hZ2VTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL0ltYWdlU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzg0Y2I5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvSW1hZ2VTZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi0NCi0vKioNCi0gKiBAdmVyc2lvbiAJMS4wDQotICogQGF1dGhvcg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBJbWFnZVNlZ21lbnQgZXh0ZW5kcyBQYXJhZ3JhcGhTZWdtZW50IGltcGxlbWVudHMgSUltYWdlU2VnbWVudCB7DQotCXByaXZhdGUgaW50IGFsaWdubWVudCA9IEJPVFRPTTsNCi0JcHJpdmF0ZSBTdHJpbmcgaW1hZ2VJZDsNCi0JDQotCXB1YmxpYyBpbnQgZ2V0VmVydGljYWxBbGlnbm1lbnQoKSB7DQotCQlyZXR1cm4gYWxpZ25tZW50Ow0KLQl9DQotCQ0KLQl2b2lkIHNldFZlcnRpY2FsQWxpZ25tZW50KGludCBhbGlnbm1lbnQpIHsNCi0JCXRoaXMuYWxpZ25tZW50ID0gYWxpZ25tZW50Ow0KLQl9DQotCQ0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlpZiAoaW1hZ2VJZD09bnVsbCkgcmV0dXJuIG51bGw7DQotCQlPYmplY3Qgb2JqID0gb2JqZWN0VGFibGUuZ2V0KGltYWdlSWQpOw0KLQkJaWYgKG9iaj09bnVsbCkgcmV0dXJuIG51bGw7DQotCQlpZiAob2JqIGluc3RhbmNlb2YgSW1hZ2UpIHJldHVybiAoSW1hZ2Upb2JqOw0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0T2JqZWN0SWQoKSB7DQotCQlyZXR1cm4gaW1hZ2VJZDsNCi0JfQ0KLQkNCi0Jdm9pZCBzZXRPYmplY3RJZChTdHJpbmcgaW1hZ2VJZCkgew0KLQkJdGhpcy5pbWFnZUlkID0gaW1hZ2VJZDsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgYWR2YW5jZUxvY2F0b3IoR0MgZ2MsIGludCB3SGludCwgTG9jYXRvciBsb2MsIEhhc2h0YWJsZSBvYmplY3RUYWJsZSkgew0KLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZShvYmplY3RUYWJsZSk7DQotCQlpbnQgaXdpZHRoID0gMDsNCi0JCWludCBpaGVpZ2h0ID0gMDsNCi0JCWlmIChpbWFnZSE9bnVsbCkgew0KLQkJCVJlY3RhbmdsZSByZWN0ID0gaW1hZ2UuZ2V0Qm91bmRzKCk7DQotCQkJaXdpZHRoID0gcmVjdC53aWR0aDsNCi0JCQlpaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7DQotCQl9DQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgbG9jLnggKyBpd2lkdGggPiB3SGludCkgew0KLQkJCS8vIG5ldyBsaW5lDQotCQkJbG9jLnggPSBsb2MuaW5kZW50ICsgaXdpZHRoOw0KLQkJCWxvYy53aWR0aCA9IGxvYy54Ow0KLQkJCWxvYy55ICs9IGxvYy5yb3dIZWlnaHQ7DQotCQkJbG9jLnJvd0hlaWdodCA9IGloZWlnaHQ7DQotCQl9DQotCQllbHNlIHsNCi0JCQlsb2MueCArPSBpd2lkdGg7DQotCQkJbG9jLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvYy5yb3dIZWlnaHQsIGloZWlnaHQpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBpbnQgd2lkdGgsIExvY2F0b3IgbG9jLCBIYXNodGFibGUgb2JqZWN0VGFibGUsIGJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2Uob2JqZWN0VGFibGUpOw0KLQkJaW50IGl3aWR0aCA9IDA7DQotCQlpbnQgaWhlaWdodCA9IDA7DQotCQlpZiAoaW1hZ2UhPW51bGwpIHsNCi0JCQlSZWN0YW5nbGUgcmVjdCA9IGltYWdlLmdldEJvdW5kcygpOw0KLQkJCWl3aWR0aCA9IHJlY3Qud2lkdGg7DQotCQkJaWhlaWdodCA9IHJlY3QuaGVpZ2h0Ow0KLQkJfQ0KLQkJZWxzZSByZXR1cm47DQotCQlsb2Mud2lkdGggPSBpd2lkdGg7DQotCQlsb2MuaGVpZ2h0ID0gaWhlaWdodDsNCi0JCQ0KLQkJaW50IGl4ID0gbG9jLng7DQotCQlpbnQgaXkgPSBsb2MueTsNCi0JCQ0KLQkJaWYgKGl4ICsgaXdpZHRoID4gd2lkdGgpIHsNCi0JCQkvLyBuZXcgcm93DQotCQkJaXggPSBsb2MuaW5kZW50ICsgbG9jLm1hcmdpbldpZHRoOw0KLQkJCWl5ICs9IGxvYy5yb3dIZWlnaHQ7DQotCQkJbG9jLnJvd0hlaWdodCA9IDA7DQotCQl9DQotCQkNCi0JCWdjLmRyYXdJbWFnZShpbWFnZSwgaXgsIGl5KTsNCi0JCWxvYy54ID0gaXggKyBpd2lkdGg7DQotCQlsb2MueSA9IGl5Ow0KLQkJbG9jLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvYy5yb3dIZWlnaHQsIGloZWlnaHQpOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvTG9jYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Mb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDE1NGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9Mb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIExvY2F0b3IgeyANCi0JcHVibGljIGludCBpbmRlbnQ7DQotCXB1YmxpYyBpbnQgeCwgeTsNCi0JcHVibGljIGludCB3aWR0aCwgaGVpZ2h0Ow0KLQlwdWJsaWMgaW50IHJvd0hlaWdodDsNCi0JcHVibGljIGludCBtYXJnaW5XaWR0aDsNCi0JcHVibGljIGludCBtYXJnaW5IZWlnaHQ7DQotCQ0KLQlwdWJsaWMgdm9pZCBuZXdMaW5lKCkgew0KLQkJcmVzZXRDYXJldCgpOw0KLQkJeSArPSByb3dIZWlnaHQ7DQotCQlyb3dIZWlnaHQgPSAwOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZXNldENhcmV0KCkgew0KLQkJeCA9IG1hcmdpbldpZHRoICsgaW5kZW50Ow0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWE0MzUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvUGFyYWdyYXBoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLmVuZ2luZTsNCi0NCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuSHlwZXJsaW5rU2V0dGluZ3M7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgUGFyYWdyYXBoIGltcGxlbWVudHMgSVBhcmFncmFwaCB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFAgPSAiaHR0cDovLyI7DQotCXByaXZhdGUgVmVjdG9yIHNlZ21lbnRzOw0KLQlwcml2YXRlIGJvb2xlYW4gYWRkVmVydGljYWxTcGFjZSA9IHRydWU7DQotDQotCXB1YmxpYyBQYXJhZ3JhcGgoYm9vbGVhbiBhZGRWZXJ0aWNhbFNwYWNlKSB7DQotCQl0aGlzLmFkZFZlcnRpY2FsU3BhY2UgPSBhZGRWZXJ0aWNhbFNwYWNlOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0SW5kZW50KCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gZ2V0QWRkVmVydGljYWxTcGFjZSgpIHsNCi0JCXJldHVybiBhZGRWZXJ0aWNhbFNwYWNlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBhcmFncmFwaCNnZXRTZWdtZW50cygpDQotCSAqLw0KLQlwdWJsaWMgSVBhcmFncmFwaFNlZ21lbnRbXSBnZXRTZWdtZW50cygpIHsNCi0JCWlmIChzZWdtZW50cyA9PSBudWxsKQ0KLQkJCXJldHVybiBuZXcgSVBhcmFncmFwaFNlZ21lbnRbMF07DQotCQlyZXR1cm4gKElQYXJhZ3JhcGhTZWdtZW50W10pIHNlZ21lbnRzLnRvQXJyYXkoDQotCQkJbmV3IElQYXJhZ3JhcGhTZWdtZW50W3NlZ21lbnRzLnNpemUoKV0pOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZFNlZ21lbnQoSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCkgew0KLQkJaWYgKHNlZ21lbnRzID09IG51bGwpDQotCQkJc2VnbWVudHMgPSBuZXcgVmVjdG9yKCk7DQotCQlzZWdtZW50cy5hZGQoc2VnbWVudCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dCgNCi0JCVN0cmluZyB0ZXh0LA0KLQkJYm9vbGVhbiBleHBhbmRVUkxzLA0KLQkJSHlwZXJsaW5rU2V0dGluZ3Mgc2V0dGluZ3MsDQotCQlTdHJpbmcgZm9udElkKSB7DQotCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKQ0KLQkJCXJldHVybjsNCi0JCWlmIChleHBhbmRVUkxzKSB7DQotCQkJaW50IGxvYyA9IHRleHQuaW5kZXhPZihIVFRQKTsNCi0NCi0JCQlpZiAobG9jID09IC0xKQ0KLQkJCQlhZGRTZWdtZW50KG5ldyBUZXh0U2VnbWVudCh0ZXh0LCBmb250SWQpKTsNCi0JCQllbHNlIHsNCi0JCQkJaW50IHRleHRMb2MgPSAwOw0KLQkJCQl3aGlsZSAobG9jICE9IC0xKSB7DQotCQkJCQlhZGRTZWdtZW50KG5ldyBUZXh0U2VnbWVudCh0ZXh0LnN1YnN0cmluZyh0ZXh0TG9jLCBsb2MpLCBmb250SWQpKTsNCi0JCQkJCWJvb2xlYW4gYWRkZWQgPSBmYWxzZTsNCi0JCQkJCWZvciAodGV4dExvYyA9IGxvYzsgdGV4dExvYyA8IHRleHQubGVuZ3RoKCk7IHRleHRMb2MrKykgew0KLQkJCQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KHRleHRMb2MpOw0KLQkJCQkJCWlmIChDaGFyYWN0ZXIuaXNTcGFjZUNoYXIoYykpIHsNCi0JCQkJCQkJYWRkSHlwZXJsaW5rU2VnbWVudCh0ZXh0LnN1YnN0cmluZyhsb2MsIHRleHRMb2MpLCBzZXR0aW5ncywgZm9udElkKTsNCi0JCQkJCQkJYWRkZWQgPSB0cnVlOw0KLQkJCQkJCQlicmVhazsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQlpZiAoIWFkZGVkKSB7DQotCQkJCQkJLy8gdGhlcmUgd2FzIG5vIHNwYWNlIC0ganVzdCBlbmQgb2YgdGV4dA0KLQkJCQkJCWFkZEh5cGVybGlua1NlZ21lbnQodGV4dC5zdWJzdHJpbmcobG9jKSwgc2V0dGluZ3MsIGZvbnRJZCk7DQotCQkJCQkJYnJlYWs7DQotCQkJCQl9DQotCQkJCQlsb2MgPSB0ZXh0LmluZGV4T2YoSFRUUCwgdGV4dExvYyk7DQotCQkJCX0NCi0JCQkJaWYgKHRleHRMb2MgPCB0ZXh0Lmxlbmd0aCgpKSB7DQotCQkJCQlhZGRTZWdtZW50KG5ldyBUZXh0U2VnbWVudCh0ZXh0LnN1YnN0cmluZyh0ZXh0TG9jKSwgZm9udElkKSk7DQotCQkJCX0NCi0JCQl9DQotCQl9IGVsc2Ugew0KLQkJCWFkZFNlZ21lbnQobmV3IFRleHRTZWdtZW50KHRleHQsIGZvbnRJZCkpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRIeXBlcmxpbmtTZWdtZW50KA0KLQkJU3RyaW5nIHRleHQsDQotCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncywNCi0JCVN0cmluZyBmb250SWQpIHsNCi0JCUh5cGVybGlua1NlZ21lbnQgaHMgPSBuZXcgSHlwZXJsaW5rU2VnbWVudCh0ZXh0LCBzZXR0aW5ncywgZm9udElkKTsNCi0JCWhzLnNldFdvcmRXcmFwQWxsb3dlZChmYWxzZSk7DQotCQlocy5zZXRBY3Rpb25JZChGb3JtRW5naW5lLlVSTF9IQU5ETEVSX0lEKTsNCi0JCWFkZFNlZ21lbnQoaHMpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHBhaW50KA0KLQkJR0MgZ2MsDQotCQlpbnQgd2lkdGgsDQotCQlMb2NhdG9yIGxvYywNCi0JCWludCBsaW5lSGVpZ2h0LA0KLQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlLA0KLQkJSUh5cGVybGlua1NlZ21lbnQgc2VsZWN0ZWRMaW5rKSB7DQotCQlJUGFyYWdyYXBoU2VnbWVudCBbXSBzZWdtZW50cyA9IGdldFNlZ21lbnRzKCk7DQotCQlpZiAoc2VnbWVudHMubGVuZ3RoID4gMCkgew0KLQkJCWlmIChzZWdtZW50c1swXSBpbnN0YW5jZW9mIElUZXh0U2VnbWVudA0KLQkJCQkmJiAoKElUZXh0U2VnbWVudCkgc2VnbWVudHNbMF0pLmlzU2VsZWN0YWJsZSgpKQ0KLQkJCQlsb2MueCArPSAxOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsNCi0JCQkJSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IHNlZ21lbnRzW2pdOw0KLQkJCQlib29sZWFuIGRvU2VsZWN0ID0gZmFsc2U7DQotCQkJCWlmIChzZWxlY3RlZExpbmsgIT0gbnVsbCAmJiBzZWdtZW50LmVxdWFscyhzZWxlY3RlZExpbmspKQ0KLQkJCQkJZG9TZWxlY3QgPSB0cnVlOw0KLQkJCQlzZWdtZW50LnBhaW50KGdjLCB3aWR0aCwgbG9jLCBvYmplY3RUYWJsZSwgZG9TZWxlY3QpOw0KLQkJCX0NCi0JCQlsb2MueSArPSBsb2Mucm93SGVpZ2h0Ow0KLQkJfSBlbHNlIHsNCi0JCQlsb2MueSArPSBsaW5lSGVpZ2h0Ow0KLQkJfQ0KLQl9DQotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzaWJsZVRleHQoKSB7DQotCQlJUGFyYWdyYXBoU2VnbWVudCBbXSBzZWdtZW50cyA9IGdldFNlZ21lbnRzKCk7DQotCQlTdHJpbmdXcml0ZXIgc3dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsNCi0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsNCi0JCQlJUGFyYWdyYXBoU2VnbWVudCBzZWdtZW50ID0gc2VnbWVudHNbaV07DQotCQkJaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBJVGV4dFNlZ21lbnQpIHsNCi0JCQkJU3RyaW5nIHRleHQgPSAoKElUZXh0U2VnbWVudClzZWdtZW50KS5nZXRUZXh0KCk7DQotCQkJCXdyaXRlci5wcmludCh0ZXh0KTsNCi0JCQl9DQotCQl9DQotCQl3cml0ZXIucHJpbnRsbigpOw0KLQkJc3dyaXRlci5mbHVzaCgpOw0KLQkJcmV0dXJuIHN3cml0ZXIudG9TdHJpbmcoKTsNCi0JfQ0KLQlwdWJsaWMgSVRleHRTZWdtZW50IGZpbmRTZWdtZW50QXQoaW50IHgsIGludCB5KSB7DQotCQlpZiAoc2VnbWVudHMhPW51bGwpIHsNCi0JCQlmb3IgKGludCBpPTA7IGk8c2VnbWVudHMuc2l6ZSgpOyBpKyspIHsNCi0JCQkJSVBhcmFncmFwaFNlZ21lbnQgc2VnbWVudCA9IChJUGFyYWdyYXBoU2VnbWVudClzZWdtZW50cy5nZXQoaSk7DQotCQkJCWlmIChzZWdtZW50IGluc3RhbmNlb2YgSVRleHRTZWdtZW50KSB7DQotCQkJCQlJVGV4dFNlZ21lbnQgdGV4dFNlZ21lbnQgPSAoSVRleHRTZWdtZW50KXNlZ21lbnQ7DQotCQkJCQlpZiAodGV4dFNlZ21lbnQuY29udGFpbnMoeCwgeSkpDQotCQkJCQkJcmV0dXJuIHRleHRTZWdtZW50Ow0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9QYXJhZ3JhcGhTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaFNlZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxNmFhYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1BhcmFncmFwaFNlZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFyYWdyYXBoU2VnbWVudCBpbXBsZW1lbnRzIElQYXJhZ3JhcGhTZWdtZW50IHsNCi0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0TW9kZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9lbmdpbmUvVGV4dE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYzk2ODIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuZW5naW5lOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7DQotaW1wb3J0IG9yZy53M2MuZG9tLio7DQotaW1wb3J0IG9yZy54bWwuc2F4Lio7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGV4dE1vZGVsIGltcGxlbWVudHMgSVRleHRNb2RlbCB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsNCi0NCi0JVmVjdG9yIHBhcmFncmFwaHM7DQotCUlIeXBlcmxpbmtMaXN0ZW5lciB1cmxMaXN0ZW5lcjsNCi0JSUh5cGVybGlua1NlZ21lbnRbXSBoeXBlcmxpbmtzOw0KLQlpbnQgc2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsNCi0JSHlwZXJsaW5rU2V0dGluZ3MgaHlwZXJsaW5rU2V0dGluZ3M7DQotCQ0KLQlwdWJsaWMgVGV4dE1vZGVsKCkgew0KLQkJcmVzZXQoKTsNCi0JfQ0KLQ0KLQljbGFzcyBMb2NhbEh5cGVybGlua1NldHRpbmdzIGV4dGVuZHMgSHlwZXJsaW5rU2V0dGluZ3Mgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVRleHRNb2RlbCNnZXRQYXJhZ3JhcGhzKCkNCi0JICovDQotCXB1YmxpYyBJUGFyYWdyYXBoW10gZ2V0UGFyYWdyYXBocygpIHsNCi0JCWlmIChwYXJhZ3JhcGhzID09IG51bGwpDQotCQkJcmV0dXJuIG5ldyBJUGFyYWdyYXBoWzBdOw0KLQkJcmV0dXJuIChJUGFyYWdyYXBoW10pIHBhcmFncmFwaHMudG9BcnJheSgNCi0JCQluZXcgSVBhcmFncmFwaFtwYXJhZ3JhcGhzLnNpemUoKV0pOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc2libGVUZXh0KCkgew0KLQkJaWYgKHBhcmFncmFwaHMgPT0gbnVsbCkNCi0JCQlyZXR1cm4gIiI7DQotCQlTdHJpbmdCdWZmZXIgc2J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0JCWZvciAoaW50IGk9MDsgaTxwYXJhZ3JhcGhzLnNpemUoKTsgaSsrKSB7DQotCQkJSVBhcmFncmFwaCBwYXJhZ3JhcGggID0gKElQYXJhZ3JhcGgpcGFyYWdyYXBocy5nZXQoaSk7DQotCQkJU3RyaW5nIHRleHQgPSBwYXJhZ3JhcGguZ2V0QWNjZXNzaWJsZVRleHQoKTsNCi0JCQlzYnVmLmFwcGVuZCh0ZXh0KTsNCi0JCX0NCi0JCXJldHVybiBzYnVmLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJVGV4dE1vZGVsI3BhcnNlKFN0cmluZykNCi0JICovDQotCXB1YmxpYyB2b2lkIHBhcnNlVGFnZ2VkVGV4dChTdHJpbmcgdGFnZ2VkVGV4dCwgYm9vbGVhbiBleHBhbmRVUkxzKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJaWYgKHRhZ2dlZFRleHQ9PW51bGwpIHsNCi0JCQlyZXNldCgpOw0KLQkJCXJldHVybjsNCi0JCX0NCi0JCXRyeSB7DQotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0NCi0JCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRhZ2dlZFRleHQuZ2V0Qnl0ZXMoIlVURjgiKSk7DQotCQkJcGFyc2VJbnB1dFN0cmVhbShzdHJlYW0sIGV4cGFuZFVSTHMpOw0KLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7DQotCQl9DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFyc2VJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpcywgYm9vbGVhbiBleHBhbmRVUkxzKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJCQ0KLQkJZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsNCi0JDQotCQlyZXNldCgpOw0KLQkJdHJ5IHsNCi0JCQlEb2N1bWVudEJ1aWxkZXIgcGFyc2VyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsNCi0JCQlJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UoaXMpOw0KLQkJCURvY3VtZW50IGRvYyA9IHBhcnNlci5wYXJzZShzb3VyY2UpOw0KLQkJCXByb2Nlc3NEb2N1bWVudChkb2MsIGV4cGFuZFVSTHMpOw0KLQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7DQotCQkJRm9ybXNQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOw0KLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsNCi0JCQlGb3Jtc1BsdWdpbi5sb2dFeGNlcHRpb24oZSk7DQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJRm9ybXNQbHVnaW4ubG9nRXhjZXB0aW9uKGUpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRG9jdW1lbnQoRG9jdW1lbnQgZG9jLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCU5vZGUgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsNCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsNCi0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsNCi0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgew0KLQkJCQkvLyBNYWtlIGFuIGltcGxpY2l0IHBhcmFncmFwaA0KLQkJCQlTdHJpbmcgdGV4dCA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOw0KLQkJCQlpZiAodGV4dCAhPSBudWxsICYmICFpc0lnbm9yYWJsZVdoaXRlU3BhY2UodGV4dCwgdHJ1ZSkpIHsNCi0JCQkJCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsNCi0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCQl0ZXh0LA0KLQkJCQkJCWV4cGFuZFVSTHMsDQotCQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwNCi0JCQkJCQludWxsKTsNCi0JCQkJCXBhcmFncmFwaHMuYWRkKHApOw0KLQkJCQl9DQotCQkJfSBlbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7DQotCQkJCVN0cmluZyB0YWcgPSBjaGlsZC5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKCk7DQotCQkJCWlmICh0YWcuZXF1YWxzKCJwIikpIHsNCi0JCQkJCUlQYXJhZ3JhcGggcCA9IHByb2Nlc3NQYXJhZ3JhcGgoY2hpbGQsIGV4cGFuZFVSTHMpOw0KLQkJCQkJaWYgKHAgIT0gbnVsbCkNCi0JCQkJCQlwYXJhZ3JhcGhzLmFkZChwKTsNCi0JCQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKCJsaSIpKSB7DQotCQkJCQlJUGFyYWdyYXBoIHAgPSBwcm9jZXNzTGlzdEl0ZW0oY2hpbGQsIGV4cGFuZFVSTHMpOw0KLQkJCQkJaWYgKHAgIT0gbnVsbCkNCi0JCQkJCQlwYXJhZ3JhcGhzLmFkZChwKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcml2YXRlIElQYXJhZ3JhcGggcHJvY2Vzc1BhcmFncmFwaChOb2RlIHBhcmFncmFwaCwgYm9vbGVhbiBleHBhbmRVUkxzKSB7DQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmFncmFwaC5nZXRDaGlsZE5vZGVzKCk7DQotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IHBhcmFncmFwaC5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGFkZFNwYWNlQXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImFkZFZlcnRpY2FsU3BhY2UiKTsNCi0JCWJvb2xlYW4gYWRkU3BhY2UgPSB0cnVlOw0KLQ0KLQkJaWYgKGFkZFNwYWNlQXR0ICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgdmFsdWUgPSBhZGRTcGFjZUF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCQlhZGRTcGFjZSA9IHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsNCi0JCX0NCi0JCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaChhZGRTcGFjZSk7DQotDQotCQlwcm9jZXNzU2VnbWVudHMocCwgY2hpbGRyZW4sIGV4cGFuZFVSTHMpOw0KLQkJcmV0dXJuIHA7DQotCX0NCi0JcHJpdmF0ZSBJUGFyYWdyYXBoIHByb2Nlc3NMaXN0SXRlbShOb2RlIGxpc3RJdGVtLCBib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbGlzdEl0ZW0uZ2V0Q2hpbGROb2RlcygpOw0KLQkJTmFtZWROb2RlTWFwIGF0dHMgPSBsaXN0SXRlbS5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGFkZFNwYWNlQXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImFkZFZlcnRpY2FsU3BhY2UiKTsNCi0JCU5vZGUgc3R5bGVBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgic3R5bGUiKTsNCi0JCU5vZGUgdmFsdWVBdHQgPSBhdHRzLmdldE5hbWVkSXRlbSgidmFsdWUiKTsNCi0JCU5vZGUgaW5kZW50QXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0oImluZGVudCIpOw0KLQkJaW50IHN0eWxlID0gSUJ1bGxldFBhcmFncmFwaC5DSVJDTEU7DQotCQlpbnQgaW5kZW50ID0gLTE7DQotCQlTdHJpbmcgdGV4dCA9IG51bGw7DQotCQlib29sZWFuIGFkZFNwYWNlID0gdHJ1ZTsNCi0NCi0JCWlmIChhZGRTcGFjZUF0dCAhPSBudWxsKSB7DQotCQkJU3RyaW5nIHZhbHVlID0gYWRkU3BhY2VBdHQuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJYWRkU3BhY2UgPSB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7DQotCQl9DQotCQlpZiAoc3R5bGVBdHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IHN0eWxlQXR0LmdldE5vZGVWYWx1ZSgpOw0KLQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0IikpIHsNCi0JCQkJc3R5bGUgPSBJQnVsbGV0UGFyYWdyYXBoLlRFWFQ7DQotCQkJfSBlbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJpbWFnZSIpKSB7DQotCQkJCXN0eWxlID0gSUJ1bGxldFBhcmFncmFwaC5JTUFHRTsNCi0JCQl9DQotCQl9DQotCQlpZiAodmFsdWVBdHQgIT0gbnVsbCkgew0KLQkJCXRleHQgPSB2YWx1ZUF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCX0NCi0JCWlmIChpbmRlbnRBdHQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGluZGVudEF0dC5nZXROb2RlVmFsdWUoKTsNCi0JCQl0cnkgew0KLQkJCQlpbmRlbnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsNCi0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0NCi0JCUJ1bGxldFBhcmFncmFwaCBwID0gbmV3IEJ1bGxldFBhcmFncmFwaChhZGRTcGFjZSk7DQotCQlwLnNldEluZGVudChpbmRlbnQpOw0KLQkJcC5zZXRCdWxsZXRTdHlsZShzdHlsZSk7DQotCQlwLnNldEJ1bGxldFRleHQodGV4dCk7DQotDQotCQlwcm9jZXNzU2VnbWVudHMocCwgY2hpbGRyZW4sIGV4cGFuZFVSTHMpOw0KLQkJcmV0dXJuIHA7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTZWdtZW50cygNCi0JCVBhcmFncmFwaCBwLA0KLQkJTm9kZUxpc3QgY2hpbGRyZW4sDQotCQlib29sZWFuIGV4cGFuZFVSTHMpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgew0KLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOw0KLQkJCUlQYXJhZ3JhcGhTZWdtZW50IHNlZ21lbnQgPSBudWxsOw0KLQ0KLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7DQotCQkJCVN0cmluZyB2YWx1ZSA9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOw0KLQ0KLQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAhaXNJZ25vcmFibGVXaGl0ZVNwYWNlKHZhbHVlLCBmYWxzZSkpIHsNCi0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCQl2YWx1ZSwNCi0JCQkJCQlleHBhbmRVUkxzLA0KLQkJCQkJCWdldEh5cGVybGlua1NldHRpbmdzKCksDQotCQkJCQkJbnVsbCk7DQotCQkJCX0NCi0JCQl9IGVsc2UgaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsNCi0JCQkJU3RyaW5nIG5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOw0KLQkJCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJpbWciKSkgew0KLQkJCQkJc2VnbWVudCA9IHByb2Nlc3NJbWFnZVNlZ21lbnQoY2hpbGQpOw0KLQkJCQl9IGVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiYSIpKSB7DQotCQkJCQlzZWdtZW50ID0NCi0JCQkJCQlwcm9jZXNzSHlwZXJsaW5rU2VnbWVudChjaGlsZCwgZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSk7DQotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJ0ZXh0IikpIHsNCi0JCQkJCXByb2Nlc3NUZXh0U2VnbWVudChwLCBleHBhbmRVUkxzLCBjaGlsZCk7DQotCQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJiIikpIHsNCi0JCQkJCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQoY2hpbGQpLnRyaW0oKTsNCi0JCQkJCVN0cmluZyBmb250SWQgPSBKRmFjZVJlc291cmNlcy5CQU5ORVJfRk9OVDsNCi0JCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCQl0ZXh0LA0KLQkJCQkJCWV4cGFuZFVSTHMsDQotCQkJCQkJZ2V0SHlwZXJsaW5rU2V0dGluZ3MoKSwNCi0JCQkJCQlmb250SWQpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCWlmIChzZWdtZW50ICE9IG51bGwpIHsNCi0JCQkJcC5hZGRTZWdtZW50KHNlZ21lbnQpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIGJvb2xlYW4gaXNJZ25vcmFibGVXaGl0ZVNwYWNlKFN0cmluZyB0ZXh0LCBib29sZWFuIGlnbm9yZVNwYWNlcykgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAoaWdub3JlU3BhY2VzICYmIGMgPT0gJyAnKQ0KLQkJCQljb250aW51ZTsNCi0JCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcZicpDQotCQkJCWNvbnRpbnVlOw0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotDQotCXByaXZhdGUgSVBhcmFncmFwaFNlZ21lbnQgcHJvY2Vzc0ltYWdlU2VnbWVudChOb2RlIGltYWdlKSB7DQotCQlJbWFnZVNlZ21lbnQgc2VnbWVudCA9IG5ldyBJbWFnZVNlZ21lbnQoKTsNCi0JCU5hbWVkTm9kZU1hcCBhdHRzID0gaW1hZ2UuZ2V0QXR0cmlidXRlcygpOw0KLQkJTm9kZSBpZCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJocmVmIik7DQotCQlOb2RlIGFsaWduID0gYXR0cy5nZXROYW1lZEl0ZW0oImFsaWduIik7DQotCQlpZiAoaWQgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGlkLmdldE5vZGVWYWx1ZSgpOw0KLQkJCXNlZ21lbnQuc2V0T2JqZWN0SWQodmFsdWUpOw0KLQkJfQ0KLQkJaWYgKGFsaWduICE9IG51bGwpIHsNCi0JCQlTdHJpbmcgdmFsdWUgPSBhbGlnbi5nZXROb2RlVmFsdWUoKS50b0xvd2VyQ2FzZSgpOw0KLQkJCWlmICh2YWx1ZS5lcXVhbHMoInRvcCIpKQ0KLQkJCQlzZWdtZW50LnNldFZlcnRpY2FsQWxpZ25tZW50KEltYWdlU2VnbWVudC5UT1ApOw0KLQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFscygibWlkZGxlIikpDQotCQkJCXNlZ21lbnQuc2V0VmVydGljYWxBbGlnbm1lbnQoSW1hZ2VTZWdtZW50Lk1JRERMRSk7DQotCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzKCJib3R0b20iKSkNCi0JCQkJc2VnbWVudC5zZXRWZXJ0aWNhbEFsaWdubWVudChJbWFnZVNlZ21lbnQuQk9UVE9NKTsNCi0JCX0NCi0JCXJldHVybiBzZWdtZW50Ow0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldE5vZGVUZXh0KE5vZGUgbm9kZSkgew0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsNCi0JCVN0cmluZyB0ZXh0ID0gIiI7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsNCi0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsNCi0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgew0KLQkJCQl0ZXh0ICs9IGNoaWxkLmdldE5vZGVWYWx1ZSgpOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB0ZXh0Ow0KLQl9DQotDQotCXByaXZhdGUgSVBhcmFncmFwaFNlZ21lbnQgcHJvY2Vzc0h5cGVybGlua1NlZ21lbnQoDQotCQlOb2RlIGxpbmssDQotCQlIeXBlcmxpbmtTZXR0aW5ncyBzZXR0aW5ncykgew0KLQkJU3RyaW5nIHRleHQgPSBnZXROb2RlVGV4dChsaW5rKTsNCi0JCUh5cGVybGlua1NlZ21lbnQgc2VnbWVudCA9IG5ldyBIeXBlcmxpbmtTZWdtZW50KHRleHQsIHNldHRpbmdzLCBudWxsKTsNCi0JCU5hbWVkTm9kZU1hcCBhdHRzID0gbGluay5nZXRBdHRyaWJ1dGVzKCk7DQotCQlOb2RlIGhyZWYgPSBhdHRzLmdldE5hbWVkSXRlbSgiaHJlZiIpOw0KLQkJaWYgKGhyZWYgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGhyZWYuZ2V0Tm9kZVZhbHVlKCk7DQotCQkJc2VnbWVudC5zZXRBY3Rpb25JZCh2YWx1ZSk7DQotCQl9DQotCQlOb2RlIGFyZyA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJhcmciKTsNCi0JCWlmIChhcmcgIT0gbnVsbCkgew0KLQkJCVN0cmluZyB2YWx1ZSA9IGFyZy5nZXROb2RlVmFsdWUoKTsNCi0JCQlzZWdtZW50LnNldEFyZyh2YWx1ZSk7DQotCQl9DQotCQlyZXR1cm4gc2VnbWVudDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1RleHRTZWdtZW50KA0KLQkJUGFyYWdyYXBoIHAsDQotCQlib29sZWFuIGV4cGFuZFVSTHMsDQotCQlOb2RlIHRleHROb2RlKSB7DQotCQlTdHJpbmcgdGV4dCA9IGdldE5vZGVUZXh0KHRleHROb2RlKS50cmltKCk7DQotDQotCQlOYW1lZE5vZGVNYXAgYXR0cyA9IHRleHROb2RlLmdldEF0dHJpYnV0ZXMoKTsNCi0JCU5vZGUgZm9udCA9IGF0dHMuZ2V0TmFtZWRJdGVtKCJmb250Iik7DQotCQlTdHJpbmcgZm9udElkID0gbnVsbDsNCi0JCWlmIChmb250ICE9IG51bGwpIHsNCi0JCQlmb250SWQgPSBmb250LmdldE5vZGVWYWx1ZSgpOw0KLQkJfQ0KLQkJcC5wYXJzZVJlZ3VsYXJUZXh0KHRleHQsIGV4cGFuZFVSTHMsIGdldEh5cGVybGlua1NldHRpbmdzKCksIGZvbnRJZCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgcGFyc2VSZWd1bGFyVGV4dChTdHJpbmcgcmVndWxhclRleHQsIGJvb2xlYW4gY29udmVydFVSTHMpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXNldCgpOw0KLQkJDQotCQlpZiAocmVndWxhclRleHQ9PW51bGwpIHJldHVybjsNCi0NCi0JCVBhcmFncmFwaCBwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsNCi0JCXBhcmFncmFwaHMuYWRkKHApOw0KLQkJaW50IHBzdGFydCA9IDA7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ3VsYXJUZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSByZWd1bGFyVGV4dC5jaGFyQXQoaSk7DQotCQkJaWYgKHAgPT0gbnVsbCkgew0KLQkJCQlwID0gbmV3IFBhcmFncmFwaCh0cnVlKTsNCi0JCQkJcGFyYWdyYXBocy5hZGQocCk7DQotCQkJfQ0KLQkJCWlmIChjID09ICdcbicpIHsNCi0JCQkJU3RyaW5nIHRleHQgPSByZWd1bGFyVGV4dC5zdWJzdHJpbmcocHN0YXJ0LCBpKTsNCi0JCQkJcHN0YXJ0ID0gaSArIDE7DQotCQkJCXAucGFyc2VSZWd1bGFyVGV4dCgNCi0JCQkJCXRleHQsDQotCQkJCQljb252ZXJ0VVJMcywNCi0JCQkJCWdldEh5cGVybGlua1NldHRpbmdzKCksDQotCQkJCQludWxsKTsNCi0JCQkJcCA9IG51bGw7DQotCQkJfQ0KLQkJfQ0KLQkJaWYgKHAgIT0gbnVsbCkgew0KLQkJCS8vIG5vIG5ldyBsaW5lDQotCQkJU3RyaW5nIHRleHQgPSByZWd1bGFyVGV4dC5zdWJzdHJpbmcocHN0YXJ0KTsNCi0JCQlwLnBhcnNlUmVndWxhclRleHQodGV4dCwgY29udmVydFVSTHMsIGdldEh5cGVybGlua1NldHRpbmdzKCksIG51bGwpOw0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBIeXBlcmxpbmtTZXR0aW5ncyBnZXRIeXBlcmxpbmtTZXR0aW5ncygpIHsNCi0JCWlmIChoeXBlcmxpbmtTZXR0aW5ncyA9PSBudWxsKSB7DQotCQkJaHlwZXJsaW5rU2V0dGluZ3MgPSBuZXcgTG9jYWxIeXBlcmxpbmtTZXR0aW5ncygpOw0KLQkJfQ0KLQkJcmV0dXJuIGh5cGVybGlua1NldHRpbmdzOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNldEh5cGVybGlua1NldHRpbmdzKEh5cGVybGlua1NldHRpbmdzIHNldHRpbmdzKSB7DQotCQl0aGlzLmh5cGVybGlua1NldHRpbmdzID0gc2V0dGluZ3M7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VVJMTGlzdGVuZXIoSUh5cGVybGlua0xpc3RlbmVyIHVybExpc3RlbmVyKSB7DQotCQl0aGlzLnVybExpc3RlbmVyID0gdXJsTGlzdGVuZXI7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgew0KLQkJaWYgKHBhcmFncmFwaHMgPT0gbnVsbCkNCi0JCQlwYXJhZ3JhcGhzID0gbmV3IFZlY3RvcigpOw0KLQkJcGFyYWdyYXBocy5jbGVhcigpOw0KLQkJc2VsZWN0ZWRMaW5rSW5kZXggPSAtMTsNCi0JCWh5cGVybGlua3MgPSBudWxsOw0KLQl9DQotDQotCUlIeXBlcmxpbmtTZWdtZW50W10gZ2V0SHlwZXJsaW5rcygpIHsNCi0JCWlmIChoeXBlcmxpbmtzICE9IG51bGwgfHwgcGFyYWdyYXBocyA9PSBudWxsKQ0KLQkJCXJldHVybiBoeXBlcmxpbmtzOw0KLQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5zaXplKCk7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IChJUGFyYWdyYXBoKSBwYXJhZ3JhcGhzLmdldChpKTsNCi0JCQlJUGFyYWdyYXBoU2VnbWVudFtdIHNlZ21lbnRzID0gcC5nZXRTZWdtZW50cygpOw0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2VnbWVudHMubGVuZ3RoOyBqKyspIHsNCi0JCQkJaWYgKHNlZ21lbnRzW2pdIGluc3RhbmNlb2YgSUh5cGVybGlua1NlZ21lbnQpDQotCQkJCQlyZXN1bHQuYWRkKHNlZ21lbnRzW2pdKTsNCi0JCQl9DQotCQl9DQotCQloeXBlcmxpbmtzID0NCi0JCQkoSUh5cGVybGlua1NlZ21lbnRbXSkgcmVzdWx0LnRvQXJyYXkoDQotCQkJCW5ldyBJSHlwZXJsaW5rU2VnbWVudFtyZXN1bHQuc2l6ZSgpXSk7DQotCQlyZXR1cm4gaHlwZXJsaW5rczsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUh5cGVybGlua1NlZ21lbnQgZmluZEh5cGVybGlua0F0KGludCB4LCBpbnQgeSkgew0KLQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAobGlua3NbaV0uY29udGFpbnMoeCwgeSkpDQotCQkJCXJldHVybiBsaW5rc1tpXTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCXB1YmxpYyBJVGV4dFNlZ21lbnQgZmluZFNlZ21lbnRBdChpbnQgeCwgaW50IHkpIHsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYWdyYXBocy5zaXplKCk7IGkrKykgew0KLQkJCUlQYXJhZ3JhcGggcCA9IChJUGFyYWdyYXBoKSBwYXJhZ3JhcGhzLmdldChpKTsNCi0JCQlJVGV4dFNlZ21lbnQgc2VnbWVudCA9IHAuZmluZFNlZ21lbnRBdCh4LCB5KTsNCi0JCQlpZiAoc2VnbWVudCAhPSBudWxsKQ0KLQkJCQlyZXR1cm4gc2VnbWVudDsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCXB1YmxpYyBJSHlwZXJsaW5rU2VnbWVudCBnZXRTZWxlY3RlZExpbmsoKSB7DQotCQlpZiAoc2VsZWN0ZWRMaW5rSW5kZXggPT0gLTEpDQotCQkJcmV0dXJuIG51bGw7DQotCQlyZXR1cm4gaHlwZXJsaW5rc1tzZWxlY3RlZExpbmtJbmRleF07DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gdHJhdmVyc2VMaW5rcyhib29sZWFuIG5leHQpIHsNCi0JCUlIeXBlcmxpbmtTZWdtZW50W10gbGlua3MgPSBnZXRIeXBlcmxpbmtzKCk7DQotCQlpZiAobGlua3MgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpbnQgc2l6ZSA9IGxpbmtzLmxlbmd0aDsNCi0JCWlmIChuZXh0KSB7DQotCQkJc2VsZWN0ZWRMaW5rSW5kZXgrKzsNCi0JCX0gZWxzZQ0KLQkJCXNlbGVjdGVkTGlua0luZGV4LS07DQotDQotCQlpZiAoc2VsZWN0ZWRMaW5rSW5kZXggPCAwIHx8IHNlbGVjdGVkTGlua0luZGV4ID4gc2l6ZSAtIDEpIHsNCi0JCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJfQ0KLQkJcmV0dXJuIHNlbGVjdGVkTGlua0luZGV4ICE9IC0xOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHNlbGVjdExpbmsoSUh5cGVybGlua1NlZ21lbnQgbGluaykgew0KLQkJaWYgKGxpbmsgPT0gbnVsbCkNCi0JCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJZWxzZSB7DQotCQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCQlzZWxlY3RlZExpbmtJbmRleCA9IC0xOw0KLQkJCWlmIChsaW5rcyA9PSBudWxsKQ0KLQkJCQlyZXR1cm47DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykgew0KLQkJCQlpZiAobGlua3NbaV0uZXF1YWxzKGxpbmspKSB7DQotCQkJCQlzZWxlY3RlZExpbmtJbmRleCA9IGk7DQotCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1c1NlZ21lbnRzKCkgew0KLQkJSUh5cGVybGlua1NlZ21lbnRbXSBsaW5rcyA9IGdldEh5cGVybGlua3MoKTsNCi0JCWlmIChsaW5rcy5sZW5ndGggPiAwKQ0KLQkJCXJldHVybiB0cnVlOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlpZiAoaHlwZXJsaW5rU2V0dGluZ3MgaW5zdGFuY2VvZiBMb2NhbEh5cGVybGlua1NldHRpbmdzKQ0KLQkJCWh5cGVybGlua1NldHRpbmdzLmRpc3Bvc2UoKTsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRTZWdtZW50LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvZW5naW5lL1RleHRTZWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZWM1ZDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2VuZ2luZS9UZXh0U2VnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmU7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsNCi1pbXBvcnQgamF2YS50ZXh0LkJyZWFrSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgVGV4dFNlZ21lbnQgZXh0ZW5kcyBQYXJhZ3JhcGhTZWdtZW50IGltcGxlbWVudHMgSVRleHRTZWdtZW50IHsNCi0JcHJpdmF0ZSBDb2xvciBjb2xvcjsNCi0JcHJpdmF0ZSBTdHJpbmcgZm9udElkOw0KLQlwcml2YXRlIFN0cmluZyB0ZXh0Ow0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1bmRlcmxpbmU7DQotCXByaXZhdGUgYm9vbGVhbiB3cmFwQWxsb3dlZCA9IHRydWU7DQotCXByb3RlY3RlZCBWZWN0b3IgYXJlYVJlY3RhbmdsZXMgPSBuZXcgVmVjdG9yKCk7DQotCQ0KLQljbGFzcyBBcmVhUmVjdGFuZ2xlIHsNCi0JCVJlY3RhbmdsZSByZWN0Ow0KLQkJaW50IGZyb20sIHRvOw0KLQkJcHVibGljIEFyZWFSZWN0YW5nbGUoUmVjdGFuZ2xlIHJlY3QsIGludCBmcm9tLCBpbnQgdG8pIHsNCi0JCQl0aGlzLnJlY3QgPSByZWN0Ow0KLQkJCXRoaXMuZnJvbSA9IGZyb207DQotCQkJdGhpcy50byA9IHRvOw0KLQkJfQ0KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHgsIGludCB5KSB7DQotCQkJcmV0dXJuIHJlY3QuY29udGFpbnMoeCwgeSk7DQotCQl9DQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQkJaWYgKGZyb209PTAgJiYgdG89PSAtMSkNCi0JCQkJcmV0dXJuIFRleHRTZWdtZW50LnRoaXMuZ2V0VGV4dCgpOw0KLQkJCWlmIChmcm9tID4wICYmIHRvID09IC0xKQ0KLQkJCQlyZXR1cm4gVGV4dFNlZ21lbnQudGhpcy5nZXRUZXh0KCkuc3Vic3RyaW5nKGZyb20pOw0KLQkJCXJldHVybiBUZXh0U2VnbWVudC50aGlzLmdldFRleHQoKS5zdWJzdHJpbmcoZnJvbSwgdG8pOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgVGV4dFNlZ21lbnQoU3RyaW5nIHRleHQsIFN0cmluZyBmb250SWQpIHsNCi0JCXRoaXMudGV4dCA9IGNsZWFudXAodGV4dCk7DQotCQl0aGlzLmZvbnRJZCA9IGZvbnRJZDsNCi0JfQ0KLQ0KLQlwcml2YXRlIFN0cmluZyBjbGVhbnVwKFN0cmluZyB0ZXh0KSB7DQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOw0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsNCi0JCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsNCi0JCQlpZiAoYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJyB8fCBjPT0nXGYnKSB7DQotCQkJCWlmIChpID4gMCkNCi0JCQkJCWJ1Zi5hcHBlbmQoJyAnKTsNCi0JCQl9IGVsc2UNCi0JCQkJYnVmLmFwcGVuZChjKTsNCi0JCX0NCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRXb3JkV3JhcEFsbG93ZWQoYm9vbGVhbiB2YWx1ZSkgew0KLQkJd3JhcEFsbG93ZWQgPSB2YWx1ZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRXcmFwQWxsb3dlZCgpIHsNCi0JCXJldHVybiB3cmFwQWxsb3dlZDsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNTZWxlY3RhYmxlKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCXB1YmxpYyBDb2xvciBnZXRDb2xvcigpIHsNCi0JCXJldHVybiBjb2xvcjsNCi0JfQ0KLQ0KLQlwdWJsaWMgRm9udCBnZXRGb250KCkgew0KLQkJaWYgKGZvbnRJZCA9PSBudWxsKQ0KLQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXREZWZhdWx0Rm9udCgpOw0KLQkJZWxzZQ0KLQkJCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRGb250UmVnaXN0cnkoKS5nZXQoZm9udElkKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7DQotCQlyZXR1cm4gdGV4dDsNCi0JfQ0KLQ0KLQl2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsNCi0JCXRoaXMudGV4dCA9IGNsZWFudXAodGV4dCk7DQotCX0NCi0NCi0Jdm9pZCBzZXRDb2xvcihDb2xvciBjb2xvcikgew0KLQkJdGhpcy5jb2xvciA9IGNvbG9yOw0KLQl9DQotDQotCXZvaWQgc2V0Rm9udElkKFN0cmluZyBmb250SWQpIHsNCi0JCXRoaXMuZm9udElkID0gZm9udElkOw0KLQl9DQotDQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB4LCBpbnQgeSkgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmVhUmVjdGFuZ2xlcy5zaXplKCk7IGkrKykgew0KLQkJCUFyZWFSZWN0YW5nbGUgYXIgPSAoQXJlYVJlY3RhbmdsZSkgYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOw0KLQkJCWlmIChhci5jb250YWlucyh4LCB5KSkNCi0JCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXB1YmxpYyBSZWN0YW5nbGUgZ2V0Qm91bmRzKCkgew0KLQkJaW50IHg9MCwgeT0wOw0KLQkJaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsNCi0JCQ0KLQkJZm9yIChpbnQgaT0wOyBpPGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7DQotCQkJQXJlYVJlY3RhbmdsZSBhciA9IChBcmVhUmVjdGFuZ2xlKWFyZWFSZWN0YW5nbGVzLmdldChpKTsNCi0JCQlpZiAoaT09MCkgeSA9IGFyLnJlY3QueTsNCi0JCQl4ID0gTWF0aC5taW4oYXIucmVjdC54LCB4KTsNCi0JCQl3aWR0aCA9IE1hdGgubWF4KGFyLnJlY3Qud2lkdGgsIHdpZHRoKTsNCi0JCQloZWlnaHQgKz0gYXIucmVjdC5oZWlnaHQ7DQotCQl9DQotCQlyZXR1cm4gbmV3IFJlY3RhbmdsZSh4LCB5LCB3aWR0aCwgaGVpZ2h0KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBhZHZhbmNlTG9jYXRvcigNCi0JCUdDIGdjLA0KLQkJaW50IHdIaW50LA0KLQkJTG9jYXRvciBsb2NhdG9yLA0KLQkJSGFzaHRhYmxlIG9iamVjdFRhYmxlKSB7DQotCQlGb250IG9sZEZvbnQgPSBudWxsOw0KLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7DQotCQkJb2xkRm9udCA9IGdjLmdldEZvbnQoKTsNCi0JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQl9DQotCQlGb250TWV0cmljcyBmbSA9IGdjLmdldEZvbnRNZXRyaWNzKCk7DQotCQlpbnQgbGluZUhlaWdodCA9IGZtLmdldEhlaWdodCgpOw0KLQ0KLQkJaWYgKHdIaW50ID09IFNXVC5ERUZBVUxUIHx8ICF3cmFwQWxsb3dlZCkgew0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7DQotDQotCQkJaWYgKGxvY2F0b3IueCArIGV4dGVudC54ID4gd0hpbnQpIHsNCi0JCQkJLy8gbmV3IGxpbmUNCi0JCQkJbG9jYXRvci54ID0gaXNTZWxlY3RhYmxlKCk/bG9jYXRvci5pbmRlbnQrMTpsb2NhdG9yLmluZGVudDsNCi0JCQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0Ow0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7DQotCQkJfQ0KLQkJCWludCB3aWR0aCA9IGV4dGVudC54Ow0KLQkJCWlmIChpc1NlbGVjdGFibGUoKSkgd2lkdGgrPTI7DQotCQkJbG9jYXRvci54ICs9IHdpZHRoOw0KLQkJCWxvY2F0b3Iud2lkdGggPSB3aWR0aDsNCi0JCQlsb2NhdG9yLmhlaWdodCA9IGV4dGVudC55Ow0KLQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gTWF0aC5tYXgobG9jYXRvci5yb3dIZWlnaHQsIGV4dGVudC55KTsNCi0JCQlyZXR1cm47DQotCQl9DQotDQotCQlCcmVha0l0ZXJhdG9yIHdiID0gQnJlYWtJdGVyYXRvci5nZXRMaW5lSW5zdGFuY2UoKTsNCi0JCXdiLnNldFRleHQodGV4dCk7DQotDQotCQlpbnQgc2F2ZWQgPSAwOw0KLQkJaW50IGxhc3QgPSAwOw0KLQ0KLQkJaW50IHdpZHRoID0gMDsNCi0NCi0JCVBvaW50IGxhc3RFeHRlbnQgPSBudWxsOw0KLQ0KLQkJZm9yIChpbnQgbG9jID0gd2IuZmlyc3QoKTsgbG9jICE9IEJyZWFrSXRlcmF0b3IuRE9ORTsgbG9jID0gd2IubmV4dCgpKSB7DQotCQkJU3RyaW5nIHdvcmQgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbG9jKTsNCi0JCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KHdvcmQpOw0KLQ0KLQkJCWlmIChsb2NhdG9yLnggKyBleHRlbnQueCA+IHdIaW50KSB7DQotCQkJCS8vIG92ZXJmbG93DQotCQkJCVN0cmluZyBzYXZlZFdvcmQgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbGFzdCk7DQotCQkJCWlmIChsYXN0RXh0ZW50PT1udWxsKQ0KLQkJCQkgICBsYXN0RXh0ZW50ID0gZ2MudGV4dEV4dGVudChzYXZlZFdvcmQpOw0KLQkJCQlpbnQgbGluZVdpZHRoID0gbG9jYXRvci54ICsgbGFzdEV4dGVudC54Ow0KLQkJCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxpbmVXaWR0aCs9MjsNCi0NCi0JCQkJc2F2ZWQgPSBsYXN0Ow0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBsYXN0RXh0ZW50LnkpOw0KLQkJCQlsb2NhdG9yLnggPSBpc1NlbGVjdGFibGUoKT9sb2NhdG9yLmluZGVudCsxOmxvY2F0b3IuaW5kZW50Ow0KLQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsNCi0JCQkJd2lkdGggPSBNYXRoLm1heCh3aWR0aCwgbGluZVdpZHRoKTsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCQlsYXN0RXh0ZW50ID0gZXh0ZW50Ow0KLQkJfQ0KLQkJU3RyaW5nIGxhc3RTdHJpbmcgPSB0ZXh0LnN1YnN0cmluZyhzYXZlZCwgbGFzdCk7DQotCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxhc3RTdHJpbmcpOw0KLQkJaW50IGxpbmVXaWR0aCA9IGV4dGVudC54Ow0KLQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBsaW5lV2lkdGggKz0gMjsNCi0JCWxvY2F0b3IueCArPSBsaW5lV2lkdGg7DQotCQlsb2NhdG9yLndpZHRoID0gd2lkdGg7DQotCQlsb2NhdG9yLmhlaWdodCA9IGxpbmVIZWlnaHQ7DQotCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBleHRlbnQueSk7DQotCQlpZiAob2xkRm9udCAhPSBudWxsKSB7DQotCQkJZ2Muc2V0Rm9udChvbGRGb250KTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcGFpbnQoDQotCQlHQyBnYywNCi0JCWludCB3aWR0aCwNCi0JCUxvY2F0b3IgbG9jYXRvciwNCi0JCUhhc2h0YWJsZSBvYmplY3RUYWJsZSwNCi0JCWJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCUZvbnQgb2xkRm9udCA9IG51bGw7DQotCQlDb2xvciBvbGRDb2xvciA9IG51bGw7DQotDQotCQlhcmVhUmVjdGFuZ2xlcy5jbGVhcigpOw0KLQ0KLQkJaWYgKGZvbnRJZCAhPSBudWxsKSB7DQotCQkJb2xkRm9udCA9IGdjLmdldEZvbnQoKTsNCi0JCQlnYy5zZXRGb250KGdldEZvbnQoKSk7DQotCQl9DQotCQlpZiAoY29sb3IgIT0gbnVsbCkgew0KLQkJCW9sZENvbG9yID0gZ2MuZ2V0Rm9yZWdyb3VuZCgpOw0KLQkJCWdjLnNldEZvcmVncm91bmQoY29sb3IpOw0KLQkJfQ0KLQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOw0KLQkJaW50IGxpbmVIZWlnaHQgPSBmbS5nZXRIZWlnaHQoKTsNCi0JCWludCBkZXNjZW50ID0gZm0uZ2V0RGVzY2VudCgpOw0KLQ0KLQkJaWYgKCF3cmFwQWxsb3dlZCkgew0KLQkJCVBvaW50IGV4dGVudCA9IGdjLnRleHRFeHRlbnQodGV4dCk7DQotCQkJaW50IGV3aWR0aCA9IGV4dGVudC54Ow0KLQkJCWlmIChpc1NlbGVjdGFibGUoKSkgZXdpZHRoICs9IDI7DQotDQotCQkJaWYgKGxvY2F0b3IueCArIGV3aWR0aCA+IHdpZHRoKSB7DQotCQkJCS8vIG5ldyBsaW5lDQotCQkJCWxvY2F0b3IucmVzZXRDYXJldCgpOw0KLQkJCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxvY2F0b3IueCArPSAxOw0KLQkJCQlsb2NhdG9yLnkgKz0gbG9jYXRvci5yb3dIZWlnaHQ7DQotCQkJCWxvY2F0b3Iucm93SGVpZ2h0ID0gMDsNCi0JCQl9DQotCQkJZ2MuZHJhd1N0cmluZyh0ZXh0LCBsb2NhdG9yLngsIGxvY2F0b3IueSk7DQotCQkJaWYgKHVuZGVybGluZSkgew0KLQkJCQlpbnQgbGluZVkgPSBsb2NhdG9yLnkgKyBsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDE7DQotCQkJCWdjLmRyYXdMaW5lKGxvY2F0b3IueCwgbGluZVksIGxvY2F0b3IueCArIGV4dGVudC54LCBsaW5lWSk7DQotCQkJfQ0KLQkJCVJlY3RhbmdsZSBiciA9DQotCQkJCW5ldyBSZWN0YW5nbGUobG9jYXRvci54IC0gMSwgbG9jYXRvci55LCBleHRlbnQueCArIDIsIGxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7DQotCQkJYXJlYVJlY3RhbmdsZXMuYWRkKG5ldyBBcmVhUmVjdGFuZ2xlKGJyLCAwLCAtMSkpOw0KLQkJCWlmIChzZWxlY3RlZCkgew0KLQkJCQlpZiAoY29sb3IgIT0gbnVsbCkNCi0JCQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJCQlnYy5kcmF3Rm9jdXMoYnIueCwgYnIueSwgYnIud2lkdGgsIGJyLmhlaWdodCk7DQotCQkJfQ0KLQ0KLQkJCWxvY2F0b3IueCArPSBld2lkdGg7DQotCQkJbG9jYXRvci53aWR0aCA9IGV3aWR0aDsNCi0JCQlsb2NhdG9yLmhlaWdodCA9IGxpbmVIZWlnaHQ7DQotCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgZXh0ZW50LnkpOw0KLQkJCWlmIChvbGRGb250ICE9IG51bGwpIHsNCi0JCQkJZ2Muc2V0Rm9udChvbGRGb250KTsNCi0JCQl9DQotCQkJaWYgKG9sZENvbG9yICE9IG51bGwpIHsNCi0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChvbGRDb2xvcik7DQotCQkJfQ0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCUJyZWFrSXRlcmF0b3Igd2IgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOw0KLQkJd2Iuc2V0VGV4dCh0ZXh0KTsNCi0NCi0JCWludCBzYXZlZCA9IDA7DQotCQlpbnQgbGFzdCA9IDA7DQotDQotCQlmb3IgKGludCBsb2MgPSB3Yi5maXJzdCgpOyBsb2MgIT0gQnJlYWtJdGVyYXRvci5ET05FOyBsb2MgPSB3Yi5uZXh0KCkpIHsNCi0JCQlpZiAobG9jID09IDApDQotCQkJCWNvbnRpbnVlOw0KLQkJCVN0cmluZyB3b3JkID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxvYyk7DQotCQkJUG9pbnQgZXh0ZW50ID0gZ2MudGV4dEV4dGVudCh3b3JkKTsNCi0JCQlpbnQgZXdpZHRoID0gZXh0ZW50Lng7DQotCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBld2lkdGggKz0gMjsNCi0NCi0JCQlpZiAobG9jYXRvci54ICsgZXdpZHRoID4gd2lkdGgpIHsNCi0JCQkJLy8gb3ZlcmZsb3cNCi0JCQkJU3RyaW5nIHByZXZMaW5lID0gdGV4dC5zdWJzdHJpbmcoc2F2ZWQsIGxhc3QpOw0KLQkJCQlnYy5kcmF3U3RyaW5nKHByZXZMaW5lLCBsb2NhdG9yLngsIGxvY2F0b3IueSwgdHJ1ZSk7DQotCQkJCVBvaW50IHByZXZFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KHByZXZMaW5lKTsNCi0JCQkJaW50IHByZXZXaWR0aCA9IHByZXZFeHRlbnQueDsNCi0JCQkJaWYgKGlzU2VsZWN0YWJsZSgpKSBwcmV2V2lkdGggKz0gMjsNCi0NCi0JCQkJaWYgKHVuZGVybGluZSkgew0KLQkJCQkJaW50IGxpbmVZID0gbG9jYXRvci55ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCQkJZ2MuZHJhd0xpbmUobG9jYXRvci54LCBsaW5lWSwgbG9jYXRvci54ICsgcHJldldpZHRoLCBsaW5lWSk7DQotCQkJCX0NCi0JCQkJUmVjdGFuZ2xlIGJyID0NCi0JCQkJCW5ldyBSZWN0YW5nbGUoDQotCQkJCQkJbG9jYXRvci54IC0gMSwNCi0JCQkJCQlsb2NhdG9yLnksDQotCQkJCQkJcHJldkV4dGVudC54ICsgMiwNCi0JCQkJCQlsaW5lSGVpZ2h0IC0gZGVzY2VudCArIDMpOw0KLQkJCQlpZiAoc2VsZWN0ZWQpIHsNCi0JCQkJCWlmIChjb2xvciAhPSBudWxsKQ0KLQkJCQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJCQkJZ2MuZHJhd0ZvY3VzKGJyLngsIGJyLnksIGJyLndpZHRoLCBici5oZWlnaHQpOw0KLQkJCQkJaWYgKGNvbG9yICE9IG51bGwpDQotCQkJCQkJZ2Muc2V0Rm9yZWdyb3VuZChjb2xvcik7DQotCQkJCX0NCi0JCQkJYXJlYVJlY3RhbmdsZXMuYWRkKG5ldyBBcmVhUmVjdGFuZ2xlKGJyLCBzYXZlZCwgbGFzdCkpOw0KLQkJCQkNCi0JCQkJbG9jYXRvci5yb3dIZWlnaHQgPSBNYXRoLm1heChsb2NhdG9yLnJvd0hlaWdodCwgcHJldkV4dGVudC55KTsNCi0JCQkJbG9jYXRvci5yZXNldENhcmV0KCk7DQotCQkJCWlmIChpc1NlbGVjdGFibGUoKSkgbG9jYXRvci54ICs9MTsNCi0JCQkJbG9jYXRvci55ICs9IGxvY2F0b3Iucm93SGVpZ2h0Ow0KLQkJCQlsb2NhdG9yLnJvd0hlaWdodCA9IDA7DQotCQkJCXNhdmVkID0gbGFzdDsNCi0JCQl9DQotCQkJbGFzdCA9IGxvYzsNCi0JCX0NCi0JCS8vIHBhaW50IHRoZSBsYXN0IGxpbmUNCi0JCVN0cmluZyBsYXN0TGluZSA9IHRleHQuc3Vic3RyaW5nKHNhdmVkLCBsYXN0KTsNCi0JCWdjLmRyYXdTdHJpbmcobGFzdExpbmUsIGxvY2F0b3IueCwgbG9jYXRvci55LCB0cnVlKTsNCi0JCVBvaW50IGxhc3RFeHRlbnQgPSBnYy50ZXh0RXh0ZW50KGxhc3RMaW5lKTsNCi0JCWludCBsYXN0V2lkdGggPSBsYXN0RXh0ZW50Lng7DQotCQlpZiAoaXNTZWxlY3RhYmxlKCkpIGxhc3RXaWR0aCArPSAyOw0KLQkJUmVjdGFuZ2xlIGJyID0NCi0JCQluZXcgUmVjdGFuZ2xlKA0KLQkJCQlsb2NhdG9yLnggLSAxLA0KLQkJCQlsb2NhdG9yLnksDQotCQkJCWxhc3RFeHRlbnQueCArIDIsDQotCQkJCWxpbmVIZWlnaHQgLSBkZXNjZW50ICsgMyk7DQotCQlhcmVhUmVjdGFuZ2xlcy5hZGQobmV3IEFyZWFSZWN0YW5nbGUoYnIsIHNhdmVkLCBsYXN0KSk7DQotCQlpZiAodW5kZXJsaW5lKSB7DQotCQkJaW50IGxpbmVZID0gbG9jYXRvci55ICsgbGluZUhlaWdodCAtIGRlc2NlbnQgKyAxOw0KLQkJCWdjLmRyYXdMaW5lKGxvY2F0b3IueCwgbGluZVksIGxvY2F0b3IueCArIGxhc3RFeHRlbnQueCwgbGluZVkpOw0KLQkJfQ0KLQkJaWYgKHNlbGVjdGVkKSB7DQotCQkJaWYgKGNvbG9yICE9IG51bGwpDQotCQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJCWdjLmRyYXdGb2N1cyhici54LCBici55LCBici53aWR0aCwgYnIuaGVpZ2h0KTsNCi0JCX0NCi0JCWxvY2F0b3IueCArPSBsYXN0V2lkdGg7DQotCQlsb2NhdG9yLnJvd0hlaWdodCA9IE1hdGgubWF4KGxvY2F0b3Iucm93SGVpZ2h0LCBsYXN0RXh0ZW50LnkpOw0KLQkJaWYgKG9sZEZvbnQgIT0gbnVsbCkgew0KLQkJCWdjLnNldEZvbnQob2xkRm9udCk7DQotCQl9DQotCQlpZiAob2xkQ29sb3IgIT0gbnVsbCkgew0KLQkJCWdjLnNldEZvcmVncm91bmQob2xkQ29sb3IpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBwYWludEZvY3VzKEdDIGdjLCBDb2xvciBiZywgQ29sb3IgZmcsIGJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCWlmIChhcmVhUmVjdGFuZ2xlcz09bnVsbCkgcmV0dXJuOw0KLQkJZm9yIChpbnQgaT0wOyBpPGFyZWFSZWN0YW5nbGVzLnNpemUoKTsgaSsrKSB7DQotCQkJQXJlYVJlY3RhbmdsZSBhcmVhUmVjdGFuZ2xlID0gKEFyZWFSZWN0YW5nbGUpYXJlYVJlY3RhbmdsZXMuZ2V0KGkpOw0KLQkJCVJlY3RhbmdsZSBiciA9IGFyZWFSZWN0YW5nbGUucmVjdDsNCi0JCQlpZiAoc2VsZWN0ZWQpIHsNCi0JCQkJZ2Muc2V0QmFja2dyb3VuZChiZyk7DQotCQkJCWdjLnNldEZvcmVncm91bmQoZmcpOw0KLQkJCQlnYy5kcmF3Rm9jdXMoYnIueCwgYnIueSwgYnIud2lkdGgsIGJyLmhlaWdodCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKGJnKTsNCi0JCQkJZ2MuZHJhd1JlY3RhbmdsZShici54LCBici55LCBici53aWR0aC0xLCBici5oZWlnaHQtMSk7DQotCQkJfQ0KLQkJfQ0KLQl9CQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvdWkvZm9ybXMvaW50ZXJuYWwvaW1hZ2UxLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbWFnZTEuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM5NGVlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbWFnZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2luZGV4LnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9mb3Jtcy9pbnRlcm5hbC9pbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MzJmODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL2Zvcm1zL2ludGVybmFsL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGZvcm0+DQotPHA+DQotVG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgDQotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjEiPk15IEVjbGlwc2UgMTwvYT4gYW5kIHNlbGVjdCANCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCANCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLiANCi1Ob3cgd2UgPGI+d2lsbDwvYj4gYWRkIGFuIA0KLTxpbWcgaHJlZj0iaW1hZ2UxIi8+IA0KLWltYWdlIGhlcmUuIEp1c3QNCi0gdG8gc2hvdyBob3cgd3JhcHBpbmcgc2hvdWxkIGFwcGx5IHRvIGltYWdlcyB3aGVuIHRoZXkgYXJlIA0KLSBsYXJnZXIgdGhhbiB0aGUgcmVndWxhciB0ZXh0Lg0KLTwvcD4NCi08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIxLiI+VG8gY2hlY2sgZm9yIHVwZGF0ZXMgZm9yIGZlYXR1cmVzIHlvdSBoYXZlIGluc3RhbGxlZCwgDQotZ28gdG8gdGhlIDxhIGhyZWY9ImFjdGlvbjIiPk15IEVjbGlwc2UgMjwvYT4gYW5kIHNlbGVjdCANCi08Yj5BdmFpbGFibGUgVXBkYXRlczwvYj4gZm9sZGVyLiA8Yj5TZWFyY2ggcGFnZTwvYj4gd2lsbCANCi1iZSBzaG93biBhbGxvd2luZyB5b3UgdG8gaW5pdGlhdGUgYW5kIGN1c3RvbWl6ZSB0aGUgc2VhcmNoLjwvbGk+DQotPGxpIHN0eWxlPSJ0ZXh0IiB2YWx1ZT0iMi4iPlRoaXMgaXMgdGhlIGl0ZW0gbnVtYmVyIDIuPC9saT4NCi08bGkgc3R5bGU9InRleHQiIHZhbHVlPSIzLiI+VGhpcyBpcyB0aGUgaXRlbSBudW1iZXIgMy48L2xpPg0KLTxsaT5UaGlzIGlzIHRoZSBidWxsZXQgaXRlbS48L2xpPg0KLTxsaT5UaGlzIGlzIGFub3RoZXIgYnVsbGV0IGl0ZW0uPC9saT4NCi08L2Zvcm0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTRkMjcwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPGNsYXNzcGF0aD4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjLyIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLnVpIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Ii9vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmhlbHAiLz4NCi0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iL29yZy5lY2xpcHNlLmNvcmUuYm9vdCIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSIvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+DQotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPg0KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4NCi08L2NsYXNzcGF0aD4NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0IGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0MWY5MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08cHJvamVjdERlc2NyaXB0aW9uPg0KLQk8bmFtZT5vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzI8L25hbWU+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPHByb2plY3RzPg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5ib290PC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5oZWxwPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudWk8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXM8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYWJvdXQuaHRtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRiNDExYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+MjB0aCBKdW5lLCAyMDAyPC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0NQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIENQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgQ1BMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Db250cmlidXRpb25zPC9oMz4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCwgYW55IENvbnRyaWJ1dGlvbnMsIGFzIGRlZmluZWQgaW4gdGhlIENQTCwgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlCi1tYWRlIGF2YWlsYWJsZSB0byBFY2xpcHNlLm9yZywgbWVtYmVycyBvZiBFY2xpcHNlLm9yZyBhbmQvb3IgdGhlIGhvc3Qgb2YgRWNsaXBzZS5vcmcgd2ViIHNpdGUsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoCi1Db250ZW50IGFyZSBwcm92aWRlZCB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIHRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENQTC48L3A+Ci0KLTxwPklmIHRoaXMgQ29udGVudCBpcyBsaWNlbnNlZCB0byB5b3UgdW5kZXIgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvdGhlciB0aGFuIHRoZSBDUEwgKCZxdW90O090aGVyIExpY2Vuc2UmcXVvdDspLCBhbnkgbW9kaWZpY2F0aW9ucywgZW5oYW5jZW1lbnRzIGFuZC9vcgotb3RoZXIgY29kZSBhbmQvb3IgZG9jdW1lbnRhdGlvbiAoJnF1b3Q7TW9kaWZpY2F0aW9ucyZxdW90OykgdXBsb2FkZWQsIHN1Ym1pdHRlZCwgb3Igb3RoZXJ3aXNlIG1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUKLWhvc3Qgb2YgRWNsaXBzZS5vcmcsIGJ5IHlvdSB0aGF0IHJlbGF0ZSB0byBzdWNoIENvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBPdGhlciBMaWNlbnNlIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUKLXRvIG90aGVycyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIE90aGVyIExpY2Vuc2UuICBJbiBhZGRpdGlvbiwgd2l0aCByZWdhcmQgdG8gTW9kaWZpY2F0aW9ucyBmb3Igd2hpY2ggeW91IGFyZSB0aGUgY29weXJpZ2h0IGhvbGRlciwgeW91IGFyZSBhbHNvCi1wcm92aWRpbmcgdGhlIE1vZGlmaWNhdGlvbnMgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBDUEwgYW5kIHN1Y2ggTW9kaWZpY2F0aW9ucyBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZgotdGhlIENQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2J1aWxkLnByb3BlcnRpZXMgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMTczMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgKi5qYXIsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1zb3VyY2UudXBkYXRldWkzMi5qYXIgPSBzcmMvCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDQxOWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNTExZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvZ29fbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyMGQ4OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTdjM2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ5YzJkYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNjNjMjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Yzc1ZjU1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2NsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGViNTNlYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9jdmlldzE2L2Jyb3dzZXIuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNzAyNzcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2N2aWV3MTYvYnJvd3Nlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2JhY2t3YXJkX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMTc5YWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1YWYwOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvZ29fbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZjAwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjMzNjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4MDA4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjgxYjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTNmNDk4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwZjliOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZGxjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxODhiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM3Y2EyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyOGVlMS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2ZvcndhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4MzMyNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2dvX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MGIyYzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9ob21lX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyYmE4Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTQyM2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9yZWZyZXNoX25hdi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGYzODFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9lbGNsMTYvc2hvd191bmNvbmYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxOWY0NC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZWxjbDE2L3N0b3BfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9ldmlldzE2L2Jyb3dzZXIuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2V2aWV3MTYvYnJvd3Nlci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTM1YjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2V2aWV3MTYvYnJvd3Nlci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZGVmX3Byb3ZpZGVyLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDNjYmViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmMwYjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlMmQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmM2QwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lMi5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUyLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0MTRmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvZm9ybV91bmRlcmxpbmUyLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL2Z1bGwvZm9ybXMvdG9waWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDEzN2U5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL3NhbXBsZS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL2ljb25zL3NhbXBsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmIzYzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9pY29ucy9zYW1wbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyODg3NjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotcGx1Z2luTmFtZSA9IFdlbGNvbWUgUG9ydGFsIGZvciBXaW5kb3dzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotdmlld3Mud2ViQnJvd3Nlci5sYWJlbCA9IFdlYiBCcm93c2VyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ueG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiNzdhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbgotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiIKLSAgIG5hbWU9IiVwbHVnaW5OYW1lIgotICAgdmVyc2lvbj0iMi4xLjAiCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0idXBkYXRldWkzMi5qYXIiPgotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+Ci0gICAgICAgICA8cGFja2FnZXMgcHJlZml4ZXM9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmlkZSIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLnZpZXdzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuamZhY2UudGV4dCIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyIvPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UudWkiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5oZWxwIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndlbGNvbWVQYWdlcyIgbmFtZT0iV2VsY29tZSBQYWdlcyIgc2NoZW1hPSJzY2hlbWEvd2VsY29tZVBhZ2VzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9IndlbGNvbWVTZWN0aW9ucyIgbmFtZT0iV2VsY29tZSBTZWN0aW9ucyIgc2NoZW1hPSJzY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldHMiPgotICAgICAgPGFjdGlvblNldAotICAgICAgICAgICAgbGFiZWw9IlNhbXBsZSBBY3Rpb24gU2V0IgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSJPcGVuIEhvbWUgUGFnZSIKLSAgICAgICAgICAgICAgIGljb249Imljb25zL3NhbXBsZS5naWYiCi0gICAgICAgICAgICAgICB0b29sdGlwPSJPcGVuIEhvbWUgUGFnZSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLlNob3dXZWxjb21lUGFnZUFjdGlvbiIKLSAgICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJoZWxwL2hlbHBFbmQiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5TaG93V2VsY29tZVBhZ2VBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICA8L2FjdGlvblNldD4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlRXh0ZW5zaW9ucyI+Ci0gICAgICA8cGVyc3BlY3RpdmVFeHRlbnNpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5yZXNvdXJjZVBlcnNwZWN0aXZlIj4KLSAgICAgICAgIDxhY3Rpb25TZXQKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIuYWN0aW9uU2V0Ij4KLSAgICAgICAgIDwvYWN0aW9uU2V0PgotICAgICAgPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgbmFtZT0iV2ViIEJyb3dzZXIiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvciIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXIuV2ViQnJvd3NlckVkaXRvciIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53ZWxjb21lLndlYmJyb3dzZXIiPgotICAgICAgPC9lZGl0b3I+Ci0gICAgICA8ZWRpdG9yCi0gICAgICAgICAgICBuYW1lPSJXZWxjb21lIFBhZ2UiCi0gICAgICAgICAgICBpY29uPSJpY29ucy9zYW1wbGUuZ2lmIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5wb3J0YWwiPgotICAgICAgPC9lZGl0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lbGVtZW50RmFjdG9yaWVzIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyLldlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkiPgotICAgICAgPC9mYWN0b3J5PgotICAgICAgPGZhY3RvcnkKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLldlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkiPgotICAgICAgPC9mYWN0b3J5PgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLndlbGNvbWVQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iSG9tZSIKLSAgICAgICAgICAgIG51bUNvbHVtbnM9IjIiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLmhvbWVQYWdlIj4KLSAgICAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICAgICBzcGFuPSIyIgotICAgICAgICAgICAgICAgaWQ9ImNvbW11bml0eS5uZXdzLnJlbW90ZSI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InNlYXJjaCI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InRhc2tzLnNvZnR3YXJlVXBkYXRlcyI+Ci0gICAgICAgICA8L3NlY3Rpb24+Ci0gICAgICAgICA8c2VjdGlvbgotICAgICAgICAgICAgICAgaWQ9InF1aWNrU3RhcnQiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJ0aXBzQW5kVHJpY2tzIj4KLSAgICAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJOZXdzIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi5uZXdzIj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSJDb21tdW5pdHkiCi0gICAgICAgICAgICBudW1Db2x1bW5zPSIxIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi5jb21tdW5pdHkiPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJjb21tdW5pdHkubGlua3MiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgICAgIGlkPSJjb21tdW5pdHkuYXJ0aWNsZXMiPgotICAgICAgICAgPC9zZWN0aW9uPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IlNhbXBsZXMiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLnNhbXBsZXMiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyLndlbGNvbWVTZWN0aW9ucyI+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iU29mdHdhcmUgVXBkYXRlcyIKLSAgICAgICAgICAgIGlkPSJ0YXNrcy5zb2Z0d2FyZVVwZGF0ZXMiPgotICAgICAgICAgPGZvcm0+Ci0gICAgICAgICAgICAmbHQ7cCZndDsKLSZsdDthIGhyZWY9JnF1b3Q7YWN0aW9uJnF1b3Q7IGFyZz0mcXVvdDtvcmcuZWNsaXBzZS51cGRhdGUudWk6b3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLkluc3RhbGxXaXphcmRBY3Rpb24mcXVvdDsmZ3Q7Ci1GaW5kIHVwZGF0ZXMgZm9yIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIGZlYXR1cmVzCi0mbHQ7L2EmZ3Q7Jmx0Oy9wJmd0OwotJmx0O3AmZ3Q7Ci0mbHQ7YSBocmVmPSZxdW90O2FjdGlvbiZxdW90OyBhcmc9JnF1b3Q7b3JnLmVjbGlwc2UudXBkYXRlLnVpOm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbiZxdW90OyZndDsKLU1hbmFnZSBteSB3b3JrYmVuY2ggY29uZmlndXJhdGlvbiZsdDsvYSZndDsmbHQ7L3AmZ3Q7Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iRWNsaXBzZSBDb21tdW5pdHkgU2l0ZXMiCi0gICAgICAgICAgICBpZD0iY29tbXVuaXR5LmxpbmtzIj4KLSAgICAgICAgIDxmb3JtPgotICAgICAgICAgICAgJmx0O2xpJmd0OyZsdDthIGhyZWY9JnF1b3Q7dXJsJnF1b3Q7IGFyZz0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnJnF1b3Q7Jmd0O0VjbGlwc2Uub3JnJmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iTmV3IEVjbGlwc2UgQXJ0aWNsZXMiCi0gICAgICAgICAgICBpZD0iY29tbXVuaXR5LmFydGljbGVzIj4KLSAgICAgICAgIDxmb3JtCi0gICAgICAgICAgICAgICB1cmw9Imh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvdmlld2N2cy9pbmRleC5jZ2kvJTdFY2hlY2tvdXQlN0UvcGxhdGZvcm0tdXBkYXRlLWhvbWUvd2VsY29tZS1hcnRpY2xlcy54bWwiCi0gICAgICAgICAgICAgICB0eXBlPSJyZW1vdGUiPgotICAgICAgICAgPC9mb3JtPgotICAgICAgPC9zZWN0aW9uPgotICAgICAgPHNlY3Rpb24KLSAgICAgICAgICAgIG5hbWU9IkhlYWRsaW5lcyIKLSAgICAgICAgICAgIGlkPSJjb21tdW5pdHkubmV3cy5yZW1vdGUiPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHVybD0iaHR0cDovL2Rldi5lY2xpcHNlLm9yZy92aWV3Y3ZzL2luZGV4LmNnaS8lN0VjaGVja291dCU3RS9wbGF0Zm9ybS11cGRhdGUtaG9tZS93ZWxjb21lLW5ld3MueG1sIgotICAgICAgICAgICAgICAgdHlwZT0icmVtb3RlIj4KLSAgICAgICAgIDwvZm9ybT4KLSAgICAgIDwvc2VjdGlvbj4KLSAgICAgIDxzZWN0aW9uCi0gICAgICAgICAgICBuYW1lPSJHZXQgSGVscCIKLSAgICAgICAgICAgIGlkPSJzZWFyY2giPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHR5cGU9ImN1c3RvbSIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5IZWxwU2VjdGlvbiI+Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iUXVpY2sgU3RhcnQiCi0gICAgICAgICAgICBpZD0icXVpY2tTdGFydCI+Ci0gICAgICAgICA8Zm9ybQotICAgICAgICAgICAgICAgdHlwZT0iZHluYW1pYyIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLmFjdGlvbnMuV2VsY29tZUNvbnRlbnRQcm92aWRlciI+Ci0gICAgICAgICA8L2Zvcm0+Ci0gICAgICA8L3NlY3Rpb24+Ci0gICAgICA8c2VjdGlvbgotICAgICAgICAgICAgbmFtZT0iVGlwcyBhbmQgVHJpY2tzIgotICAgICAgICAgICAgaWQ9InRpcHNBbmRUcmlja3MiPgotICAgICAgICAgPGZvcm0KLSAgICAgICAgICAgICAgIHR5cGU9ImR5bmFtaWMiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5hY3Rpb25zLlRpcHNBbmRUcmlja3NDb250ZW50UHJvdmlkZXIiPgotICAgICAgICAgPC9mb3JtPgotICAgICAgPC9zZWN0aW9uPgotICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVBhZ2VzLmV4c2QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lUGFnZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U0M2YxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NjaGVtYS93ZWxjb21lUGFnZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/Pg0KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+DQotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiI+DQotPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyIiBpZD0id2VsY29tZVBhZ2VzIiBuYW1lPSJXZWxjb21lIFBhZ2VzIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwYWdlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgIDwvY29tcGxleFR5cGU+DQotICAgPC9lbGVtZW50Pg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9InBhZ2UiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8c2VxdWVuY2U+DQotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+DQotICAgICAgICAgPC9zZXF1ZW5jZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJudW1Db2x1bW5zIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0ic2VjdGlvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNwYW4iIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc2NoZW1hL3dlbGNvbWVTZWN0aW9ucy5leHNkIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNGI1ZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zY2hlbWEvd2VsY29tZVNlY3Rpb25zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiIgaWQ9IndlbGNvbWVTZWN0aW9ucyIgbmFtZT0iV2VsY29tZSBTZWN0aW9ucyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic2VjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJzZWN0aW9uIj4NCi0gICAgICA8Y29tcGxleFR5cGU+DQotICAgICAgICAgPHNlcXVlbmNlPg0KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZm9ybSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAgICAgPGFubm90YXRpb24+DQotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JUG9ydGFsU2VjdGlvbiIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGVsZW1lbnQgbmFtZT0iZm9ybSI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0ibG9jYWwiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIEZvcm1zIGFyZSBsb2FkZWQgZGVwZW5kaW5nIG9uIHRoZSAmbHQ7c2FtcCZndDt0eXBlJmx0Oy9zYW1wJmd0OyBhdHRyaWJ1dGU6DQotJmx0O3VsJmd0Ow0KLSZsdDtsaSZndDsmbHQ7YiZndDtsb2NhbCZsdDsvYiZndDsgLSB0aGUgY29udGVudCBvZiB0aGUgZm9ybSB3aWxsIGJlIGxvYWRlZCBmcm9tIHRoZSBib2R5IHRleHQgb2YgdGhlIGVsZW1lbnQuJmx0Oy9saSZndDsNCi0mbHQ7bGkmZ3Q7Jmx0O2ImZ3Q7cmVtb3RlJmx0Oy9iJmd0OyAtIHRoZSBjb250ZW50IG9mIHRoZSBmb3JtIHdpbGwgYmUgZG93bmxvYWRlZCB1c2luZyB0aGUgc3BlY2lmaWVkIFVSTC4mbHQ7L2xpJmd0Ow0KLSZsdDtsaSZndDsmbHQ7YiZndDtjdXN0b20mbHQ7L2ImZ3Q7IC0gdGhlIGZvcm0gd2lsbCBiZSBjcmVhdGVkIGJ5IGxvYWRpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSB0aGF0IGltcGxlbWVudHMgSVBvcnRhbFNlY3Rpb24gaW50ZXJmYWNlLiZsdDsvbGkmZ3Q7DQotJmx0O2xpJmd0OyZsdDtiJmd0O2R5bmFtaWMmbHQ7L2ImZ3Q7IC0gdGhlIGZvcm0gd2lsbCBiZSBjcmVhdGVkIGJ5IGxvYWRpbmcgdGhlIGNsYXNzIHNwZWNpZmllZCBieSB0aGUgJmx0O3NhbXAmZ3Q7Y2xhc3MmbHQ7L3NhbXAmZ3Q7IGF0dHJpYnV0ZSB0aGF0IGltcGxlbWVudHMgSUZvcm1Db250ZW50UHJvdmlkZXIgaW50ZXJmYWNlLiZsdDsvbGkmZ3Q7DQotJmx0Oy91bCZndDsNCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPg0KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPg0KLSAgICAgICAgICAgICAgIDxyZXN0cmljdGlvbiBiYXNlPSJzdHJpbmciPg0KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibG9jYWwiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJyZW1vdGUiPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJjdXN0b20iPg0KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJkeW5hbWljIj4NCi0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPg0KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+DQotICAgICAgICAgICAgPC9zaW1wbGVUeXBlPg0KLSAgICAgICAgIDwvYXR0cmlidXRlPg0KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJsIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIElmICZsdDtzYW1wJmd0O3R5cGUmbHQ7L3NhbXAmZ3Q7IGlzICZsdDtzYW1wJmd0O3JlbW90ZSZsdDsvc2FtcCZndDssIHRoZSBjb250ZW50IG9mIHRoZSBmb3JtIHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLg0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgICAgICAgICAgICAgPGFwcEluZm8+DQotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklQb3J0YWxTZWN0aW9uIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQ0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICA8L2Fubm90YXRpb24+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+DQotICAgICAgPC9hcHBJbmZvPg0KLSAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvU2hvd1dlbGNvbWVQYWdlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1Nob3dXZWxjb21lUGFnZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVjNWJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvU2hvd1dlbGNvbWVQYWdlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogT3VyIHNhbXBsZSBhY3Rpb24gaW1wbGVtZW50cyB3b3JrYmVuY2ggYWN0aW9uIGRlbGVnYXRlLgotICogVGhlIGFjdGlvbiBwcm94eSB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHdvcmtiZW5jaCBhbmQKLSAqIHNob3duIGluIHRoZSBVSS4gV2hlbiB0aGUgdXNlciB0cmllcyB0byB1c2UgdGhlIGFjdGlvbiwKLSAqIHRoaXMgZGVsZWdhdGUgd2lsbCBiZSBjcmVhdGVkIGFuZCBleGVjdXRpb24gd2lsbCBiZSAKLSAqIGRlbGVnYXRlZCB0byBpdC4KLSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG93V2VsY29tZVBhZ2VBY3Rpb24gaW1wbGVtZW50cyBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3c7Ci0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBTaG93V2VsY29tZVBhZ2VBY3Rpb24oKSB7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdGlvbiBoYXMgYmVlbiBhY3RpdmF0ZWQuIFRoZSBhcmd1bWVudCBvZiB0aGUKLQkgKiBtZXRob2QgcmVwcmVzZW50cyB0aGUgJ3JlYWwnIGFjdGlvbiBzaXR0aW5nCi0JICogaW4gdGhlIHdvcmtiZW5jaCBVSS4KLQkgKiBAc2VlIElXb3JrYmVuY2hXaW5kb3dBY3Rpb25EZWxlZ2F0ZSNydW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJdHJ5IHsKLQkJCVdlbGNvbWVQb3J0YWwuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IoCi0JCQkJbmV3IFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCgpLAotCQkJCSJvcmcuZWNsaXBzZS53ZWxjb21lLnBvcnRhbCIpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQlXZWxjb21lUG9ydGFsLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdGlvbiBpbiB0aGUgd29ya2JlbmNoIGhhcyBiZWVuIGNoYW5nZWQuIFdlIAotCSAqIGNhbiBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSAncmVhbCcgYWN0aW9uIGhlcmUKLQkgKiBpZiB3ZSB3YW50LCBidXQgdGhpcyBjYW4gb25seSBoYXBwZW4gYWZ0ZXIgCi0JICogdGhlIGRlbGVnYXRlIGhhcyBiZWVuIGNyZWF0ZWQuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjc2VsZWN0aW9uQ2hhbmdlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIHVzZSB0aGlzIG1ldGhvZCB0byBkaXNwb3NlIG9mIGFueSBzeXN0ZW0KLQkgKiByZXNvdXJjZXMgd2UgcHJldmlvdXNseSBhbGxvY2F0ZWQuCi0JICogQHNlZSBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUjZGlzcG9zZQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogV2Ugd2lsbCBjYWNoZSB3aW5kb3cgb2JqZWN0IGluIG9yZGVyIHRvCi0JICogYmUgYWJsZSB0byBwcm92aWRlIHBhcmVudCBzaGVsbCBmb3IgdGhlIG1lc3NhZ2UgZGlhbG9nLgotCSAqIEBzZWUgSVdvcmtiZW5jaFdpbmRvd0FjdGlvbkRlbGVnYXRlI2luaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCXRoaXMud2luZG93ID0gd2luZG93OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL1dlbGNvbWVQb3J0YWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmEyZjAwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3Nlci4qOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbCBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0JST1dTRVIgPSBQTFVHSU5fSUQgKyAiV2ViQnJvd3NlciI7Ci0JCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIFdlbGNvbWVQb3J0YWwgcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cCNlYXJseVN0YXJ0dXAoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VVJMKFN0cmluZyBuYW1lLCBTdHJpbmcgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlXZWxjb21lUG9ydGFsLmdldEFjdGl2ZVBhZ2UoKS5vcGVuRWRpdG9yKAotCQkJCW5ldyBXZWJCcm93c2VyRWRpdG9ySW5wdXQobmFtZSwgdXJsKSwKLQkJCQkib3JnLmVjbGlwc2Uud2VsY29tZS53ZWJicm93c2VyIik7Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCVdlbGNvbWVQb3J0YWwubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBXZWxjb21lUG9ydGFsKElQbHVnaW5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJc3VwZXIoZGVzY3JpcHRvcik7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9Ci0JCQkJUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKAotCQkJCQkib3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5XZWxjb21lUG9ydGFsUmVzb3VyY2VzIik7Ci0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBXZWxjb21lUG9ydGFsIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJV29ya2JlbmNoUGFnZSBnZXRBY3RpdmVQYWdlKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmludGVybmFsR2V0QWN0aXZlUGFnZSgpOwotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhZ2UgaW50ZXJuYWxHZXRBY3RpdmVQYWdlKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IGdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpCi0JCQlyZXR1cm4gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTaGVsbCBnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJcmV0dXJuIHdpbmRvdyAhPSBudWxsID8gd2luZG93LmdldFNoZWxsKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFdpbmRvdyBnZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0KCkuZ2V0RGVzY3JpcHRvcigpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZnJvbSB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqIG9yICdrZXknIGlmIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSkgewotCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQl0cnkgewotCQkJcmV0dXJuIGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBrZXk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZ1tdIGFyZ3MpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJpbmcoa2V5KTsKLQkJcmV0dXJuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LCBhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRGb3JtYXR0ZWRNZXNzYWdlKFN0cmluZyBrZXksIFN0cmluZyBhcmcpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJpbmcoa2V5KTsKLQkJcmV0dXJuIGphdmEudGV4dC5NZXNzYWdlRm9ybWF0LmZvcm1hdCh0ZXh0LCBuZXcgU3RyaW5nW10geyBhcmcgfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGx1Z2luJ3MgcmVzb3VyY2UgYnVuZGxlLAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJcmV0dXJuIHJlc291cmNlQnVuZGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlsb2dFeGNlcHRpb24oZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZSwgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKGUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQllID0gKChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSBlKS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKGUgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBlLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQkJbWVzc2FnZSA9IGUudG9TdHJpbmcoKTsKLQkJCXN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQkJZ2V0UGx1Z2luSWQoKSwKLQkJCQkJSVN0YXR1cy5PSywKLQkJCQkJbWVzc2FnZSwKLQkJCQkJZSk7Ci0JCX0KLQkJbG9nKHN0YXR1cywgc2hvd0Vycm9yRGlhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzLCBib29sZWFuIHNob3dFcnJvckRpYWxvZykgewotCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5JTkZPKSB7Ci0JCQlpZiAoc2hvd0Vycm9yRGlhbG9nKQotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJc3RhdHVzKTsKLQkJCS8vUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQlzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbEltYWdlcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzVmNGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQbHVnaW5EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQnVuZGxlIG9mIGFsbCBpbWFnZXMgdXNlZCBieSB0aGUgUERFIHBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxJbWFnZXMgewotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUkVGSVg9IFdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSsiLiI7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBVUkwgQkFTRV9VUkwgPSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXREZXNjcmlwdG9yKCkuZ2V0SW5zdGFsbFVSTCgpOwotCi0KLQlwcml2YXRlIHN0YXRpYyBJbWFnZVJlZ2lzdHJ5IFBMVUdJTl9SRUdJU1RSWTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OU19QQVRIID0gImljb25zL2Z1bGwvIjsKLQotCS8qKgotCSAqIFNldCBvZiBwcmVkZWZpbmVkIEltYWdlIERlc2NyaXB0b3JzLgotCSAqLwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX09CSj0gSUNPTlNfUEFUSCsib2JqMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9WSUVXID0gSUNPTlNfUEFUSCsiY3ZpZXcxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0xDTD0gSUNPTlNfUEFUSCsiZWxjbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTENMX0hPVkVSPSBJQ09OU19QQVRIKyJjbGNsMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0xfRElTQUJMRUQ9IElDT05TX1BBVEgrImRsY2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1RPT0wgPSBJQ09OU19QQVRIICsgImV0b29sMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9UT09MX0hPVkVSID0gSUNPTlNfUEFUSCArICJjdG9vbDE2LyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfVE9PTF9ESVNBQkxFRCA9IElDT05TX1BBVEggKyAiZHRvb2wxNi8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX09WUiA9IElDT05TX1BBVEggKyAib3ZyMTYvIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9XSVpCQU4gPSBJQ09OU19QQVRIICsgIndpemJhbi8iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfRk9STVMgPSBJQ09OU19QQVRIICsgImZvcm1zLyI7Ci0KLQotCS8qKgotCSAqIEZyZXF1ZW50bHkgdXNlZCBpbWFnZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRk9STV9CQU5ORVIgPSBOQU1FX1BSRUZJWCsiRk9STV9CQU5ORVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19GT1JNX0JBTk5FUl9TSE9SVCA9IE5BTUVfUFJFRklYKyJGT1JNX0JBTk5FUl9TSE9SVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0ZPUk1fVU5ERVJMSU5FID0gTkFNRV9QUkVGSVggKyAiRk9STV9VTkRFUkxJTkUiOwotCi0JLyoqCi0JICogT0JKMTYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0FQUF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJhcHBfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkZPTERFUl9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJiZm9sZGVyX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NBVEVHT1JZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNhdGVnb3J5X29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NEX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNkX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTVBVVEVSX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImNvbXB1dGVyX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJjb25maWdfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJmZWF0dXJlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VGSVhfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZWZpeDJfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRkxPUFBZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImZsb3BweV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ISVNUT1JZX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImhpc3Rvcnlfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAibHNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAicHNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiZXNpdGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJzaXRlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1dFQl9TSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIndlYl9ia21ya19vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QTEFDRVNfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAicGxhY2VzX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NBVkVEX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInNhdmVkX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VOQ09ORl9GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInVuY29uZl9mZWF0dXJlX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURVNfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidXBkYXRlc19vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19WRklYRURfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidmZpeGVkX29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1ZSRU1PVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAidnJlbW90ZV9vYmouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19WUkVNT1ZBQkxFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInZyZW1vdmFibGVfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTk9USU5TVF9GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIm5vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYiKTsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1NFQVJDSCA9IGNyZWF0ZShQQVRIX09CSiwgInRzZWFyY2hfb2JqLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVJSX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImVycm9yX3N0X29iai5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09LX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIm9rX3N0X29iai5naWYiKTsKLQotCQotCS8qKgotCSAqIE9WUjE2Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19MSU5LRURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgImxpbmtlZF9jby5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VQREFURURfQ08gICA9IGNyZWF0ZShQQVRIX09WUiwgInVwZGF0ZWRfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMQUJMRV9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImluc3RhbGxhYmxlX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ1VSUkVOVF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImN1cnJlbnRfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FUlJPUl9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImVycm9yX2NvLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0FSTklOR19DTyA9IGNyZWF0ZShQQVRIX09WUiwgIndhcm5pbmdfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19NT0RfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJtb2RfY28uZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BRERfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJhZGRfc3RhdC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0RFTF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImRlbF9zdGF0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5DT05GX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAidW5jb25maWd1cmVkX2NvLmdpZiIpOwotCi0JLyoqCi0JICogVklFVzE2Ci0JICovCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0NPTkZJR1NfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJjb25maWdzLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0lURVNfVklFVyA9IGNyZWF0ZShQQVRIX1ZJRVcsICJ1cGRhdGVzLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0VMRUNURURfVVBEQVRFU19WSUVXID0gY3JlYXRlKFBBVEhfVklFVywgInNlbGVjdGVkX3VwZGF0ZXMuZ2lmIik7Ci0KLQkvKioKLQkgKiBMQ0wKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JBQ0tXQVJEX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImJhY2t3YXJkX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0JBQ0tXQVJEX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAiYmFja3dhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkFDS1dBUkRfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJiYWNrd2FyZF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JXQVJEX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9SV0FSRF9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9SV0FSRF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImZvcndhcmRfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSE9NRV9OQVYgPSBjcmVhdGUoUEFUSF9MQ0wsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hPTUVfTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hPTUVfTkFWX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJob21lX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1JFRlJFU0hfTkFWID0gY3JlYXRlKFBBVEhfTENMLCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19SRUZSRVNIX05BVl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19SRUZSRVNIX05BVl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAicmVmcmVzaF9uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TVE9QX05BViA9IGNyZWF0ZShQQVRIX0xDTCwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU1RPUF9OQVZfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU1RPUF9OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgInN0b3BfbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfR09fTkFWID0gY3JlYXRlKFBBVEhfTENMLCAiZ29fbmF2LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfR09fTkFWX0ggPSBjcmVhdGUoUEFUSF9MQ0xfSE9WRVIsICJnb19uYXYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19HT19OQVZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgImdvX25hdi5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfVU5DT05GID0gY3JlYXRlKFBBVEhfTENMLCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9EID0gY3JlYXRlKFBBVEhfTENMX0RJU0FCTEVELCAic2hvd191bmNvbmYuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT0xMQVBTRV9BTEwgPSBjcmVhdGUoUEFUSF9MQ0wsICJjb2xsYXBzZWFsbC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfSElFUkFSQ0hZID0gY3JlYXRlKFBBVEhfTENMLCAiaGllcmFyY2hpY2FsTGF5b3V0LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFlfSCA9IGNyZWF0ZShQQVRIX0xDTF9IT1ZFUiwgImhpZXJhcmNoaWNhbExheW91dC5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfSElFUkFSQ0hZX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7Ci0KLQkvKioKLQkgKiBXSVoKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0lOU1RBTExfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImluc3RhbGxfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1cGRhdGVfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ09ORklHX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJjb25maWdfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVU5JTlNUQUxMX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1bmluc3RhbGxfd2l6LmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSU5TVEFMTF9CQU5ORVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiZGVmX3dpemJhbi5qcGciKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0ZPUk1fQkFOTkVSICA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZm9ybV9iYW5uZXIuanBnIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19GT1JNX0JBTk5FUl9TSE9SVCAgPSBjcmVhdGUoUEFUSF9GT1JNUywgImZvcm1fYmFubmVyLmdpZiIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRk9STV9VTkRFUkxJTkUgID0gY3JlYXRlKFBBVEhfRk9STVMsICJmb3JtX3VuZGVybGluZTIuanBnIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19QUk9WSURFUiA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAiZGVmX3Byb3ZpZGVyLmpwZyIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSVRFTSA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAidG9waWMuZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ORVdfQk9PS01BUksgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X2Jvb2ttYXJrX3dpei5naWYiKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX05FV19GT0xERVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAibmV3X2ZvbGRlcl93aXouZ2lmIik7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19ORVdfU0VBUkNIICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgIm5ld19zZWFyY2hfd2l6LmdpZiIpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZShTdHJpbmcgcHJlZml4LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobWFrZUltYWdlVVJMKHByZWZpeCwgbmFtZSkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXQoU3RyaW5nIGtleSkgewotCQlpZiAoUExVR0lOX1JFR0lTVFJZPT1udWxsKSBpbml0aWFsaXplKCk7Ci0JCXJldHVybiBQTFVHSU5fUkVHSVNUUlkuZ2V0KGtleSk7Ci0JfQotCi0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oCi0JSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwgCi0JU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JVVJMIGluc3RhbGxVUkwgPSBwbHVnaW5EZXNjcmlwdG9yLmdldEluc3RhbGxVUkwoKTsKLQl0cnkgewotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXdVUkwpOwotCX0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIG51bGw7Ci19Ci0KLQotcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZUZyb21QbHVnaW4oCi0JSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciwKLQlTdHJpbmcgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpIHsKLQlVUkwgaW5zdGFsbFVSTCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOwotCUltYWdlIGltYWdlID0gbnVsbDsKLQl0cnkgewotCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCVN0cmluZyBrZXkgPSBuZXdVUkwudG9TdHJpbmcoKTsKLQkJaWYgKFBMVUdJTl9SRUdJU1RSWT09bnVsbCkgaW5pdGlhbGl6ZSgpOwotCQlpbWFnZSA9IFBMVUdJTl9SRUdJU1RSWS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlPT1udWxsKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG5ld1VSTCk7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCVBMVUdJTl9SRUdJU1RSWS5wdXQoa2V5LCBpbWFnZSk7Ci0JCX0KLQl9Ci0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JfQotCXJldHVybiBpbWFnZTsKLX0KLS8qIHBhY2thZ2UgKi8KLXByaXZhdGUgc3RhdGljIGZpbmFsIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQlQTFVHSU5fUkVHSVNUUlkgPSBuZXcgSW1hZ2VSZWdpc3RyeSgpOwotCW1hbmFnZShJTUdfRk9STV9CQU5ORVJfU0hPUlQsIERFU0NfRk9STV9CQU5ORVJfU0hPUlQpOwotCW1hbmFnZShJTUdfRk9STV9CQU5ORVIsIERFU0NfRk9STV9CQU5ORVIpOwotCW1hbmFnZShJTUdfRk9STV9VTkRFUkxJTkUsIERFU0NfRk9STV9VTkRFUkxJTkUpOwotfQotCi0KLXByaXZhdGUgc3RhdGljIFVSTCBtYWtlSW1hZ2VVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQlTdHJpbmcgcGF0aCA9IHByZWZpeCArIG5hbWU7Ci0JVVJMIHVybCA9IG51bGw7Ci0JdHJ5IHsKLQkJdXJsID0gbmV3IFVSTChCQVNFX1VSTCwgcGF0aCk7Ci0JfQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIHVybDsKLX0KLQotcHVibGljIHN0YXRpYyBJbWFnZSBtYW5hZ2UoU3RyaW5nIGtleSwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQlJbWFnZSBpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQlQTFVHSU5fUkVHSVNUUlkucHV0KGtleSwgaW1hZ2UpOwotCXJldHVybiBpbWFnZTsKLX0KLQotcHVibGljIHN0YXRpYyBVUkwgZ2V0RGVmYXVsdFByb3ZpZGVySW1hZ2VVUkwoKSB7Ci0JVVJMIHVybCA9IG1ha2VJbWFnZVVSTChQQVRIX0ZPUk1TLCAiZGVmX3Byb3ZpZGVyLmpwZyIpOwotCXRyeSB7Ci0JCXVybCA9IFBsYXRmb3JtLnJlc29sdmUodXJsKTsKLQl9Ci0JY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQl9Ci0JcmV0dXJuIHVybDsgCi19Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvV2VsY29tZVBvcnRhbFJlc291cmNlcy5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWVlNDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9XZWxjb21lUG9ydGFsUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAKLSMKLSMKLQotQnJvd3NlclBhZ2UuYWRkcmVzcyA9IEFkZHJlc3M6Ci1Ccm93c2VyUGFnZS5zdG9wID0gU3RvcAotQnJvd3NlclBhZ2UuZ28gPSBHbwotQnJvd3NlclBhZ2UucmVmcmVzaCA9IFJlZnJlc2gKLQotV2ViQnJvd3NlclZpZXcubm90QXZhaWxhYmxlID0gRW1iZWRkZWQgV2ViIGJyb3dzZXIgaXMgbm90IGF2YWlsYWJsZS4gXAotUmVxdWllc3RzIGZvciBvcGVuaW5nIFVSTHMgYXJlIHByb2Nlc3NlZCB1c2luZyBXZWIgYnJvd3NlciByZWdpc3RlcmVkIHRvIGhhbmRsZSBcCi1XZWIgcGFnZXMgb24geW91ciBzeXN0ZW0uCi1XZWJCcm93c2VyVmlldy5hZGRyZXNzID0gQWRkcmVzczoKLVdlYkJyb3dzZXJWaWV3LnN0b3AgPSBTdG9wCi1XZWJCcm93c2VyVmlldy5nbyA9IEdvCi1XZWJCcm93c2VyVmlldy5ob21lID0gR28gSG9tZQotV2ViQnJvd3NlclZpZXcucmVmcmVzaCA9IFJlZnJlc2gKLVdlYkJyb3dzZXJWaWV3LmJhY2t3YXJkID0gR28gQmFjawotV2ViQnJvd3NlclZpZXcuZm9yd2FyZCA9IEdvIEZvcndhcmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9hY3Rpb25zL1RpcHNBbmRUcmlja3NDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjViM2I5YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgVGlwc0FuZFRyaWNrc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElGb3JtQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIElGb3JtQ29udGVudE9ic2VydmVyIG9ic2VydmVyOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50UHJvdmlkZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQkvKgotCQkvLyBBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmVhdHVyZQotCQlBYm91dEluZm9bXSBmZWF0dXJlcyA9ICgoV29ya2JlbmNoKSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKSkuZ2V0Q29uZmlndXJhdGlvbkluZm8oKS5nZXRGZWF0dXJlc0luZm8oKTsKLQkJQXJyYXlMaXN0IHdlbGNvbWVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nV3JpdGVyIHN3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsKLQkJd3JpdGVyLnByaW50bG4oIjxmb3JtPiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYm91dEluZm8gZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJaWYgKGZlYXR1cmUuZ2V0V2VsY29tZVBhZ2VVUkwoKSAhPSBudWxsKSB7Ci0JCQkJYWRkRmVhdHVyZUxpbmsod3JpdGVyLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQl3cml0ZXIucHJpbnRsbigiPC9mb3JtPiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJcmV0dXJuIHN3cml0ZXIudG9TdHJpbmcoKTsKLQkJKi8KLQkJcmV0dXJuICI8Zm9ybT48L2Zvcm0+IjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmVhdHVyZUxpbmsoUHJpbnRXcml0ZXIgd3JpdGVyLCBBYm91dEluZm8gZmVhdHVyZSkgewotCQlTdHJpbmcgbmFtZSA9IGZlYXR1cmUuZ2V0RmVhdHVyZUxhYmVsKCk7Ci0JCVN0cmluZyBocmVmID0gZmVhdHVyZS5nZXRUaXBzQW5kVHJpY2tzSHJlZigpOwotCQlpZiAoaHJlZj09bnVsbCkgcmV0dXJuOwotCQl3cml0ZXIucHJpbnQoIjxsaT4iKTsKLQkJd3JpdGVyLnByaW50KCI8YSBocmVmPVwiaGVscFwiIGFyZz1cIiIraHJlZisiXCI+IituYW1lKyI8L2E+Iik7Ci0JCXdyaXRlci5wcmludGxuKCI8L2xpPiIpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklGb3JtQ29udGVudFByb3ZpZGVyI3NldENvbnRlbnRPYnNlcnZlcihvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRPYnNlcnZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50T2JzZXJ2ZXIoSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpIHsKLQkJdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9XZWxjb21lQ29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL2FjdGlvbnMvV2VsY29tZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMyZDc5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvYWN0aW9ucy9XZWxjb21lQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMjAsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuV2VsY29tZVBvcnRhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElGb3JtQ29udGVudFByb3ZpZGVyIHsKLQlwcml2YXRlIElGb3JtQ29udGVudE9ic2VydmVyIG9ic2VydmVyOwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50UHJvdmlkZXIjZ2V0Q29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQkvKgotCQkvLyBBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZmVhdHVyZQotCQlBYm91dEluZm9bXSBmZWF0dXJlcyA9ICgoV29ya2JlbmNoKSBXZWxjb21lUG9ydGFsLmdldERlZmF1bHQoKS5nZXRXb3JrYmVuY2goKSkuZ2V0Q29uZmlndXJhdGlvbkluZm8oKS5nZXRGZWF0dXJlc0luZm8oKTsKLQkJQXJyYXlMaXN0IHdlbGNvbWVGZWF0dXJlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU3RyaW5nV3JpdGVyIHN3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihzd3JpdGVyKTsKLQkJd3JpdGVyLnByaW50bG4oIjxmb3JtPiIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlBYm91dEluZm8gZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwotCQkJaWYgKGZlYXR1cmUuZ2V0V2VsY29tZVBhZ2VVUkwoKSAhPSBudWxsKSB7Ci0JCQkJYWRkRmVhdHVyZUxpbmsod3JpdGVyLCBmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQl3cml0ZXIucHJpbnRsbigiPC9mb3JtPiIpOwotCQkvKgotCi0JCWlmIChwZXJzcGVjdGl2ZUlkICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcGFnZSA9IChXb3JrYmVuY2hQYWdlKSB3aW5kb3cuZ2V0V29ya2JlbmNoKCkuc2hvd1BlcnNwZWN0aXZlKHBlcnNwZWN0aXZlSWQsIHdpbmRvdyk7Ci0JCQl9IGNhdGNoIChXb3JrYmVuY2hFeGNlcHRpb24gZSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCXBhZ2Uuc2V0RWRpdG9yQXJlYVZpc2libGUodHJ1ZSk7Ci0KLQkJLy8gY3JlYXRlIGlucHV0Ci0JCVdlbGNvbWVFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBXZWxjb21lRWRpdG9ySW5wdXQoZmVhdHVyZSk7Ci0KLQkJLy8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHdlbGNvbWUgZWRpdG9yCi0JCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZmluZEVkaXRvcihpbnB1dCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJcGFnZS5hY3RpdmF0ZShlZGl0b3IpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXBhZ2Uub3BlbkVkaXRvcihpbnB1dCwgRURJVE9SX0lEKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFdvcmtiZW5jaFBsdWdpbi5QSV9XT1JLQkVOQ0gsIDEsIFdvcmtiZW5jaE1lc3NhZ2VzLmdldFN0cmluZygiUXVpY2tTdGFydEFjdGlvbi5vcGVuRWRpdG9yRXhjZXB0aW9uIiksIGUpOyAvLyROT04tTkxTLTEkCi0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJd2luZG93LmdldFNoZWxsKCksCi0JCQkJV29ya2JlbmNoTWVzc2FnZXMuZ2V0U3RyaW5nKCJXb3JrYmVuY2gub3BlbkVkaXRvckVycm9yRGlhbG9nVGl0bGUiKSwgIC8vJE5PTi1OTFMtMSQKLQkJCQlXb3JrYmVuY2hNZXNzYWdlcy5nZXRTdHJpbmcoIldvcmtiZW5jaC5vcGVuRWRpdG9yRXJyb3JEaWFsb2dNZXNzYWdlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlzdGF0dXMpOwotCQl9Ci0JCXdyaXRlci5jbG9zZSgpOwotCQlyZXR1cm4gc3dyaXRlci50b1N0cmluZygpOwotCQkqLwotCQlyZXR1cm4gIjxmb3JtPjwvZm9ybT4iOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGZWF0dXJlTGluayhQcmludFdyaXRlciB3cml0ZXIsIEFib3V0SW5mbyBmZWF0dXJlKSB7Ci0JCVN0cmluZyBuYW1lID0gZmVhdHVyZS5nZXRGZWF0dXJlTGFiZWwoKTsKLQkJVVJMIHdlbGNvbWVVUkwgPSBmZWF0dXJlLmdldFdlbGNvbWVQYWdlVVJMKCk7Ci0JCVN0cmluZyBhY3Rpb24gPSAiIjsKLQkJd3JpdGVyLnByaW50KCI8bGk+Iik7Ci0JCXdyaXRlci5wcmludCgiPGEgaHJlZj1cImFjdGlvblwiPiIrbmFtZSsiPC9hPiIpOwotCQl3cml0ZXIucHJpbnRsbigiPC9saT4iKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5JRm9ybUNvbnRlbnRQcm92aWRlciNzZXRDb250ZW50T2JzZXJ2ZXIob3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSUZvcm1Db250ZW50T2JzZXJ2ZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudE9ic2VydmVyKElGb3JtQ29udGVudE9ic2VydmVyIG9ic2VydmVyKSB7Ci0JCXRoaXMub2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9IZWxwU2VjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSGVscFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzZGUyYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9IZWxwU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEhlbHBTZWN0aW9uIGltcGxlbWVudHMgSVBvcnRhbFNlY3Rpb25Gb3JtIHsKLQlwcml2YXRlIFRleHQgcGhyYXNlVGV4dDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsLklQb3J0YWxTZWN0aW9uI2luaXQob3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLklGb3JtUGFnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElGb3JtUGFnZSBwYWdlKSB7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWwuSVBvcnRhbFNlY3Rpb24jY3JlYXRlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlmYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgIlBocmFzZToiKTsKLQkJcGhyYXNlVGV4dCA9IGZhY3RvcnkuY3JlYXRlVGV4dChjb250YWluZXIsICIiKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcGhyYXNlVGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZmluYWwgQnV0dG9uIGJ1dHRvbiA9IGZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbnRhaW5lciwgIkdvIiwgU1dULlBVU0gpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZG9TZWFyY2gocGhyYXNlVGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlwaHJhc2VUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0PXBocmFzZVRleHQuZ2V0VGV4dCgpOwotCQkJCWJ1dHRvbi5zZXRFbmFibGVkKHRleHQubGVuZ3RoKCk+MCk7Ci0JCQl9Ci0JCX0pOwotCQlwaHJhc2VUZXh0LmFkZEtleUxpc3RlbmVyKG5ldyBLZXlBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJCWlmIChlLmNoYXJhY3Rlcj09J1xyJykgewotCQkJCQlpZiAoYnV0dG9uLmlzRW5hYmxlZCgpKQotCQkJCQkJZG9TZWFyY2gocGhyYXNlVGV4dC5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCWZhY3RvcnkucGFpbnRCb3JkZXJzRm9yKGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCXByaXZhdGUgdm9pZCBkb1NlYXJjaChTdHJpbmcgcGhyYXNlKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZXBocmFzZSA9IFVSTEVuY29kZXIuZW5jb2RlKHBocmFzZSwgIlVURi04Iik7Ci0JCQlTdHJpbmcgcXVlcnkgPSAidGFiPXNlYXJjaCZzZWFyY2hXb3JkPSIrZXBocmFzZTsKLQkJCVdvcmtiZW5jaEhlbHAuZ2V0SGVscFN1cHBvcnQoKS5kaXNwbGF5SGVscFJlc291cmNlKHF1ZXJ5KTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCX0KLQl9IAotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50T2JzZXJ2ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0lGb3JtQ29udGVudE9ic2VydmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzgwMWIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50T2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElGb3JtQ29udGVudE9ic2VydmVyIHsKLQlwdWJsaWMgdm9pZCBjb250ZW50Q2hhbmdlZChJRm9ybUNvbnRlbnRQcm92aWRlciBwcm92aWRlcik7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSUZvcm1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVlODVlZS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9JRm9ybUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENyZWF0ZWQgb24gSnVuIDIwLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5wb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZvcm1Db250ZW50UHJvdmlkZXIgewotCVN0cmluZyBnZXRDb250ZW50KCk7Ci0Jdm9pZCBzZXRDb250ZW50T2JzZXJ2ZXIoSUZvcm1Db250ZW50T2JzZXJ2ZXIgb2JzZXJ2ZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL0lQb3J0YWxTZWN0aW9uRm9ybS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSVBvcnRhbFNlY3Rpb25Gb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZDc3YTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvSVBvcnRhbFNlY3Rpb25Gb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLio7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVBvcnRhbFNlY3Rpb25Gb3JtIHsKLQl2b2lkIGluaXQoSUZvcm1QYWdlIHBhZ2UpOwotCUNvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KTsKLQl2b2lkIGRpc3Bvc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9Qb3J0YWxTZWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9Qb3J0YWxTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNWVhYTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvUG9ydGFsU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mb3Jtcy5pbnRlcm5hbC5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3J0YWxTZWN0aW9uIGV4dGVuZHMgRm9ybVNlY3Rpb24gIHsKLQlwcml2YXRlIFNlY3Rpb25EZXNjcmlwdG9yIGRlc2M7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsRm9ybSBmb3JtOwotCXByaXZhdGUgSHlwZXJsaW5rQWN0aW9uIGVjbGlwc2VBY3Rpb247Ci0JcHJpdmF0ZSBIVFRQQWN0aW9uIGh0dHBBY3Rpb247Ci0JcHJpdmF0ZSBIeXBlcmxpbmtBY3Rpb24gaGVscEFjdGlvbjsKLQlwcml2YXRlIENvbXBvc2l0ZSBmb3JtQ29udGFpbmVyOwotCXByaXZhdGUgSGFzaHRhYmxlIGVjbGlwc2VBY3Rpb25zOwotCi0JY2xhc3MgQWN0aW9uV3JhcHBlciBleHRlbmRzIEFjdGlvbiB7Ci0JCUlBY3Rpb25EZWxlZ2F0ZSBkZWxlZ2F0ZTsKLQotCQlwdWJsaWMgQWN0aW9uV3JhcHBlcihTdHJpbmcgYXJnLCBJQWN0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJCXN1cGVyKGFyZyk7Ci0JCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JCQlpZiAoZGVsZWdhdGUgaW5zdGFuY2VvZiBJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUpCi0JCQkJKChJV29ya2JlbmNoV2luZG93QWN0aW9uRGVsZWdhdGUpIGRlbGVnYXRlKS5pbml0KAotCQkJCQlXZWxjb21lUG9ydGFsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkZWxlZ2F0ZS5ydW4odGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUG9ydGFsU2VjdGlvbihTZWN0aW9uRGVzY3JpcHRvciBkZXNjLCBXZWxjb21lUG9ydGFsRm9ybSBmb3JtKSB7Ci0JCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCXRoaXMuZm9ybSA9IGZvcm07Ci0JCXNldERlc2NyaXB0aW9uUGFpbnRlZChmYWxzZSk7Ci0JCXNldENvbGxhcHNhYmxlKHRydWUpOwotCQlzZXRIZWFkZXJUZXh0KGRlc2MuZ2V0TmFtZSgpKTsKLQkJbWFrZUh5cGVybGlua0FjdGlvbnMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUh5cGVybGlua0FjdGlvbnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPQotCQkJZm9ybS5nZXRQb3J0YWwoKS5nZXRFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpOwotCQlodHRwQWN0aW9uID0gbmV3IEhUVFBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKElIeXBlcmxpbmtTZWdtZW50IGxpbmspIHsKLQkJCQlTdHJpbmcgdXJsID0gbGluay5nZXRBcmcoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCVdlbGNvbWVQb3J0YWwuc2hvd1VSTChsaW5rLmdldFRleHQoKSwgdXJsKTsKLQkJCX0KLQkJfTsKLQkJaHR0cEFjdGlvbi5zZXRTdGF0dXNMaW5lTWFuYWdlcihiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCQllY2xpcHNlQWN0aW9uID0gbmV3IEh5cGVybGlua0FjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSUh5cGVybGlua1NlZ21lbnQgbGluaykgewotCQkJCVN0cmluZyBhcmcgPSBsaW5rLmdldEFyZygpOwotCQkJCWlmIChhcmcgIT0gbnVsbCkKLQkJCQkJcnVuRWNsaXBzZUFjdGlvbihhcmcpOwotCQkJfQotCQl9OwotCQllY2xpcHNlQWN0aW9uLnNldFN0YXR1c0xpbmVNYW5hZ2VyKGJhcnMuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSk7Ci0JCWhlbHBBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgbGlua0FjdGl2YXRlZChJSHlwZXJsaW5rU2VnbWVudCBsaW5rKSB7Ci0JCQkJU3RyaW5nIGFyZyA9IGxpbmsuZ2V0QXJnKCk7Ci0JCQkJaWYgKGFyZyAhPSBudWxsKQotCQkJCQlvcGVuRWNsaXBzZUhlbHAoYXJnKTsKLQkJCX0KLQkJfTsKLQkJaGVscEFjdGlvbi5zZXRTdGF0dXNMaW5lTWFuYWdlcihiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCX0KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNsaWVudCgKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnID0gZGVzYy5nZXRDb25maWcoKTsKLQkJZm9ybUNvbnRhaW5lciA9IGZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCWZvcm1Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWxheW91dC50b3BNYXJnaW4gPSBsYXlvdXQuYm90dG9tTWFyZ2luID0gMDsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSBsYXlvdXQucmlnaHRNYXJnaW4gPSAwOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgPSBjaGlsZHJlbltpXTsKLQkJCWlmIChjaGlsZC5nZXROYW1lKCkuZXF1YWxzKCJmb3JtIikpIHsKLQkJCQljcmVhdGVGb3JtKGZvcm1Db250YWluZXIsIGNoaWxkLCBmYWN0b3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZm9ybUNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ybSgKLQkJZmluYWwgQ29tcG9zaXRlIHBhcmVudCwKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywKLQkJRm9ybVdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlTdHJpbmcgdHlwZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoInR5cGUiKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmVxdWFscygiY3VzdG9tIikpIHsKLQkJCWNyZWF0ZUN1c3RvbUZvcm0ocGFyZW50LCBjb25maWcsIGZhY3RvcnkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIEZvcm1FbmdpbmUgZW5naW5lID0gZmFjdG9yeS5jcmVhdGVGb3JtRW5naW5lKHBhcmVudCk7Ci0JCS8vZW5naW5lLnNldEJhY2tncm91bmQocGFyZW50LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQ1lBTikpOwotCQllbmdpbmUuc2V0SHlwZXJsaW5rU2V0dGluZ3MoZmFjdG9yeS5nZXRIeXBlcmxpbmtIYW5kbGVyKCkpOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKFRhYmxlRGF0YS5GSUxMLCBUYWJsZURhdGEuVE9QKTsKLQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQllbmdpbmUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCWVuZ2luZS5yZWdpc3RlclRleHRPYmplY3QoInVybCIsIGh0dHBBY3Rpb24pOwotCQllbmdpbmUucmVnaXN0ZXJUZXh0T2JqZWN0KCJhY3Rpb24iLCBlY2xpcHNlQWN0aW9uKTsKLQkJZW5naW5lLnJlZ2lzdGVyVGV4dE9iamVjdCgiaGVscCIsIGhlbHBBY3Rpb24pOwotCQlpZiAodHlwZSA9PSBudWxsIHx8IHR5cGUuZXF1YWxzKCJsb2NhbCIpKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBjb25maWcuZ2V0VmFsdWUoKTsKLQkJCWVuZ2luZS5sb2FkKCI8Zm9ybT4iICsgdmFsdWUgKyAiPC9mb3JtPiIsIHRydWUsIGZhbHNlKTsKLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygiZHluYW1pYyIpKSB7Ci0JCQlJRm9ybUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGNyZWF0ZUNvbnRlbnRQcm92aWRlcihjb25maWcpOwotCQkJaWYgKHByb3ZpZGVyIT1udWxsKSB7Ci0JCQkJZW5naW5lLmxvYWQocHJvdmlkZXIuZ2V0Q29udGVudCgpLCB0cnVlLCBmYWxzZSk7Ci0JCQkJcHJvdmlkZXIuc2V0Q29udGVudE9ic2VydmVyKG5ldyBJRm9ybUNvbnRlbnRPYnNlcnZlcigpIHsKLQkJCQkJcHVibGljIHZvaWQgY29udGVudENoYW5nZWQoSUZvcm1Db250ZW50UHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJCQkJCWVuZ2luZS5sb2FkKHByb3ZpZGVyLmdldENvbnRlbnQoKSwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJcmVmbG93KCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0eXBlLmVxdWFscygicmVtb3RlIikpIHsKLQkJCVN0cmluZyB1cmxOYW1lID0gY29uZmlnLmdldEF0dHJpYnV0ZSgidXJsIik7Ci0JCQl0cnkgewotCQkJCWZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKHVybE5hbWUpOwotCQkJCVJ1bm5hYmxlIGxvYWRlciA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJCQkJZW5naW5lLmxvYWQoaXMsIGZhbHNlKTsKLQkJCQkJCQlwYXJlbnQuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJcmVmbG93KCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQkJCQkJCX0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlwYXJlbnQuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJV2VsY29tZVBvcnRhbC5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9KTsKLQotCQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJCQkJCWlzLmNsb3NlKCk7Ci0JCQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKGxvYWRlcik7Ci0JCQkJdC5zdGFydCgpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlXZWxjb21lUG9ydGFsLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDdXN0b21Gb3JtKAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLAotCQlGb3JtV2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3Qgb2JqID0gY29uZmlnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVBvcnRhbFNlY3Rpb25Gb3JtKSB7Ci0JCQkJSVBvcnRhbFNlY3Rpb25Gb3JtIHBzZWN0aW9uID0gKElQb3J0YWxTZWN0aW9uRm9ybSkgb2JqOwotCQkJCS8vcHNlY3Rpb24uaW5pdChmb3JtLmdldFBvcnRhbCgpKTsKLQkJCQlDb250cm9sIGNvbnRyb2wgPSBwc2VjdGlvbi5jcmVhdGVDb250cm9sKHBhcmVudCwgZmFjdG9yeSk7Ci0JCQkJVGFibGVEYXRhIHRkID0gbmV3IFRhYmxlRGF0YShUYWJsZURhdGEuRklMTCwgVGFibGVEYXRhLlRPUCk7Ci0JCQkJdGQuZ3JhYkhvcml6b250YWwgPSB0cnVlOwotCQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJV2VsY29tZVBvcnRhbC5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJRm9ybUNvbnRlbnRQcm92aWRlciBjcmVhdGVDb250ZW50UHJvdmlkZXIoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQl0cnkgewotCQkJT2JqZWN0IG9iaiA9IGNvbmZpZy5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKCJjbGFzcyIpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElGb3JtQ29udGVudFByb3ZpZGVyKSB7Ci0JCQkJcmV0dXJuIChJRm9ybUNvbnRlbnRQcm92aWRlcikgb2JqOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVdlbGNvbWVQb3J0YWwubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCByZWZsb3coKSB7Ci0JCWZvcm1Db250YWluZXIubGF5b3V0KCk7Ci0JCXN1cGVyLnJlZmxvdygpOwotCQlmb3JtLnVwZGF0ZVNpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcnVuRWNsaXBzZUFjdGlvbihmaW5hbCBTdHJpbmcgYXJnKSB7Ci0JCUJ1c3lJbmRpY2F0b3IKLQkJCS5zaG93V2hpbGUoZm9ybS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgSUFjdGlvbiBhY3Rpb24gPSBnZXRFY2xpcHNlQWN0aW9uKGFyZyk7Ci0JCQkJaWYgKGFjdGlvbiAhPSBudWxsKQotCQkJCQlhY3Rpb24ucnVuKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUFjdGlvbiBnZXRFY2xpcHNlQWN0aW9uKFN0cmluZyBhcmcpIHsKLQkJaWYgKGVjbGlwc2VBY3Rpb25zID09IG51bGwpIHsKLQkJCWVjbGlwc2VBY3Rpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCUlBY3Rpb24gYWN0aW9uID0gKElBY3Rpb24pIGVjbGlwc2VBY3Rpb25zLmdldChhcmcpOwotCQlpZiAoYWN0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gYWN0aW9uOwotCQkvLyBsb2FkCi0JCWludCBjb2wgPSBhcmcuaW5kZXhPZignOicpOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBhcmcuc3Vic3RyaW5nKDAsIGNvbCk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBhcmcuc3Vic3RyaW5nKGNvbCArIDEpOwotCQlJUGx1Z2luRGVzY3JpcHRvciBkZXNjID0KLQkJCVBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0UGx1Z2luRGVzY3JpcHRvcihwbHVnaW5JZCk7Ci0JCWlmIChkZXNjID09IG51bGwpIHsKLQkJCWxvZ0FjdGlvbkxpbmtFcnJvcihwbHVnaW5JZCwgY2xhc3NOYW1lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUNsYXNzIGFjdGlvbkNsYXNzOwotCQl0cnkgewotCQkJYWN0aW9uQ2xhc3MgPSBkZXNjLmdldFBsdWdpbkNsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdHJ5IHsKLQkJCU9iamVjdCBvYmogPSBhY3Rpb25DbGFzcy5uZXdJbnN0YW5jZSgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElBY3Rpb24pCi0JCQkJYWN0aW9uID0gKElBY3Rpb24pIG9iajsKLQkJCWVsc2UKLQkJCQlhY3Rpb24gPSBuZXcgQWN0aW9uV3JhcHBlcihhcmcsIChJQWN0aW9uRGVsZWdhdGUpIG9iaik7Ci0JCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJbG9nQWN0aW9uTGlua0Vycm9yKHBsdWdpbklkLCBjbGFzc05hbWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2dBY3Rpb25MaW5rRXJyb3IocGx1Z2luSWQsIGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllY2xpcHNlQWN0aW9ucy5wdXQoYXJnLCBhY3Rpb24pOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2dBY3Rpb25MaW5rRXJyb3IoU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0KLQkJCW5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQlXZWxjb21lUG9ydGFsLmdldFBsdWdpbklkKCksCi0JCQkJSVN0YXR1cy5PSywKLQkJCQkiVW5hYmxlIHRvIGxvYWQgY2xhc3MgIgotCQkJCQkrIGNsYXNzTmFtZQotCQkJCQkrICIgZnJvbSBwbHVnLWluICIKLQkJCQkJKyBwbHVnaW5JZAotCQkJCQkrICIuIiwKLQkJCQludWxsKTsKLQkJV2VsY29tZVBvcnRhbC5sb2coc3RhdHVzLCB0cnVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5FY2xpcHNlSGVscChTdHJpbmcgYXJnKSB7Ci0JCVdvcmtiZW5jaEhlbHAuZ2V0SGVscFN1cHBvcnQoKS5kaXNwbGF5SGVscFJlc291cmNlKGFyZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvU2VjdGlvbkRlc2NyaXB0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1NlY3Rpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNDk3YjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvU2VjdGlvbkRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwucG9ydGFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFNlY3Rpb25EZXNjcmlwdG9yIHsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWc7Ci0JCi0JcHVibGljIFNlY3Rpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJdGhpcy5jb25maWcgPSBjb25maWc7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBjb25maWcuZ2V0QXR0cmlidXRlKCJpZCIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBjb25maWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JfQotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlnKCkgewotCQlyZXR1cm4gY29uZmlnOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0MTJlNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEVkaXRvciBleHRlbmRzIEVkaXRvclBhcnQgewotCXByaXZhdGUgV2VsY29tZVBvcnRhbFBhcnQgd2VsY29tZVBhcnQ7Ci0JCi0JcHVibGljIFdlbGNvbWVQb3J0YWxFZGl0b3IoKSB7Ci0JCXdlbGNvbWVQYXJ0ID0gbmV3IFdlbGNvbWVQb3J0YWxQYXJ0KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh3ZWxjb21lUGFydCE9bnVsbCkKLQkJCXdlbGNvbWVQYXJ0LmRpc3Bvc2UoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjZG9TYXZlQXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2dvdG9NYXJrZXIob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvTWFya2VyKElNYXJrZXIgbWFya2VyKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQl0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlpZiAoIShpbnB1dCBpbnN0YW5jZW9mIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCkpCi0JCQl0aHJvdyBuZXcgUGFydEluaXRFeGNlcHRpb24oIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0Iik7Ci0JCXNldFNpdGUoc2l0ZSk7Ci0JCXNldElucHV0KGlucHV0KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzRGlydHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGlydHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2lzU2F2ZUFzQWxsb3dlZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJd2VsY29tZVBhcnQuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I3NldEZvY3VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2YxZjQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotLyoqCi0gKiBBIHNpbXBsZSBlZGl0b3IgaW5wdXQgZm9yIHRoZSB3ZWxjb21lIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgV2VsY29tZVBvcnRhbEVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0IHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRkFDVE9SWV9JRCA9ICJvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbC5XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFdlbGNvbWVFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQoKSB7Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAiV2VsY29tZSI7Ci0JfQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmo9PW51bGwpIHJldHVybiBmYWxzZTsKLQkJaWYgKG9iaiA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dCkgewotCQkJV2VsY29tZVBvcnRhbEVkaXRvcklucHV0IHdvYmogPSAoV2VsY29tZVBvcnRhbEVkaXRvcklucHV0KW9iajsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBuZXcgSVBlcnNpc3RhYmxlRWxlbWVudCgpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUlkKCkgewotCQkJCXJldHVybiBGQUNUT1JZX0lEOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJCX0KLQkJfTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzc2ZjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbEVkaXRvcklucHV0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVsZW1lbnRGYWN0b3J5OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxFZGl0b3JJbnB1dEZhY3RvcnkgaW1wbGVtZW50cyBJRWxlbWVudEZhY3RvcnkgewotCS8qKgotCSAqLwotCXB1YmxpYyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXRGYWN0b3J5KCkgewotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3RvcnkjY3JlYXRlRWxlbWVudChvcmcuZWNsaXBzZS51aS5JTWVtZW50bykKLQkgKi8KLQlwdWJsaWMgSUFkYXB0YWJsZSBjcmVhdGVFbGVtZW50KElNZW1lbnRvIG1lbWVudG8pIHsKLQkJcmV0dXJuIG5ldyBXZWxjb21lUG9ydGFsRWRpdG9ySW5wdXQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxGb3JtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsRm9ybS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGE0NGIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxGb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxGb3JtIGV4dGVuZHMgV2ViRm9ybSB7Ci0JcHJpdmF0ZSBXZWxjb21lUG9ydGFsUGFydCBwb3J0YWw7Ci0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgcGFnZUNvbmZpZzsKLQotCXB1YmxpYyBXZWxjb21lUG9ydGFsRm9ybShXZWxjb21lUG9ydGFsUGFydCBwb3J0YWwsIElDb25maWd1cmF0aW9uRWxlbWVudCBwYWdlQ29uZmlnKSB7Ci0JCXRoaXMucG9ydGFsID0gcG9ydGFsOwotCQl0aGlzLnBhZ2VDb25maWcgPSBwYWdlQ29uZmlnOwotCQlzZXRIZWFkaW5nVmlzaWJsZShmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoT2JqZWN0IG1vZGVsKSB7Ci0JCXVwZGF0ZSgpOwotCX0KLQkKLQlwdWJsaWMgV2VsY29tZVBvcnRhbFBhcnQgZ2V0UG9ydGFsKCkgewotCQlyZXR1cm4gcG9ydGFsOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUhUTUxUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgSFRNTFRhYmxlTGF5b3V0KCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBnZXRJbnRlZ2VyKHBhZ2VDb25maWcsICJudW1Db2x1bW5zIiwgMSk7Ci0JCWxheW91dC50b3BNYXJnaW4gPSAwOwotCQlsYXlvdXQubGVmdE1hcmdpbiA9IGxheW91dC5yaWdodE1hcmdpbiA9IDEwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmc9MTU7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSA1OwotCQkvL3BhcmVudC5zZXRCYWNrZ3JvdW5kKHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0dSRUVOKSk7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGg9dHJ1ZTsKLQkJU2VsZWN0YWJsZUZvcm1MYWJlbCBjdXN0b21pemUgPSBnZXRGYWN0b3J5KCkuY3JlYXRlU2VsZWN0YWJsZUxhYmVsKHBhcmVudCwgIkN1c3RvbWl6ZS4uLiIpOwotCQlnZXRGYWN0b3J5KCkudHVybkludG9IeXBlcmxpbmsoY3VzdG9taXplLCBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoQ29udHJvbCBsaW5rKSB7Ci0JCQl9Ci0JCX0pOwotCQlUYWJsZURhdGEgdGQgPSBuZXcgVGFibGVEYXRhKCk7Ci0JCXRkLmFsaWduID0gVGFibGVEYXRhLkNFTlRFUjsKLQkJdGQuY29sc3BhbiA9IGxheW91dC5udW1Db2x1bW5zOwotCQljdXN0b21pemUuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgW10gc2VjdGlvblJlZnMgPSBwYWdlQ29uZmlnLmdldENoaWxkcmVuKCJzZWN0aW9uIik7Ci0JCWZvciAoaW50IGk9MDsgaTxzZWN0aW9uUmVmcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IHNlY3Rpb25SZWYgPSBzZWN0aW9uUmVmc1tpXTsKLQkJCVN0cmluZyBpZCA9IHNlY3Rpb25SZWYuZ2V0QXR0cmlidXRlKCJpZCIpOwotCQkJU2VjdGlvbkRlc2NyaXB0b3IgZGVzYyA9IHBvcnRhbC5maW5kU2VjdGlvbihpZCk7Ci0JCQlpZiAoZGVzYz09bnVsbCkgY29udGludWU7Ci0JCQlQb3J0YWxTZWN0aW9uIHNlY3Rpb24gPSBuZXcgUG9ydGFsU2VjdGlvbihkZXNjLCB0aGlzKTsKLQkJCUNvbnRyb2wgY29udHJvbCA9IHNlY3Rpb24uY3JlYXRlQ29udHJvbChwYXJlbnQsIGdldEZhY3RvcnkoKSk7Ci0JCQlpbnQgc3BhbiA9IGdldEludGVnZXIoc2VjdGlvblJlZiwgInNwYW4iLCAxKTsKLQkJCXRkID0gbmV3IFRhYmxlRGF0YShUYWJsZURhdGEuRklMTCwgVGFibGVEYXRhLlRPUCk7Ci0JCQl0ZC5jb2xzcGFuID0gc3BhbjsKLQkJCXRkLmdyYWJIb3Jpem9udGFsID0gdHJ1ZTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCQlyZWdpc3RlclNlY3Rpb24oc2VjdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRJbnRlZ2VyKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcsIFN0cmluZyBhdHROYW1lLCBpbnQgZGVmKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCWlmICh2YWx1ZSE9bnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVmOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lUG9ydGFsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDMzNGQxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIFdlbGNvbWVQb3J0YWxQYWdlIGltcGxlbWVudHMgSUZvcm1QYWdlIHsKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgV2VsY29tZVBvcnRhbFBhcnQgcG9ydGFsOwotCXByaXZhdGUgV2VsY29tZVBvcnRhbEZvcm0gZm9ybTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWc7Ci0JcHJpdmF0ZSBTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYjsKLQkKLQlwdWJsaWMgV2VsY29tZVBvcnRhbFBhZ2UoV2VsY29tZVBvcnRhbFBhcnQgcG9ydGFsLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCXRoaXMucG9ydGFsID0gcG9ydGFsOwotCQl0aGlzLmZvcm0gPSBuZXcgV2VsY29tZVBvcnRhbEZvcm0ocG9ydGFsLCBjb25maWcpOwotCQl0aGlzLm5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKCJuYW1lIik7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUYWIoU2VsZWN0YWJsZUZvcm1MYWJlbCB0YWIpIHsKLQkJdGhpcy50YWIgPSB0YWI7Ci0JfQotCQotCXB1YmxpYyBTZWxlY3RhYmxlRm9ybUxhYmVsIGdldFRhYigpIHsKLQkJcmV0dXJuIHRhYjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBiZWNvbWVzSW52aXNpYmxlKElGb3JtUGFnZSBuZXdQYWdlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlY29tZXNWaXNpYmxlKElGb3JtUGFnZSBwcmV2aW91c1BhZ2UpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5jb250cm9sID0gZm9ybS5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCWZvcm0uaW5pdGlhbGl6ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NvdXJjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLQkJcmV0dXJuIHBvcnRhbC5pc1Zpc2libGUodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVQb3J0YWxQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMzY3MDEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC9wb3J0YWwvV2VsY29tZVBvcnRhbFBhcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUudWkuZm9ybXMuaW50ZXJuYWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWw7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lUG9ydGFsUGFydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRBQl9QQURESU5HID0gNTsKLQlwcml2YXRlIEhhc2h0YWJsZSBzZWN0aW9uRGVzY3JpcHRvcnM7Ci0JY2xhc3MgVGFiTGlzdGVuZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBsaW5rQWN0aXZhdGVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCQlJRm9ybVBhZ2UgcGFnZSA9IChJRm9ybVBhZ2UpIGxpbmtMYWJlbC5nZXREYXRhKCk7Ci0JCQl3b3JrYm9vay5zZWxlY3RQYWdlKHBhZ2UsIGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpbmtFbnRlcmVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaW5rRXhpdGVkKENvbnRyb2wgbGlua0xhYmVsKSB7Ci0JCQlpZiAobGlua0xhYmVsPT1zZWxlY3RlZFRhYikKLQkJCQloaWdobGlnaHRUYWIoc2VsZWN0ZWRUYWIsIHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUYWJMaXN0ZW5lciB0YWJMaXN0ZW5lciA9IG5ldyBUYWJMaXN0ZW5lcigpOwotCXByaXZhdGUgQ29tcG9zaXRlIHRhYkNvbnRhaW5lcjsKLQlwcml2YXRlIEZvcm1XaWRnZXRGYWN0b3J5IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBIeXBlcmxpbmtIYW5kbGVyIGhoYW5kbGVyOwotCXByaXZhdGUgV2VsY29tZVBvcnRhbEVkaXRvciBlZGl0b3I7Ci0JcHJpdmF0ZSBDb2xvciB0YWJDb2xvcjsKLQlwcml2YXRlIE5vVGFic1dvcmtib29rIHdvcmtib29rOwotCXByaXZhdGUgU2VsZWN0YWJsZUZvcm1MYWJlbCBzZWxlY3RlZFRhYjsKLQotCXB1YmxpYyBXZWxjb21lUG9ydGFsUGFydChXZWxjb21lUG9ydGFsRWRpdG9yIGVkaXRvcikgewotCQlmYWN0b3J5ID0gbmV3IEZvcm1XaWRnZXRGYWN0b3J5KCk7Ci0JCWhoYW5kbGVyID0gbmV3IEh5cGVybGlua0hhbmRsZXIoKTsKLQkJd29ya2Jvb2sgPSBuZXcgTm9UYWJzV29ya2Jvb2soKTsKLQkJdGhpcy5lZGl0b3IgPSBlZGl0b3I7Ci0JfQotCQotCXB1YmxpYyBXZWxjb21lUG9ydGFsRWRpdG9yIGdldEVkaXRvcigpIHsKLQkJcmV0dXJuIGVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmYWN0b3J5LmRpc3Bvc2UoKTsKLQkJaGhhbmRsZXIuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoSUZvcm1QYWdlIHBhZ2UpIHsKLQkJcmV0dXJuIHdvcmtib29rLmdldEN1cnJlbnRQYWdlKCkuZXF1YWxzKHBhZ2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29udGFpbmVyID0gZmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQljcmVhdGVUaXRsZShjb250YWluZXIpOwotCQljcmVhdGVUYWJzKGNvbnRhaW5lcik7Ci0JCXdvcmtib29rLmNyZWF0ZUNvbnRyb2woY29udGFpbmVyKTsKLQkJd29ya2Jvb2suZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl3b3JrYm9vay5hZGRGb3JtU2VsZWN0aW9uTGlzdGVuZXIobmV3IElGb3JtU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBmb3JtU2VsZWN0ZWQoSUZvcm1QYWdlIHBhZ2UsIGJvb2xlYW4gc2V0Rm9jdXMpIHsKLQkJCQloaWdodGxpZ2h0VGFiKChXZWxjb21lUG9ydGFsUGFnZSkgcGFnZSk7Ci0JCQl9Ci0JCX0pOwotCQl3b3JrYm9vay5zZWxlY3RQYWdlKHdvcmtib29rLmdldFBhZ2VzKClbMF0sIHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUaXRsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVdlbGNvbWVUaXRsZUFyZWEgdGl0bGUgPSBuZXcgV2VsY29tZVRpdGxlQXJlYShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aXRsZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGl0bGUuc2V0VGV4dCgiV2VsY29tZSIpOwotCQl0aXRsZS5zZXRCYWNrZ3JvdW5kKGZhY3RvcnkuZ2V0QmFja2dyb3VuZENvbG9yKCkpOwotCQl0aXRsZS5zZXRGb3JlZ3JvdW5kKGZhY3RvcnkuZ2V0Rm9yZWdyb3VuZENvbG9yKCkpOwotCQl0aXRsZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEhlYWRlckZvbnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhYnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0YWJDb250YWluZXIgPSBmYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCQl0YWJDb250YWluZXIuYWRkUGFpbnRMaXN0ZW5lcihuZXcgUGFpbnRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGUpIHsKLQkJCQlQb2ludCBzaXplID0gdGFiQ29udGFpbmVyLmdldFNpemUoKTsKLQkJCQlSZWN0YW5nbGUgdGFiQm91bmRzID0gc2VsZWN0ZWRUYWIuZ2V0Qm91bmRzKCk7Ci0JCQkJR0MgZ2MgPSBlLmdjOwotCQkJCWdjLnNldEJhY2tncm91bmQoZmFjdG9yeS5nZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0JCQkJZ2MuZmlsbFJlY3RhbmdsZSgwLCB0YWJCb3VuZHMueS1UQUJfUEFERElORywgc2l6ZS54LCB0YWJCb3VuZHMuaGVpZ2h0K1RBQl9QQURESU5HK1RBQl9QQURESU5HKTsKLQkJCX0KLQkJfSk7Ci0JCXRhYkNvbG9yID0KLQkJCWZhY3RvcnkuZ2V0Q29sb3IoRm9ybVdpZGdldEZhY3RvcnkuQ09MT1JfQ09NUE9TSVRFX1NFUEFSQVRPUik7Ci0JCXRhYkNvbnRhaW5lci5zZXRCYWNrZ3JvdW5kKHRhYkNvbG9yKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IFRBQl9QQURESU5HOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gVEFCX1BBRERJTkcgKyBUQUJfUEFERElORzsKLQkJdGFiQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKTsKLQkJdGFiQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQloaGFuZGxlci5zZXRCYWNrZ3JvdW5kKHRhYkNvbG9yKTsKLQkJaGhhbmRsZXIuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJaGhhbmRsZXIuc2V0SHlwZXJsaW5rVW5kZXJsaW5lTW9kZSgKLQkJCUh5cGVybGlua1NldHRpbmdzLlVOREVSTElORV9ST0xMT1ZFUik7Ci0JCWxvYWRUYWJzKHRhYkNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2FkVGFicyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBwYWdlcyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSwgIndlbGNvbWVQYWdlcyIpOwotCQlmb3IgKGludCBpPTA7IGk8cGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCWNyZWF0ZVRhYihwYXJlbnQsIHBhZ2VzW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWIoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJV2VsY29tZVBvcnRhbFBhZ2UgcGFnZSA9IG5ldyBXZWxjb21lUG9ydGFsUGFnZSh0aGlzLCBjb25maWcpOwotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYiA9IGZhY3RvcnkuY3JlYXRlU2VsZWN0YWJsZUxhYmVsKHBhcmVudCwgcGFnZS5nZXRUaXRsZSgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJdGFiLnNldEJhY2tncm91bmQodGFiQ29sb3IpOwotCQl0YWIuc2V0Rm9yZWdyb3VuZChmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpKTsKLQkJaGhhbmRsZXIucmVnaXN0ZXJIeXBlcmxpbmsodGFiLCB0YWJMaXN0ZW5lcik7Ci0JCXRhYi5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JCXRhYi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFiLnNldERhdGEocGFnZSk7Ci0JCXBhZ2Uuc2V0VGFiKHRhYik7Ci0JCXdvcmtib29rLmFkZFBhZ2UocGFnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhpZ2h0bGlnaHRUYWIoV2VsY29tZVBvcnRhbFBhZ2UgcGFnZSkgewotCQlpZiAoc2VsZWN0ZWRUYWIgIT0gbnVsbCkKLQkJCWhpZ2hsaWdodFRhYihzZWxlY3RlZFRhYiwgZmFsc2UpOwotCQlTZWxlY3RhYmxlRm9ybUxhYmVsIHRhYiA9IHBhZ2UuZ2V0VGFiKCk7Ci0JCWhpZ2hsaWdodFRhYih0YWIsIHRydWUpOwotCQlzZWxlY3RlZFRhYiA9IHRhYjsKLQkJdGFiQ29udGFpbmVyLnJlZHJhdygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoaWdobGlnaHRUYWIoU2VsZWN0YWJsZUZvcm1MYWJlbCB0YWIsIGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQkJQ29sb3IgYmcgPSB0YWJDb2xvcjsKLQkJQ29sb3IgZmcgPSBmYWN0b3J5LmdldEJhY2tncm91bmRDb2xvcigpOwotCQl0YWIuc2V0Rm9yZWdyb3VuZChzZWxlY3RlZCA/IGJnIDogZmcpOwotCQl0YWIuc2V0QmFja2dyb3VuZChzZWxlY3RlZCA/IGZnIDogYmcpOwotCX0KLQotCXB1YmxpYyBTZWN0aW9uRGVzY3JpcHRvciBmaW5kU2VjdGlvbihTdHJpbmcgaWQpIHsKLQkJaWYgKHNlY3Rpb25EZXNjcmlwdG9ycz09bnVsbCkgewotCQkJc2VjdGlvbkRlc2NyaXB0b3JzPW5ldyBIYXNodGFibGUoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBzZWN0aW9ucyA9IFBsYXRmb3JtLmdldFBsdWdpblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFdlbGNvbWVQb3J0YWwuZ2V0UGx1Z2luSWQoKSwgIndlbGNvbWVTZWN0aW9ucyIpOwotCQkJZm9yIChpbnQgaT0wOyBpPHNlY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU2VjdGlvbkRlc2NyaXB0b3IgZGVzYyA9IG5ldyBTZWN0aW9uRGVzY3JpcHRvcihzZWN0aW9uc1tpXSk7Ci0JCQkJc2VjdGlvbkRlc2NyaXB0b3JzLnB1dChkZXNjLmdldElkKCksIGRlc2MpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU2VjdGlvbkRlc2NyaXB0b3Ipc2VjdGlvbkRlc2NyaXB0b3JzLmdldChpZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVUaXRsZUFyZWEuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvcG9ydGFsL1dlbGNvbWVUaXRsZUFyZWEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM2MDAwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3BvcnRhbC9XZWxjb21lVGl0bGVBcmVhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ3JlYXRlZCBvbiBKdW4gMTksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLnBvcnRhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnVpLmZvcm1zLmludGVybmFsLkZvcm1MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLldlbGNvbWVQb3J0YWxJbWFnZXM7Ci0KLS8qKgotICogQGF1dGhvciBkZWphbgotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxjb21lVGl0bGVBcmVhIGV4dGVuZHMgRm9ybUxhYmVsIHsKLQlwcml2YXRlIEltYWdlIHRvcEltYWdlOwotCXByaXZhdGUgSW1hZ2UgYm90dG9tSW1hZ2U7Ci0KLQlwdWJsaWMgV2VsY29tZVRpdGxlQXJlYShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCXRvcEltYWdlID0gV2VsY29tZVBvcnRhbEltYWdlcy5nZXQoV2VsY29tZVBvcnRhbEltYWdlcy5JTUdfRk9STV9CQU5ORVIpOwotCQlib3R0b21JbWFnZSA9IFdlbGNvbWVQb3J0YWxJbWFnZXMuZ2V0KFdlbGNvbWVQb3J0YWxJbWFnZXMuSU1HX0ZPUk1fVU5ERVJMSU5FKTsKLQl9Ci0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50LCBib29sZWFuIGNoYW5nZWQpIHsKLQkJUG9pbnQgdGV4dFNpemUgPSBzdXBlci5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQsIGNoYW5nZWQpOwotCQlpbnQgd2lkdGggPSB0ZXh0U2l6ZS54OwotCQlpbnQgaGVpZ2h0ID0gTWF0aC5tYXgodGV4dFNpemUueSwgdG9wSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0KTsKLQkJaGVpZ2h0ICs9IGJvdHRvbUltYWdlLmdldEJvdW5kcygpLmhlaWdodDsKLQkJcmV0dXJuIG5ldyBQb2ludCh3aWR0aCwgaGVpZ2h0KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgcGFpbnQoUGFpbnRFdmVudCBlKSB7Ci0JCUdDIGdjID0gZS5nYzsKLQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldEJvdW5kcygpOwotCQlnYy5kcmF3SW1hZ2UodG9wSW1hZ2UsIGJvdW5kcy54LCBib3VuZHMueSk7Ci0JCWludCB5ID0JYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0IC0gYm90dG9tSW1hZ2UuZ2V0Qm91bmRzKCkuaGVpZ2h0OwotCQlnYy5kcmF3SW1hZ2UoYm90dG9tSW1hZ2UsIDAsIHkpOwotCQlzdXBlci5wYWludChlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvQnJvd3NlckNvbnRyb2xTaXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvQnJvd3NlckNvbnRyb2xTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjcwMjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0Jyb3dzZXJDb250cm9sU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIE5lZWRlZCBmb3IgdGhlIE9MRSBpbXBsZW1lbnRhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQnJvd3NlckNvbnRyb2xTaXRlIGV4dGVuZHMgT2xlQ29udHJvbFNpdGUgewotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYmVlbkJ1aWx0ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRlZERvd25sb2FkID0gZmFsc2U7Ci0JLy8gV2ViIEJyb3dzZXIKLQlwcml2YXRlIFdlYkJyb3dzZXIgYnJvd3NlcjsKLQlwcml2YXRlIFN0cmluZyBwcmVzZW50YXRpb25VUkw7Ci0JcHJpdmF0ZSBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXI7Ci0JcHJpdmF0ZSBpbnQgd29ya1NvRmFyID0gMDsKLQlwcml2YXRlIGludCBwcmV2TWF4ID0gMDsKLQotCXB1YmxpYyB2b2lkIHNldFN0YXR1c0xpbmVNYW5hZ2VyKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXRoaXMuc3RhdHVzTGluZU1hbmFnZXIgPSBtYW5hZ2VyOwotCX0KLQotCXZvaWQgc2V0QnJvd3NlcihXZWJCcm93c2VyIGJyb3dzZXIpIHsKLQkJdGhpcy5icm93c2VyID0gYnJvd3NlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZXNlbnRhdGlvblVSTCgpIHsKLQkJcmV0dXJuIHByZXNlbnRhdGlvblVSTDsKLQl9Ci0KLQkvKioKLQkgKiBCcm93c2VyQ29udHJvbFNpdGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgQnJvd3NlckNvbnRyb2xTaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgU3RyaW5nIHByb2dJZCkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlLCBwcm9nSWQpOwotCi0JCWFkZEV2ZW50TGlzdGVuZXIoV2ViQnJvd3Nlci5Eb3dubG9hZEJlZ2luLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCXN0YXJ0ZWREb3dubG9hZCA9IHRydWU7Ci0JCQkJLy93ZWJQcm9ncmVzcy5zZXRTZWxlY3Rpb24oMCk7Ci0JCQkJcHJldk1heCA9IC0xOwotCQkJfQotCQl9KTsKLQotCQlhZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuRG93bmxvYWRDb21wbGV0ZSwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdGFydGVkRG93bmxvYWQgPSBmYWxzZTsKLQkJCQkvL3dlYlByb2dyZXNzLnNldFNlbGVjdGlvbigwKTsKLQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuZG9uZSgpOwotCQkJCXByZXNlbnRhdGlvblVSTCA9IGJyb3dzZXIuZ2V0TG9jYXRpb25VUkwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkJlZm9yZU5hdmlnYXRlMiwgbmV3IE9sZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoT2xlRXZlbnQgZXZlbnQpIHsKLQkJCQkvL1ZhcmlhbnQgdXJsVmFyID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJCS8vU3RyaW5nIHN0clVybCA9IHVybFZhci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gUmVzcG9uZCB0byBQcm9ncmVzc0NoYW5nZSBldmVudHMgYnkgdXBkYXRpbmcgdGhlIFByb2dyZXNzIGJhcgotCQlhZGRFdmVudExpc3RlbmVyKFdlYkJyb3dzZXIuUHJvZ3Jlc3NDaGFuZ2UsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFzdGFydGVkRG93bmxvYWQpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCVZhcmlhbnQgcHJvZ3Jlc3MgPSBldmVudC5hcmd1bWVudHNbMF07Ci0JCQkJVmFyaWFudCBtYXhQcm9ncmVzcyA9IGV2ZW50LmFyZ3VtZW50c1sxXTsKLQotCQkJCWlmIChwcm9ncmVzcyA9PSBudWxsIHx8IG1heFByb2dyZXNzID09IG51bGwgfHwgcHJvZ3Jlc3MuZ2V0SW50KCkgPT0gLTEpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQkvKgotCQkJCWlmIChtYXhQcm9ncmVzcy5nZXRJbnQoKSE9MTAwKQotCQkJCSAgIHdlYlByb2dyZXNzLnNldE1heGltdW0obWF4UHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCSovCi0JCQkJaWYgKHByZXZNYXggIT0gbWF4UHJvZ3Jlc3MuZ2V0SW50KCkpIHsKLQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkuYmVnaW5UYXNrKCIiLCBtYXhQcm9ncmVzcy5nZXRJbnQoKSk7Ci0JCQkJCXByZXZNYXggPSBtYXhQcm9ncmVzcy5nZXRJbnQoKTsKLQkJCQl9Ci0JCQkJLy93ZWJQcm9ncmVzcy5zZXRTZWxlY3Rpb24ocHJvZ3Jlc3MuZ2V0SW50KCkpOwotCQkJCWludCBuZXdWYWx1ZSA9IHByb2dyZXNzLmdldEludCgpOwotCQkJCWludCB3b3JrZWQgPSBuZXdWYWx1ZSAtIHdvcmtTb0ZhcjsKLQkJCQl3b3JrU29GYXIgPSBuZXdWYWx1ZTsKLQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJc3RhdHVzTGluZU1hbmFnZXIuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkud29ya2VkKHdvcmtlZCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWFkZEV2ZW50TGlzdGVuZXIoV2ViQnJvd3Nlci5TdGF0dXNUZXh0Q2hhbmdlLCBuZXcgT2xlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChPbGVFdmVudCBldmVudCkgewotCQkJCVZhcmlhbnQgbmV3VGV4dCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlTdHJpbmcgbXNnID0gbmV3VGV4dC5nZXRTdHJpbmcoKTsKLQotCQkJCWlmIChtc2cgIT0gbnVsbCkgewotCQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UobXNnKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoc3RhdHVzTGluZU1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldE1lc3NhZ2UoIiIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0dsb2JhbEFjdGlvbkhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9HbG9iYWxBY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjNjMjMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0dsb2JhbEFjdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEdsb2JhbEFjdGlvbkhhbmRsZXIgewotCXByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCXByaXZhdGUgQ29udHJvbExpc3RlbmVyIGNvbnRyb2xMaXN0ZW5lcjsKLQotCXByaXZhdGUgY2xhc3MgQ29udHJvbExpc3RlbmVyIGltcGxlbWVudHMgTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC50eXBlKSB7Ci0JCQkJY2FzZSBTV1QuQWN0aXZhdGUgOgotCQkJCQlhY3RpdmUgPSB0cnVlOwotCQkJCQl1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBTV1QuRGVhY3RpdmF0ZSA6Ci0JCQkJCWFjdGl2ZSA9IGZhbHNlOwotCQkJCQl1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBHbG9iYWxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcml2YXRlIFN0cmluZyBpZDsKLQotCQlwdWJsaWMgR2xvYmFsQWN0aW9uKFN0cmluZyBpZCkgewotCQkJdGhpcy5pZCA9IGlkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZG9HbG9iYWxBY3Rpb24oaWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gY3V0QWN0aW9uOwotCXByaXZhdGUgR2xvYmFsQWN0aW9uIGNvcHlBY3Rpb247Ci0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gcGFzdGVBY3Rpb247Ci0JcHJpdmF0ZSBHbG9iYWxBY3Rpb24gZGVsZXRlQWN0aW9uOwotCXByaXZhdGUgR2xvYmFsQWN0aW9uIHNlbGVjdEFsbEFjdGlvbjsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbiB1bmRvQWN0aW9uOwotCi0JcHVibGljIEdsb2JhbEFjdGlvbkhhbmRsZXIoSUFjdGlvbkJhcnMgYWN0aW9uQmFyLCBDb21ibyBjb21ibykgewotCQl0aGlzLmNvbWJvID0gY29tYm87Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQsCi0JCQljdXRBY3Rpb24pOwotCQlhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSwKLQkJCWNvcHlBY3Rpb24pOwotCQlhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuUEFTVEUsCi0JCQlwYXN0ZUFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ERUxFVEUsCi0JCQlkZWxldGVBY3Rpb24pOwotCQlhY3Rpb25CYXIuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCUlXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuU0VMRUNUX0FMTCwKLQkJCXNlbGVjdEFsbEFjdGlvbik7Ci0JCWFjdGlvbkJhci5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5VTkRPLAotCQkJdW5kb0FjdGlvbik7Ci0JCWNvbnRyb2xMaXN0ZW5lciA9IG5ldyBDb250cm9sTGlzdGVuZXIoKTsKLQkJY29tYm8uYWRkTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBjb250cm9sTGlzdGVuZXIpOwotCQljb21iby5hZGRMaXN0ZW5lcihTV1QuRGVhY3RpdmF0ZSwgY29udHJvbExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoIWNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJY29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULkFjdGl2YXRlLCBjb250cm9sTGlzdGVuZXIpOwotCQkJY29tYm8ucmVtb3ZlTGlzdGVuZXIoU1dULkRlYWN0aXZhdGUsIGNvbnRyb2xMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCWN1dEFjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5DVVQpOwotCQljb3B5QWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNPUFkpOwotCQlwYXN0ZUFjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5QQVNURSk7Ci0JCWRlbGV0ZUFjdGlvbiA9IG5ldyBHbG9iYWxBY3Rpb24oSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5ERUxFVEUpOwotCQlzZWxlY3RBbGxBY3Rpb24gPQotCQkJbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlNFTEVDVF9BTEwpOwotCQl1bmRvQWN0aW9uID0gbmV3IEdsb2JhbEFjdGlvbihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBY3Rpb25zRW5hYmxlU3RhdGUoKSB7Ci0JCWlmICghYWN0aXZlKSB7Ci0JCQljdXRBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljb3B5QWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcGFzdGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlzZWxlY3RBbGxBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl1bmRvQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9IGVsc2UgewotCQkJY3V0QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQljb3B5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlwYXN0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZGVsZXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlzZWxlY3RBbGxBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBkb0dsb2JhbEFjdGlvbihTdHJpbmcgaWQpIHsKLQkJaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkNVVCkpCi0JCQljb21iby5jdXQoKTsKLQkJZWxzZSBpZiAoaWQuZXF1YWxzKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuQ09QWSkpCi0JCQljb21iby5jb3B5KCk7Ci0JCWVsc2UgaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLlBBU1RFKSkKLQkJCWNvbWJvLnBhc3RlKCk7Ci0JCWVsc2UgaWYgKGlkLmVxdWFscyhJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkRFTEVURSkpCi0JCQlkb0RlbGV0ZSgpOwotCQllbHNlIGlmIChpZC5lcXVhbHMoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5TRUxFQ1RfQUxMKSkKLQkJCWRvU2VsZWN0QWxsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvRGVsZXRlKCkgewotCQlTdHJpbmcgdGV4dCA9IGNvbWJvLmdldFRleHQoKTsKLQkJUG9pbnQgc2VsZWN0aW9uID0gY29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24ueCA9PSBzZWxlY3Rpb24ueSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGxlZnQgPSB0ZXh0LnN1YnN0cmluZygwLCBzZWxlY3Rpb24ueCk7Ci0JCVN0cmluZyByaWdodCA9IHRleHQuc3Vic3RyaW5nKHNlbGVjdGlvbi55ICsgMSk7Ci0JCWNvbWJvLnNldFRleHQobGVmdCArIHJpZ2h0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9TZWxlY3RBbGwoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gY29tYm8uZ2V0VGV4dCgpOwotCQlQb2ludCBuZXdTZWxlY3Rpb24gPSBuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSk7Ci0JCWNvbWJvLnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lFbWJlZGRlZFdlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5MTRiNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvSUVtYmVkZGVkV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53ZWxjb21lLmludGVybmFsLndlYmJyb3dzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUVtYmVkZGVkV2ViQnJvd3NlciB7Ci0JcHVibGljIHZvaWQgb3BlblRvKFN0cmluZyB1cmwpOwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKElXZWJCcm93c2VyTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lXZWJCcm93c2VyTGlzdGVuZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9JV2ViQnJvd3Nlckxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzQyNDMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL0lXZWJCcm93c2VyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGRlamFuCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJV2ViQnJvd3Nlckxpc3RlbmVyIHsKLQl2b2lkIHN0YXRlQ2hhbmdlZCgpOwotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3Nlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYzhjZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qub2xlLndpbjMyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBY3RpdmVYIGJhc2VkIHdlYiBicm93c2VyIGNvbnRyb2wuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyIGltcGxlbWVudHMgT2xlTGlzdGVuZXIgewotCS8vIEdlbmVyYXRlZCBmcm9tIHR5cGVsaWIgZmlsZW5hbWU6IHNoZG9jdncuZGxsCi0KLQkvLyBDb25zdGFudHMgZm9yIFdlYkJyb3dzZXIgQ29tbWFuZFN0YXRlQ2hhbmdlCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IENTQ19VUERBVEVDT01NQU5EUyA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgQ1NDX05BVklHQVRFRk9SV0FSRCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBDU0NfTkFWSUdBVEVCQUNLID0gMjsKLQotCS8vIFdlYiBCcm93c2VyIENvbnRyb2wgRXZlbnRzIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJlZm9yZU5hdmlnYXRlID0gMTAwOwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0by4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOYXZpZ2F0ZUNvbXBsZXRlID0gMTAxOwotCS8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byBiZWNvbWVzIHZpc2libGUgYW5kIGVudGVycyB0aGUgbmF2aWdhdGlvbiBzdGFjay4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTdGF0dXNUZXh0Q2hhbmdlID0gMTAyOwotCS8vIFN0YXR1c2JhciB0ZXh0IGNoYW5nZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUHJvZ3Jlc3NDaGFuZ2UgPSAxMDg7Ci0JLy8gRmlyZWQgd2hlbiBkb3dubG9hZCBwcm9ncmVzcyBpcyB1cGRhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERvd25sb2FkQ29tcGxldGUgPSAxMDQ7Ci0JLy8gRG93bmxvYWQgb2YgcGFnZSBjb21wbGV0ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDb21tYW5kU3RhdGVDaGFuZ2UgPSAxMDU7Ci0JLy8gVGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBjb21tYW5kIGNoYW5nZWQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb3dubG9hZEJlZ2luID0gMTA2OwotCS8vIERvd25sb2FkIG9mIGEgcGFnZSBzdGFydGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5ld1dpbmRvdyA9IDEwNzsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUaXRsZUNoYW5nZSA9IDExMzsKLQkvLyBEb2N1bWVudCB0aXRsZSBjaGFuZ2VkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lQmVmb3JlTmF2aWdhdGUgPSAyMDA7Ci0JLy8gRmlyZWQgd2hlbiBhIG5ldyBoeXBlcmxpbmsgaXMgYmVpbmcgbmF2aWdhdGVkIHRvIGluIGEgZnJhbWUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRnJhbWVOYXZpZ2F0ZUNvbXBsZXRlID0gMjAxOwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgaHlwZXJsaW5rIGlzIGJlaW5nIG5hdmlnYXRlZCB0byBpbiBhIGZyYW1lLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZyYW1lTmV3V2luZG93ID0gMjA0OwotCS8vIEZpcmVkIHdoZW4gYSBuZXcgd2luZG93IHNob3VsZCBiZSBjcmVhdGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1aXQgPSAxMDM7Ci0JLy8gRmlyZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBxdWl0aW5nLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd01vdmUgPSAxMDk7Ci0JLy8gRmlyZWQgd2hlbiB3aW5kb3cgaGFzIGJlZW4gbW92ZWQuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV2luZG93UmVzaXplID0gMTEwOwotCS8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIHNpemVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdpbmRvd0FjdGl2YXRlID0gMTExOwotCS8vIEZpcmVkIHdoZW4gd2luZG93IGhhcyBiZWVuIGFjdGl2YXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQcm9wZXJ0eUNoYW5nZSA9IDExMjsKLQkvLyBGaXJlZCB3aGVuIHRoZSBQdXRQcm9wZXJ0eSBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJlZm9yZU5hdmlnYXRlMiA9IDI1MDsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IGh5cGVybGluayBpcyBiZWluZyBuYXZpZ2F0ZWQgdG8uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTmV3V2luZG93MiA9IDI1MTsKLQkvLyBGaXJlZCB3aGVuIGEgbmV3IHdpbmRvdyBzaG91bGQgYmUgY3JlYXRlZC4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEb2N1bWVudENvbXBsZXRlID0gMjU5OwotCS8vIEZpcmVkIHdoZW4gdGhlIGRvY3VtZW50IGJlaW5nIG5hdmlnYXRlZCB0byByZWFjaGVzIFJlYWR5U3RhdGVfQ29tcGxldGUuCi0KLQkvLyBXZWIgQnJvd3NlciBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTUElEX1JFQURZU1RBVEUgPSAtNTI1OwotCi0JLy8gV2ViIEJyb3dzZXIgc3RhdGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEWVNUQVRFX1VOSU5JVElBTElaRUQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfTE9BRElORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBRFlTVEFURV9MT0FERUQgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfSU5URVJBQ1RJVkUgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQURZU1RBVEVfQ09NUExFVEUgPSA0OwotCi0JLy8gS2VlcCB0cmFjayBvZiB0aGUgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBuYXZpZ2F0ZSBpbiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgZGlyZWN0aW9ucwotCXByaXZhdGUgYm9vbGVhbiBiYWNrd2FyZEVuYWJsZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZvcndhcmRFbmFibGVkOwotCi0JLy8gVGhlIGF1dG9tYXRpb24gb2JqZWN0IGFuZCBDb250cm9sIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFpbiBPTEUgY29udHJvbAotCXByaXZhdGUgT2xlQXV0b21hdGlvbiBvbGVPYmplY3Q7Ci0JcHJpdmF0ZSBCcm93c2VyQ29udHJvbFNpdGUgY29udHJvbFNpdGU7Ci0KLQkvLyBUaGUgT0xFIGZyYW1lICh0aGVyZSBzaG91bGQgb25seSBiZSBvbmUpCi0JcHJpdmF0ZSBPbGVGcmFtZSBjb250cm9sRnJhbWU7Ci0KLQkvL3ByaXZhdGUgTmVzdGVkUHJpbnREZWxlZ2F0ZSBhUHJpbnREZWxlZ2F0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgV2ViQnJvd3NlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBPTEUgZnJhbWUuIAotCQljb250cm9sRnJhbWUgPSBjcmVhdGVPbGVGcmFtZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZXMgdGhlIElFNSBPTEUgQ29udHJvbAotCQkvLyBUaGUgY29uc3RydWN0b3IgYWxzbyByZWdpc3RlcnMgYWxsIHRoZSBuZWNlc3NhcnkgT0xFIGxpc3RlbmVycy4KLQkJLy8gZm9yIG5vdywgb25seSBjYXRjaCB0aGUgZXhlY3B0aW9uIGlmIGNyZWF0aW5nIGFuZCBhY3RpdmF0aW5nIHRoZSAKLQkJLy8gY29udHJvbCBmYWlscy4gTm8gY2hlY2tpbmcgaWYgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgT0xFIGNvbnRyb2wgCi0JCS8vIGlzIGluc3RhbGxlZC4KLQkJdHJ5IHsKLQkJCWNvbnRyb2xTaXRlID0KLQkJCQluZXcgQnJvd3NlckNvbnRyb2xTaXRlKAotCQkJCQljb250cm9sRnJhbWUsCi0JCQkJCVNXVC5OT05FLAotCQkJCQkiU2hlbGwuRXhwbG9yZXIiKTsKLQkJCWNvbnRyb2xTaXRlLnNldEJyb3dzZXIodGhpcyk7Ci0JCQlvbGVPYmplY3QgPSBuZXcgT2xlQXV0b21hdGlvbihjb250cm9sU2l0ZSk7Ci0KLQkJCWJhY2t3YXJkRW5hYmxlZCA9IGZhbHNlOwotCQkJZm9yd2FyZEVuYWJsZWQgPSBmYWxzZTsKLQotCQkJLy8gTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBDb21tYW5kIFN0YXRlcwotCQkJY29udHJvbFNpdGUuYWRkRXZlbnRMaXN0ZW5lcihDb21tYW5kU3RhdGVDaGFuZ2UsIHRoaXMpOwotCi0JCQkvLyBpbml0aWFsaXplIGNvbnRyb2wKLQkJCWNvbnRyb2xTaXRlLmRvVmVyYihPTEUuT0xFSVZFUkJfU0hPVyk7Ci0KLQkJCS8vIGNyZWF0ZSBwcmludCBEZWxlZ2F0ZSAoaGFzIHRvIGJlIGRvbmUgZWFybHksIGhlcmUhKS4KLQkJCS8vYVByaW50RGVsZWdhdGUgPSBuZXcgTmVzdGVkUHJpbnREZWxlZ2F0ZSh0aGlzLCBvbGVPYmplY3QsIGNvbnRyb2xTaXRlKTsKLQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIGlkID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMiI7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQkJbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBpZCwgSVN0YXR1cy5PSywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJfQotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGJhY2soKSB7Ci0KLQkJaWYgKCFiYWNrd2FyZEVuYWJsZWQpCi0JCQlyZXR1cm4gT0xFLlNfRkFMU0U7Ci0JCWZvcndhcmRFbmFibGVkID0gdHJ1ZTsKLQotCQkvLyBkaXNwaWQ9MTAwLCB0eXBlPU1FVEhPRCwgbmFtZT0iR29CYWNrIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTAwOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkdvQmFjayIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlWYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVPYmplY3QuaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0KLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSBPTEUuVlRfRU1QVFkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgY29weSgpIHsKLQkJaW50IHJlc3VsdCA9IGNvbnRyb2xTaXRlLnF1ZXJ5U3RhdHVzKE9MRS5PTEVDTURJRF9DT1BZKTsKLQkJaWYgKChyZXN1bHQgJiBPTEUuT0xFQ01ERl9FTkFCTEVEKSA9PSBPTEUuT0xFQ01ERl9FTkFCTEVEKSB7Ci0JCQlyZXN1bHQgPQotCQkJCWNvbnRyb2xTaXRlLmV4ZWMoCi0JCQkJCU9MRS5PTEVDTURJRF9DT1BZLAotCQkJCQlPTEUuT0xFQ01ERVhFQ09QVF9ET0RFRkFVTFQsCi0JCQkJCW51bGwsCi0JCQkJCW51bGwpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBPbGVGcmFtZSBjcmVhdGVPbGVGcmFtZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChjb250cm9sRnJhbWUgPT0gbnVsbCkgewotCQkJY29udHJvbEZyYW1lID0gbmV3IE9sZUZyYW1lKHBhcmVudCwgU1dULk5PTkUpOwotCQkJY29udHJvbEZyYW1lLnNldExheW91dERhdGEoCi0JCQkJbmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwKLQkJCQkJCXwgR3JpZERhdGEuR1JBQl9WRVJUSUNBTAotCQkJCQkJfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwKLQkJCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fRklMTCkpOwotCQl9Ci0JCXJldHVybiBjb250cm9sRnJhbWU7Ci0KLQl9Ci0JLyoqCi0JICogY2xlYW4gdXAKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyoqIGNsZWFuIHVwCi0JCWlmIChvbGVPYmplY3QgIT0gbnVsbCkKLQkJCW9sZU9iamVjdC5kaXNwb3NlKCk7Ci0JCW9sZU9iamVjdCA9IG51bGw7Ci0KLQkJaWYgKGNvbnRyb2xTaXRlICE9IG51bGwpCi0JCQljb250cm9sU2l0ZS5kaXNwb3NlKCk7Ci0JCWNvbnRyb2xTaXRlID0gbnVsbDsKLQotCQlpZiAoY29udHJvbEZyYW1lICE9IG51bGwpCi0JCQljb250cm9sRnJhbWUuZGlzcG9zZSgpOwotCQljb250cm9sRnJhbWUgPSBudWxsOwotCi0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZm9yd2FyZCgpIHsKLQkJaWYgKCFmb3J3YXJkRW5hYmxlZCkKLQkJCXJldHVybiBPTEUuU19GQUxTRTsKLQkJYmFja3dhcmRFbmFibGVkID0gdHJ1ZTsKLQkJLy8gZGlzcGlkPTEwMSwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvRm9yd2FyZCIKLQotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDEwMTsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJHb0ZvcndhcmQiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0Lmludm9rZShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGNvbnRyb2xGcmFtZTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbk5hbWUoKSB7Ci0JCS8vIGRpc3BpZD0yMTAsIHR5cGU9UFJPUEdFVCwgbmFtZT0iTG9jYXRpb25OYW1lIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMjEwOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0KLQkJCW9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJMb2NhdGlvbk5hbWUiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvblVSTCgpIHsKLQkJLy8gZGlzcGlkPTIxMSwgdHlwZT1QUk9QR0VULCBuYW1lPSJMb2NhdGlvblVSTCIKLQkJLy8gWW91IGNhbiBoYXJkIGNvZGUgdGhlIERJU1BJRCBpZiB5b3Uga25vdyBpdCBiZWZvcmUgaGFuZCAtIHRoaXMgaXMgb2YgY291cnNlIHRoZSBmYXN0ZXN0IHdheQotCQkvL2ludCBkaXNwSWRNZW1iZXIgPSAyMTE7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPQotCQkJb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkxvY2F0aW9uVVJMIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRTdHJpbmcoKTsKLQl9Ci0JcHJvdGVjdGVkIE9sZUZyYW1lIGdldE9sZUZyYW1lKCkgewotCQlyZXR1cm4gY29udHJvbEZyYW1lOwotCi0JfQotCi0JcHVibGljIEJyb3dzZXJDb250cm9sU2l0ZSBnZXRDb250cm9sU2l0ZSgpIHsKLQkJcmV0dXJuIGNvbnRyb2xTaXRlOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlYWR5U3RhdGUoKSB7Ci0JCS8vIGRpc3BpZD00Mjk0OTY2NzcxLCB0eXBlPVBST1BHRVQsIG5hbWU9IlJlYWR5U3RhdGUiCi0JCS8vIFJFQURZU1RBVEVfVU5JTklUSUFMSVpFRCA9IDA7Ci0JCS8vIFJFQURZU1RBVEVfTE9BRElORyA9IDE7Ci0JCS8vIFJFQURZU1RBVEVfTE9BREVEID0gMjsKLQkJLy8gUkVBRFlTVEFURV9JTlRFUkFDVElWRSA9IDM7Ci0JCS8vIFJFQURZU1RBVEVfQ09NUExFVEUgPSA0OwotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gLTUyNTsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJSZWFkeVN0YXRlIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5nZXRQcm9wZXJ0eShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAtMTsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCXN3aXRjaCAoZXZlbnQudHlwZSkgewotCQkJY2FzZSAoQ29tbWFuZFN0YXRlQ2hhbmdlKSA6Ci0JCQkJaW50IGNvbW1hbmQgPSAwOwotCQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCi0JCQkJVmFyaWFudCB2YXJSZXN1bHQgPSBldmVudC5hcmd1bWVudHNbMF07Ci0JCQkJaWYgKHZhclJlc3VsdCAhPSBudWxsICYmIHZhclJlc3VsdC5nZXRUeXBlKCkgIT0gT0xFLlZUX0VNUFRZKSB7Ci0JCQkJCWNvbW1hbmQgPSB2YXJSZXN1bHQuZ2V0SW50KCk7Ci0JCQkJfQotCi0JCQkJdmFyUmVzdWx0ID0gZXZlbnQuYXJndW1lbnRzWzFdOwotCQkJCWlmICh2YXJSZXN1bHQgIT0gbnVsbCAmJiB2YXJSZXN1bHQuZ2V0VHlwZSgpICE9IE9MRS5WVF9FTVBUWSkgewotCQkJCQllbmFibGVkID0gdmFyUmVzdWx0LmdldEJvb2xlYW4oKTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29tbWFuZCA9PSBDU0NfTkFWSUdBVEVCQUNLKQotCQkJCQliYWNrd2FyZEVuYWJsZWQgPSBlbmFibGVkOwotCQkJCWlmIChjb21tYW5kID09IENTQ19OQVZJR0FURUZPUldBUkQpCi0JCQkJCWZvcndhcmRFbmFibGVkID0gZW5hYmxlZDsKLQotCQkJCXJldHVybjsKLQotCQkJY2FzZSAoRG9jdW1lbnRDb21wbGV0ZSkgOgotCQkJCXZhclJlc3VsdCA9IGV2ZW50LmFyZ3VtZW50c1swXTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJLy90aHJvdyBuZXcgT2xlRXJyb3IoT0xFLkVSUk9SX05PVF9JTVBMRU1FTlRFRCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgaG9tZSgpIHsKLQkJLy8gZGlzcGlkPTEwMiwgdHlwZT1NRVRIT0QsIG5hbWU9IkdvSG9tZSIKLQotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDEwMjsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQlpbnRbXSByZ2Rpc3BpZCA9IG9sZU9iamVjdC5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJHb0hvbWUiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0gb2xlT2JqZWN0Lmludm9rZShkaXNwSWRNZW1iZXIpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQl9Ci0JLyoqCi0JICovCi0JcHVibGljIGludCBuYXZpZ2F0ZShTdHJpbmcgdXJsKSB7Ci0JCXJldHVybiBuYXZpZ2F0ZShvbGVPYmplY3QsIHVybCk7Ci0JfQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBpbnQgbmF2aWdhdGUoT2xlQXV0b21hdGlvbiBhT2xlQXV0b21hdGlvbiwgU3RyaW5nIHVybCkgewotCQkvL2lmIChMb2dnZXIuREVCVUcpCi0JCS8vTG9nZ2VyLmxvZ0RlYnVnTWVzc2FnZSgiV2ViQnJvd3NlciIsICJuYXZpZ2F0ZSB0bzogIiArIHVybCk7Ci0JCS8vIGRpc3BpZD0xMDQsIHR5cGU9TUVUSE9ELCBuYW1lPSJOYXZpZ2F0ZSIKLQotCQkvLyBZb3UgY2FuIGhhcmQgY29kZSB0aGUgRElTUElEIGlmIHlvdSBrbm93IGl0IGJlZm9yZSBoYW5kIC0gdGhpcyBpcyBvZiBjb3Vyc2UgdGhlIGZhc3Rlc3Qgd2F5Ci0JCS8vaW50IGRpc3BJZE1lbWJlciA9IDEwNDsKLQotCQkvLyBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGxvb2sgdXAgdGhlIERJU1BJRCBkeW5hbWljYWxseQotCQkvLyBIZXJlIHdlIGFyZSBsb29raW5nIHVwIHRoZSBpZCBvZiB0aGUgYXJndW1lbnQgYXMgd2VsbAotCQlpbnRbXSByZ2Rpc3BpZCA9Ci0JCQlhT2xlQXV0b21hdGlvbi5nZXRJRHNPZk5hbWVzKG5ldyBTdHJpbmdbXSB7ICJOYXZpZ2F0ZSIsICJVUkwiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJVmFyaWFudFtdIHJndmFyZyA9IG5ldyBWYXJpYW50WzFdOwotCQlyZ3ZhcmdbMF0gPSBuZXcgVmFyaWFudCh1cmwpOwotCQlpbnRbXSByZ2Rpc3BpZE5hbWVkQXJncyA9IG5ldyBpbnRbMV07Ci0JCXJnZGlzcGlkTmFtZWRBcmdzWzBdID0gcmdkaXNwaWRbMV07IC8vIGlkZW50aWZpZXIgb2YgYXJndW1lbnQKLQkJVmFyaWFudCBwVmFyUmVzdWx0ID0KLQkJCWFPbGVBdXRvbWF0aW9uLmludm9rZShkaXNwSWRNZW1iZXIsIHJndmFyZywgcmdkaXNwaWROYW1lZEFyZ3MpOwotCQlpZiAocFZhclJlc3VsdCA9PSBudWxsIHx8IHBWYXJSZXN1bHQuZ2V0VHlwZSgpID09IE9MRS5WVF9FTVBUWSkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gcFZhclJlc3VsdC5nZXRJbnQoKTsKLQotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IHByaW50KCkgewotCQlyZXR1cm4gcHJpbnQoY29udHJvbFNpdGUsIHRydWUpOwotCX0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHByaW50KEJyb3dzZXJDb250cm9sU2l0ZSBhQ29udHJvbFNpdGUsIGJvb2xlYW4gcHJvbXB0dXNlcikgewotCi0JCWludCByZXN1bHQgPSBhQ29udHJvbFNpdGUucXVlcnlTdGF0dXMoT0xFLk9MRUNNRElEX1BSSU5UKTsKLQotCQlpZiAoKHJlc3VsdCAmIE9MRS5PTEVDTURGX0VOQUJMRUQpID09IE9MRS5PTEVDTURGX0VOQUJMRUQpIHsKLQkJCWlmIChwcm9tcHR1c2VyKQotCQkJCXJlc3VsdCA9Ci0JCQkJCWFDb250cm9sU2l0ZS5leGVjKAotCQkJCQkJT0xFLk9MRUNNRElEX1BSSU5ULAotCQkJCQkJT0xFLk9MRUNNREVYRUNPUFRfUFJPTVBUVVNFUiwKLQkJCQkJCW51bGwsCi0JCQkJCQludWxsKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPQotCQkJCQlhQ29udHJvbFNpdGUuZXhlYygKLQkJCQkJCU9MRS5PTEVDTURJRF9QUklOVCwKLQkJCQkJCU9MRS5PTEVDTURFWEVDT1BUX0RPTlRQUk9NUFRVU0VSLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwpOwotCQl9Ci0KLQkJLy9pZiAoTG9nZ2VyLkRFQlVHKQotCQkvL0xvZ2dlci5sb2dEZWJ1Z01lc3NhZ2UoIldlYkJyb3dzZXIiLCAiZXhlYyByZXR1cm5zOiAiICsgSW50ZWdlci50b1N0cmluZyhyZXN1bHQpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBjdXJyZW50bHkgdmlld2VkIHBhZ2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQotCQkvLyBkaXNwaWQ9IDQyOTQ5NjY3NDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJSZWZyZXNoIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gIDQyOTQ5NjY3NDY7Ci0KLQkJLy8gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBsb29rIHVwIHRoZSBESVNQSUQgZHluYW1pY2FsbHkKLQkJaW50W10gcmdkaXNwaWQgPSBvbGVPYmplY3QuZ2V0SURzT2ZOYW1lcyhuZXcgU3RyaW5nW10geyAiUmVmcmVzaCIgfSk7Ci0JCWludCBkaXNwSWRNZW1iZXIgPSByZ2Rpc3BpZFswXTsKLQotCQlvbGVPYmplY3QuaW52b2tlTm9SZXBseShkaXNwSWRNZW1iZXIpOwotCX0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IHNlYXJjaCgpIHsKLQkJLy8gZGlzcGlkPTEwMywgdHlwZT1NRVRIT0QsIG5hbWU9IkdvU2VhcmNoIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTAzOwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIkdvU2VhcmNoIiB9KTsKLQkJaW50IGRpc3BJZE1lbWJlciA9IHJnZGlzcGlkWzBdOwotCi0JCVZhcmlhbnQgcFZhclJlc3VsdCA9IG9sZU9iamVjdC5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQkJaWYgKHBWYXJSZXN1bHQgPT0gbnVsbCB8fCBwVmFyUmVzdWx0LmdldFR5cGUoKSA9PSBPTEUuVlRfRU1QVFkpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIHBWYXJSZXN1bHQuZ2V0SW50KCk7Ci0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vIGRpc3BpZD0xMDYsIHR5cGU9TUVUSE9ELCBuYW1lPSJTdG9wIgotCi0JCS8vIFlvdSBjYW4gaGFyZCBjb2RlIHRoZSBESVNQSUQgaWYgeW91IGtub3cgaXQgYmVmb3JlIGhhbmQgLSB0aGlzIGlzIG9mIGNvdXJzZSB0aGUgZmFzdGVzdCB3YXkKLQkJLy9pbnQgZGlzcElkTWVtYmVyID0gMTA2OwotCi0JCS8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gbG9vayB1cCB0aGUgRElTUElEIGR5bmFtaWNhbGx5Ci0JCWludFtdIHJnZGlzcGlkID0gb2xlT2JqZWN0LmdldElEc09mTmFtZXMobmV3IFN0cmluZ1tdIHsgIlN0b3AiIH0pOwotCQlpbnQgZGlzcElkTWVtYmVyID0gcmdkaXNwaWRbMF07Ci0KLQkJLy9WYXJpYW50IHBWYXJSZXN1bHQgPSBvbGVPYmplY3QuaW52b2tlKGRpc3BJZE1lbWJlcik7Ci0JCW9sZU9iamVjdC5pbnZva2UoZGlzcElkTWVtYmVyKTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgZm9yd2FyZEVuYWJsZWQKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZvcndhcmRFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGJhY2t3YXJkRW5hYmxlZAotCSAqIEByZXR1cm4gUmV0dXJucyBhIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0JhY2t3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGJhY2t3YXJkRW5hYmxlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE3NDAyYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lm9sZS53aW4zMi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLldvcmtiZW5jaEhlbHA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwuKjsKLQotcHVibGljIGNsYXNzIFdlYkJyb3dzZXJFZGl0b3IgZXh0ZW5kcyBFZGl0b3JQYXJ0IGltcGxlbWVudHMgSUVtYmVkZGVkV2ViQnJvd3NlciB7Ci0JLy8gTkwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05PVF9BVkFJTEFCTEUgPQotCQkiV2ViQnJvd3NlclZpZXcubm90QXZhaWxhYmxlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FERFJFU1MgPSAiV2ViQnJvd3NlclZpZXcuYWRkcmVzcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVE9QID0gIldlYkJyb3dzZXJWaWV3LnN0b3AiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR08gPSAiV2ViQnJvd3NlclZpZXcuZ28iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUkVGUkVTSCA9ICJXZWJCcm93c2VyVmlldy5yZWZyZXNoIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0JBQ0tXQVJEID0gIldlYkJyb3dzZXJWaWV3LmJhY2t3YXJkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZPUldBUkQgPSAiV2ViQnJvd3NlclZpZXcuZm9yd2FyZCI7Ci0KLQlwcml2YXRlIGludCBBRERSRVNTX1NJWkUgPSAxMDsKLQlwcml2YXRlIFdlYkJyb3dzZXIgYnJvd3NlcjsKLQlwcml2YXRlIENvbnRyb2wgY29udHJvbDsKLQlwcml2YXRlIENvbWJvIGFkZHJlc3NDb21ibzsKLQlwcml2YXRlIE9iamVjdCBpbnB1dDsKLQlwcml2YXRlIFRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyOwotCXByaXZhdGUgQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gc3RvcEFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBnb0FjdGlvbjsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbkhhbmRsZXIgZ2xvYmFsQWN0aW9uSGFuZGxlcjsKLQlwcml2YXRlIElXZWJCcm93c2VyTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmVBcygpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlQXMoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQjZ290b01hcmtlcihvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpCi0JCXRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWlmICghKGlucHV0IGluc3RhbmNlb2YgV2ViQnJvd3NlckVkaXRvcklucHV0KSkKLQkJCXRocm93IG5ldyBQYXJ0SW5pdEV4Y2VwdGlvbigiSW52YWxpZCBJbnB1dDogTXVzdCBiZSBXZWxjb21lRWRpdG9ySW5wdXQiKTsKLQkJc2V0U2l0ZShzaXRlKTsKLQkJc2V0SW5wdXQoaW5wdXQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNEaXJ0eSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgV2ViQnJvd3NlckVkaXRvcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElGb3JtUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb250cm9sID0gY29udGFpbmVyOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUNvbXBvc2l0ZSBuYXZDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAxOwotCQluYXZDb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZU5hdkJhcihuYXZDb250YWluZXIpOwotCQluYXZDb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWZpbmFsIFdlYkJyb3dzZXIgd2luQnJvd3NlciA9IG5ldyBXZWJCcm93c2VyKGNvbnRhaW5lcik7Ci0JCWJyb3dzZXIgPSB3aW5Ccm93c2VyOwotCi0JCUNvbnRyb2wgYyA9IGJyb3dzZXIuZ2V0Q29udHJvbCgpOwotCQljLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlmaW5hbCBCcm93c2VyQ29udHJvbFNpdGUgc2l0ZSA9IHdpbkJyb3dzZXIuZ2V0Q29udHJvbFNpdGUoKTsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHNtbmcgPQotCQkJZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlzaXRlLnNldFN0YXR1c0xpbmVNYW5hZ2VyKHNtbmcpOwotCi0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkRvd25sb2FkQ29tcGxldGUsIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIHVybCA9IHdpbkJyb3dzZXIuZ2V0TG9jYXRpb25VUkwoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJYWRkcmVzc0NvbWJvLnNldFRleHQodXJsKTsKLQkJCQkJZG93bmxvYWRDb21wbGV0ZSh1cmwpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNpdGUuYWRkRXZlbnRMaXN0ZW5lcihXZWJCcm93c2VyLkRvd25sb2FkQmVnaW4sIG5ldyBPbGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KE9sZUV2ZW50IGV2ZW50KSB7Ci0JCQkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCXJlZnJlc2hBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29udGFpbmVyLCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLldlYkJyb3dzZXJWaWV3Iik7Ci0JCVdlYkJyb3dzZXJFZGl0b3JJbnB1dCBpbnB1dCA9IChXZWJCcm93c2VyRWRpdG9ySW5wdXQpZ2V0RWRpdG9ySW5wdXQoKTsKLQkJb3BlblRvKGlucHV0LmdldFVSTCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuVG8oZmluYWwgU3RyaW5nIHVybCkgewotCQlhZGRyZXNzQ29tYm8uc2V0VGV4dCh1cmwpOwotCQljb250cm9sLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5hdmlnYXRlKHVybCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb3dubG9hZENvbXBsZXRlKFN0cmluZyB1cmwpIHsKLQkJc3RvcEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlpZiAobGlzdGVuZXIhPW51bGwpCi0JCQlsaXN0ZW5lci5zdGF0ZUNoYW5nZWQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoSVdlYkJyb3dzZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5hdkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGFkZHJlc3NMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJYWRkcmVzc0xhYmVsLnNldFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0FERFJFU1MpKTsKLQotCQlhZGRyZXNzQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuRFJPUF9ET1dOIHwgU1dULkJPUkRFUik7Ci0JCWFkZHJlc3NDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGFkZHJlc3NDb21iby5nZXRUZXh0KCk7Ci0JCQkJZ29BY3Rpb24uc2V0RW5hYmxlZCh0ZXh0Lmxlbmd0aCgpID4gMCk7Ci0JCQl9Ci0JCX0pOwotCQlhZGRyZXNzQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cmluZyB0ZXh0ID0KLQkJCQkJYWRkcmVzc0NvbWJvLmdldEl0ZW0oYWRkcmVzc0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJCWlmICh0ZXh0Lmxlbmd0aCgpID4gMCkKLQkJCQkJbmF2aWdhdGUodGV4dCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCW5hdmlnYXRlKGFkZHJlc3NDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYWRkcmVzc0NvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlUb29sQmFyIHRvb2xiYXIgPSBuZXcgVG9vbEJhcihwYXJlbnQsIFNXVC5GTEFUIHwgU1dULkhPUklaT05UQUwpOwotCQl0b29sQmFyTWFuYWdlciA9IG5ldyBUb29sQmFyTWFuYWdlcih0b29sYmFyKTsKLQkJbWFrZUFjdGlvbnMoKTsKLQkJSUFjdGlvbkJhcnMgYmFycyA9IGdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCk7Ci0JCWdsb2JhbEFjdGlvbkhhbmRsZXIgPSBuZXcgR2xvYmFsQWN0aW9uSGFuZGxlcihiYXJzLCBhZGRyZXNzQ29tYm8pOwotCX0KLQotCXByaXZhdGUgdm9pZCBuYXZpZ2F0ZShTdHJpbmcgdXJsKSB7Ci0JCWJyb3dzZXIubmF2aWdhdGUodXJsKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBhZGRyZXNzQ29tYm8uZ2V0SXRlbXMoKTsKLQkJaW50IGxvYyA9IC0xOwotCQlTdHJpbmcgbm9ybVVSTCA9IGdldE5vcm1hbGl6ZWRVUkwodXJsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5vcm1JdGVtID0gZ2V0Tm9ybWFsaXplZFVSTChpdGVtc1tpXSk7Ci0JCQlpZiAobm9ybVVSTC5lcXVhbHMobm9ybUl0ZW0pKSB7Ci0JCQkJLy8gbWF0Y2ggCi0JCQkJbG9jID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAobG9jICE9IC0xKSB7Ci0JCQlhZGRyZXNzQ29tYm8ucmVtb3ZlKGxvYyk7Ci0JCX0KLQkJYWRkcmVzc0NvbWJvLmFkZCh1cmwsIDApOwotCQlpZiAoYWRkcmVzc0NvbWJvLmdldEl0ZW1Db3VudCgpID4gQUREUkVTU19TSVpFKSB7Ci0JCQlhZGRyZXNzQ29tYm8ucmVtb3ZlKGFkZHJlc3NDb21iby5nZXRJdGVtQ291bnQoKSAtIDEpOwotCQl9Ci0JCWFkZHJlc3NDb21iby5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JfQotCQotCXZvaWQgYmFjaygpIHsKLQkJYnJvd3Nlci5iYWNrKCk7Ci0JfQotCXZvaWQgZm9yd2FyZCgpIHsKLQkJYnJvd3Nlci5mb3J3YXJkKCk7Ci0JfQotCWJvb2xlYW4gaXNCYWNrd2FyZEVuYWJsZWQoKSB7Ci0JCXJldHVybiBicm93c2VyLmlzQmFja3dhcmRFbmFibGVkKCk7Ci0JfQotCWJvb2xlYW4gaXNGb3J3YXJkRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGJyb3dzZXIuaXNGb3J3YXJkRW5hYmxlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJZ29BY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCW5hdmlnYXRlKGFkZHJlc3NDb21iby5nZXRUZXh0KCkpOwotCQkJfQotCQl9OwotCQlnb0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZ29BY3Rpb24uc2V0VG9vbFRpcFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0dPKSk7Ci0JCWdvQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfR09fTkFWKTsKLQkJZ29BY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0dPX05BVl9EKTsKLQkJZ29BY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0dPX05BVl9IKTsKLQotCQlzdG9wQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlicm93c2VyLnN0b3AoKTsKLQkJCX0KLQkJfTsKLQkJc3RvcEFjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfU1RPUCkpOwotCQlzdG9wQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfU1RPUF9OQVYpOwotCQlzdG9wQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1NUT1BfTkFWX0QpOwotCQlzdG9wQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1NUT1BfTkFWX0gpOwotCQlzdG9wQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWJyb3dzZXIucmVmcmVzaCgpOwotCQkJfQotCQl9OwotCQlyZWZyZXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KAotCQkJV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX1JFRlJFU0gpKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX1JFRlJFU0hfTkFWKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19SRUZSRVNIX05BVl9EKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19SRUZSRVNIX05BVl9IKTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQl0b29sQmFyTWFuYWdlci5hZGQoZ29BY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKHN0b3BBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQocmVmcmVzaEFjdGlvbik7Ci0JCXRvb2xCYXJNYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROb3JtYWxpemVkVVJMKFN0cmluZyB1cmwpIHsKLQkJdXJsID0gdXJsLnRvTG93ZXJDYXNlKCk7Ci0JCWlmICh1cmwuaW5kZXhPZigiOi8vIikgPT0gLTEpIHsKLQkJCXVybCA9ICJodHRwOi8vIiArIHVybDsKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChicm93c2VyICE9IG51bGwpCi0JCQlicm93c2VyLmRpc3Bvc2UoKTsKLQkJZ2xvYmFsQWN0aW9uSGFuZGxlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkKLQkJCWNvbnRyb2wuc2V0Rm9jdXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLndpbjMyL3NyYy9vcmcvZWNsaXBzZS93ZWxjb21lL2ludGVybmFsL3dlYmJyb3dzZXIvV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YjkwMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qCi0gKiBDcmVhdGVkIG9uIEp1biAxOCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3NlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC4qOwotCi0vKioKLSAqIEBhdXRob3IgZGVqYW4KLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvckNvbnRyaWJ1dG9yCi0JZXh0ZW5kcyBFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcgotCWltcGxlbWVudHMgSVdlYkJyb3dzZXJMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OT1RfQVZBSUxBQkxFID0KLQkJIldlYkJyb3dzZXJWaWV3Lm5vdEF2YWlsYWJsZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9IT01FID0gIldlYkJyb3dzZXJWaWV3LmhvbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQkFDS1dBUkQgPSAiV2ViQnJvd3NlclZpZXcuYmFja3dhcmQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRk9SV0FSRCA9ICJXZWJCcm93c2VyVmlldy5mb3J3YXJkIjsKLQotCXByaXZhdGUgQWN0aW9uIGhvbWVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gYmFja3dhcmRBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gZm9yd2FyZEFjdGlvbjsKLQlwcml2YXRlIFdlYkJyb3dzZXJFZGl0b3IgZWRpdG9yOwotCQotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9yQ29udHJpYnV0b3IoKSB7Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC5JV2ViQnJvd3Nlckxpc3RlbmVyI3N0YXRlQ2hhbmdlZCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQl1cGRhdGVBY3Rpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlob21lQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW5wdXQgPSAoV2ViQnJvd3NlckVkaXRvcklucHV0KWVkaXRvci5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCWVkaXRvci5vcGVuVG8oaW5wdXQuZ2V0VVJMKCkpOwotCQkJfQotCQl9OwotCQlob21lQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWhvbWVBY3Rpb24uc2V0VG9vbFRpcFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0hPTUUpKTsKLQkJaG9tZUFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfSE9NRV9OQVYpOwotCQlob21lQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0hPTUVfTkFWX0QpOwotCQlob21lQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0hPTUVfTkFWX0gpOwotCi0KLQkJYmFja3dhcmRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWVkaXRvci5iYWNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWJhY2t3YXJkQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQliYWNrd2FyZEFjdGlvbi5zZXRUb29sVGlwVGV4dChXZWxjb21lUG9ydGFsLmdldFN0cmluZyhLRVlfQkFDS1dBUkQpKTsKLQkJYmFja3dhcmRBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0JBQ0tXQVJEX05BVik7Ci0JCWJhY2t3YXJkQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKAotCQkJV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0JBQ0tXQVJEX05BVl9EKTsKLQkJYmFja3dhcmRBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoCi0JCQlXZWxjb21lUG9ydGFsSW1hZ2VzLkRFU0NfQkFDS1dBUkRfTkFWX0gpOwotCi0JCWZvcndhcmRBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWVkaXRvci5mb3J3YXJkKCk7Ci0JCQl9Ci0JCX07Ci0JCWZvcndhcmRBY3Rpb24uc2V0VG9vbFRpcFRleHQoV2VsY29tZVBvcnRhbC5nZXRTdHJpbmcoS0VZX0ZPUldBUkQpKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoV2VsY29tZVBvcnRhbEltYWdlcy5ERVNDX0ZPUldBUkRfTkFWKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19GT1JXQVJEX05BVl9EKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcigKLQkJCVdlbGNvbWVQb3J0YWxJbWFnZXMuREVTQ19GT1JXQVJEX05BVl9IKTsKLQkJZm9yd2FyZEFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQl0b29sQmFyTWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGhvbWVBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQoYmFja3dhcmRBY3Rpb24pOwotCQl0b29sQmFyTWFuYWdlci5hZGQoZm9yd2FyZEFjdGlvbik7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJaWYgKHRoaXMuZWRpdG9yICE9IG51bGwpCi0JCQl0aGlzLmVkaXRvci5zZXRMaXN0ZW5lcihudWxsKTsKLQkJZWRpdG9yID0gKFdlYkJyb3dzZXJFZGl0b3IpIHRhcmdldEVkaXRvcjsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQllZGl0b3Iuc2V0TGlzdGVuZXIodGhpcyk7Ci0JCQl1cGRhdGVBY3Rpb25zKCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbnMoKSB7Ci0JCWJhY2t3YXJkQWN0aW9uLnNldEVuYWJsZWQoZWRpdG9yLmlzQmFja3dhcmRFbmFibGVkKCkpOwotCQlmb3J3YXJkQWN0aW9uLnNldEVuYWJsZWQoZWRpdG9yLmlzRm9yd2FyZEVuYWJsZWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODllMDg3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci0vKioKLSAqIEEgc2ltcGxlIGVkaXRvciBpbnB1dCBmb3IgdGhlIHdlbGNvbWUgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWJCcm93c2VyRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGQUNUT1JZX0lEID0gIm9yZy5lY2xpcHNlLndlbGNvbWUuaW50ZXJuYWwud2ViYnJvd3Nlci5XZWJCcm93c2VyRWRpdG9ySW5wdXRGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCS8qKgotCSAqIFdlbGNvbWVFZGl0b3JJbnB1dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBXZWJCcm93c2VyRWRpdG9ySW5wdXQoU3RyaW5nIG5hbWUsIFN0cmluZyB1cmwpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy51cmwgPSB1cmw7Ci0JfQotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaj09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqID09IHRoaXMpIHJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgV2ViQnJvd3NlckVkaXRvcklucHV0KSB7Ci0JCQlXZWJCcm93c2VyRWRpdG9ySW5wdXQgd29iaiA9IChXZWJCcm93c2VyRWRpdG9ySW5wdXQpb2JqOwotCQkJcmV0dXJuIHdvYmouZ2V0VVJMKCkuZXF1YWxzKGdldFVSTCgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbmV3IElQZXJzaXN0YWJsZUVsZW1lbnQoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlJZCgpIHsKLQkJCQlyZXR1cm4gRkFDVE9SWV9JRDsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCQkJbWVtZW50by5wdXRTdHJpbmcoIm5hbWUiLCBuYW1lKTsKLQkJCQltZW1lbnRvLnB1dFN0cmluZygidXJsIiwgdXJsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkud2luMzIvc3JjL29yZy9lY2xpcHNlL3dlbGNvbWUvaW50ZXJuYWwvd2ViYnJvd3Nlci9XZWJCcm93c2VyRWRpdG9ySW5wdXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODA1NWYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS53aW4zMi9zcmMvb3JnL2VjbGlwc2Uvd2VsY29tZS9pbnRlcm5hbC93ZWJicm93c2VyL1dlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud2VsY29tZS5pbnRlcm5hbC53ZWJicm93c2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWxlbWVudEZhY3Rvcnk7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgV2ViQnJvd3NlckVkaXRvcklucHV0RmFjdG9yeSBpbXBsZW1lbnRzIElFbGVtZW50RmFjdG9yeSB7Ci0JLyoqCi0JICovCi0JcHVibGljIFdlYkJyb3dzZXJFZGl0b3JJbnB1dEZhY3RvcnkoKSB7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFbGVtZW50RmFjdG9yeSNjcmVhdGVFbGVtZW50KG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvKQotCSAqLwotCXB1YmxpYyBJQWRhcHRhYmxlIGNyZWF0ZUVsZW1lbnQoSU1lbWVudG8gbWVtZW50bykgewotCQlTdHJpbmcgbmFtZSA9IG1lbWVudG8uZ2V0U3RyaW5nKCJuYW1lIik7Ci0JCVN0cmluZyB1cmwgPSBtZW1lbnRvLmdldFN0cmluZygidXJsIik7Ci0JCXJldHVybiBuZXcgV2ViQnJvd3NlckVkaXRvcklucHV0KG5hbWUsIHVybCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jbGFzc3BhdGggYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4NDgyNDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxjbGFzc3BhdGg+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPg0KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4NCi0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIi8+DQotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPg0KLTwvY2xhc3NwYXRoPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTExNjliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTxwcm9qZWN0RGVzY3JpcHRpb24+DQotCTxuYW1lPm9yZy5lY2xpcHNlLnVwZGF0ZS51aTwvbmFtZT4NCi0JPGNvbW1lbnQ+PC9jb21tZW50Pg0KLQk8cHJvamVjdHM+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLmJvb3Q8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS5oZWxwLmJhc2U8L3Byb2plY3Q+DQotCQk8cHJvamVjdD5vcmcuZWNsaXBzZS51aTwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVpLmZvcm1zPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcjwvcHJvamVjdD4NCi0JCTxwcm9qZWN0Pm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlPC9wcm9qZWN0Pg0KLQkJPHByb2plY3Q+b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubGludXg8L3Byb2plY3Q+DQotCTwvcHJvamVjdHM+DQotCTxidWlsZFNwZWM+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JCTxidWlsZENvbW1hbmQ+DQotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4NCi0JCQk8YXJndW1lbnRzPg0KLQkJCTwvYXJndW1lbnRzPg0KLQkJPC9idWlsZENvbW1hbmQ+DQotCQk8YnVpbGRDb21tYW5kPg0KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPg0KLQkJCTxhcmd1bWVudHM+DQotCQkJPC9hcmd1bWVudHM+DQotCQk8L2J1aWxkQ29tbWFuZD4NCi0JPC9idWlsZFNwZWM+DQotCTxuYXR1cmVzPg0KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+DQotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4NCi0JPC9uYXR1cmVzPg0KLTwvcHJvamVjdERlc2NyaXB0aW9uPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvR3JhcGhpY3NfdXBkYXRlLmh0bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL0dyYXBoaWNzX3VwZGF0ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFlMWEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvR3JhcGhpY3NfdXBkYXRlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NTUgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAxMTApaHR0cDovL2Rlc2lnbi50b3JvbGFiLmlibS5jb20vYWltL1dTV0ItZWNsaXBzZS8xMDIwX1BERS9pbXBsZW1lbnRhdGlvbl9pY29ucy9vcmcuZWNsaXBzZS5wZGUvR3JhcGhpY3NfcGRlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+Z3JhcGhpY3M8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iR3JlZyBBZGFtcyIgbmFtZT1BdXRob3I+Ci08TUVUQSBjb250ZW50PSJNaWNyb3NvZnQgRnJvbnRQYWdlIDQuMCIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgYmdDb2xvcj13aGl0ZT4KLTxIMj5vcmcuZWNsaXBzZS51cGRhdGUudWkgLSBHcmFwaGljcyBTdW1tYXJ5PC9IMj48Rk9OVCBzaXplPS0xPjxTVFJPTkc+Q29tcGV0ZW5jeSAKLWxlYWQ6IDwvU1RST05HPlZsYWQgS2xpY25payAvIFRPTCA8QlI+PFNUUk9ORz5UZWNobmljYWwgbGVhZDogPC9TVFJPTkc+RGVqYW4gCi1HbG96aWMgLyBUT0wgPEJSPjxTVFJPTkc+VUNEIGRlc2lnbmVyOiA8L1NUUk9ORz5KdWxpYW4gSm9uZXMgLyBUT0wgCi08QlI+PFNUUk9ORz5VSSBkZXNpZ25lcjogPC9TVFJPTkc+QW5kcullIFByb3VseCAvIFRPTCA8QlI+PFNUUk9ORz5JRCB3cml0ZXI6IAotPC9TVFJPTkc+LTwvRk9OVD4gCi08SFIgd2lkdGg9IjEwMCUiIFNJWkU9MT4KLTxCPjxGT05UIHNpemU9LTE+SGlzdG9yeTo8L0ZPTlQ+PC9CPiAKLTxwPjxmb250IHNpemU9Ii0xIj5BcHJpbCAxOSwgMjAwMiA6IFRlbXBsYXRlIFN1Ym1pc3Npb248L2ZvbnQ+PC9wPgotPEhSIHdpZHRoPSIxMDAlIiBTSVpFPTE+Ci08IS0tLSBTdGFydCBIZXJlIC0tLT4KLTxUQUJMRSBjZWxsU3BhY2luZz0wIGNlbGxQYWRkaW5nPTMgd2lkdGg9IjEwMCUiIGJvcmRlcj0wIGhlaWdodD0iMzE0NyI+Ci0gIAotICA8VFIgYmdDb2xvcj0jYmZiZjdmPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5WaWV3PC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxCPjxGT05UIHNpemU9LTE+SXRlbTwvRk9OVD48L0I+PC9URD4KLSAgICA8VEQ+PEI+PEZPTlQgc2l6ZT0tMT5GaWxlIE5hbWUmbmJzcDsgKC5naWYpPC9GT05UPjwvQj48L1REPgotICAgIDxURD48Qj48Rk9OVCBzaXplPS0xPkRlc2NyaXB0aW9uL0hvb3ZlciBIZWxwPC9GT05UPjwvQj48L1REPgotICAgIDxURD4KLSAgICAgIDxDRU5URVI+PEI+PEZPTlQgc2l6ZT0tMT5PbGQ8L0ZPTlQ+PC9CPiA8L0NFTlRFUj48L1REPgotICAgIDxURD4KLSAgICAgIDxDRU5URVI+PEI+PEZPTlQgc2l6ZT0tMT5OZXcgRnVsbDwvRk9OVD48L0I+IDwvQ0VOVEVSPjwvVEQ+Ci0gICAgPFREPjxCPjxGT05UIHNpemU9LTE+U3RhdHVzPC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD5Db25maWd1cmF0aW9uczwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Y29uZmlnczwvRk9OVD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiBzaG93cyB0aGUgY29uZmlndXJhdGlvbnMgb2YgdGhlIEVjbGlwc2UtYmFzZWQgYXBwbGljYXRpb248L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvY29uZmlncy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L2NvbmZpZ3MuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi9jb25maWdzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+VXBkYXRlczwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+dXBkYXRlczwvRk9OVD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPnNob3dzIHNpdGVzIGFuIEVjbGlwc2UgYXBwIGNhbiBiZSB1cGRhdGVkIGZyb208L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvdXBkYXRlcy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L3VwZGF0ZXMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi91cGRhdGVzLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPlByZXZpZXc8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+cHJldmlldzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+c2hvd3MgZGV0YWlscyBvZiB0aGUgc2VsZWN0ZWQgb2JqZWN0PC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvdmlldzE2L3ByZXZpZXcuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi9wcmV2aWV3LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V2aWV3MTYvcHJldmlldy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPldlYiBCcm93c2VyPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmJyb3dzZXI8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmEgZnVsbHktZnVuY3Rpb25pbmcgV2ViIGJyb3dzZXIgKGhvc3RzIElFNSAtIFdpbmRvd3Mgb25seSk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC92aWV3MTYvYnJvd3Nlci5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jdmlldzE2L2Jyb3dzZXIuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXZpZXcxNi9icm93c2VyLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD5VcGRhdGUgUGVyc3BlY3RpdmU8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dXBkYXRlX3BlcnM8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPlJlcHJlc2VudHMgSW5zdGFsbC9VcGRhdGUKLSAgICAgIHBlcnNwZWN0aXZlIGluIHRoZSBVSTwvZm9udD48L1REPgotICAgIDxURD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3ZpZXcxNi91cGRhdGVfcGVycy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldmlldzE2L3VwZGF0ZV9wZXJzLmdpZiIgd2lkdGg9MTYgCi1ib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD4KLSAgPC9UUj4KLSAgCi0gIDxUUiBiZ0NvbG9yPSNiZmJmN2Y+Ci0gICAgPFREIGNvbFNwYW49Nz48Qj48Rk9OVCBzaXplPSsyPlRvb2xiYXIgV2l6YXJkPC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9jb25maWdfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvY29uZmlnX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvY29uZmlnX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0JCi0gIDxUUiBiZ0NvbG9yPSNkZmRmOWY+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT48L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZHRvb2wxNi9pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIAotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19ib29rbWFya193aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L25ld19ib29rbWFya193aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZm9sZGVyX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvbmV3X2ZvbGRlcl93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD41PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZXRvb2wxNi9uZXdfc2VhcmNoX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD42PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPiAgICBkZXNjcmlwdGlvbjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDt0b29sIHRpcCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2N0b29sMTYvdW5pbnN0YWxsX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9ldG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCTxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjc8L1REPgotICAgIDxURD4gPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+ICAgIGRlc2NyaXB0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO3Rvb2wgdGlwJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY3Rvb2wxNi91cGRhdGVfd2l6LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2V0b29sMTYvdXBkYXRlX3dpei5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2R0b29sMTYvdXBkYXRlX3dpei5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIAotICAKLSAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+TG9jYWwgVG9vbGJhcjwvRk9OVD48L0I+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+R28gQmFja3dhcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2JhY2t3YXJkX25hdjwvRk9OVD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgJ2JhY2t3YXJkJyBidXR0b248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7R28gQmFja3dhcmQmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgCi0gICAgICB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvYmFja3dhcmRfbmF2LmdpZiIgCi0gICAgICB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2JhY2t3YXJkX25hdi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9iYWNrd2FyZF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+R28gRm9yd2FyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Zm9yd2FyZF9uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+Ci0gICAgICA8VEFCTEUgY2VsbFNwYWNpbmc9MiBjZWxsUGFkZGluZz0wIHdpZHRoPSIxMDAlIiBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyICdmb3J3YXJkJyBidXR0b248L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7R28gRm9yd2FyZCZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2ZvcndhcmRfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9mb3J3YXJkX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD5HbzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Z29fbmF2PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPkEgc3RhbmRhcmQgYnJvd3NlciBidXR0b24gZm9yCi0gICAgICAgICAgICBuYXZpZ2F0aW5nIHRvIGEgVVJMLjwvZm9udD48L1REPgotICAgICAgICAgIDxURCB2QWxpZ249Y2VudGVyIGFsaWduPXJpZ2h0PgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L2dvX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvZ29fbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9nb19uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+R28gSG9tZTwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7aG9tZV9uYXY8L0ZPTlQ+PC9URD4KLSAgICA8VEQgPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCBib3JkZXI9MD4KLSAgICAgICAgCi0gICAgICAgIDxUUj4KLSAgICAgICAgICA8VEQgdkFsaWduPXRvcD48Zm9udCBzaXplPSItMSI+QSBzdGFuZGFyZCBicm93c2VyIGJ1dHRvbgotICAgICAgICAgICAgZm9yIGdvaW5nIHRvIHRoZSBob21lIGxvY2F0aW9uPC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREPgotICAgICAgICAgICAgPFRBQkxFPgotICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgPFRSPgotICAgICAgICAgICAgICAgIDxURCAKLSAgICAgICAgICAgICAgICBzdHlsZT0iQk9SREVSLVJJR0hUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1UT1A6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUxFRlQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLUJPVFRPTTogYmxhY2sgMXB4IHNvbGlkIiAKLSAgICAgICAgICAgICAgICBhbGlnbj1taWRkbGUgYmdDb2xvcj0jZmZmZmUxPjxGT05UIAotICAgICAgICAgICAgICAgICAgc2l6ZT0tMj4mbmJzcDtHbyBIb21lJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZGxjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jY2NjY2NjPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9jbGNsMTYvaG9tZV9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8SU1HIAotICAgICAgaGVpZ2h0PTE2IGFsdD0iIiBzcmM9Imljb25zL2Z1bGwvZWxjbDE2L2hvbWVfbmF2LmdpZiIgd2lkdGg9MTYgCi0gICAgICBib3JkZXI9MD4mbmJzcDs8SU1HIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9ob21lX25hdi5naWYiIAotICAgICAgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4gPC9GT05UPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+NTwvVEQ+Ci0gICAgPFREPlJlZnJlc2g8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO3JlZnJlc2hfbmF2PC9GT05UPjwvVEQ+Ci0gICAgPFREPgotICAgICAgPFRBQkxFIGNlbGxTcGFjaW5nPTIgY2VsbFBhZGRpbmc9MCB3aWR0aD0iMTAwJSIgYm9yZGVyPTA+Ci0gICAgICAgIAotICAgICAgICA8VFI+Ci0gICAgICAgICAgPFREIHZBbGlnbj10b3A+PGZvbnQgc2l6ZT0iLTEiPlJlZnJlc2ggdGhlIGNvbnRlbnRzIG9mIHRoZSB2aWV3PC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO1JlZnJlc2gmbmJzcDs8L0ZPTlQ+PC9URD48L1RSPjwvVEFCTEU+PC9URD48L1RSPjwvVEFCTEU+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9jbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4gPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNjY2NjY2M+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2NsY2wxNi9yZWZyZXNoX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzxJTUcgCi0gICAgICBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9lbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiAKLSAgICAgIGJvcmRlcj0wPiZuYnNwOzxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvcmVmcmVzaF9uYXYuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZjlmPgotICAgIDxURD42PC9URD4KLSAgICA8VEQ+U3RvcDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5zdG9wX25hdjwvZm9udD48L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHN0YW5kYXJkIGJyb3dzZXIgYnV0dG9uIGZvciBzdG9wcGluZwotICAgICAgICAgICAgdGhlIG5hdmlnYXRpb24gaW4gcHJvZ3Jlc3M8L2ZvbnQ+PC9URD4KLSAgICAgICAgICA8VEQgdkFsaWduPWNlbnRlciBhbGlnbj1yaWdodD4KLSAgICAgICAgICAgIDxUQUJMRT4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxUUj4KLSAgICAgICAgICAgICAgICA8VEQgCi0gICAgICAgICAgICAgICAgc3R5bGU9IkJPUkRFUi1SSUdIVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItVE9QOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1MRUZUOiBibGFjayAxcHggc29saWQ7IEJPUkRFUi1CT1RUT006IGJsYWNrIDFweCBzb2xpZCIgCi0gICAgICAgICAgICAgICAgYWxpZ249bWlkZGxlIGJnQ29sb3I9I2ZmZmZlMT48Rk9OVCAKLSAgICAgICAgICAgICAgICAgIHNpemU9LTI+Jm5ic3A7U3RvcCZuYnNwOyZuYnNwOzwvRk9OVD48L1REPjwvVFI+PC9UQUJMRT48L1REPjwvVFI+PC9UQUJMRT48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2NsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPiA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2RsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L3N0b3BfbmF2LmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9zdG9wX25hdi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIHNyYz0iaWNvbnMvZnVsbC9kbGNsMTYvc3RvcF9uYXYuZ2lmIiAKLSAgICAgIHdpZHRoPTE2IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+NzwvVEQ+Ci0gICAgPFREPlNob3cgVW5jb25maWd1cmVkIEZlYXR1cmVzPC9URD4KLSAgICA8VEQ+c2hvd191bmNvbmY8L1REPgotICAgIDxURD4KLSAgICAgIDxUQUJMRSBjZWxsU3BhY2luZz0yIGNlbGxQYWRkaW5nPTAgd2lkdGg9IjEwMCUiIGJvcmRlcj0wPgotICAgICAgICAKLSAgICAgICAgPFRSPgotICAgICAgICAgIDxURCB2QWxpZ249dG9wPjxmb250IHNpemU9Ii0xIj5BIHRvZ2dsZSBidXR0b24gdGhhdCBhbGxvd3MKLSAgICAgICAgICAgIHVuY29uZmlndXJlZCBmZWF0dXJlcyB0byBzaG93IGluIHRoZSB2aWV3PC9mb250PjwvVEQ+Ci0gICAgICAgICAgPFREIHZBbGlnbj1jZW50ZXIgYWxpZ249cmlnaHQ+Ci0gICAgICAgICAgICA8VEFCTEU+Ci0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICA8VFI+Ci0gICAgICAgICAgICAgICAgPFREIAotICAgICAgICAgICAgICAgIHN0eWxlPSJCT1JERVItUklHSFQ6IGJsYWNrIDFweCBzb2xpZDsgQk9SREVSLVRPUDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItTEVGVDogYmxhY2sgMXB4IHNvbGlkOyBCT1JERVItQk9UVE9NOiBibGFjayAxcHggc29saWQiIAotICAgICAgICAgICAgICAgIGFsaWduPW1pZGRsZSBiZ0NvbG9yPSNmZmZmZTE+PEZPTlQgCi0gICAgICAgICAgICAgICAgICBzaXplPS0yPiZuYnNwO1Nob3cgVW5jb25maWd1cmVkIEZlYXR1cmVzJm5ic3A7PC9GT05UPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+PC9UUj48L1RBQkxFPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+IDwvVEQ+Ci0gICAgPFREIEJHQ09MT1I9I2NjY2NjYz48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvY2xjbDE2L3Nob3dfdW5jb25mLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Jm5ic3A7PElNRyAKLSAgICAgIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL2VsY2wxNi9zaG93X3VuY29uZi5naWYiIHdpZHRoPTE2IAotICAgICAgYm9yZGVyPTA+Jm5ic3A7PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2RsY2wxNi9zaG93X3VuY29uZi5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLQkKLSAgPFRSIGJnQ29sb3I9I2JmYmY3Zj4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+TW9kZWwgT2JqZWN0PC9GT05UPjwvQj48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjE8L1REPgotICAgIDxURD4mbmJzcDtBcHBsaWNhdGlvbiBDb25maWd1cmF0aW9uPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDthcHBfb2JqPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj50aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHVzZWQgdG8gbG9hZCB0aGUgY3VycmVudAotICAgICAgYXBwbGljYXRpb248L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9hcHBfb2JqLmdpZiIgd2lkdGg9MTYgCi0gICAgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL29iajE2L2FwcF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotCQotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD5NeSBDb21wdXRlcjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7Y29tcHV0ZXJfb2JqPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj50aGUgZmlsZSBzeXN0ZW0gcm9vdDwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NvbXB1dGVyX29iai5naWYiIHdpZHRoPTE2IAotICAgIGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NvbXB1dGVyX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjM8L1REPgotICAgIDxURD4mbmJzcDtGZWF0dXJlPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtmZWF0dXJlX29iajwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+ZmVhdHVyZSBvYmplY3Q8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9mZWF0dXJlX29iai5naWYiIHdpZHRoPTE2IAotYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD5VbmNvbmZpZ3VyZWQgRmVhdHVyZTwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7dW5jb25mX2ZlYXR1cmVfb2JqPC9GT05UPjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mZWF0dXJlIHRoYXQgaXMgY3VycmVudGx5IHVuY29uZmlndXJlZCAoaS5lLiBzdGlsbAotICAgICAgcHJlc2VudCBidXQgZGlzYWJsZWQgaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbik8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiAKLSAgICBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi91bmNvbmZfZmVhdHVyZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURD41PC9URD4KLSAgICA8VEQ+UGxhY2VzIHRvIFZpc2l0PC9URD4KLSAgICA8VEQ+cGxhY2VzX29iajwvVEQ+Ci0gICAgPFREPmEgZm9sZGVyIHRoYXQgY29udGFpbnMgYm9va21hcmtzIHRvIHJlbW90ZSBzaXRlcyB0aGF0Ci0gICAgICBjb250YWluIGNvb2wgZmVhdHVyZXM8L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3BsYWNlc19vYmouZ2lmIiB3aWR0aD0xNiAKLWFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9wbGFjZXNfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDs8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NjwvVEQ+Ci0gICAgPFREPlNpdGU8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+c2l0ZV9vYmombmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnVwZGF0ZSBzaXRlIG9iamVjdCB0aGF0IHJlcHJlc2VudCBhIHByb3ZpZGVyCi0gICAgICBzaXRlIChzaXRlIHRoYXQgaXMgc2V0IHVwIHRvIGFjdCBhcyBhIHNvdXJjZSBvZiBmZWF0dXJlcyk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9zaXRlX29iai5naWYiIHdpZHRoPTE2IAotYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiA8L0ZPTlQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjc8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+TG9jYWwgU2l0ZTwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+bHNpdGVfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPnVwZGF0ZSBzaXRlIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgYSByZWNlaXZlciBzaXRlIChzaXRlCi0gICAgICB0aGF0IGlzIHNldCB1cCB0byBhY3QgYXMgYSB0YXJnZXQgb2YgdGhlIGZlYXR1cmUgaW5zdGFsbGF0aW9uKTwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIAotc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9sc2l0ZV9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvbHNpdGVfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDs8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+ODwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5GZWF0dXJlIENhdGVnb3J5PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5jYXRlZ29yeV9vYmo8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+c2l0ZXMgY2FuIGNsYXNzaWZ5IGZlYXR1cmVzIHRoZXkgaG9zdCBpbnRvIGhpZXJhcmNoaWNhbAotICAgICAgY2F0ZWdvcmllczwvVEQ+Ci0gICAgPFREPgotICAgICAgPFAgYWxpZ249bGVmdD48SU1HIGhlaWdodD0xNiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2NhdGVnb3J5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvUD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2NhdGVnb3J5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjk8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Qm9va21hcmsgRm9sZGVyPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5iZm9sZGVyX29iajwvZm9udD48L1REPgotICAgIDxURD5mb2xkZXIgb2JqZWN0IGluIHRoZSB2aWV3IHRoYXQgcHJvdmlkZXMgZm9yCi0gICAgICBvcmdhbml6aW5nIHNpdGUgYm9va21hcmtzIGFuZCBzZWFyY2ggb2JqZWN0czwvVEQ+Ci0gICAgPFREPgotICAgICAgPFAgYWxpZ249bGVmdD48SU1HIGhlaWdodD0xNiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L2Jmb2xkZXJfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9QPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L2Jmb2xkZXJfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAmbmJzcDs8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTA8L1REPgotICAgIDxURD5UZXh0IFNlYXJjaDwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj50c2VhcmNoX29iajwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+VGV4dCBzZWFyY2ggb2JqZWN0Jm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdHNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi90c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MTE8L1REPgotICAgIDxURD5VcGRhdGUgU2VhcmNoPC9URD4KLSAgICA8VEQ+dXNlYXJjaF9vYmo8L1REPgotICAgIDxURD5BdmFpbGFibGUgVXBkYXRlcyBzZWFyY2ggb2JqZWN0PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi91c2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3VzZWFyY2hfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjEyPC9URD4KLSAgICA8VEQ+UGx1Zy1pbiBTZWFyY2g8L1REPgotICAgIDxURD5wc2VhcmNoX29iajwvVEQ+Ci0gICAgPFREPlBsdWctaW4gc2VhcmNoIG9iamVjdDwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvcHNlYXJjaF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9wc2VhcmNoX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPgotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xMzwvVEQ+Ci0gICAgPFREPkZpeGVkIFZvbHVtZTwvVEQ+Ci0gICAgPFREPnZmaXhlZF9vYmo8L1REPgotICAgIDxURD5Mb2NhbCBmaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnRzIGEgZml4ZWQgZHJpdmUgKFdpbmRvd3MpIG9yCi0gICAgICBmb2xkZXIgKExpbnV4KTwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdmZpeGVkX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+Ci0gICAgPC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi92Zml4ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+Ci0gICAgICAKLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTQ8L1REPgotICAgIDxURD5SZW1vdGUgVm9sdW1lPC9URD4KLSAgICA8VEQ+dnJlbW90ZV9vYmo8L1REPgotICAgIDxURD5SZW1vdGUgZmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgcmVwcmVzZW50cyBhIHNoYXJlZCBkcml2ZSAoV2luZG93KSBvcgotICAgICAgbW91bnRlZCB2b2x1bWUgKExpbnV4KTwvVEQ+Ci0gICAgPFREIGhlaWdodCA9MTYgCi0gICAgICBhbHQ9IiIgPElNRyBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3ZyZW1vdGVfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9IjEiIAotICAgPgotICAgIDwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvdnJlbW90ZV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgICZuYnNwOwotICAgIDwvVEQ+Ci0gICAgPFREPjwvVEQ+PC9UUj4KLSAgPFRSPgotICAgIDxURD4xNTwvVEQ+Ci0gICAgPFREPlJlbW92YWJsZSBWb2x1bWU8L1REPgotICAgIDxURD52cmVtb3ZhYmxlX29iajwvVEQ+Ci0gICAgPFREPlJlbW92YWJsZSBmaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCBpcyBuZWl0aGVyIENELVJPTSBub3IgRmxvcHB5IERpc2suCi0gICAgICBUaGlzIGltYWdlIGlzIHVzZWQgZm9yIGFsbCBvdGhlciByZW1vdmFibGUgdm9sdW1lcyBsaWtlIERWRC1ST00sIHZhcmlvdXMKLSAgICAgIFBDTUNJQSBjYXJkcyBldGMuPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi92cmVtb3ZhYmxlX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+Ci0gICAgPC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi92cmVtb3ZhYmxlX29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgJm5ic3A7Ci0gICAgPC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjE2PC9URD4KLSAgICA8VEQ+Q0QtUk9NPC9URD4KLSAgICA8VEQ+Y2Rfb2JqPC9URD4KLSAgICA8VEQ+RmlsZSBzeXN0ZW0gdm9sdW1lIHRoYXQgcmVwcmVzZW50IGEgQ0QtUk9NIGRyaXZlPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9jZF9vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICAgIDxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9jZF9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD4KLSAgICA8L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUj4KLSAgICA8VEQ+MTc8L1REPgotICAgIDxURD5GbG9wcHkgRGlzazwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mbG9wcHlfb2JqPC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5GaWxlIHN5c3RlbSB2b2x1bWUgdGhhdCByZXByZXNlbnRzIGEgMyAxLzIgaW5jaCBmbG9wcHkKLSAgICAgIGRpc2sgZHJpdmU8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9mbG9wcHlfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvZmxvcHB5X29iai5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPgotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+IDwvRk9OVD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MTg8L1REPgotICAgIDxURD5TYXZlZCBDb25maWd1cmF0aW9uczwvVEQ+Ci0gICAgPFREPnNhdmVkX29iajwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9IjIiPkZvbGRlciB0aGF0IGhvbGRzIHBhc3QgY29uZmlndXJhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcHJlc2VydmVkIGFuZC9vcgotICAgICAgcmVuYW1lZDwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0xNiAKLSAgICAgIGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL29iajE2L3NhdmVkX29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvc2F2ZWRfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjE5PC9URD4KLSAgICA8VEQ+Q29uZmlndXJhdGlvbiBIaXN0b3J5PC9URD4KLSAgICA8VEQ+aGlzdG9yeV9vYmo8L1REPgotICAgIDxURD5Gb2xkZXIgdGhhdCBob2xkcyBwYXN0IGNvbmZpZ3VyYXRpb25zPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9oaXN0b3J5X29iai5naWYiIHdpZHRoPTE2IGFsaWduPWxlZnQgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmID48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb2JqMTYvaGlzdG9yeV9vYmouZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD48L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjA8L1REPgotICAgIDxURD5BdmFpbGFibGUgVXBkYXRlczwvVEQ+Ci0gICAgPFREPnVwZGF0ZXNfb2JqPC9URD4KLSAgICA8VEQ+VXBkYXRlIFNlYXJjaCBvYmplY3QgdGhhdCBpcyBwcmUtY29uZmlndXJlZCB0byBsb29rIGZvcgotICAgICAgYXZhaWxhYmxlIHVwZGF0ZXMgb2YgYWxsIHRoZSBpbnN0YWxsZWQgZmVhdHVyZXMuIEl0IGNhbm5vdCBiZSByZW1vdmVkIGZyb20KLSAgICAgIHRoZSB2aWV3LjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTE2IAotICAgICAgYWx0PSIiIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb2JqMTYvdXBkYXRlc19vYmouZ2lmIiB3aWR0aD0xNiBhbGlnbj1sZWZ0IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZiA+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL29iajE2L3VwZGF0ZXNfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjIxPC9URD4KLSAgICA8VEQ+Q29uZmlndXJhdGlvbjwvVEQ+Ci0gICAgPFREPmNvbmZpZ19vYmo8L1REPgotICAgIDxURD5BIGNvbmZpZ3VyYXRpb24gaGlzdG9yeSBlbnRyeSB0aGF0IHJlcHJlc2VudHMgb25lCi0gICAgICBjb25maWd1cmF0aW9uPC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgCi0gICAgICBhbHQ9IiIgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vYmoxNi9jb25maWdfb2JqLmdpZiIgd2lkdGg9MTYgYWxpZ249bGVmdCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmYgPjxJTUcgaGVpZ2h0PTE2IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vYmoxNi9jb25maWdfb2JqLmdpZiIgd2lkdGg9MTYgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQ+PC9URD48L1RSPgotCQotCQotCQotICA8VFIgYmdDb2xvcj0jY2NjY2NjPgotICAgIDxURCBjb2xTcGFuPTc+PEI+PEZPTlQgc2l6ZT0rMj5PYmplY3QgT3ZlcmxheSA8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPiZuYnNwO2N1cnJlbnQ8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y3VycmVudF9jbyZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2luZGljYXRlcyB0aGF0IHRoZSBjb25maWd1cmF0aW9uIGlzIGN1cnJlbnQgaS5lLiBpbgotICAgICAgZWZmZWN0PC9GT05UPjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9vdnIxNi9jdXJyZW50X2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9jdXJyZW50X2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjI8L1REPgotICAgIDxURD4mbmJzcDtlcnJvcjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+ZXJyb3JfY28mbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT53aWxsIGJlIG92ZXJsYXllZCBvdmVyIFBERSBlZGl0b3Igb2JqZWN0cyB0aGF0IGFyZSAKLSAgICAgIHNvbWVob3cgYXNzb2NpYXRlZCB3aXRoIFhNTCBzeW50YXggb3IgdmFsaWRhdGlvbiBlcnJvcnMmbmJzcDs8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2Vycm9yX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPiZuYnNwO2luc3RhbGxhYmxlPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmluc3RhbGxhYmxlX2NvJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5pbmRpY2F0ZXMgdGhhdCBzaXRlIGNhbiBhY2NlcHQgZmVhdHVyZXMgZHVyaW5nCi0gICAgICBpbnN0YWxsYXRpb248L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8SU1HIGhlaWdodD04IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC9vdnIxNi9pbnN0YWxsYWJsZV9jby5naWYiIHdpZHRoPTcgYm9yZGVyPTA+Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD40PC9URD4KLSAgICA8VEQ+Jm5ic3A7bGlua2VkPC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmxpbmtlZF9jbyZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5kaWNhdGVzIHRoYXQgdGhlIHNpdGUgaXMgb25seSBsaW5rZWQgdG8gdGhlCi0gICAgICBjb25maWd1cmF0aW9uPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTEwIGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvb3ZyMTYvbGlua2VkX2NvLmdpZiIgd2lkdGg9MTEgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPgotICAgICAgPElNRyBoZWlnaHQ9OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvb3ZyMTYvbGlua2VkX2NvLmdpZiIgd2lkdGg9NyBib3JkZXI9MD4KLSAgICAgIDxQPjwvUD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICAgIDxUUiBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgPFREPjU8L1REPgotICAgIDxURD51bmNvbmZpZ3VyZWQ8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dW5jb25maWd1cmVkX2NvJm5ic3A7PC9mb250PjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj4gICAgICAKLSAgICAgIDwvZm9udD48L1REPgotICAgIDxURD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Ci0gICAgICA8UD48L1A+PElNRyBoZWlnaHQ9OCBhbHQ9IiIgc3JjPSJpY29ucy9mdWxsL292cjE2L3VuY29uZmlndXJlZF9jby5naWYiIAotICAgICAgd2lkdGg9NyBib3JkZXI9MD48L1REPgotICAgIDxURD4gPC9URD48L1RSPgotCQotICAKLSAgCi0gIDx0ciBiZ0NvbG9yPSNjY2NjY2M+Ci0gICAgPFREIGNvbFNwYW49Nz48Yj48Zm9udCBzaXplPSIrMiI+Rm9ybXMgQXJ0d29yazwvZm9udD48L2I+PC9URD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDxURD4xPC9URD4KLSAgICA8VEQ+Jm5ic3A7VG9waWM8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+dG9waWMmbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDthbiBpbWFnZSB0byBiZSB1c2VkIGFzIGEgY3VzdG9tIGJ1bGxldCBmb3IgaXRlbXMgaW4KLSAgICAgIGEgJ1dlbGNvbWUnIHBhZ2U8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MTYgYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC9mb3Jtcy90b3BpYy5naWYiIHdpZHRoPTE2IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNiBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvZm9ybXMvdG9waWMuZ2lmIiB3aWR0aD0xNiBib3JkZXI9MD48L1REPgotICAgIDxURD4gPC9URD4KLSAgPC90cj4KLSAgPHRyIGJnQ29sb3I9I2RmZGZiPgotICAgIDxURD4yPC9URD4KLSAgICA8VEQ+RGVmYXVsdCBQcm92aWRlcjwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5kZWZfcHJvdmlkZXImbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmFuIGltYWdlIHRvIGJlIHVzZWQgaW4gYSBmZWF0dXJlIGRlc2NyaXB0aW9uIHBhZ2UgaW4gCi0gICAgICBjYXNlcyB3aGVyZSBvbmUgd2FzIG5vdCBzdXBwbGllZCBieSBmZWF0dXJlIHByb3ZpZGVyIChzaG91bGQgYmUgSlBFRyk8SU1HIAotICAgICAgaGVpZ2h0PTQ4IGFsdD0iIiBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5naWYiIHdpZHRoPTEwOSAKLSAgICAgIGJvcmRlcj0wPiAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgPC9mb250PjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0xNTAgYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL2Zvcm1zL2RlZl9wcm92aWRlci5naWYiIHdpZHRoPTE5MCBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD4KLSAgPC90cj4KLSAgPHRyPgotICAgIDxURD4zPC9URD4KLSAgICA8VEQ+Jm5ic3A7Rm9ybSBCYW5uZXI8L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Zm9ybV9iYW5uZXImbmJzcDs8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmEgYmFubmVyIGltYWdlIHVzZWQgaW4gYWxsIGZvcm0gcGFnZXMgYmVoaW5kIHRoZSBoZWFkaW5nCi0gICAgICAoc2hvd24gaGVyZSBpbiAxOjEwIHpvb20gb3V0KTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD0zIGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvZm9ybXMvZm9ybV9iYW5uZXIuZ2lmIiB3aWR0aD02MCBib3JkZXI9MD48L1REPgotICAgIDxURCBiZ0NvbG9yPSNmZmZmZmY+Jm5ic3A7Ci0gICAgICA8UD48L1A+PC9URD4KLSAgICA8VEQ+IDwvVEQ+Ci0gIDwvdHI+Ci0gIDx0ciBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+NDwvVEQ+Ci0gICAgPFREPiZuYnNwO0Zvcm0gQmFubmVyIFVuZGVybGluZTwvVEQ+Ci0gICAgPFREPjxmb250IHNpemU9Ii0xIj5mb3JtX3VuZGVybGluZSZuYnNwOzwvZm9udD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBzZWNvbmQgcG9ydGlvbiBvZiB0aGUgYmFubmVyIHVzZWQgdW5kZXIgdGhlIGhlYWRpbmcKLSAgICAgIHRleHQgKHNob3duIGhlcmUgaW4gMToxMCB6b29tIG91dCk8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9MSBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmdpZiIgd2lkdGg9NjAgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPiZuYnNwOwotICAgICAgPFA+PC9QPjwvVEQ+Ci0gICAgPFREPiA8L1REPgotICA8L3RyPgotICAKLSAgCi0gIAotICAKLSAgPFRSIGJnQ29sb3I9I2NjY2NjYz4KLSAgICA8VEQgY29sU3Bhbj03PjxCPjxGT05UIHNpemU9KzI+V2l6YXJkIEdyYXBoaWM8L0ZPTlQ+PC9CPjwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MTwvVEQ+Ci0gICAgPFREPk5ldyBCb29rbWFyayB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO25ld19ib29rbWFya193aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNyZWF0ZXMgYSBuZXcgdXBkYXRlIHNpdGUgYm9va21hcms8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vbmV3X2Jvb2ttYXJrX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vbmV3X2Jvb2ttYXJrX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQ+MjwvVEQ+Ci0gICAgPFREPk5ldyBGb2xkZXIgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtuZXdfZm9sZGVyX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+Y3JlYXRlcyBhIG5ldyBib29rbWFyayBmb2xkZXI8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vbmV3X2ZvbGRlcl93aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL25ld19mb2xkZXJfd2l6LmdpZiIgd2lkdGg9NzUgYm9yZGVyPTA+Jm5ic3A7PC9URD4KLSAgICA8VEQ+IDwvVEQ+PC9UUj4KLSAgPFRSIGJnQ29sb3I9I2ZmZmZmZj4KLSAgICA8VEQ+MzwvVEQ+Ci0gICAgPFREPk5ldyBTZWFyY2ggd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtuZXdfc2VhcmNoX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPmNyZWF0ZXMgYSBuZXcgc2VhcmNoIG9iamVjdDwvRk9OVD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9uZXdfc2VhcmNoX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vbmV3X3NlYXJjaF93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjQ8L1REPgotICAgIDxURD5JbnN0YWxsIEZlYXR1cmUgd2l6YXJkPC9URD4KLSAgICA8VEQ+PEZPTlQgc2l6ZT0tMT4mbmJzcDtpbnN0YWxsX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5zdGFsbHMgYSBuZXcgZmVhdHVyZSBpbnRvIHRoZSBwbGF0Zm9ybTwvZm9udD48L1REPgotICAgIDxURD48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Ii4uL29sZC5pY29ucy9mdWxsL3dpemJhbi9pbnN0YWxsX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vaW5zdGFsbF93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZmZmZmZmPgotICAgIDxURCA+NTwvVEQ+Ci0gICAgPFREPlVwZGF0ZSBGZWF0dXJlIHdpemFyZDwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7dXBkYXRlX3dpejwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+aW5zdGFsbHMgYSBuZXdlciB2ZXJzaW9uIG9mIGFuIGFscmVhZHkgaW5zdGFsbGVkIGZlYXR1cmU8L2ZvbnQ+PC9URD4KLSAgICA8VEQ+PElNRyBoZWlnaHQ9NTggYWx0PSIiIAotICAgICAgc3JjPSIuLi9vbGQuaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlX3dpei5naWYiIAotICAgICAgd2lkdGg9NzUgYm9yZGVyPTA+PC9URD4KLSAgICA8VEQgYmdDb2xvcj0jZmZmZmZmPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iaWNvbnMvZnVsbC93aXpiYW4vdXBkYXRlX3dpei5naWYiIHdpZHRoPTc1IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+Ci0gIDxUUiBiZ0NvbG9yPSNkZmRmYj4KLSAgICA8VEQgPjY8L1REPgotICAgIDxURD5Db25maWd1cmUgRmVhdHVyZSB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO2NvbmZpZ193aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPmNvbmZpZ3VyZXMgb3IgdW5jb25maWd1cmVzIGFuIGluc3RhbGxlZCBmZWF0dXJlPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL2NvbmZpZ193aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL2NvbmZpZ193aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFI+Ci0gICAgPFREPjc8L1REPgotICAgIDxURD5Vbmluc3RhbGwgRmVhdHVyZSB3aXphcmQ8L1REPgotICAgIDxURD48Rk9OVCBzaXplPS0xPiZuYnNwO3VuaW5zdGFsbF93aXo8L0ZPTlQ+PC9URD4KLSAgICA8VEQ+PGZvbnQgc2l6ZT0iLTEiPnBlcm1hbmVudGx5IHJlbW92ZXMgYSBmZWF0dXJlIGZyb20gdGhlIHBsYXRmb3JtPC9mb250PjwvVEQ+Ci0gICAgPFREPjxJTUcgaGVpZ2h0PTU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmIiAKLSAgICAgIHdpZHRoPTc1IGJvcmRlcj0wPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD01OCBhbHQ9IiIgCi0gICAgICBzcmM9Imljb25zL2Z1bGwvd2l6YmFuL3VuaW5zdGFsbF93aXouZ2lmIiB3aWR0aD03NSBib3JkZXI9MD4mbmJzcDs8L1REPgotICAgIDxURD4gPC9URD48L1RSPgotICA8VFIgYmdDb2xvcj0jZGZkZmI+Ci0gICAgPFREPjg8L1REPgotICAgIDxURD5EZWZhdWx0IEluc3RhbGwgV2l6YXJkIGJhbm5lcjwvVEQ+Ci0gICAgPFREPjxGT05UIHNpemU9LTE+Jm5ic3A7ZGVmX3dpemJhbjwvRk9OVD48L1REPgotICAgIDxURD48Zm9udCBzaXplPSItMSI+YSBkZWZhdWx0IGltYWdlIHNob3duIGluIGluc3RhbGwgd2l6YXJkIHBhZ2VzIHdoZW4gCi0gICAgICBvbmUgaXMgbm90IHN1cHBsaWVkIGJ5IGZlYXR1cmUgcHJvdmlkZXJzPElNRyBoZWlnaHQ9MjU4IGFsdD0iIiAKLSAgICAgIHNyYz0iLi4vb2xkLmljb25zL2Z1bGwvd2l6YmFuL2RlZl93aXpiYW4uanBnIiB3aWR0aD0xMTggCi1ib3JkZXI9MD4gICAgICAgICAKLSAgICAgICAgICAgPC9mb250PjwvVEQ+Ci0gICAgPFREPjwvVEQ+Ci0gICAgPFREIGJnQ29sb3I9I2ZmZmZmZj48SU1HIGhlaWdodD0yNTggYWx0PSIiIAotICAgICAgc3JjPSJpY29ucy9mdWxsL3dpemJhbi9kZWZfd2l6YmFuLmpwZyIgd2lkdGg9MTE4IGJvcmRlcj0wPiZuYnNwOzwvVEQ+Ci0gICAgPFREPiA8L1REPjwvVFI+PC9UQUJMRT4KLTxQPjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGI0MTFhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD4yMHRoIEp1bmUsIDIwMDI8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotPHA+RWNsaXBzZS5vcmcgbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBDUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPkNvbnRyaWJ1dGlvbnM8L2gzPgotCi08cD5JZiB0aGlzIENvbnRlbnQgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMLCBhbnkgQ29udHJpYnV0aW9ucywgYXMgZGVmaW5lZCBpbiB0aGUgQ1BMLCB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UKLW1hZGUgYXZhaWxhYmxlIHRvIEVjbGlwc2Uub3JnLCBtZW1iZXJzIG9mIEVjbGlwc2Uub3JnIGFuZC9vciB0aGUgaG9zdCBvZiBFY2xpcHNlLm9yZyB3ZWIgc2l0ZSwgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2gKLUNvbnRlbnQgYXJlIHByb3ZpZGVkIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQ1BMIGFuZCBjYW4gYmUgbWFkZSBhdmFpbGFibGUgdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ1BMLjwvcD4KLQotPHA+SWYgdGhpcyBDb250ZW50IGlzIGxpY2Vuc2VkIHRvIHlvdSB1bmRlciBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zIG90aGVyIHRoYW4gdGhlIENQTCAoJnF1b3Q7T3RoZXIgTGljZW5zZSZxdW90OyksIGFueSBtb2RpZmljYXRpb25zLCBlbmhhbmNlbWVudHMgYW5kL29yCi1vdGhlciBjb2RlIGFuZC9vciBkb2N1bWVudGF0aW9uICgmcXVvdDtNb2RpZmljYXRpb25zJnF1b3Q7KSB1cGxvYWRlZCwgc3VibWl0dGVkLCBvciBvdGhlcndpc2UgbWFkZSBhdmFpbGFibGUgdG8gRWNsaXBzZS5vcmcsIG1lbWJlcnMgb2YgRWNsaXBzZS5vcmcgYW5kL29yIHRoZQotaG9zdCBvZiBFY2xpcHNlLm9yZywgYnkgeW91IHRoYXQgcmVsYXRlIHRvIHN1Y2ggQ29udGVudCBhcmUgcHJvdmlkZWQgdW5kZXIgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIE90aGVyIExpY2Vuc2UgYW5kIGNhbiBiZSBtYWRlIGF2YWlsYWJsZQotdG8gb3RoZXJzIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgT3RoZXIgTGljZW5zZS4gIEluIGFkZGl0aW9uLCB3aXRoIHJlZ2FyZCB0byBNb2RpZmljYXRpb25zIGZvciB3aGljaCB5b3UgYXJlIHRoZSBjb3B5cmlnaHQgaG9sZGVyLCB5b3UgYXJlIGFsc28KLXByb3ZpZGluZyB0aGUgTW9kaWZpY2F0aW9ucyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIENQTCBhbmQgc3VjaCBNb2RpZmljYXRpb25zIGNhbiBiZSBtYWRlIGF2YWlsYWJsZSB0byBvdGhlcnMgdW5kZXIgdGhlIHRlcm1zIG9mCi10aGUgQ1BMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZlMDAwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcDQotICAgICAgICAgICAgICAgaWNvbnMvLFwNCi0gICAgICAgICAgICAgICAqLmphcixcDQotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcDQotICAgICAgICAgICAgICAgYWJvdXQuaHRtbA0KLWphcnMuY29tcGlsZS5vcmRlciA9IHVwZGF0ZXVpLmphcg0KLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXA0KLSAgICAgICAgICAgICAgIHNjaGVtYS8NCi1zb3VyY2UudXBkYXRldWkuamFyID0gc3JjLw0KLSNqYXJzLmV4dHJhLmNsYXNzcGF0aCA9IC4uL29yZy5lY2xpcHNlLnRvbWNhdC9zZXJ2bGV0Lmphcg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJlZWI2ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2RsY2wxNi9oaWVyYXJjaGljYWxMYXlvdXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvc2hvd191bmNvbmYuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kbGNsMTYvc2hvd191bmNvbmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGNmOTZiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZGxjbDE2L3Nob3dfdW5jb25mLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9jb25maWdfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi9jb25maWdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4YWNlYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvY29uZmlnX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L2luc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5ZmYyOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9kdG9vbDE2L3VuaW5zdGFsbF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzVmY2QyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi91cGRhdGVfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZHRvb2wxNi91cGRhdGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU5ZDQ0OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2R0b29sMTYvdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L2hpZXJhcmNoaWNhbExheW91dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDQ4NjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9lbGNsMTYvaGllcmFyY2hpY2FsTGF5b3V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L3Nob3dfdW5jb25mLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZWxjbDE2L3Nob3dfdW5jb25mLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1YjcwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2VsY2wxNi9zaG93X3VuY29uZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvY29uZmlnX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvY29uZmlnX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWM3MjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2NvbmZpZ193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi9pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGM2M2YuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L2luc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXRvb2wxNi91bmluc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMzMzEyOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdW5pbnN0YWxsX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdXBkYXRlX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V0b29sMTYvdXBkYXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODRlYmUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldG9vbDE2L3VwZGF0ZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L2NvbmZpZ3MuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9ldmlldzE2L2NvbmZpZ3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg0ZmJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXZpZXcxNi9jb25maWdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXZpZXcxNi9wcmV2aWV3LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZXZpZXcxNi9wcmV2aWV3LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZiZjljZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2V2aWV3MTYvcHJldmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2RlZl9wcm92aWRlci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYjAzZmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9kZWZfcHJvdmlkZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViYzBiMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fYmFubmVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV9iYW5uZXIuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1M2UyZDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy9mb3JtX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL2Zvcm1fdW5kZXJsaW5lLmpwZyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmYzZDBiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvZm9ybXMvZm9ybV91bmRlcmxpbmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9mb3Jtcy90b3BpYy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL3RvcGljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkZDRlYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL2Zvcm1zL3RvcGljLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYXBwX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2FwcF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTNjYWQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYXBwX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2Jmb2xkZXJfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYmZvbGRlcl9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI3M2U0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvYmZvbGRlcl9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9jYXRlZ29yeV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDg3ZDA3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY2F0ZWdvcnlfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY29uZmlnX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2NvbmZpZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg0ZmJhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvY29uZmlnX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXgyX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXgyX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzg5NTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lZml4Ml9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lZml4X29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXhfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmYzQ5OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VmaXhfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXJyb3Jfc3Rfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvZXJyb3Jfc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJjNjA2OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2Vycm9yX3N0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VzaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2VzaXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZmQwN2IuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9lc2l0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9mZWF0dXJlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2ZlYXR1cmVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwNjY4MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2ZlYXR1cmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvaGlzdG9yeV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9oaXN0b3J5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OWQ0M2EuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9oaXN0b3J5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2xzaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L2xzaXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NTBiZGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9sc2l0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9ub3RpbnN0YWxsZWRfZmVhdHVyZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkyYjg0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvbm90aW5zdGFsbGVkX2ZlYXR1cmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvb2tfc3Rfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvb2tfc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhY2I5Ni4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L29rX3N0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3BzaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3BzaXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ODk3ZjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9wc2l0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi9zaXRlX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3NpdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1NjhmNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3NpdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdW5jb25mX2ZlYXR1cmVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4ODFmZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VuY29uZl9mZWF0dXJlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VwZGF0ZXNfb2JqLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXBkYXRlc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmY0ZjdjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvdXBkYXRlc19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vYmoxNi91c2VhcmNoX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VzZWFyY2hfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA4MDU5OS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3VzZWFyY2hfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvd2ViX2JrbXJrX29iai5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL29iajE2L3dlYl9ia21ya19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJjNTI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb2JqMTYvd2ViX2JrbXJrX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2FkZF9zdGF0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvYWRkX3N0YXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTIzYTJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvYWRkX3N0YXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9jdXJyZW50X2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvY3VycmVudF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMDc3ZjkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9jdXJyZW50X2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvZGVsX3N0YXQuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9kZWxfc3RhdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDIwN2MuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9kZWxfc3RhdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2Vycm9yX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvZXJyb3JfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTlkY2NjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvZXJyb3JfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9pbnN0YWxsYWJsZV9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5OTliNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2luc3RhbGxhYmxlX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbGlua2VkX2NvLmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvbGlua2VkX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0MGUxYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L2xpbmtlZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L21vZF9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L21vZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMWI4ZDYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi9tb2RfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi91bmNvbmZpZ3VyZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTU4OWNlLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdW5jb25maWd1cmVkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdXBkYXRlZF9jby5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3VwZGF0ZWRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY4NmFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvb3ZyMTYvdXBkYXRlZF9jby5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3dhcm5pbmdfY28uZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy9vdnIxNi93YXJuaW5nX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZGFjNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL292cjE2L3dhcm5pbmdfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vY29uZmlnX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9jb25maWdfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExOWZiZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9jb25maWdfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL2RlZl93aXpiYW4uanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vZGVmX3dpemJhbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkN2ViYTYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vZGVmX3dpemJhbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi9pbnN0YWxsX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZWU3YzMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vaW5zdGFsbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdW5pbnN0YWxsX3dpei5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyMzM3OC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL2ljb25zL3dpemJhbi91bmluc3RhbGxfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvaWNvbnMvd2l6YmFuL3VwZGF0ZV93aXouZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdXBkYXRlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzY0ODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9pY29ucy93aXpiYW4vdXBkYXRlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxYWZiYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0jIA0KLSMgQ29udHJpYnV0b3JzOg0KLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jDQotIyBVcGRhdGUgVUkgcGx1Z2luLnhtbCByZXNvdXJjZXMNCi0jDQotcGx1Z2luTmFtZSA9IEluc3RhbGwvVXBkYXRlIFVJDQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcNCi1mcmFnbWVudE5hbWVXaW4gPSBJbnN0YWxsL1VwZGF0ZSBVSSBmb3IgV2luZG93cw0KLQ0KLXVwZGF0ZU1lbnUubGFiZWwgPSAmU29mdHdhcmUgVXBkYXRlcw0KLWFjdGlvblNldHMuc29mdHdhcmVVcGRhdGVzLmxhYmVsID0gU29mdHdhcmUgVXBkYXRlcw0KLWFjdGlvblNldHMudXBkYXRlcy5sYWJlbCA9ICZGaW5kIGFuZCBJbnN0YWxsLi4uDQotYWN0aW9uU2V0cy5jb25maWdNYW5hZ2VyLmxhYmVsID0gJk1hbmFnZSBDb25maWd1cmF0aW9uLi4uDQotYWN0aW9uU2V0cy53ZWJTaXRlcy5sYWJlbCA9ICZVcGRhdGUgU2l0ZXMgKGV4cGVyaW1lbnRhbCkNCi0NCi1zZWFyY2hDYXRlZ29yeS5uYW1lID0gU2VhcmNoIENhdGVnb3J5DQotc2VhcmNoQ2F0ZWdvcmllcy51cGRhdGVzID0gQXZhaWxhYmxlIFVwZGF0ZXMNCi1zZWFyY2hDYXRlZ29yaWVzLnVwZGF0ZXMuZGVzYyA9IDxmb3JtPjxwPlNlYXJjaCBmb3IgdXBkYXRlcyB0byBcDQotZmVhdHVyZXMgY3VycmVudGx5IGluc3RhbGxlZCBpbiB0aGlzIGFwcGxpY2F0aW9uLiBVcGRhdGVzIGFyZSBcDQotZmVhdHVyZXMgdGhhdCBoYXZlIHRoZSBzYW1lIGlkZW50aWZpZXIgYXMgdGhlIGluc3RhbGxlZCBmZWF0dXJlcywgXA0KLWJ1dCBuZXdlciB2ZXJzaW9ucy48L3A+XA0KLTxwPlVzZSBzY29wZSBzZXR0aW5ncyB0byBjb250cm9sIHRoZSBcDQotZXh0ZW50IG9mIHRoZSBzZWFyY2ggYW5kIHRoZSB1cGRhdGUgc2l0ZXMgdGhhdCB3aWxsIGJlIHZpc2l0ZWQuPC9wPlwNCi08cD5Ob3RlIHRoYXQgdGhlIHNldHRpbmdzIGluIDxiPlByZWZlcmVuY2VzPC9iPiBhZmZlY3Qgd2hldGhlciB0aGUgbmV3IGZlYXR1cmUgXA0KLXZlcnNpb25zIHdpbGwgYmUgY29uc2lkZXJlZCB2YWxpZCBhcyB1cGRhdGVzLjwvcD48L2Zvcm0+DQotDQotc2VhcmNoQ2F0ZWdvcmllcy5leHByZXNzaW9uID0gUmVndWxhciBFeHByZXNzaW9ucw0KLXNlYXJjaENhdGVnb3JpZXMuZXhwcmVzc2lvbi5kZXNjID0gPGZvcm0+PHA+U2VhcmNoIGZvciBmZWF0dXJlcyB0aGF0IFwNCi1jb250YWluIGRlc2lyZWQgdGV4dCBvciByZXF1bGFyIGV4cHJlc3Npb24uIFVzZSB0aGUgcXVlcnkgc2V0dGluZ3MgXA0KLXRvIGNvbmZpZ3VyZSBzZWFyY2ggb3B0aW9ucy48L3A+PC9mb3JtPg0KLQ0KLXNlYXJjaENhdGVnb3JpZXMucGx1Z2luID0gUGx1Zy1pbnMgaW4gRmVhdHVyZXMNCi1zZWFyY2hDYXRlZ29yaWVzLnBsdWdpbi5kZXNjID0gPGZvcm0+PHA+TG9vayBmb3IgcGx1Zy1pbnMgdGhhdCBcDQotYXJlIHBhY2thZ2VkIGluIHRoZSBmZWF0dXJlcy4gVGhpcyBzZWFyY2ggY2F0ZWdvcnkgaXMgdXNlZnVsIFwNCi13aGVuIHJlcXVpcmVkIHBsdWctaW5zIG9mIHRoZSBmZWF0dXJlIHlvdSB3YW50ZWQgdG8gaW5zdGFsbCBcDQotd2VyZSBub3QgZm91bmQgaW4gdGhpcyBhcHBsaWNhdGlvbi48L3A+PC9mb3JtPg0KLQ0KLW1haW5QcmVmZXJlbmNlLm5hbWUgPSBJbnN0YWxsL1VwZGF0ZQ0KLQ0KLXByb3BlcnRpZXMuZ2VuZXJhbC1pbmZvLmxhYmVsID0gR2VuZXJhbCBJbmZvcm1hdGlvbg0KLXByb3BlcnRpZXMubGljZW5zZS5sYWJlbCA9IExpY2Vuc2UgQWdyZWVtZW50DQotcHJvcGVydGllcy5jb3B5cmlnaHQubGFiZWwgPSBDb3B5cmlnaHQNCi1wcm9wZXJ0aWVzLnN0YXR1cy5sYWJlbCA9IFN0YXR1cw0KLXByb3BlcnRpZXMuY3VycmVudENvbmZpZy5hY3Rpdml0aWVzID0gQWN0aXZpdGllcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnhtbCBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExYjExNi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4NCi08cGx1Z2luDQotICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aSINCi0gICBuYW1lPSIlcGx1Z2luTmFtZSINCi0gICB2ZXJzaW9uPSIzLjAuMCINCi0gICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIg0KLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUkiPg0KLQ0KLSAgIDxydW50aW1lPg0KLSAgICAgIDxsaWJyYXJ5IG5hbWU9InVwZGF0ZXVpLmphciI+DQotICAgICAgICAgPGV4cG9ydCBuYW1lPSIqIi8+DQotICAgICAgICAgPHBhY2thZ2VzIHByZWZpeGVzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkiLz4NCi0gICAgICA8L2xpYnJhcnk+DQotICAgPC9ydW50aW1lPg0KLSAgIDxyZXF1aXJlcz4NCi0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmhlbHAuYmFzZSIvPg0KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIi8+DQotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLnVpLmZvcm1zIi8+DQotICAgPC9yZXF1aXJlcz4NCi0NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPg0KLSAgICAgIDxwYWdlDQotICAgICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC5JRmVhdHVyZUFkYXB0ZXIiDQotICAgICAgICAgICAgbmFtZT0iJXByb3BlcnRpZXMuZ2VuZXJhbC1pbmZvLmxhYmVsIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllcy5GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklGZWF0dXJlQWRhcHRlciINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5saWNlbnNlLmxhYmVsIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllcy5GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklGZWF0dXJlQWRhcHRlciINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5jb3B5cmlnaHQubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLkZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLkNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciINCi0gICAgICAgICAgICBuYW1lPSIlcHJvcGVydGllcy5zdGF0dXMubGFiZWwiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzLkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UiDQotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS51aS5mZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlIj4NCi0gICAgICA8L3BhZ2U+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLklDb25maWd1cmVkU2l0ZUFkYXB0ZXIiDQotICAgICAgICAgICAgbmFtZT0iJXByb3BlcnRpZXMuZ2VuZXJhbC1pbmZvLmxhYmVsIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllcy5Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmNvbmZpZ1NpdGUiPg0KLSAgICAgIDwvcGFnZT4NCi0gICAgICA8cGFnZQ0KLSAgICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5TaXRlTG9jYWwiDQotICAgICAgICAgICAgbmFtZT0iJXByb3BlcnRpZXMuZ2VuZXJhbC1pbmZvLmxhYmVsIg0KLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllcy5JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLnVpLmluc3RhbGxDb25maWciPg0KLSAgICAgIDwvcGFnZT4NCi0gICA8L2V4dGVuc2lvbj4NCi0gICA8ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+DQotICAgICAgPHBhZ2UNCi0gICAgICAgICAgICBuYW1lPSIlbWFpblByZWZlcmVuY2UubmFtZSINCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLk1haW5QcmVmZXJlbmNlUGFnZSINCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzLk1haW5QcmVmZXJlbmNlUGFnZSI+DQotICAgICAgPC9wYWdlPg0KLSAgIDwvZXh0ZW5zaW9uPg0KLQ0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9BZGRCb29rbWFya3NBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9BZGRCb29rbWFya3NBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBlOTZjYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvQWRkQm9va21hcmtzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIEFkZHMgYm9va21hcmtzIHRvIHVwZGF0ZSBzaXRlcwotICovCi1wdWJsaWMgY2xhc3MgQWRkQm9va21hcmtzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRCb29rbWFya3NBY3Rpb24oKSB7Ci0JCXNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJBZGRCb29rbWFya3NBY3Rpb24uYWRkIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlOZXdXZWJTaXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBOZXdXZWJTaXRlRGlhbG9nKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJBZGRCb29rbWFya3NBY3Rpb24ubmV3IikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkaWFsb2cub3BlbigpID09IE5ld1dlYlNpdGVEaWFsb2cuT0spIHsKLQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpLnNhdmVCb29rbWFya3MoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvdy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYWMwOGMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0NvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3MuKjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIE1hbmFnZXIgd2luZG93LgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci0JewotCXByaXZhdGUgQ29uZmlndXJhdGlvblZpZXcgdmlldzsKLQlwcml2YXRlIEdsb2JhbEFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCXByaXZhdGUgSUFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcjsKLQkKLQljbGFzcyBHbG9iYWxBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgSUFjdGlvbiBoYW5kbGVyOwotCi0JCXB1YmxpYyBHbG9iYWxBY3Rpb24oKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBY3Rpb25IYW5kbGVyKElBY3Rpb24gYWN0aW9uKSB7Ci0JCQlpZiAoaGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCWhhbmRsZXIgPSBudWxsOwotCQkJfQotCQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQkJdGhpcy5oYW5kbGVyID0gYWN0aW9uOwotCQkJCWFjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkgewotCQkJCXNldEVuYWJsZWQoaGFuZGxlci5pc0VuYWJsZWQoKSk7Ci0JCQkJc2V0Q2hlY2tlZChoYW5kbGVyLmlzQ2hlY2tlZCgpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhBY3Rpb24uRU5BQkxFRCkpIHsKLQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQlzZXRFbmFibGVkKGJvb2wuYm9vbGVhblZhbHVlKCkpOwotCQkJfSBlbHNlIGlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhBY3Rpb24uQ0hFQ0tFRCkpIHsKLQkJCQlCb29sZWFuIGJvb2wgPSAoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQlzZXRDaGVja2VkKGJvb2wuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKGhhbmRsZXIgIT0gbnVsbCkKLQkJCQloYW5kbGVyLnJ1bigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93KFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuQVBQTElDQVRJT05fTU9EQUwpOwotCQkvLyBTZXR1cCB3aW5kb3cuCi0JCWFkZE1lbnVCYXIoKTsKLQkJYWRkQWN0aW9ucygpOwotCQlhZGRUb29sQmFyKFNXVC5GTEFUKTsKLS8vCQlhZGRTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGlvbnMoKSB7Ci0JCUlNZW51TWFuYWdlciBtZW51QmFyID0gZ2V0TWVudUJhck1hbmFnZXIoKTsKLQkJSU1lbnVNYW5hZ2VyIGZpbGVNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cuZmlsZU1lbnUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudUJhci5hZGQoZmlsZU1lbnUpOwotCi0JCXByb3BlcnRpZXNBY3Rpb24gPSBuZXcgR2xvYmFsQWN0aW9uKCk7Ci0JCXByb3BlcnRpZXNBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LnByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQlmaWxlTWVudS5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0JCWZpbGVNZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCi0JCUFjdGlvbiBjbG9zZUFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJY2xvc2UoKTsKLQkJCX0KLQkJfTsKLQkJY2xvc2VBY3Rpb24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LmNsb3NlIikpOyAvLyROT04tTkxTLTEkCi0JCWZpbGVNZW51LmFkZChjbG9zZUFjdGlvbik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBob29rR2xvYmFsQWN0aW9ucygpIHsKLQkJaWYocHJvcGVydGllc0FjdGlvbkhhbmRsZXIhPW51bGwpCi0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEFjdGlvbkhhbmRsZXIocHJvcGVydGllc0FjdGlvbkhhbmRsZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXcgPSBuZXcgQ29uZmlndXJhdGlvblZpZXcodGhpcyk7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUdyaWREYXRhIGdkOwotCQlMYWJlbCBzZXBhcmF0b3IgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5oZWlnaHRIaW50ID0gMTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0JCXZpZXcuY3JlYXRlUGFydENvbnRyb2woY29udGFpbmVyKTsKLQkJQ29udHJvbCB2aWV3Q29udHJvbCA9IHZpZXcuZ2V0Q29udHJvbCgpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQl2aWV3Q29udHJvbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJaG9va0dsb2JhbEFjdGlvbnMoKTsKLQotCQl1cGRhdGVBY3Rpb25CYXJzKCk7Ci0KLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCk7Ci0JCQl2aWV3LmdldFRyZWVWaWV3ZXIoKS5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obG9jYWxTaXRlKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCQotCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJZ2V0U2hlbGwoKS5zZXRJbWFnZShwcm92aWRlci5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19DT05GSUdTX1ZJRVcsIDApKTsKLQkJCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUFjdGlvbkJhcnMoKSB7Ci0JCWdldE1lbnVCYXJNYW5hZ2VyKCkudXBkYXRlQWxsKGZhbHNlKTsKLQkJZ2V0VG9vbEJhck1hbmFnZXIoKS51cGRhdGUoZmFsc2UpOwotLy8JCWdldFN0YXR1c0xpbmVNYW5hZ2VyKCkudXBkYXRlKGZhbHNlKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNjbG9zZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCWlmICh2aWV3ICE9IG51bGwpCi0JCQl2aWV3LmRpc3Bvc2UoKTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQkvLyBzZXQgdGhlIHRpdGxlCi0JCWdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25NYW5hZ2VyQWN0aW9uLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCWdldFNoZWxsKCkuc2V0U2l6ZSg4MDAsIDYwMCk7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjb3BlbigpCi0JICovCi0JcHVibGljIGludCBvcGVuKCkgewotCQkvLyB1cGRhdGUgYWN0aW9uIGJhcnMKLQkJdXBkYXRlQWN0aW9uQmFycygpOwotCQlyZXR1cm4gc3VwZXIub3BlbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcihJQWN0aW9uIGhhbmRsZXIpewotCQlwcm9wZXJ0aWVzQWN0aW9uSGFuZGxlcj1oYW5kbGVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9SZXN0YXJ0RGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvUmVzdGFydERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWM1M2EwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9SZXN0YXJ0RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLQotLyoqCi0gKiBBIGRpYWxvZyB3aGljaCBwcm9tcHRzIHRoZSB1c2VyIHRvIHJlc3RhcnQgYWZ0ZXIgYW4gdXBkYXRlIG9wZXJhdGlvbgotICogYW5kIHByb3ZpZGVzIFllcywgTm8sIENvbnRpbnVlIGJ1dHRvbnMuIAotICovCi1wdWJsaWMgY2xhc3MgUmVzdGFydERpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT05USU5VRSA9IDI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nW10geWVzTm8gPSBuZXcgU3RyaW5nW10ge0lEaWFsb2dDb25zdGFudHMuWUVTX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMfTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSB5ZXNOb0FwcGx5ID0gbmV3IFN0cmluZ1tdIHtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJBcHBseUNoYW5nZXMiKX07IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGludCBidXR0b25JZCA9IDA7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkaWFsb2cKLQkgKiBAc2VlIE1lc3NhZ2VEaWFsb2cjTWVzc2FnZURpYWxvZyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbCwgamF2YS5sYW5nLlN0cmluZywgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlLCBqYXZhLmxhbmcuU3RyaW5nLCBpbnQsIGphdmEubGFuZy5TdHJpbmdbXSwgaW50KQotCSAqLwotCXB1YmxpYyBSZXN0YXJ0RGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWVzc2FnZSwgYm9vbGVhbiByZXN0YXJ0TmVlZGVkKSB7Ci0JCXN1cGVyKHBhcmVudCwKLQkJCQl0aXRsZSwKLQkJCQludWxsLAkvLyBhY2NlcHQgdGhlIGRlZmF1bHQgd2luZG93IGljb24KLQkJCQltZXNzYWdlLAotCQkJCVFVRVNUSU9OLAotCQkJCXJlc3RhcnROZWVkZWQgPyB5ZXNObyA6IHllc05vQXBwbHksIAotCQkJCTApOwkJLy8geWVzIGlzIHRoZSBkZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIG9wZW4gdGhlIFllcy9Oby9Db250aW51ZSBxdWVzdGlvbiBkaWFsb2cuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIGRpYWxvZywgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSByZXN0YXJ0SXNSZWFsbHlOZWVkZWQgd2hlbiBmYWxzZSwgdGhlIGNoYW5nZXMgYXJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgY29uZmlnCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdXNlciBwcmVzc2VzICBZRVMKLQkgKiAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9wZW5RdWVzdGlvbihTaGVsbCBwYXJlbnQsIGJvb2xlYW4gcmVzdGFydElzUmVhbGx5TmVlZGVkKSB7Ci0JCVN0cmluZyB0aXRsZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiUmVzdGFydFRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1lc3NhZ2UgPSByZXN0YXJ0SXNSZWFsbHlOZWVkZWQgPyBVcGRhdGVVSS5nZXRTdHJpbmcoIlJlc3RhcnRNZXNzYWdlIik6IFVwZGF0ZVVJLmdldFN0cmluZygiT3B0aW9uYWxSZXN0YXJ0TWVzc2FnZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJUmVzdGFydERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzdGFydERpYWxvZyhwYXJlbnQsIHRpdGxlLAltZXNzYWdlLCByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpOwotCQlpbnQgYnV0dG9uPSBkaWFsb2cub3BlbigpOwotCQlpZiAoYnV0dG9uID09IDIpCi0JCQlJbnN0YWxsQ29uZmlndXJhdGlvbi5hcHBseUNoYW5nZXMoKTsKLQkJcmV0dXJuIGJ1dHRvbiA9PSAwOyAvLyBZZXMKLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBhIGJ1dHRvbiBpcyBwcmVzc2VkLCBzdG9yZSB0aGUgcHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2J1dHRvblByZXNzZWQoaW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGlkKSB7Ci0JCWlmIChpZCA9PSAyKSB7IAotCQkJYnV0dG9uSWQ9IENPTlRJTlVFOwotCQl9IAotCQkKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChpZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVzZXIncyBzZWxlY3Rpb24sCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIgaGFzbid0IGNob3NlbiB5ZXQuCi0JICogCi0JICogQHJldHVybiB0aGUgdXNlcidzIHNlbGVjdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVzdWx0KCkgewotCQlyZXR1cm4gYnV0dG9uSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZUxhYmVsUHJvdmlkZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDMwNjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGFhYjAuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5oZWxwLmludGVybmFsLmJyb3dzZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LnByb2dyYW0uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5Lio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVVSSBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0FQUF9JRCA9ICJvcmcuZWNsaXBzZS51cGRhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlVUkgcGx1Z2luOwotCS8vUmVzb3VyY2UgYnVuZGxlLgotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGU7Ci0JcHJpdmF0ZSBVcGRhdGVNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yIGF1dGhlbnRpY2F0b3I7Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwU2VydmVySG9zdDsKLQlwcml2YXRlIGludCBhcHBTZXJ2ZXJQb3J0OwotCXByaXZhdGUgVXBkYXRlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gcmVtaW5kT25DYW5jZWwgPSB0cnVlOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBVcGRhdGVVSSgpIHsKLQotCQlwbHVnaW4gPSB0aGlzOwotCQl0cnkgewotCQkJcmVzb3VyY2VCdW5kbGUgPQotCQkJCVJlc291cmNlQnVuZGxlLmdldEJ1bmRsZSgKLQkJCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSVBsdWdpblJlc291cmNlcyIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGRhdGVVSSBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIGdldERlZmF1bHQoKS5pbnRlcm5hbEdldEFjdGl2ZVBhZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGludGVybmFsR2V0QWN0aXZlUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBnZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKQotCQkJcmV0dXJuIHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXJldHVybiB3aW5kb3cgIT0gbnVsbCA/IHdpbmRvdy5nZXRTaGVsbCgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElXb3JrYmVuY2hXaW5kb3cgZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCX0KLQotCXB1YmxpYyBVcGRhdGVMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCWlmIChsYWJlbFByb3ZpZGVyID09IG51bGwpCi0JCQlsYWJlbFByb3ZpZGVyID0gbmV3IFVwZGF0ZUxhYmVsUHJvdmlkZXIoKTsKLQkJcmV0dXJuIGxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIGZyb20gdGhlIHBsdWdpbidzIHJlc291cmNlIGJ1bmRsZSwKLQkgKiBvciAna2V5JyBpZiBub3QgZm91bmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFJlc291cmNlQnVuZGxlKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYnVuZGxlLmdldFN0cmluZyhrZXkpOwotCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGtleTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nW10gYXJncykgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIGFyZ3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcm1hdHRlZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIGFyZykgewotCQlTdHJpbmcgdGV4dCA9IGdldFN0cmluZyhrZXkpOwotCQlyZXR1cm4gamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQuZm9ybWF0KHRleHQsIG5ldyBTdHJpbmdbXSB7IGFyZyB9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwbHVnaW4ncyByZXNvdXJjZSBidW5kbGUsCi0JICovCi0JcHVibGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJbW9kZWwgPSBuZXcgVXBkYXRlTW9kZWwoKTsKLQkJYXV0aGVudGljYXRvciA9IG5ldyBVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvcigpOwotCQlBdXRoZW50aWNhdG9yLnNldERlZmF1bHQoYXV0aGVudGljYXRvcik7Ci0JCWludCBoaXN0b3J5UHJlZiA9Ci0JCQlnZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChVcGRhdGVDb3JlLlBfSElTVE9SWV9TSVpFKTsKLQkJaWYgKGhpc3RvcnlQcmVmID4gMCkgewotCQkJVXBkYXRlQ29yZS5ERUZBVUxUX0hJU1RPUlkgPSBoaXN0b3J5UHJlZjsKLQkJfQotCX0KLQkKLQkKLQotCXB1YmxpYyBib29sZWFuIGlzV2ViQXBwU3RhcnRlZCgpIHsKLQkJcmV0dXJuIGFwcFNlcnZlckhvc3QgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFwcFNlcnZlckhvc3QoKSB7Ci0JCXJldHVybiBhcHBTZXJ2ZXJIb3N0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXBwU2VydmVyUG9ydCgpIHsKLQkJcmV0dXJuIGFwcFNlcnZlclBvcnQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5zaHV0ZG93bigpOwotCi0JCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwpCi0JCQlsYWJlbFByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQotCX0KLQotCXB1YmxpYyBVcGRhdGVNb2RlbCBnZXRVcGRhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUpIHsKLQkJbG9nRXhjZXB0aW9uKGUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGUsIGJvb2xlYW4gc2hvd0Vycm9yRGlhbG9nKSB7Ci0JCWlmIChlIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJc3RhdHVzID0gKChDb3JlRXhjZXB0aW9uKSBlKS5nZXRTdGF0dXMoKTsKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gZS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSA9PSBudWxsKQotCQkJCW1lc3NhZ2UgPSBlLnRvU3RyaW5nKCk7Ci0JCQlzdGF0dXMgPQotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsCi0JCQkJCWdldFBsdWdpbklkKCksCi0JCQkJCUlTdGF0dXMuT0ssCi0JCQkJCW1lc3NhZ2UsCi0JCQkJCWUpOwotCQl9Ci0JCWxvZyhzdGF0dXMsIHNob3dFcnJvckRpYWxvZyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cywgYm9vbGVhbiBzaG93RXJyb3JEaWFsb2cpIHsKLQkJaWYgKHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykgewotCQkJaWYgKHNob3dFcnJvckRpYWxvZykKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0JCQkvL1Jlc291cmNlc1BsdWdpbi5nZXRQbHVnaW4oKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLS8vCQkJIFNob3VsZCBsb2cgb24gdGhlIHVwZGF0ZSBwbHVnaW4ncyBsb2cKLS8vCQkJUGxhdGZvcm0uZ2V0UGx1Z2luKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiKS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLnVwZGF0ZS51aSIpOyAgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1cyk7Ci0JCX0gZWxzZSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCQlnZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCW51bGwsCi0JCQkJc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElGZWF0dXJlW10gc2VhcmNoU2l0ZSgKLQkJU3RyaW5nIGZlYXR1cmVJZCwKLQkJSUNvbmZpZ3VyZWRTaXRlIHNpdGUsCi0JCWJvb2xlYW4gb25seUNvbmZpZ3VyZWQpCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSUZlYXR1cmVSZWZlcmVuY2VbXSByZWZlcmVuY2VzID0gbnVsbDsKLQotCQlpZiAob25seUNvbmZpZ3VyZWQpCi0JCQlyZWZlcmVuY2VzID0gc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJZWxzZQotCQkJcmVmZXJlbmNlcyA9IHNpdGUuZ2V0U2l0ZSgpLmdldEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCVZlY3RvciByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmZXJlbmNlc1tpXS5nZXRGZWF0dXJlKG51bGwpOwotCQkJU3RyaW5nIGlkID0gZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpOwotCQkJaWYgKGZlYXR1cmVJZC5lcXVhbHMoaWQpKSB7Ci0JCQkJcmVzdWx0LmFkZChmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlW10pIHJlc3VsdC50b0FycmF5KG5ldyBJRmVhdHVyZVtyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmVhdHVyZVtdIGdldEluc3RhbGxlZEZlYXR1cmVzKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUZlYXR1cmVbXSBnZXRJbnN0YWxsZWRGZWF0dXJlcygKLQkJSUZlYXR1cmUgZmVhdHVyZSwKLQkJYm9vbGVhbiBvbmx5Q29uZmlndXJlZCkgewotCQlWZWN0b3IgZmVhdHVyZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRyeSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IGxvY2FsU2l0ZS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlW10gaXNpdGVzID0gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOwotCQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCVN0cmluZyBpZCA9IHZpZC5nZXRJZGVudGlmaWVyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGlzaXRlID0gaXNpdGVzW2ldOwotCQkJCUlGZWF0dXJlW10gcmVzdWx0ID0KLQkJCQkJVXBkYXRlVUkuc2VhcmNoU2l0ZShpZCwgaXNpdGUsIG9ubHlDb25maWd1cmVkKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZSBpbnN0YWxsZWRGZWF0dXJlID0gcmVzdWx0W2pdOwotCQkJCQlmZWF0dXJlcy5hZGQoaW5zdGFsbGVkRmVhdHVyZSk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gKElGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IElGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgYXV0aGVudGljYXRvci4KLQkgKiBAcmV0dXJuIFJldHVybnMgYSBVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvcgotCSAqLwotCXB1YmxpYyBVcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvciBnZXRBdXRoZW50aWNhdG9yKCkgewotCQlyZXR1cm4gYXV0aGVudGljYXRvcjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRPcmlnaW5hdGluZ1VSTChTdHJpbmcgaWQpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBnZXRPcmlnaW5hdGluZ1VSTFNlY3Rpb24oKTsKLQkJU3RyaW5nIHZhbHVlID0gc2VjdGlvbi5nZXQoaWQpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTCh2YWx1ZSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRPcmlnaW5hdGluZ1VSTChTdHJpbmcgaWQsIFVSTCB1cmwpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBnZXRPcmlnaW5hdGluZ1VSTFNlY3Rpb24oKTsKLQkJc2VjdGlvbi5wdXQoaWQsIHVybC50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJRGlhbG9nU2V0dGluZ3MgZ2V0T3JpZ2luYXRpbmdVUkxTZWN0aW9uKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKCJvcmlnaW5hdGluZ1VSTHMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2VjdGlvbiA9PSBudWxsKQotCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oIm9yaWdpbmF0aW5nVVJMcyIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCQotCS8qKgotCSAqIFByb21wdHMgdGhlIHVzZXIgdG8gcmVzdGFydAotCSAqIEBwYXJhbSByZXN0YXJ0SXNSZWFsbHlOZWVkZWQgdHJ1ZSB3aGVuIGEgcmVzdGFydCBpcyBuZWVkZWQsIGZhbHNlIGlmIHRoZSB1c2VyIGZlZWxzIGx1Y2t5ICh0bSkgYW5kIHdhbnRzIHRoZSBjaGFuZ2VzCi0JICogYXBwbGllZCB0byB0aGUgY3VycmVudCBjb25maWcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFJlc3RhcnQoYm9vbGVhbiByZXN0YXJ0SXNSZWFsbHlOZWVkZWQpIHsKLQkJYm9vbGVhbiByZXN0YXJ0ID0KLQkJCVJlc3RhcnREaWFsb2cub3BlblF1ZXN0aW9uKAotCQkJCWdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJcmVzdGFydElzUmVhbGx5TmVlZGVkKTsKLQkJaWYgKHJlc3RhcnQpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLnJlc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2hvd1VSTChTdHJpbmcgdXJsKSB7Ci0JCXNob3dVUkwodXJsLCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93VVJMKFN0cmluZyB1cmwsIGJvb2xlYW4gZW5jb2RlSG9zdEFuZFBvcnQpIHsKLQkJaWYgKGVuY29kZUhvc3RBbmRQb3J0KQotCQkJdXJsID0gZW5jb2RlSG9zdEFuZFBvcnQodXJsKTsKLQotCQlpZiAoU1dULmdldFBsYXRmb3JtKCkuZXF1YWxzKCJ3aW4zMiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVByb2dyYW0ubGF1bmNoKHVybCk7Ci0JCX0gZWxzZSB7Ci0JCQlJQnJvd3NlciBicm93c2VyID0gQnJvd3Nlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVCcm93c2VyKCk7Ci0JCQl0cnkgewotCQkJCWJyb3dzZXIuZGlzcGxheVVSTCh1cmwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZW5jb2RlSG9zdEFuZFBvcnQoU3RyaW5nIHVybE5hbWUpIHsKLQkJU3RyaW5nIGNhbGxiYWNrVVJMID0gZ2V0Q2FsbGJhY2tVUkxBc1N0cmluZygpOwotCQlpZiAoY2FsbGJhY2tVUkwgPT0gbnVsbCkKLQkJCXJldHVybiB1cmxOYW1lOwotCQlTdHJpbmcgY2FsbGJhY2tQYXJhbWV0ZXIgPSAidXBkYXRlVVJMPSIgKyBjYWxsYmFja1VSTDsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsTmFtZS5pbmRleE9mKCc/JykgIT0gLTEpCi0JCQlyZXR1cm4gdXJsTmFtZSArICImIiArIGNhbGxiYWNrUGFyYW1ldGVyOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXJldHVybiB1cmxOYW1lICsgIj8iICsgY2FsbGJhY2tQYXJhbWV0ZXI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENhbGxiYWNrVVJMQXNTdHJpbmcoKSB7Ci0JCVN0cmluZyBob3N0ID0gZ2V0RGVmYXVsdCgpLmdldEFwcFNlcnZlckhvc3QoKTsKLQkJaW50IHBvcnQgPSBnZXREZWZhdWx0KCkuZ2V0QXBwU2VydmVyUG9ydCgpOwotCQlpZiAoaG9zdCA9PSBudWxsIHx8IHBvcnQgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIHsKLQkJCVN0cmluZyB2YWx1ZSA9Ci0JCQkJImh0dHA6Ly8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBob3N0Ci0JCQkJCSsgIjoiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBwb3J0Ci0JCQkJCSsgIi8iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBXRUJfQVBQX0lECi0JCQkJCSsgIi9pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQl2YWx1ZSA9IFVSTEVuY29kZXIuZW5jb2RlKHZhbHVlLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldFJlbWluZE9uQ2FuY2VsKCkgewotCQlyZXR1cm4gcmVtaW5kT25DYW5jZWw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1pbmRPbkNhbmNlbChib29sZWFuIHJlbWluZCkgewotCQlyZW1pbmRPbkNhbmNlbCA9IHJlbWluZDsgCi0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VwZGF0ZVVJSW1hZ2VzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlJbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwZTUxYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlJbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBhbGwgaW1hZ2VzIHVzZWQgYnkgdGhlIFBERSBwbHVnaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVVSUltYWdlcyB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJQ09OU19QQVRIID0gImljb25zLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFNldCBvZiBwcmVkZWZpbmVkIEltYWdlIERlc2NyaXB0b3JzLgotCSAqLwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX09CSj0gSUNPTlNfUEFUSCsib2JqMTYvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1ZJRVcgPSBJQ09OU19QQVRIKyJldmlldzE2LyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MQ0w9IElDT05TX1BBVEgrImVsY2wxNi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfTENMX0RJU0FCTEVEPSBJQ09OU19QQVRIKyJkbGNsMTYvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX09WUiA9IElDT05TX1BBVEggKyAib3ZyMTYvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX1dJWkJBTiA9IElDT05TX1BBVEggKyAid2l6YmFuLyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX0ZPUk1TID0gSUNPTlNfUEFUSCArICJmb3Jtcy8iOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIEZyZXF1ZW50bHkgdXNlZCBpbWFnZXMKLQkgKi8KLQotCS8qKgotCSAqIE9CSjE2Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19BUFBfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiYXBwX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQkZPTERFUl9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJiZm9sZGVyX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQ0FURUdPUllfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiY2F0ZWdvcnlfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiY29uZmlnX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRkVBVFVSRV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJmZWF0dXJlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRUZJWF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJlZml4Ml9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0hJU1RPUllfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAiaGlzdG9yeV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0xTSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgImxzaXRlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUFNJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAicHNpdGVfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19FU0lURV9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJlc2l0ZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NJVEVfT0JKID0gY3JlYXRlKFBBVEhfT0JKLCAic2l0ZV9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1dFQl9TSVRFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIndlYl9ia21ya19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VOQ09ORl9GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgInVuY29uZl9mZWF0dXJlX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFU19PQkogPSBjcmVhdGUoUEFUSF9PQkosICJ1cGRhdGVzX29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfTk9USU5TVF9GRUFUVVJFX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIm5vdGluc3RhbGxlZF9mZWF0dXJlX29iai5naWYiKTsJIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0VSUl9TVF9PQkogPSBjcmVhdGUoUEFUSF9PQkosICJlcnJvcl9zdF9vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX09LX1NUX09CSiA9IGNyZWF0ZShQQVRIX09CSiwgIm9rX3N0X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JCi0JLyoqCi0JICogT1ZSMTYKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0xJTktFRF9DTyAgID0gY3JlYXRlKFBBVEhfT1ZSLCAibGlua2VkX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VUERBVEVEX0NPICAgPSBjcmVhdGUoUEFUSF9PVlIsICJ1cGRhdGVkX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMQUJMRV9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImluc3RhbGxhYmxlX2NvLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DVVJSRU5UX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiY3VycmVudF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfRVJST1JfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJlcnJvcl9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfV0FSTklOR19DTyA9IGNyZWF0ZShQQVRIX09WUiwgIndhcm5pbmdfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX01PRF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgIm1vZF9jby5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfQUREX0NPID0gY3JlYXRlKFBBVEhfT1ZSLCAiYWRkX3N0YXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX0RFTF9DTyA9IGNyZWF0ZShQQVRIX09WUiwgImRlbF9zdGF0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19VTkNPTkZfQ08gPSBjcmVhdGUoUEFUSF9PVlIsICJ1bmNvbmZpZ3VyZWRfY28uZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFZJRVcxNgotCSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdTX1ZJRVcgPSBjcmVhdGUoUEFUSF9WSUVXLCAiY29uZmlncy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTENMCi0JICovCi0KLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19VTkNPTkYgPSBjcmVhdGUoUEFUSF9MQ0wsICJzaG93X3VuY29uZi5naWYiKTsgLy8kTk9OLU5MUy0xJAotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19TSE9XX1VOQ09ORl9IID0gY3JlYXRlKFBBVEhfTENMX0hPVkVSLCAic2hvd191bmNvbmYuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19VTkNPTkZfRCA9IGNyZWF0ZShQQVRIX0xDTF9ESVNBQkxFRCwgInNob3dfdW5jb25mLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT0xMQVBTRV9BTEwgPSBjcmVhdGUoUEFUSF9MQ0wsICJjb2xsYXBzZWFsbC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfU0hPV19ISUVSQVJDSFkgPSBjcmVhdGUoUEFUSF9MQ0wsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1NIT1dfSElFUkFSQ0hZX0QgPSBjcmVhdGUoUEFUSF9MQ0xfRElTQUJMRUQsICJoaWVyYXJjaGljYWxMYXlvdXQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFdJWgotCSAqLwotLy8JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19JTlNUQUxMX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJpbnN0YWxsX3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfVVBEQVRFX1dJWiAgPSBjcmVhdGUoUEFUSF9XSVpCQU4sICJ1cGRhdGVfd2l6LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgREVTQ19DT05GSUdfV0laICA9IGNyZWF0ZShQQVRIX1dJWkJBTiwgImNvbmZpZ193aXouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNDX1VOSU5TVEFMTF9XSVogID0gY3JlYXRlKFBBVEhfV0laQkFOLCAidW5pbnN0YWxsX3dpei5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSU5TVEFMTF9CQU5ORVIgID0gY3JlYXRlKFBBVEhfV0laQkFOLCAiZGVmX3dpemJhbi5qcGciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfUFJPVklERVIgPSBjcmVhdGUoUEFUSF9GT1JNUywgImRlZl9wcm92aWRlci5qcGciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFU0NfSVRFTSA9IGNyZWF0ZShQQVRIX0ZPUk1TLCAidG9waWMuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tVVJMKG1ha2VJbWFnZVVSTChwcmVmaXgsIG5hbWUpKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIFVSTCBtYWtlSW1hZ2VVUkwoU3RyaW5nIHByZWZpeCwgU3RyaW5nIG5hbWUpIHsKLQkJdHJ5IHsKLQkJCVVSTCBiYXNlID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHByZWZpeCk7Ci0JCQlyZXR1cm4gbmV3IFVSTChiYXNlLCBuYW1lKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVXBkYXRlVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmEyOTEwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VcGRhdGVVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotIyANCi0jIENvbnRyaWJ1dG9yczoNCi0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQotIyANCi0jDQotIw0KLVJlc3RhcnRUaXRsZSA9IEluc3RhbGwvVXBkYXRlDQotUmVzdGFydE1lc3NhZ2UgPSBZb3Ugd2lsbCBuZWVkIHRvIHJlc3RhcnQgdGhlIHdvcmtiZW5jaCBmb3IgdGhlIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QuIFwNCi1Xb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IG5vdz8NCi0NCi1PcHRpb25hbFJlc3RhcnRNZXNzYWdlID0gSXQgaXMgcmVjb21tZW5kZWQgeW91IHJlc3RhcnQgdGhlIHdvcmtiZW5jaCBmb3IgdGhlIGNoYW5nZXMgdG8gdGFrZSBlZmZlY3QsIFwNCi1idXQgaXQgbWF5IGJlIHBvc3NpYmxlIHRvIGFwcGx5IHRoZSBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gd2l0aG91dCByZXN0YXJ0aW5nLlwNCi1Xb3VsZCB5b3UgbGlrZSB0byByZXN0YXJ0IG5vdz8NCi0NCi1BcHBseUNoYW5nZXM9QXBwbHkgQ2hhbmdlcw0KLQ0KLUFkZEJvb2ttYXJrc0FjdGlvbi5hZGQ9QWRkIEJvb2ttYXJrLi4uDQotQWRkQm9va21hcmtzQWN0aW9uLm5ldz1OZXcgQm9va21hcmsNCi0NCi1Db25maWd1cmF0aW9uTWFuYWdlckFjdGlvbi50aXRsZT1Qcm9kdWN0IENvbmZpZ3VyYXRpb24NCi1Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvdy5maWxlTWVudT0mRmlsZQ0KLUNvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93LnByb3BlcnRpZXM9JlByb3BlcnRpZXMNCi1Db25maWd1cmF0aW9uTWFuYWdlcldpbmRvdy5jbG9zZT0mQ2xvc2UNCi0NCi1FZGl0Qm9va21hcmtzQWN0aW9uLmVkaXQ9RWRpdCBCb29rbWFya3MuLi4NCi1FZGl0Qm9va21hcmtzQWN0aW9uLnRpdGxlPUJvb2ttYXJrcw0KLQ0KLUluc3RhbGxXaXphcmRBY3Rpb24udGl0bGU9SW5zdGFsbC9VcGRhdGUNCi1JbnN0YWxsV2l6YXJkLnJldHJ5VGl0bGUgPSBQcm9ibGVtIG9jY3VycmVkDQotSW5zdGFsbFdpemFyZC5yZXRyeSA9IERvIHlvdSB3YW50IHRvIHJldHJ5Pw0KLQ0KLVdlYkJvb2ttYXJrc0RpYWxvZy5sYWJlbD1DdXJyZW50IEJvb2ttYXJrczoNCi1XZWJCb29rbWFya3NEaWFsb2cuYWRkPUFkZC4uLg0KLVdlYkJvb2ttYXJrc0RpYWxvZy5uZXc9TmV3IEJvb2ttYXJrDQotV2ViQm9va21hcmtzRGlhbG9nLmVkaXQ9RWRpdC4uLg0KLVdlYkJvb2ttYXJrc0RpYWxvZy5lZGl0VGl0bGU9RWRpdCBCb29rbWFyaw0KLVdlYkJvb2ttYXJrc0RpYWxvZy5yZW1vdmU9UmVtb3ZlDQotDQotRGlzY292ZXJ5Rm9sZGVyLm5hbWU9U2l0ZXMgdG8gVmlzaXQNCi1GZWF0dXJlQWRhcHRlci5mYWlsdXJlPTxmYWlsdXJlPg0KLVNpdGVCb29rbWFyay5jb25uZWN0aW5nID0gQ29ubmVjdGluZyB0byAiezB9Ii4uLg0KLVNpdGVCb29rbWFyay5kb3dubG9hZGluZyA9IERvd25sb2FkaW5nOlwgDQotU2l0ZUNhdGVnb3J5Lm90aGVyLmxhYmVsID0gT3RoZXINCi1TaXRlQ2F0ZWdvcnkub3RoZXIuZGVzY3JpcHRpb24gPSBGZWF0dXJlcyBmb3VuZCB1bmRlciB0aGlzIGNhdGVnb3J5IGFyZSBlaXRoZXIgbm90IGNhdGVnb3JpemVkIG9yIHRoZWlyIGNhdGVnb3JpZXMgY291bGQgbm90IGJlIGZvdW5kIG9uIHNlcnZlci4NCi0NCi1NYWluUHJlZmVyZW5jZVBhZ2UuY2hlY2tTaWduYXR1cmUgPSBDaGVjayBkaWdpdGFsICZzaWduYXR1cmVzIG9mIGRvd25sb2FkZWQgYXJjaGl2ZXMNCi1NYWluUHJlZmVyZW5jZVBhZ2UuaGlzdG9yeVNpemUgPSAmTWF4aW11bSBudW1iZXIgb2YgJ0hpc3RvcnknIGNvbmZpZ3VyYXRpb25zOg0KLU1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucyA9IFZhbGlkIHVwZGF0ZXMNCi1NYWluUHJlZmVyZW5jZVBhZ2UudXBkYXRlVmVyc2lvbnMuZXF1aXZhbGVudCA9IGUmcXVpdmFsZW50ICgxLjAuMSAtPiAxLjAuMiAtIG9ubHkgc2VydmljZSBpbmNyZW1lbnRzKQ0KLU1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucy5jb21wYXRpYmxlID0gJmNvbXBhdGlibGUgKDEuMC45IC0+IDEuMS4wIC0gc2VydmljZSBhbmQgbWlub3IgaW5jcmVtZW50cykNCi1NYWluUHJlZmVyZW5jZVBhZ2UudXBkYXRlUG9saWN5ID0gJlVwZGF0ZSBQb2xpY3kNCi1NYWluUHJlZmVyZW5jZVBhZ2UudXBkYXRlUG9saWN5VVJMID0gUG8mbGljeSBVUkw6DQotTWFpblByZWZlcmVuY2VQYWdlLnByb3h5R3JvdXAgPSBQcm94eSBzZXR0aW5ncw0KLU1haW5QcmVmZXJlbmNlUGFnZS5lbmFibGVIdHRwUHJveHkgPSBFJm5hYmxlIEhUVFAgcHJveHkgY29ubmVjdGlvbg0KLU1haW5QcmVmZXJlbmNlUGFnZS5odHRwUHJveHlIb3N0ID0gJkhUVFAgcHJveHkgaG9zdCBhZGRyZXNzOg0KLU1haW5QcmVmZXJlbmNlUGFnZS5odHRwUHJveHlQb3J0ID0gIEhUVFAgJnByb3h5IGhvc3QgcG9ydDoNCi1NYWluUHJlZmVyZW5jZVBhZ2UuZGlnaXRhbFNpZ25hdHVyZS50aXRsZSA9IERpZ2l0YWwgU2lnbmF0dXJlIENoZWNrDQotTWFpblByZWZlcmVuY2VQYWdlLmRpZ2l0YWxTaWduYXR1cmUubWVzc2FnZSA9IFlvdSBoYXZlIGNob3NlbiB0byBkaXNhYmxlIGRpZ2l0YWwgc2lnbmF0dXJlIFwNCi1jaGVja3MgZm9yIGRvd25sb2FkZWQgYXJjaGl2ZXMuIE5vdGUgdGhhdCB1bnNpZ25lZCBhcmNoaXZlcyBtYXkgXA0KLWNvbnRhaW4gc29mdHdhcmUgdGhhdCBjYW4gaGFybSB5b3VyIGNvbXB1dGVyLg0KLQ0KLVVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuZGVzY3JpcHRpb249U2V0dGluZ3MgZm9yIGF1dG9tYXRpYyBmZWF0dXJlIHVwZGF0ZQ0KLVVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UubGFiZWw9QWRkcmVzcyAmTWFwcGluZ3MgVVJMOg0KLVVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuaW52YWxpZD1JbnZhbGlkIG1hcHBpbmdzIFVSTA0KLQ0KLUNvbmZpZ3VyYXRpb25BY3Rpdml0aWVzUHJvcGVydHlQYWdlLmxhYmVsPUFjdGl2aXRpZXMgdGhhdCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoaXMgY29uZmlndXJhdGlvbjoNCi0NCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5wYXRoPUxvY2F0aW9uIHBhdGg6IA0KLUNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnR5cGU9TG9jYXRpb24gdHlwZTogDQotQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UuZW5hYmxlZD1FbmFibGVkOiANCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS55ZXM9eWVzDQotQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2Uubm89bm8NCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5wcml2YXRlPXByaXZhdGUNCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5leHRlbnNpb249cHJvZHVjdCBleHRlbnNpb24NCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5wcm9kdWN0PXByb2R1Y3QNCi1Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS51bmtub3duPXVua25vd24NCi0NCi1GZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlLnNob3dJbkJyb3dzZXI9U2hvdyBpbiBCcm93c2VyDQotRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZS5ub0NvcHlyaWdodD1GZWF0dXJlIGRvZXMgbm90IGNvbnRhaW4gYSBjb3B5cmlnaHQgc3RhdGVtZW50DQotDQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UubmFtZT1OYW1lOg0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmlkPUlkZW50aWZpZXI6DQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UudmVyc2lvbj1WZXJzaW9uOg0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLnByb3ZpZGVyPVByb3ZpZGVyOg0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLnNpemU9U2l6ZToNCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5wbGF0Zm9ybXM9U3VwcG9ydGVkIFBsYXRmb3Jtcw0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLndzPVdpbmRvd2luZyBTeXN0ZW06IA0KLUZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmFyY2g9Q1BVIEFyY2hpdGVjdHVyZTogDQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Uubmw9TGFuZ3VhZ2VzOiANCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5hbGw9YWxsDQotRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Uub3M9T3BlcmF0aW5nIFN5c3RlbToNCi1GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5kZXNjPURlc2NyaXB0aW9uDQotDQotRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Uuc2hvd0luQnJvd3Nlcj1TaG93IGluIEJyb3dzZXINCi1GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZS5ub0xpY2Vuc2U9RmVhdHVyZSBkb2VzIG5vdCBjb250YWluIGEgbGljZW5zZS4NCi0NCi1GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLnBlbmRpbmdDaGFuZ2VzPVRoZSBmZWF0dXJlIGhhcyBwZW5kaW5nIGNoYW5nZXMuICBUaGVyZWZvcmUsIGl0cyBzdGF0dXMgY2Fubm90IGJlIGRldGVybWluZWQgdW50aWwgeW91IHJlc3RhcnQgdGhlIHdvcmtiZW5jaC4NCi1GZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlLnJlYXNvbj1SZWFzb246DQotRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5taXNzaW5nT3B0aW9uYWw9VGhpcyBvcHRpb25hbCBmZWF0dXJlIGlzIGN1cnJlbnRseSBub3QgaW5zdGFsbGVkLg0KLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UubWlzc2luZz1SZWZlcmVuY2VkIGZlYXR1cmUgbm90IGZvdW5kLg0KLUZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UuZ29vZENvbmZpZ3VyYXRpb249VGhlIGZlYXR1cmUgaXMgY29uZmlndXJlZCBwcm9wZXJseS4NCi0NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cud3RpdGxlID0gSmFyIFZlcmlmaWNhdGlvbg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5UaXRsZT0gRmVhdHVyZSB2ZXJpZmljYXRpb24NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuVmVyaWZpY2F0aW9uPVZlcmlmaWNhdGlvbg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Db21wb25lbnROb3RJbnN0YWxsZWQ9VGhpcyBmZWF0dXJlIHdpbGwgbm90IGJlIGluc3RhbGxlZC4NCi0NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQWJvdXRUb0luc3RhbGwuRmlsZT1XYXJuaW5nOiBZb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYW4gdW5zaWduZWQgZmVhdHVyZSBmaWxlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Ob3REaWdpdGFsbHlTaWduZWQuRmlsZT0gV2FybmluZzogVGhpcyBmZWF0dXJlIGZpbGUgaGFzIG5vdCBiZWVuIGRpZ2l0YWxseSBzaWduZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbm5vdFZlcmlmeVByb3ZpZGVyLkZpbGU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBmaWxlIGNhbm5vdCBiZSB2ZXJpZmllZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuQ29ycnVwdGVkQ29udGVudC5GaWxlPVRoZSBjb250ZW50IG9mIHRoaXMgZmVhdHVyZSBmaWxlIGhhcyBiZWVuIGNvcnJ1cHRlZA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5TaWduZWRDb21wb25lbnQuRmlsZT1Zb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYSBzaWduZWQgZmVhdHVyZSBmaWxlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Vbmtub3duQ2VydGlmaWNhdGUuRmlsZT1UaGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgZmVhdHVyZSBmaWxlIGFyZSBub3QgcmVjb2duaXplZC4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuVW5hYmxlVG9WZXJpZnlQcm92aWRlci5GaWxlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgZmlsZSBjYW5ub3QgYmUgdmVyaWZpZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlByb3ZpZGVyS25vd24uRmlsZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGZpbGUgaGFzIGJlZW4gdmFsaWRhdGVkIGJ5IGEgdHJ1c3RlZCB0aGlyZCBwYXJ0eS4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuS25vd25DZXJ0aWZpY2F0ZS5GaWxlPU9uZSBvZiB0aGUgY2VydGlmaWNhdGVzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoaXMgZmVhdHVyZSBmaWxlIHdhcyByZWNvZ25pemVkLg0KLQ0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5BYm91dFRvSW5zdGFsbC5GZWF0dXJlPVdhcm5pbmc6IFlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhbiB1bnNpZ25lZCBmZWF0dXJlLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Ob3REaWdpdGFsbHlTaWduZWQuRmVhdHVyZT0gV2FybmluZzogVGhpcyBmZWF0dXJlIGhhcyBub3QgYmVlbiBkaWdpdGFsbHkgc2lnbmVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5DYW5ub3RWZXJpZnlQcm92aWRlci5GZWF0dXJlPVRoZSBwcm92aWRlciBvZiB0aGlzIGZlYXR1cmUgY2Fubm90IGJlIHZlcmlmaWVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Db3JydXB0ZWRDb250ZW50LkZlYXR1cmU9VGhlIGNvbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIGNvcnJ1cHRlZA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5TaWduZWRDb21wb25lbnQuRmVhdHVyZT1Zb3UgYXJlIGFib3V0IHRvIGluc3RhbGwgYSBzaWduZWQgZmVhdHVyZS4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuVW5rbm93bkNlcnRpZmljYXRlLkZlYXR1cmU9VGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgYXJlIG5vdCByZWNvZ25pemVkLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5VbmFibGVUb1ZlcmlmeVByb3ZpZGVyLkZlYXR1cmU9VGhlIHByb3ZpZGVyIG9mIHRoaXMgZmVhdHVyZSBjYW5ub3QgYmUgdmVyaWZpZWQuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlByb3ZpZGVyS25vd24uRmVhdHVyZT1UaGUgcHJvdmlkZXIgb2YgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIHZhbGlkYXRlZCBieSBhIHRydXN0ZWQgdGhpcmQgcGFydHkuDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLktub3duQ2VydGlmaWNhdGUuRmVhdHVyZT1PbmUgb2YgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGZlYXR1cmUgd2FzIHJlY29nbml6ZWQuDQotDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhdXRpb249XHJcbkNhdXRpb246IFwiezB9XCIgYXNzZXJ0cyB0aGF0IHRoZSBjb250ZW50IG9mIHRoaXMgZmVhdHVyZSBpcyBzYWZlLiBcclxuWW91IHNob3VsZCBvbmx5IGluc3RhbGwgdGhpcyBmZWF0dXJlIGlmIHlvdSB0cnVzdCBcInswfVwiIHRvIG1ha2UgdGhhdCBhc3NlcnRpb24NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuRmlsZU5hbWU9RmlsZSBJZGVudGlmaWVyOg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5GZWF0dXJlTmFtZT1GZWF0dXJlIG5hbWU6DQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZlYXR1cmVJZGVudGlmaWVyPUZlYXR1cmUgSWRlbnRpZmllcjoNCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuUHJvdmlkZXI9CVByb3ZpZGVyOg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5NYXlDaG9vc2VUb0luc3RhbGw9WW91IG1heSBjaG9vc2UgdG8gaW5zdGFsbCB0aGUgZmVhdHVyZSBvciBjYW5jZWwgaXRzIGluc3RhbGxhdGlvbi4NCi1KYXJWZXJpZmljYXRpb25EaWFsb2cuTWF5Q2hvb3NlVG9Db250aW51ZT1Zb3UgbWF5IGNob29zZSB0byBjb250aW51ZSB0byBpbnN0YWxsIHRoZSBmZWF0dXJlIG9yIGNhbmNlbCBpdHMgaW5zdGFsbGF0aW9uLg0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5JbnN0YWxsPSZJbnN0YWxsDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlPUMmb250aW51ZQ0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5DYW5jZWw9JkNhbmNlbA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5Sb290Q0E9IEFjY29yZGluZyB0bzogDQotSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlN1YmplY3RDQT0gRmlsZSBzaWduZWQgYnk6IA0KLUphclZlcmlmaWNhdGlvbkRpYWxvZy5DZXJ0aWZpY2F0ZUluZm89IENlcnRpZmljYXRlOg0KLQ0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuUGFzc3dvcmRSZXF1aXJlZD1QYXNzd29yZCBSZXF1aXJlZA0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuQ29ubmVjdFRvPUNvbm5lY3QgdG86IA0KLVVzZXJWZXJpZmljYXRpb25EaWFsb2cuUGFzc3dvcmQ9UGFzc3dvcmQ6DQotVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5Vc2VyTmFtZT1Vc2VyIG5hbWU6DQotDQotQ29uZmlndXJhdGlvblByZXZpZXdGb3JtLmNvbmZpZ0Rlc2NyaXB0aW9uPVRoaXMgaXMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uDQotQ29uZmlndXJhdGlvblByZXZpZXdGb3JtLmluc3RhbGw9SW5zdGFsbCBMb2NhdGlvbg0KLQ0KLUNvbmZpZ3VyYXRpb25WaWV3Lm1pc3NpbmdGZWF0dXJlID0gezB9IChub3QgaW5zdGFsbGVkKQ0KLUNvbmZpZ3VyYXRpb25WaWV3LmN1cnJlbnQ9Q3VycmVudCBDb25maWd1cmF0aW9uDQotQ29uZmlndXJhdGlvblZpZXcucGVuZGluZz1cIChwZW5kaW5nIGNoYW5nZXMpDQotQ29uZmlndXJhdGlvblZpZXcuZXJyb3I9RXJyb3INCi1Db25maWd1cmF0aW9uVmlldy5jb2xsYXBzZUxhYmVsPUNvbGxhcHNlIEFsbA0KLUNvbmZpZ3VyYXRpb25WaWV3LmNvbGxhcHNlVG9vbHRpcD1Db2xsYXBzZSBBbGwNCi1Db25maWd1cmF0aW9uVmlldy5yZXZlcnRMYWJlbD1SZXZlcnQuLi4NCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsSGlzdG9yeSA9SW5zdGFsbGF0aW9uIEhpc3RvcnkNCi1Db25maWd1cmF0aW9uVmlldy5leHRMb2NhdGlvbj1FeHRlbnNpb24gTG9jYXRpb24uLi4NCi1Db25maWd1cmF0aW9uVmlldy51bmluc3RhbGw9VW5pbnN0YWxsDQotQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbD1JbnN0YWxsDQotQ29uZmlndXJhdGlvblZpZXcuYW5vdGhlclZlcnNpb249JkFub3RoZXIgVmVyc2lvbi4uLg0KLUNvbmZpZ3VyYXRpb25WaWV3LmZpbmRVcGRhdGVzPUZpbmQgVXBkYXRlcy4uLg0KLUNvbmZpZ3VyYXRpb25WaWV3LnNob3dOZXN0ZWRGZWF0dXJlcz1TaG93IE5lc3RlZCBGZWF0dXJlcw0KLUNvbmZpZ3VyYXRpb25WaWV3LnNob3dOZXN0ZWRUb29sdGlwPVNob3cgTmVzdGVkIEZlYXR1cmVzDQotQ29uZmlndXJhdGlvblZpZXcuc2hvd0luc3RhbGw9U2hvdyBJbnN0YWxsIExvY2F0aW9ucw0KLUNvbmZpZ3VyYXRpb25WaWV3LnNob3dJbnN0YWxsVG9vbHRpcD1TaG93IEluc3RhbGwgTG9jYXRpb25zDQotQ29uZmlndXJhdGlvblZpZXcuc2hvd0Rpc2FibGVkPVNob3cgRGlzYWJsZWQgRmVhdHVyZXMNCi1Db25maWd1cmF0aW9uVmlldy5zaG93RGlzYWJsZWRUb29sdGlwPVNob3cgRGlzYWJsZWQgRmVhdHVyZXMNCi1Db25maWd1cmF0aW9uVmlldy5uZXc9TmV3DQotQ29uZmlndXJhdGlvblZpZXcucmVwbGFjZVdpdGg9UmVwbGFjZSB3aXRoDQotQ29uZmlndXJhdGlvblZpZXcucmV2ZXJ0UHJldmlvdXNMYWJlbD1SZXZlcnQgdG8gUHJldmlvdXMNCi1Db25maWd1cmF0aW9uVmlldy5yZXZlcnRQcmV2aW91c0Rlc2M9WW91IGNhbiByZXZlcnQgdG8gb25lIG9mIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9ucyBpZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyB3aXRoIHRoZSBjdXJyZW50IG9uZS4NCi1Db25maWd1cmF0aW9uVmlldy51cGRhdGVMYWJlbD1TY2FuIGZvciBVcGRhdGVzDQotQ29uZmlndXJhdGlvblZpZXcudXBkYXRlRGVzYz1TZWFyY2ggZm9yIHVwZGF0ZXMgZm9yIGFsbCB0aGUgaW5zdGFsbGVkIGZlYXR1cmVzLg0KLUNvbmZpZ3VyYXRpb25WaWV3LmRldGVjdGVkQ2hhbmdlcz1EZXRlY3RlZCBDaGFuZ2VzLi4uDQotQ29uZmlndXJhdGlvblZpZXcuZGV0ZWN0ZWRMYWJlbD1Qcm9jZXNzIERldGVjdGVkIENoYW5nZXMNCi1Db25maWd1cmF0aW9uVmlldy5kZXRlY3RlZERlc2M9UHJvY2VzcyBjb25maWd1cmF0aW9uIGNoYW5nZXMgdGhhdCB3ZXJlIGRldGVjdGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIuDQotQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbEhpc3RMYWJlbD1WaWV3IEluc3RhbGxhdGlvbiBIaXN0b3J5DQotQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbEhpc3REZXNjPVZpZXcgYWxsIGFjdGl2aXRpZXMgc2luY2UgdGhlIGluc3RhbGxhdGlvbiBvZiB0aGUgcHJvZHVjdC4NCi1Db25maWd1cmF0aW9uVmlldy5hY3Rpdml0aWVzTGFiZWw9U2hvdyBBY3Rpdml0aWVzDQotQ29uZmlndXJhdGlvblZpZXcuYWN0aXZpdGllc0Rlc2M9VmlldyB0aGUgYWN0aXZpdGllcyB0aGF0IGNhdXNlZCB0aGUgY3JlYXRpb24gb2YgdGhpcyBjb25maWd1cmF0aW9uLg0KLUNvbmZpZ3VyYXRpb25WaWV3LmVuYWJsZUxvY0Rlc2M9WW91IGNhbiBlbmFibGUgb3IgZGlzYWJsZSBhbiBlbnRpcmUgaW5zdGFsbCBsb2NhdGlvbi4gRGlzYWJsaW5nIGEgbG9jYXRpb24gaXMgZXF1aXZhbGVudCB0byBkaXNhYmxpbmcgZXZlcnkgZmVhdHVyZSBpbiBpdC4NCi1Db25maWd1cmF0aW9uVmlldy5leHRMb2NMYWJlbD1BZGQgYW4gRXh0ZW5zaW9uIExvY2F0aW9uDQotQ29uZmlndXJhdGlvblZpZXcuZXh0TG9jRGVzYz1Mb2NhdGUgYW5kIGFkZCBhbiBleHRlbnNpb24gbG9jYXRpb24gdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4gQW4gZXh0ZW5zaW9uIGxvY2F0aW9uIGNvbnRhaW5zIGZlYXR1cmVzIGFuZCBwbHVnaW5zIHByZXZpb3VzbHkgaW5zdGFsbGVkLg0KLUNvbmZpZ3VyYXRpb25WaWV3LnByb3BlcnRpZXNMYWJlbD1TaG93IFByb3BlcnRpZXMNCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsUHJvcERlc2M9VmlldyB0aGUgcHJvcGVydGllcyBvZiB0aGUgaW5zdGFsbCBsb2NhdGlvbi4NCi1Db25maWd1cmF0aW9uVmlldy5yZXBsYWNlVmVyc2lvbkxhYmVsPVJlcGxhY2UgV2l0aCBBbm90aGVyIFZlcnNpb24NCi1Db25maWd1cmF0aW9uVmlldy5yZXBsYWNlVmVyc2lvbkRlc2M9RGlzYWJsZXMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBhbmQgcmVwbGFjZXMgaXQgd2l0aCBhbm90aGVyIHZlcnNpb24gZnJvbSB0aGUgbGlzdCBvZiB0aGUgY3VycmVudGx5IGRpc2FibGVkIGZlYXR1cmVzLg0KLUNvbmZpZ3VyYXRpb25WaWV3LmVuYWJsZUZlYXR1cmVEZXNjPVlvdSBjYW4gZW5hYmxlIG9yIGRpc2FibGUgYSBmZWF0dXJlLiBGdW5jdGlvbiBwcm92aWRlZCBieSB0aGUgZmVhdHVyZSB3aWxsIGJlIHJlbW92ZWQgYnV0IHRoZSBmZWF0dXJlIGl0c2VsZiB3aWxsIHN0aWxsIGJlIHByZXNlbnQgdG8gYmUgZW5hYmxlZCBsYXRlci4NCi1Db25maWd1cmF0aW9uVmlldy5pbnN0YWxsT3B0aW9uYWxMYWJlbD1JbnN0YWxsIGZyb20gT3JpZ2luYXRpbmcgU2VydmVyDQotQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbE9wdGlvbmFsRGVzYz1UaGlzIG9wdGlvbmFsIGZlYXR1cmUgd2FzIG5vdCBvcmlnaW5hbGx5IGluc3RhbGxlZC4gWW91IGNhbiBpbnN0YWxsIGl0IG5vdyBieSBjb25uZWN0aW5nIHRvIHRoZSBvcmlnaW5hdGluZyBzZXJ2ZXIgb2YgdGhlIHBhcmVudC4NCi1Db25maWd1cmF0aW9uVmlldy51bmluc3RhbGxMYWJlbD1Vbmluc3RhbGwNCi1Db25maWd1cmF0aW9uVmlldy51bmluc3RhbGxEZXNjPVRoaXMgZmVhdHVyZSBpcyBjdXJyZW50bHkgbm90IHVzZWQgYW5kIGNhbiBiZSB1bmluc3RhbGxlZCBmcm9tIHRoZSBwcm9kdWN0Lg0KLUNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbERlc2MyPVVuaW5zdGFsbCB0aGUgZmVhdHVyZSBmcm9tIHRoZSBwcm9kdWN0LiBUaGlzIHdpbGwgZGlzYWJsZSB0aGUgZmVhdHVyZSBmcm9tIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBkaXNrLg0KLUNvbmZpZ3VyYXRpb25WaWV3LnNjYW5MYWJlbD1TY2FuIGZvciBVcGRhdGVzDQotQ29uZmlndXJhdGlvblZpZXcuc2NhbkRlc2M9U2VhcmNoIGZvciB1cGRhdGVzIGZvciB0aGlzIGZlYXR1cmUuDQotQ29uZmlndXJhdGlvblZpZXcuZmVhdHVyZVByb3BMYWJlbD1TaG93IFByb3BlcnRpZXMNCi1Db25maWd1cmF0aW9uVmlldy5mZWF0dXJlUHJvcERlc2M9VmlldyBwcm9wZXJ0aWVzIG9mIHRoZSBmZWF0dXJlIHN1Y2ggYXMgdmVyc2lvbiwgcHJvdmlkZXIgbmFtZSwgbGljZW5zZSBhZ3JlZW1lbnQgZXRjLg0KLQ0KLUFjdGlvbnMuYnJva2VuQ29uZmlnUXVlc3Rpb249VGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBjb250YWlucyBlcnJvcnMgYW5kIHRoaXMgb3BlcmF0aW9uIGNhbiBoYXZlIHVucHJlZGljdGFibGUgcmVzdWx0cy4gRG8geW91IHdhbnQgdG8gY29udGludWUgPw0KLQ0KLUZlYXR1cmVTdGF0ZUFjdGlvbi5kaXNhYmxlPURpc2FibGUNCi1GZWF0dXJlU3RhdGVBY3Rpb24uZW5hYmxlPUVuYWJsZQ0KLUZlYXR1cmVTdGF0ZUFjdGlvbi5kaXNhYmxlUXVlc3Rpb249RG8geW91IHdhbnQgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmU/DQotRmVhdHVyZVN0YXRlQWN0aW9uLkVuYWJsZVF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmU/DQotRmVhdHVyZVN0YXRlQWN0aW9uLmRpYWxvZ1RpdGxlPUN1cnJlbnQgQ29uZmlndXJhdGlvbg0KLQ0KLUZlYXR1cmVVbmluc3RhbGxBY3Rpb24udW5pbnN0YWxsPVVuaW5zdGFsbA0KLUZlYXR1cmVVbmluc3RhbGxBY3Rpb24udW5pbnN0YWxsUXVlc3Rpb249RG8geW91IHdhbnQgdG8gdW5pbnN0YWxsIHRoaXMgZmVhdHVyZT8NCi1GZWF0dXJlVW5pbnN0YWxsQWN0aW9uLmRpYWxvZ1RpdGxlPUN1cnJlbnQgQ29uZmlndXJhdGlvbg0KLQ0KLVNpdGVTdGF0ZUFjdGlvbi5kaWFsb2dUaXRsZT1DdXJyZW50IENvbmZpZ3VyYXRpb24NCi1TaXRlU3RhdGVBY3Rpb24uZGlzYWJsZUxhYmVsPURpc2FibGUNCi1TaXRlU3RhdGVBY3Rpb24uZGlzYWJsZU1lc3NhZ2U9RG8geW91IHdhbnQgdG8gZGlzYWJsZSBhbGwgdGhlIGZlYXR1cmVzIGluICJ7MH0iPw0KLVNpdGVTdGF0ZUFjdGlvbi5lbmFibGVMYWJlbD1FbmFibGUNCi1TaXRlU3RhdGVBY3Rpb24uZW5hYmxlTWVzc2FnZT1EbyB5b3Ugd2FudCB0byBlbmFibGUgZmVhdHVyZXMgaW4gInswfSI/DQotDQotRmluZFVwZGF0ZXNBY3Rpb24udXBkYXRlcz1VcGRhdGVzDQotDQotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi50aXRsZT1JbnN0YWxsYXRpb24gSGlzdG9yeQ0KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uZGVzYz1UaGUgbGlzdCBiZWxvdyByZXByZXNlbnRzIHRoZSBoaXN0b3J5IG9mIHlvdXIgdXBkYXRlIGFjdGl2aXRpZXMgZnJvbSB0aGUgcHJvZHVjdCBpbnN0YWxsYXRpb24gdG8gZGF0ZS4gRWFjaCBvcGVyYXRpb24gY2FycmllcyBhIGRhdGUgaXQgY29tbWVuY2VkLCBhcyB3ZWxsIGFzIGFjdGl2aXRpZXMgcGVyZm9ybWVkLiBPcGVyYXRpb25zIGFyZSBzb3J0ZWQgYnkgZGF0ZSBpbiBhc2NlbmRpbmcgb3JkZXIuDQotSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5hY3Rpdml0eT1BQ1RJVklUWQ0KLUluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uZGF0ZVRpbWU9RGF0ZSAvIFRpbWUNCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLnRhcmdldD1UYXJnZXQNCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmFjdGlvbj1BY3Rpb24NCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLnN0YXR1cz1TdGF0dXMNCi1JbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmVycm9ycz1FcnJvcnMgd2hpbGUgY3JlYXRpbmcgaW5zdGFsbGF0aW9uIGhpc3RvcnkgZmlsZS4NCi0NCi1OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5zZWxlY3RFeHRMb2NhdGlvbj1TZWxlY3QgYW4gZXh0ZW5zaW9uIGxvY2F0aW9uLiBBbiBleHRlbnNpb24gbG9jYXRpb24gaXMgYSBkaXJlY3RvcnkgbmFtZWQgZWNsaXBzZSwgd2hpY2ggY29udGFpbnMgdGhlIC5lY2xpcHNlcHJvZHVjdCBtYXJrZXIgZmlsZSwgYXMgd2VsbCB0aGUgZmVhdHVyZXMgYW5kIHBsdWdpbnMgZm9sZGVycy4NCi1OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5leHRJbmZvVGl0bGU9SW52YWxpZCBFeHRlbnNpb24NCi1OZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5leHRJbmZvTWVzc2FnZT1TZWxlY3RlZCBsb2NhdGlvbiBkb2VzIG5vdCBjb250YWluIGEgcHJvZHVjdCBleHRlbnNpb24uIEFuIGV4dGVuc2lvbiBzaG91bGQgY29uc2lzdCBvZiBhIGRpcmVjdG9yeSBuYW1lZCBlY2xpcHNlLCB3aGljaCBjb250YWlucyBhIG1hcmtlciBmaWxlIGNhbGxlZCAuZWNsaXBzZXByb2R1Y3QgYW5kIHRoZSBmZWF0dXJlcyBhbmQgcGx1Z2lucyBmb2xkZXJzLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGxvY2F0aW9uLg0KLQ0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5lbmFibGVkPUVuYWJsZWQNCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXIuZmVhdHVyZUluc3RhbGxlZD1GZWF0dXJlIEluc3RhbGxlZA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5mZWF0dXJlUmVtb3ZlZD1GZWF0dXJlIFJlbW92ZWQNCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXIuc2l0ZUluc3RhbGxlZD1TaXRlIEluc3RhbGxlZA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5zaXRlUmVtb3ZlZD1TaXRlIFJlbW92ZWQNCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXIuZGlzYWJsZWQ9RGlzYWJsZWQNCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXIucmV2ZXJ0PVJldmVydA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5yZWNvbmNpbGU9UmVjb25jaWxlDQotQWN0aXZpdGllc1RhYmxlVmlld2VyLnVua25vd249dW5rbm93bg0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5kYXRlPURhdGUNCi1BY3Rpdml0aWVzVGFibGVWaWV3ZXIudGFyZ2V0PVRhcmdldA0KLUFjdGl2aXRpZXNUYWJsZVZpZXdlci5hY3Rpb249QWN0aW9uDQotDQotRGVsdGFGZWF0dXJlQWRhcHRlci5zaG9ydE5hbWUgPSB7MH0gKHsxfSkNCi1EZWx0YUZlYXR1cmVBZGFwdGVyLmxvbmdOYW1lID0gezB9ICh7MX0pIGluIHsyfQ0KLQ0KLUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy50aXRsZSA9IER1cGxpY2F0ZSBDb25mbGljdHMNCi1EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cubWVzc2FnZSA9IElmIHlvdSBjb250aW51ZSB3aXRoIHRoZSB1cGRhdGUvaW5zdGFsbCwgXA0KLXRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiB3aWxsIGNvbnRhaW4gZHVwbGljYXRpb24gY29uZmxpY3RzIFwNCi10aGF0IG1heSBjYXVzZSBwYXJ0cyBvZiB0aGUgcHJvZHVjdCB0byBiZSB1bnVzYWJsZS4gRG8geW91IHdhbnQgdG8gXA0KLWNvbnRpbnVlPw0KLUR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy50cmVlTGFiZWwgPSAmRGV0ZWN0ZWQgY29uZmxpY3RzOg0KLQ0KLUluc3RhbGxEZWx0YVdpemFyZC53dGl0bGUgPSBDb25maWd1cmF0aW9uIENoYW5nZXMNCi1JbnN0YWxsRGVsdGFXaXphcmQucHJvY2Vzc2luZyA9IFByb2Nlc3NpbmcgcGVuZGluZyBjaGFuZ2VzOg0KLUluc3RhbGxEZWx0YVdpemFyZC50aXRsZSA9IFBlbmRpbmcgQ29uZmlndXJhdGlvbiBDaGFuZ2VzDQotSW5zdGFsbERlbHRhV2l6YXJkLmRlc2MgPSBDaGVjayB0aGUgY2hhbmdlcyB5b3Ugd2lzaCB0byBwcm9jZXNzIG5vdy4gUmVtb3ZlIGNoYW5nZXMgdGhhdCBzaG91bGQgbmV2ZXIgYmUgcHJvY2Vzc2VkLg0KLUluc3RhbGxEZWx0YVdpemFyZC5sYWJlbCA9IERldGVjdGVkICZjaGFuZ2VzOg0KLUluc3RhbGxEZWx0YVdpemFyZC5kZWxldGUgPSAmUmVtb3ZlDQotSW5zdGFsbERlbHRhV2l6YXJkLmVycm9ycyA9ICZFcnJvciBEZXRhaWxzLi4uDQotSW5zdGFsbERlbHRhV2l6YXJkLm1lc3NhZ2UgPSBTZWxlY3RlZCB1cGRhdGUgd2lsbCByZXN1bHQgaW4gYW4gaW52YWxpZCBjb25maWd1cmF0aW9uLg0KLQ0KLU1vZGVTZWxlY3Rpb25QYWdlLnRpdGxlPUZlYXR1cmUgVXBkYXRlcw0KLU1vZGVTZWxlY3Rpb25QYWdlLmRlc2M9Q2hvb3NlIHRoZSB3YXkgeW91IHdhbnQgdG8gc2VhcmNoIGZvciBmZWF0dXJlcyB0byBpbnN0YWxsDQotTW9kZVNlbGVjdGlvblBhZ2UudXBkYXRlcz1TZWFyY2ggZm9yICZ1cGRhdGVzIG9mIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIGZlYXR1cmVzDQotTW9kZVNlbGVjdGlvblBhZ2UubmV3RmVhdHVyZXM9JlNlYXJjaCBmb3IgbmV3IGZlYXR1cmVzIHRvIGluc3RhbGwNCi0NCi1Nb3JlSW5mb0dlbmVyYXRvci5ub3RJbnN0YWxsZWQ9bm90IGluc3RhbGxlZA0KLU1vcmVJbmZvR2VuZXJhdG9yLmFsbD1hbGwNCi1Nb3JlSW5mb0dlbmVyYXRvci5saWNlbnNlPUxpY2Vuc2UNCi1Nb3JlSW5mb0dlbmVyYXRvci5IVE1MbGljZW5zZT1IVE1MIHZlcnNpb24gb2YgdGhlIGxpY2Vuc2UgYWdyZWVtZW50DQotTW9yZUluZm9HZW5lcmF0b3IubGljZW5zZUF2YWlsYWJsZT1pcyBhbHNvIGF2YWlsYWJsZS4NCi1Nb3JlSW5mb0dlbmVyYXRvci5jb3B5cmlnaHQ9Q29weXJpZ2h0DQotTW9yZUluZm9HZW5lcmF0b3IuSFRNTGNvcHlyaWdodD1IVE1MIHZlcnNpb24gb2YgdGhlIGNvcHlyaWdodA0KLU1vcmVJbmZvR2VuZXJhdG9yLmNvcHlyaWdodEF2YWlsYWJsZT1pcyBhbHNvIGF2YWlsYWJsZS4NCi1Nb3JlSW5mb0dlbmVyYXRvci5wbGF0Zm9ybXM9U3VwcG9ydGVkIFBsYXRmb3Jtcw0KLU1vcmVJbmZvR2VuZXJhdG9yLmZvb3RwcmludD1Gb290cHJpbnQNCi1Nb3JlSW5mb0dlbmVyYXRvci5kb3dubG9hZFNpemU9RG93bmxvYWQgc2l6ZToNCi1Nb3JlSW5mb0dlbmVyYXRvci5pbnN0YWxsU2l6ZT1JbnN0YWxsIHNpemU6DQotTW9yZUluZm9HZW5lcmF0b3IuZG93bmxvYWRUaW1lPUVzdGltYXRlZCBkb3dubG9hZCB0aW1lOg0KLU1vcmVJbmZvR2VuZXJhdG9yLmxlc3N0aGFub25lPWxlc3MgdGhhbiBvbmUgbWludXRlDQotTW9yZUluZm9HZW5lcmF0b3IuZGVzYz1EZXNjcmlwdGlvbg0KLU1vcmVJbmZvR2VuZXJhdG9yLm1vcmVJbmZvPU1vcmUgaW5mby4uLg0KLQ0KLU5ld1VwZGF0ZVNpdGVEaWFsb2cubmFtZT1OYW1lOiANCi1OZXdVcGRhdGVTaXRlRGlhbG9nLnVybD1VUkw6IA0KLQ0KLUluc3RhbGxXaXphcmQud3RpdGxlPUluc3RhbGwNCi1JbnN0YWxsV2l6YXJkLk9wdGlvbmFsRmVhdHVyZXNQYWdlLnRpdGxlPSBPcHRpb25hbCBGZWF0dXJlcw0KLUluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzYyA9IFNvbWUgb2YgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoaXMgZmVhdHVyZSBhcmUgb3B0aW9uYWwuDQotSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS50cmVlTGFiZWwgPSAmQXZhaWxhYmxlIG9wdGlvbmFsIGZlYXR1cmVzOg0KLUluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2Uuc2VsZWN0QWxsID0gJlNlbGVjdCBBbGwNCi1JbnN0YWxsV2l6YXJkLk9wdGlvbmFsRmVhdHVyZXNQYWdlLmRlc2VsZWN0QWxsID0gJkRlc2VsZWN0IEFsbA0KLQ0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5jb3VudGVyID0gezB9IG9mIHsxfSBzZWxlY3RlZC4NCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UudGl0bGU9U2VhcmNoIFJlc3VsdHMNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZGVzYz1TZWxlY3QgZmVhdHVyZXMgdG8gaW5zdGFsbCBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0IGxpc3QuDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmxhYmVsPVNlbGVjdCB0aGUgZmVhdHVyZXMgdG8gJmluc3RhbGw6DQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnNlbGVjdEFsbD0mU2VsZWN0IEFsbA0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5kZXNlbGVjdEFsbD0mRGVzZWxlY3QgQWxsDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLm1vcmVJbmZvPSZNb3JlIEluZm8NCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UucHJvcGVydGllcz0mUHJvcGVydGllcw0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5zaG93U3RhdHVzPSZFcnJvciBEZXRhaWxzLi4uDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmZpbHRlckZlYXR1cmVzPVwgRmlsJnRlciBmZWF0dXJlcyBpbmNsdWRlZCBpbiBvdGhlciBmZWF0dXJlcyBvbiB0aGUgbGlzdA0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5maWx0ZXJQYXRjaGVzPVwgRmlsJnRlciBwYXRjaGVzIGluY2x1ZGVkIGluIG90aGVyIHBhdGNoZXMgb24gdGhlIGxpc3QNCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZmVhdHVyZT1GZWF0dXJlDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnZlcnNpb249VmVyc2lvbg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5wcm92aWRlcj1Qcm92aWRlcg0KLUluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5wcm9wPSZQcm9wZXJ0aWVzDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmludmFsaWQubG9uZz1JbnZhbGlkIGNvbWJpbmF0aW9uIC0gc2VsZWN0IFwiU2hvdyBTdGF0dXMuLi5cIiBmb3IgZGV0YWlscy4NCi1JbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuaW52YWxpZC5zaG9ydD1JbnZhbGlkIGNvbWJpbmF0aW9uDQotSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmN5Y2xlPUN5Y2xlIHN0YXJ0aW5nIGF0IHswfQ0KLQ0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuYWNjZXB0ID0gSSAmYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmFjY2VwdDIgPSBJICZhY2NlcHQgdGhlIHRlcm1zIGluIHRoZSBsaWNlbnNlIGFncmVlbWVudHMNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmRlY2xpbmUgPSBJICZkbyBub3QgYWNjZXB0IHRoZSB0ZXJtcyBpbiB0aGUgbGljZW5zZSBhZ3JlZW1lbnQNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmRlY2xpbmUyID0gSSAmZG8gbm90IGFjY2VwdCB0aGUgdGVybXMgaW4gdGhlIGxpY2Vuc2UgYWdyZWVtZW50cw0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVzYyA9IFRoaXMgZmVhdHVyZSBoYXMgYSBsaWNlbnNlIFwNCi1hZ3JlZW1lbnQgdGhhdCB5b3UgbmVlZCB0byBhY2NlcHQgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBcDQotdGhlIGluc3RhbGxhdGlvbi4NCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmRlc2MyID0gU29tZSBvZiB0aGUgZmVhdHVyZXMgaGF2ZSBsaWNlbnNlIFwNCi1hZ3JlZW1lbnRzIHRoYXQgeW91IG5lZWQgdG8gYWNjZXB0IGJlZm9yZSBwcm9jZWVkaW5nIHdpdGggXA0KLXRoZSBpbnN0YWxsYXRpb24uDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kb3duPU5leHQgJkxpY2Vuc2UNCi1JbnN0YWxsV2l6YXJkLkxpY2Vuc2VQYWdlLmhlYWRlcj17MH0gb3V0IG9mIHsxfTogezJ9ICh7M30pDQotSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS50aXRsZSA9IEZlYXR1cmUgTGljZW5zZQ0KLUluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UudXA9JlByZXZpb3VzIExpY2Vuc2UNCi0NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UudGl0bGUgPSBJbnN0YWxsIExvY2F0aW9uDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmRlc2MgPSBDaG9vc2UgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmZWF0dXJlcyB3aWxsIGJlIGluc3RhbGxlZC4NCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2Uuam9ic0xhYmVsID0gRmVhdHVyZXMgdG8gJmluc3RhbGw6DQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnNpdGVMYWJlbCA9IEEmdmFpbGFibGUgc2l0ZXM6DQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLm5ldyA9ICZBZGQgU2l0ZS4uLg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5kZWxldGUgPSAmUmVtb3ZlIFNpdGUNCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UucmVxdWlyZWRTcGFjZSA9IFJlcXVpcmVkIHNwYWNlOg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5hdmFpbGFibGVTcGFjZSA9IEZyZWUgc3BhY2U6DQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uID0gVGFyZ2V0IExvY2F0aW9uDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLm1lc3NhZ2UgPSBTZWxlY3QgYSBuZXcgaW5zdGFsbCBsb2NhdGlvbg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lbXB0eSA9IFRhcmdldCBpbnN0YWxsIGxvY2F0aW9uIG11c3QgYmUgc2VsZWN0ZWQuIElmIG5vbmUgaXMgYXZhaWxhYmxlLCBjcmVhdGUgYSBuZXcgb25lLg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5leGlzdHMgPSBUYXJnZXQgbG9jYXRpb24gYWxyZWFkeSBleGlzdHMuDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVycm9yLnRpdGxlID0gSW52YWxpZCBMb2NhdGlvbg0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci5tZXNzYWdlID0gVGhlIHNlbGVjdGVkIGxvY2F0aW9uIGNhbm5vdCBiZSB1c2VkIHRvIGluc3RhbGwgZmVhdHVyZXM6IHswfQ0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci5yZWFzb24gPSBSZWFzb246IHswfQ0KLUluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5zaXplID0gezB9S0INCi1JbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UudW5rbm93blNpemUgPSBVbmtub3duDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnBhdGNoRXJyb3IgPSBQYXRjaCAiezB9IiBtdXN0IGJlIGluc3RhbGxlZCBpbiB0aGUgc2FtZSBzaXRlIGFzICJ7MX0iDQotSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnBhdGNoRXJyb3IyID0gUGF0Y2ggInswfSIgbXVzdCBiZSBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgc2l0ZSBhcyAiezF9IiA6IHsyfQ0KLQ0KLVJldmVydENvbmZpZ3VyYXRpb25XaXphcmQud3RpdGxlPVJldmVydCB0byBhIFByZXZpb3VzIENvbmZpZ3VyYXRpb24NCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS50aXRsZT1SZXZlcnQgdG8gYSBQcmV2aW91cyBDb25maWd1cmF0aW9uDQotUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UuZGVzYz1DaG9vc2UgYSBzdGFibGUgY29uZmlndXJhdGlvbiB0byB3aGljaCB5b3Ugd291bGQgbGlrZSB0byByZXZlcnQNCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5sYWJlbD0mUGFzdCBjb25maWd1cmF0aW9uczoNCi1SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5hY3Rpdml0aWVzPSZBY3Rpdml0aWVzIHRoYXQgY2F1c2VkIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb246DQotUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UucXVlc3Rpb249VGhpcyBvcGVyYXRpb24gcmVxdWlyZXMgcmVzdGFydGluZyB0aGUgd29ya2JlbmNoLiAgV291bGQgeW91IGxpa2UgdG8gcHJvY2VlZD8NCi0NCi1SZXZlcnQuUHJvYmxlbURpYWxvZy50aXRsZSA9IFJlc3RvcmUgUHJvYmxlbXMNCi0NCi1TaG93QWN0aXZpdGllc0RpYWxvZy50aXRsZSA9IEN1cnJlbnQgQ29uZmlndXJhdGlvbg0KLVNob3dBY3Rpdml0aWVzRGlhbG9nLmRhdGUgPSBEYXRlOg0KLVNob3dBY3Rpdml0aWVzRGlhbG9nLmxvYyA9IExvY2F0aW9uOiANCi1TaG93QWN0aXZpdGllc0RpYWxvZy5sYWJlbCA9IEFjdGl2aXRpZXMgdGhhdCBjYXVzZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb246DQotDQotU2l0ZVBhZ2UudGl0bGU9VXBkYXRlIHNpdGVzIHRvIHZpc2l0DQotU2l0ZVBhZ2UuZGVzYz1TZWxlY3QgdXBkYXRlIHNpdGVzIHRvIHZpc2l0IHdoaWxlIGxvb2tpbmcgZm9yIG5ldyBmZWF0dXJlcy4NCi1TaXRlUGFnZS5sYWJlbD0mU2l0ZXMgdG8gaW5jbHVkZSBpbiBzZWFyY2g6DQotU2l0ZVBhZ2UuYWRkVXBkYXRlU2l0ZT1OZXcgUmVtbyZ0ZSBTaXRlLi4uDQotU2l0ZVBhZ2UuYWRkTG9jYWxTaXRlPU5ldyAmTG9jYWwgU2l0ZS4uLg0KLVNpdGVQYWdlLmFkZExvY2FsWmlwcGVkU2l0ZT1OZXcgJkFyY2hpdmVkIFNpdGUuLi4NCi1TaXRlUGFnZS5lZGl0PSZFZGl0Li4uDQotU2l0ZVBhZ2UucmVtb3ZlPSZSZW1vdmUNCi1TaXRlUGFnZS5pZ25vcmU9Jklnbm9yZSBmZWF0dXJlcyBub3QgYXBwbGljYWJsZSB0byB0aGlzIGVudmlyb25tZW50DQotU2l0ZVBhZ2UubmV3PU5ldyBVcGRhdGUgU2l0ZQ0KLVNpdGVQYWdlLmRpYWxvZ0VkaXRMb2NhbD1FZGl0IExvY2FsIFNpdGUNCi1TaXRlUGFnZS5kaWFsb2dFZGl0VXBkYXRlU2l0ZT1FZGl0IFJlbW90ZSBTaXRlDQotU2l0ZVBhZ2UuY29ubmVjdGluZz1Db25uZWN0aW5nDQotU2VhcmNoUnVubmVyLmNvbm5lY3Rpb25FcnJvcj1Db25uZWN0aW9uIGVycm9yDQotDQotTG9jYWxTaXRlU2VsZWN0b3IuZGlhbG9nTWVzc2FnZT1TZWxlY3QgYSBsb2NhbCB1cGRhdGUgc2l0ZS4NCi1Mb2NhbFNpdGVTZWxlY3Rvci5kaXJJbmZvVGl0bGU9SW52YWxpZCBTaXRlDQotTG9jYWxTaXRlU2VsZWN0b3IuZGlySW5mb01lc3NhZ2U9U2VsZWN0ZWQgbG9jYXRpb24gZG9lcyBub3QgY29udGFpbiBhbiB1cGRhdGUgc2l0ZS4gIFBsZWFzZSBzZWxlY3QgYW5vdGhlciBsb2NhdGlvbi4NCi1Mb2NhbFNpdGVTZWxlY3Rvci5kaWFsb2dNZXNzYWdlemlwPVNlbGVjdCBMb2NhbCBTaXRlIEFyY2hpdmUNCi1Mb2NhbFNpdGVTZWxlY3Rvci56aXBJbmZvVGl0bGU9SW52YWxpZCBTaXRlDQotTG9jYWxTaXRlU2VsZWN0b3IuemlwSW5mb01lc3NhZ2U9U2VsZWN0ZWQgYXJjaGl2ZSBkb2VzIG5vdCBjb250YWluIGFuIHVwZGF0ZSBzaXRlLiAgUGxlYXNlIHNlbGVjdCBhbm90aGVyIGFyY2hpdmUuDQotDQotSW5zdGFsbFNlcnZsZXQudW5rbm93blNlcnZlclVSTD1VcGRhdGUgc2VydmVyIFVSTCBpcyB1bmtub3duLg0KLUluc3RhbGxTZXJ2bGV0Lm5vRmVhdHVyZXM9Tm8gZmVhdHVyZXMgdG8gaW5zdGFsbC4NCi1JbnN0YWxsU2VydmxldC5pblByb2dyZXNzID0gQW5vdGhlciBpbnN0YWxsIHNlc3Npb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4NCi1JbnN0YWxsU2VydmxldC5pbmNvcnJlY3RVUkxGb3JtYXQ9VXBkYXRlIHNlcnZlciBVUkwgaGFzIGluY29ycmVjdCBmb3JtYXQ6IHswfQ0KLUluc3RhbGxTZXJ2bGV0LmNvbnRhY3RXZWJtYXN0ZXI9Q29udGFjdCBXZWIgbWFzdGVyIHRoYXQgbWFpbnRhaW5zIHRoZSBwYWdlIHRoYXQgaW5pdGlhdGVkIHRoaXMgb3BlcmF0aW9uLg0KLQ0KLU1pc3NpbmdGZWF0dXJlLnByb3ZpZGVyID0gTi9BDQotTWlzc2luZ0ZlYXR1cmUuZGVzYy51bmtub3duID0gVGhlIGZlYXR1cmUgd2FzIG5vdCBsb2FkZWQgZHVlIHRvIGVycm9ycy4gT3BlbiBmZWF0dXJlIHByb3BlcnRpZXMgZm9yIGRldGFpbHMuDQotTWlzc2luZ0ZlYXR1cmUuZGVzYy5vcHRpb25hbCA9IFRoaXMgb3B0aW9uYWwgZmVhdHVyZSBoYXMgbm90IGJlZW4gaW5zdGFsbGVkLg0KLUluc3RhbGxEZWx0YVdpemFyZC5yZW1pbmRlcj1UbyBwcm9jZXNzIHRoZXNlIGNoYW5nZXMgYXQgYSBsYXRlciB0aW1lLCBnbyB0byBIZWxwLT5Tb2Z0d2FyZSBVcGRhdGVzLT5NYW5hZ2UgQ29uZmlndXJhdGlvbi4uLg0KLVN3YXBGZWF0dXJlV2l6YXJkLnRpdGxlPVJlcGxhY2UgV2l0aCBBbm90aGVyIFZlcnNpb24NCi1Td2FwRmVhdHVyZVdpemFyZFBhZ2UudGl0bGU9UmVwbGFjZSBXaXRoIEFub3RoZXIgVmVyc2lvbg0KLVN3YXBGZWF0dXJlV2l6YXJkUGFnZS5kZXNjPURpc2FibGUgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBhbmQgcmVwbGFjZSBpdCB3aXRoIG9uZSBvZiB0aGUgdmVyc2lvbnMgZnJvbSB0aGUgbGlzdA0KLVN3YXBGZWF0dXJlV2l6YXJkUGFnZS5sYWJlbD0mQXZhaWxhYmxlIGRpc2FibGVkIHZlcnNpb25zOg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9Cb29rbWFya0ZvbGRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzZiNWMuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrRm9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgQm9va21hcmtGb2xkZXIgZXh0ZW5kcyBOYW1lZE1vZGVsT2JqZWN0IHsKLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IGNoaWxkcmVuPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHVibGljIEJvb2ttYXJrRm9sZGVyKCkgewotCX0KLQkKLQlwdWJsaWMgQm9va21hcmtGb2xkZXIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW4uc2l6ZSgpPjA7Ci0JfSAKLQkKLQlwdWJsaWMgdm9pZCBhZGRDaGlsZChOYW1lZE1vZGVsT2JqZWN0IG9iamVjdCkgewotCQlpbnRlcm5hbEFkZChvYmplY3QpOwotCQlub3RpZnlPYmplY3RzQWRkZWQodGhpcywgbmV3IE9iamVjdFtdIHtvYmplY3R9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZHJlbihOYW1lZE1vZGVsT2JqZWN0IFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWludGVybmFsQWRkKG9iamVjdHNbaV0pOwotCQl9Ci0JCW5vdGlmeU9iamVjdHNBZGRlZCh0aGlzLCBvYmplY3RzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBZGQoTmFtZWRNb2RlbE9iamVjdCBjaGlsZCkgewotCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQljaGlsZC5zZXRNb2RlbChnZXRNb2RlbCgpKTsKLQkJY2hpbGQuc2V0UGFyZW50KHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbihOYW1lZE1vZGVsT2JqZWN0IFtdIG9iamVjdHMpIHsKLQkJZm9yIChpbnQgaT0wOyBpPG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWNoaWxkcmVuLnJlbW92ZShvYmplY3RzW2ldKTsKLQkJCW9iamVjdHNbaV0uc2V0UGFyZW50KG51bGwpOwotCQl9Ci0JCW5vdGlmeU9iamVjdHNSZW1vdmVkKHRoaXMsIG9iamVjdHMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtVdGlsLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQm9va21hcmtVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MTAyZmQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Jvb2ttYXJrVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotcHVibGljIGNsYXNzIEJvb2ttYXJrVXRpbCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhcnNlKFN0cmluZyBmaWxlTmFtZSwgVmVjdG9yIGJvb2ttYXJrcykgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJCURvY3VtZW50QnVpbGRlciBwYXJzZXIgPSBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jID0gcGFyc2VyLnBhcnNlKGZpbGVOYW1lKTsKLQkJCU5vZGUgcm9vdCA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCXByb2Nlc3NSb290KHJvb3QsIGJvb2ttYXJrcyk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFya1tdIGdldEJvb2ttYXJrcyhWZWN0b3IgYm9va21hcmtzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYm9va21hcmtzLnNpemUoKTsgaSsrKSB7Ci0JCQlwcm9jZXNzRW50cnkoYm9va21hcmtzLmdldChpKSwgcmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gKFNpdGVCb29rbWFya1tdKSByZXN1bHQudG9BcnJheShuZXcgU2l0ZUJvb2ttYXJrW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJvb2ttYXJrRm9sZGVyIGdldEZvbGRlcihWZWN0b3IgYm9va21hcmtzLCBJUGF0aCBwYXRoKSB7Ci0JCU5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0ID0gZmluZChib29rbWFya3MsIHBhdGgpOwotCQlpZiAob2JqZWN0ICE9IG51bGwgJiYgb2JqZWN0IGluc3RhbmNlb2YgQm9va21hcmtGb2xkZXIpCi0JCQlyZXR1cm4gKEJvb2ttYXJrRm9sZGVyKSBvYmplY3Q7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTmFtZWRNb2RlbE9iamVjdCBmaW5kKFZlY3RvciBib29rbWFya3MsIElQYXRoIHBhdGgpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBib29rbWFya3MudG9BcnJheSgpOwotCQlyZXR1cm4gZmluZChhcnJheSwgcGF0aCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTmFtZWRNb2RlbE9iamVjdCBmaW5kKE9iamVjdFtdIGFycmF5LCBJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBuYW1lID0gcGF0aC5zZWdtZW50KDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlOYW1lZE1vZGVsT2JqZWN0IG9iaiA9IChOYW1lZE1vZGVsT2JqZWN0KSBhcnJheVtpXTsKLQkJCWlmIChvYmouZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQkJCUlQYXRoIGNoaWxkUGF0aCA9IHBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJCQkJCUJvb2ttYXJrRm9sZGVyIGZvbGRlciA9IChCb29rbWFya0ZvbGRlcikgb2JqOwotCQkJCQkJcmV0dXJuIGZpbmQoZm9sZGVyLmdldENoaWxkcmVuKG51bGwpLCBjaGlsZFBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzUm9vdChOb2RlIHJvb3QsIFZlY3RvciBib29rbWFya3MpIHsKLQkJaWYgKHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImJvb2ttYXJrcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gcm9vdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlwcm9jZXNzQ2hpbGRyZW4oY2hpbGRyZW4sIG51bGwsIGJvb2ttYXJrcyk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzQ2hpbGRyZW4oCi0JCU5vZGVMaXN0IGNoaWxkcmVuLAotCQlCb29rbWFya0ZvbGRlciBmb2xkZXIsCi0JCVZlY3RvciBib29rbWFya3MpIHsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCU5hbWVkTW9kZWxPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJzaXRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlvYmplY3QgPSBjcmVhdGVTaXRlKGNoaWxkKTsKLQotCQkJCX0gZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImZvbGRlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJb2JqZWN0ID0gY3JlYXRlRm9sZGVyKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAob2JqZWN0ICE9IG51bGwpIHsKLQkJCQlpZiAoZm9sZGVyICE9IG51bGwpIHsKLQkJCQkJZm9sZGVyLmFkZENoaWxkKG9iamVjdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYm9va21hcmtzLmFkZChvYmplY3QpOwotCQkJCX0KLQkJCQlvYmplY3Quc2V0TW9kZWwobW9kZWwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU2l0ZUJvb2ttYXJrIGNyZWF0ZVNpdGUoTm9kZSBjaGlsZCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShjaGlsZCwgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgdXJsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwoZ2V0QXR0cmlidXRlKGNoaWxkLCAidXJsIikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQotCQlTdHJpbmcgd2ViID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAid2ViIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiB3ZWJCb29rbWFyayA9ICh3ZWIgIT0gbnVsbCAmJiB3ZWIuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNlbCA9IGdldEF0dHJpYnV0ZShjaGlsZCwgInNlbGVjdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IChzZWwgIT0gbnVsbCAmJiBzZWwuZXF1YWxzKCJ0cnVlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhuYW1lLCB1cmwsIHdlYkJvb2ttYXJrLCBzZWxlY3RlZCk7Ci0KLQkJU3RyaW5nIGxvY2FsID0gZ2V0QXR0cmlidXRlKGNoaWxkLCAibG9jYWwiKTsgLy8kTk9OLU5MUy0xJAotCQlib29rbWFyay5zZXRMb2NhbChsb2NhbCAhPSBudWxsICYmIGxvY2FsLmVxdWFscygidHJ1ZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBpZ24gPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJpZ25vcmVkLWNhdGVnb3JpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWduICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihpZ24sICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCUFycmF5TGlzdCBhcnJheSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChzdG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2sgPSBzdG9rLm5leHRUb2tlbigpOwotCQkJCWFycmF5LmFkZCh0b2spOwotCQkJfQotCQkJYm9va21hcmsuc2V0SWdub3JlZENhdGVnb3JpZXMoKFN0cmluZ1tdKSBhcnJheS50b0FycmF5KG5ldyBTdHJpbmdbYXJyYXkuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBib29rbWFyazsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCb29rbWFya0ZvbGRlciBjcmVhdGVGb2xkZXIoTm9kZSBjaGlsZCkgewotCQlCb29rbWFya0ZvbGRlciBmb2xkZXIgPSBuZXcgQm9va21hcmtGb2xkZXIoKTsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoY2hpbGQsICJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGVyLnNldE5hbWUobmFtZSk7Ci0JCWlmIChjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGVMaXN0IGNoaWxkcmVuID0gY2hpbGQuZ2V0Q2hpbGROb2RlcygpOwotCQkJcHJvY2Vzc0NoaWxkcmVuKGNoaWxkcmVuLCBmb2xkZXIsIG51bGwpOwotCQl9Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlKFN0cmluZyBmaWxlTmFtZSwgVmVjdG9yIGJvb2ttYXJrcykgewotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCU91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBudWxsOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihmb3MsICJVVEY4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvc3cpOwotCQkJd3JpdGVyLnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PiIpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIucHJpbnRsbigiPGJvb2ttYXJrcz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBib29rbWFya3Muc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gYm9va21hcmtzLmdldChpKTsKLQkJCQl3cml0ZU9iamVjdCgiICAgIiwgb2JqLCB3cml0ZXIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl3cml0ZXIucHJpbnRsbigiPC9ib29rbWFya3M+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5mbHVzaCgpOwotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG9zdyAhPSBudWxsKQotCQkJCQlvc3cuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCWlmIChmb3MgIT0gbnVsbCkKLQkJCQkJZm9zLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJfQotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVPYmplY3QoCi0JCVN0cmluZyBpbmRlbnQsCi0JCU9iamVjdCBvYmosCi0JCVByaW50V3JpdGVyIHdyaXRlcikgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBvYmo7Ci0JCQlTdHJpbmcgbmFtZSA9IGJvb2ttYXJrLmdldE5hbWUoKTsKLQkJCVN0cmluZyB1cmwgPSBib29rbWFyay5nZXRVUkwoKS50b1N0cmluZygpOwotCQkJU3RyaW5nIHdlYiA9IGJvb2ttYXJrLmlzV2ViQm9va21hcmsoKT8idHJ1ZSI6ImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgc2VsID0gYm9va21hcmsuaXNTZWxlY3RlZCgpPyJ0cnVlIjoiZmFsc2UiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBsb2NhbCA9IGJvb2ttYXJrLmlzTG9jYWwoKSA/ICJ0cnVlIiA6ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIFtdIGlnbiA9IGJvb2ttYXJrLmdldElnbm9yZWRDYXRlZ29yaWVzKCk7Ci0JCQlTdHJpbmdCdWZmZXIgd2lnbiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWduLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgPiAwKQotCQkJCQl3aWduLmFwcGVuZCgnLCcpOwotCQkJCXdpZ24uYXBwZW5kKGlnbltpXSk7Ci0JCQl9Ci0JCQl3cml0ZXIucHJpbnQoaW5kZW50ICsgIjxzaXRlIG5hbWU9XCIiICsgbmFtZSArICJcIiB1cmw9XCIiICsgdXJsICsgIlwiIHdlYj1cIiIgKyB3ZWIgKyAiXCIgc2VsZWN0ZWQ9XCIiICsgc2VsICsgIlwiIGxvY2FsPVwiIiArIGxvY2FsICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0JCQlpZiAod2lnbi5sZW5ndGgoKSA+IDApCi0JCQkJd3JpdGVyLnByaW50KCIgaWdub3JlZC1jYXRlZ29yaWVzPVwiIit3aWduLnRvU3RyaW5nKCkrIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJd3JpdGVyLnByaW50bG4oIi8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJQm9va21hcmtGb2xkZXIgZm9sZGVyID0gKEJvb2ttYXJrRm9sZGVyKSBvYmo7Ci0JCQlTdHJpbmcgbmFtZSA9IGZvbGRlci5nZXROYW1lKCk7Ci0JCQl3cml0ZXIucHJpbnRsbihpbmRlbnQgKyAiPGZvbGRlciBuYW1lPVwiIiArIG5hbWUgKyAiXCI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBmb2xkZXIuZ2V0Q2hpbGRyZW4oZm9sZGVyKTsKLQkJCVN0cmluZyBpbmRlbnQyID0gaW5kZW50ICsgIiAgICI7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQl3cml0ZU9iamVjdChpbmRlbnQyLCBjaGlsZHJlbltpXSwgd3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci5wcmludGxuKGluZGVudCArICI8L2ZvbGRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU5hbWVkTm9kZU1hcCBhdHRzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgYXR0ID0gYXR0cy5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCWlmIChhdHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGF0dC5nZXROb2RlVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRm9sZGVyKEJvb2ttYXJrRm9sZGVyIGZvbGRlciwgQXJyYXlMaXN0IHJlc3VsdCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGZvbGRlci5nZXRDaGlsZHJlbihmb2xkZXIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9jZXNzRW50cnkoY2hpbGRyZW5baV0sIHJlc3VsdCk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcm9jZXNzRW50cnkoT2JqZWN0IG9iaiwgQXJyYXlMaXN0IHJlc3VsdCkgewotCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKQotCQkJcmVzdWx0LmFkZChvYmopOwotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBCb29rbWFya0ZvbGRlcikgewotCQkJcHJvY2Vzc0ZvbGRlcigoQm9va21hcmtGb2xkZXIpIG9iaiwgcmVzdWx0KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNmYyMzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyDQotCWV4dGVuZHMgU2ltcGxlRmVhdHVyZUFkYXB0ZXINCi0JaW1wbGVtZW50cyBJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIHsNCi0JcHJpdmF0ZSBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGFkYXB0ZXI7DQotCXByaXZhdGUgYm9vbGVhbiBjb25maWd1cmVkOw0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlZDsNCi0NCi0JcHVibGljIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigNCi0JCUlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciwNCi0JCUlGZWF0dXJlIGZlYXR1cmUsDQotCQlib29sZWFuIGNvbmZpZ3VyZWQsDQotCQlib29sZWFuIHVwZGF0ZWQsDQotCQlib29sZWFuIG9wdGlvbmFsKSB7DQotCQlzdXBlcihmZWF0dXJlLCBvcHRpb25hbCk7DQotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOw0KLQkJdGhpcy5jb25maWd1cmVkID0gY29uZmlndXJlZDsNCi0JCXRoaXMudXBkYXRlZCA9IHVwZGF0ZWQ7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsNCi0JCWlmIChvYmplY3QgPT0gbnVsbCkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQlpZiAob2JqZWN0ID09IHRoaXMpDQotCQkJcmV0dXJuIHRydWU7DQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSB7DQotCQkJdHJ5IHsNCi0JCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkID0gKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgb2JqZWN0Ow0KLQkJCQlyZXR1cm4gYWQuZ2V0Q29uZmlndXJlZFNpdGUoKS5lcXVhbHMoZ2V0Q29uZmlndXJlZFNpdGUoKSkNCi0JCQkJCSYmIGFkLmdldEZlYXR1cmUobnVsbCkuZXF1YWxzKGdldEZlYXR1cmUobnVsbCkpOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgew0KLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q29uZmlndXJlZFNpdGUoKTsNCi0JfQ0KLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCkgew0KLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKTsNCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKSB7DQotCQlyZXR1cm4gY29uZmlndXJlZDsNCi0JfQ0KLQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWQoKSB7DQotCQlyZXR1cm4gdXBkYXRlZDsNCi0JfQ0KLQlwdWJsaWMgSUZlYXR1cmVBZGFwdGVyW10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCXRyeSB7DQotCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0NCi0JCQkJZ2V0RmVhdHVyZShudWxsKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyW10gcmVzdWx0ID0NCi0JCQkJbmV3IENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcltpbmNsdWRlZC5sZW5ndGhdOw0KLQkJCWlmIChtb25pdG9yID09IG51bGwpDQotCQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOw0KLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKTsNCi0JCQlzdWJNb25pdG9yLmJlZ2luVGFzaygiIiwgaW5jbHVkZWQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSBmcmVmID0gaW5jbHVkZWRbaV07DQotCQkJCUlGZWF0dXJlIGZlYXR1cmU7DQotCQkJCWJvb2xlYW4gY2hpbGRDb25maWd1cmVkID0gY29uZmlndXJlZDsNCi0JCQkJYm9vbGVhbiB1cGRhdGVkID0gZmFsc2U7DQotCQkJCXRyeSB7DQotCQkJCQlmZWF0dXJlID0gZnJlZi5nZXRGZWF0dXJlKA0KLQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHN1Yk1vbml0b3IsIDEpKTsNCi0JCQkJCWNoaWxkQ29uZmlndXJlZCA9DQotCQkJCQkJYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLmlzQ29uZmlndXJlZChmZWF0dXJlKTsNCi0JCQkJCS8vLyoNCi0JCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHJlZnBpZCA9DQotCQkJCQkJZnJlZi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOw0KLQkJCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgZnBpZCA9DQotCQkJCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOw0KLQkJCQkJdXBkYXRlZCA9ICFyZWZwaWQuZXF1YWxzKGZwaWQpOw0KLQkJCQkJLy8qLw0KLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCWZlYXR1cmUgPSBuZXcgTWlzc2luZ0ZlYXR1cmUoZ2V0RmVhdHVyZShudWxsKSwgZnJlZik7DQotCQkJCQljaGlsZENvbmZpZ3VyZWQgPSBmYWxzZTsNCi0JCQkJfQ0KLQ0KLQkJCQlyZXN1bHRbaV0gPQ0KLQkJCQkJbmV3IENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcigNCi0JCQkJCQlhZGFwdGVyLA0KLQkJCQkJCWZlYXR1cmUsDQotCQkJCQkJY2hpbGRDb25maWd1cmVkLA0KLQkJCQkJCXVwZGF0ZWQsDQotCQkJCQkJZnJlZi5pc09wdGlvbmFsKCkpOw0KLQkJCQlyZXN1bHRbaV0uc2V0SW5jbHVkZWQodHJ1ZSk7DQotCQkJfQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsNCi0JCX0NCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjI5MWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0NvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyZWRTaXRlQWRhcHRlcgotCWV4dGVuZHMgVUlNb2RlbE9iamVjdAotCWltcGxlbWVudHMgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciB7Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGNzaXRlOwotCQkKLQlwdWJsaWMgQ29uZmlndXJlZFNpdGVBZGFwdGVyKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcsIElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgewotCQl0aGlzLmNzaXRlID0gY3NpdGU7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCX0KLQkKLQlwdWJsaWMgSUNvbmZpZ3VyZWRTaXRlIGdldENvbmZpZ3VyZWRTaXRlKCkgewotCQlyZXR1cm4gY3NpdGU7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdD09bnVsbCkgcmV0dXJuIGZhbHNlOwotCQlpZiAob2JqZWN0ID09IHRoaXMpIHJldHVybiB0cnVlOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkU2l0ZUFkYXB0ZXIpb2JqZWN0OwotCQkJcmV0dXJuIGNzaXRlIT1udWxsICYmIGNzaXRlLmdldFNpdGUoKS5lcXVhbHMoYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLmdldFNpdGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJlZFNpdGUoKS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRGlzY292ZXJ5Rm9sZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRGlzY292ZXJ5Rm9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MGViMGUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0Rpc2NvdmVyeUZvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotcHVibGljIGNsYXNzIERpc2NvdmVyeUZvbGRlciBleHRlbmRzIEJvb2ttYXJrRm9sZGVyIHsKLQlwdWJsaWMgRGlzY292ZXJ5Rm9sZGVyKCkgewotCQlzdXBlcihVcGRhdGVVSS5nZXRTdHJpbmcoIkRpc2NvdmVyeUZvbGRlci5uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCXNldE1vZGVsKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJY2hpbGRyZW4uY2xlYXIoKTsKLQkJdHJ5IHsKLQkJCUlMb2NhbFNpdGUgc2l0ZSA9IFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9IHNpdGUuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKTsKLQkJCUlDb25maWd1cmVkU2l0ZVtdIGNzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3NpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY3NpdGVzW2ldOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gcmVmcyA9IGNzaXRlLmdldENvbmZpZ3VyZWRGZWF0dXJlcygpOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2pdOwotCQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gcmVmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCUlVUkxFbnRyeVtdIGVudHJpZXMgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCk7Ci0JCQkJCWlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCS8vIE9ubHkgYWRkIGRpc2NvdmVyeSBzaXRlcyBpZgotCQkJCQkJLy8gb2Ygcm9vdCBmZWF0dXJlcwotCQkJCQkJaWYgKCFpc0luY2x1ZGVkKHJlZiwgcmVmcykpCi0JCQkJCQkJYWRkQm9va21hcmtzKGVudHJpZXMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbmNsdWRlZCgKLQkJSUZlYXR1cmVSZWZlcmVuY2UgcmVmLAotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnMpIHsKLQkJdHJ5IHsKLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGNhbmRpZGF0ZSA9IHJlZnNbaV07Ci0JCQkJLy8gSWdub3JlIHNlbGYKLQkJCQlpZiAoY2FuZGlkYXRlLmVxdWFscyhyZWYpKQotCQkJCQljb250aW51ZTsKLQkJCQlJRmVhdHVyZSBjZmVhdHVyZSA9IGNhbmRpZGF0ZS5nZXRGZWF0dXJlKG51bGwpOwotCQkJCUlGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJCQljZmVhdHVyZS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpcmVmcy5sZW5ndGg7IGorKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSBpcmVmID0gaXJlZnNbal07Ci0JCQkJCVZlcnNpb25lZElkZW50aWZpZXIgaXZpZCA9IGlyZWYuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpOwotCQkJCQlpZiAoaXZpZC5lcXVhbHModmlkKSkgewotCQkJCQkJLy8gYmluZ28gLSBpbmNsdWRlZCBpbiBhdCBsZWFzdCBvbmUgZmVhdHVyZQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGFkZEJvb2ttYXJrcyhJVVJMRW50cnlbXSBlbnRyaWVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSVVSTEVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9Ci0JCQkJbmV3IFNpdGVCb29rbWFyaygKLQkJCQkJZW50cnkuZ2V0QW5ub3RhdGlvbigpLAotCQkJCQllbnRyeS5nZXRVUkwoKSwKLQkJCQkJZW50cnkuZ2V0VHlwZSgpID09IElVUkxFbnRyeS5XRUJfU0lURSk7Ci0JCQlib29rbWFyay5zZXRSZWFkT25seShlbnRyeS5nZXRUeXBlKCkgIT0gSVVSTEVudHJ5LldFQl9TSVRFKTsKLQkJCWlmICghY29udGFpbnMoYm9va21hcmspKQotCQkJCWludGVybmFsQWRkKGJvb2ttYXJrKTsKLQkJfQotCX0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCU9iamVjdCBvID0gY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBTaXRlQm9va21hcmspIHsKLQkJCQkvLyBub3RlOiBtYXRjaCBvbiBVUkwsIG5vdCB0aGUgbGFiZWwKLQkJCQlpZiAoYm9va21hcmsuZ2V0VVJMKCkuZXF1YWxzKCgoU2l0ZUJvb2ttYXJrKSBvKS5nZXRVUkwoKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJaWYgKGhhc0NoaWxkcmVuKCkgPT0gZmFsc2UpCi0JCQlpbml0aWFsaXplKCk7Ci0JCXJldHVybiBzdXBlci5nZXRDaGlsZHJlbihwYXJlbnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvRmVhdHVyZUFkYXB0ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTc4ZTdjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGFic3RyYWN0IGNsYXNzIEZlYXR1cmVBZGFwdGVyIGV4dGVuZHMgVUlNb2RlbE9iamVjdCBpbXBsZW1lbnRzIElGZWF0dXJlQWRhcHRlciB7DQotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlZD1mYWxzZTsNCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZUFkYXB0ZXIjZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKQ0KLQkgKi8NCi0JcHVibGljIElJbnN0YWxsQ29uZmlndXJhdGlvbiBnZXRJbnN0YWxsQ29uZmlndXJhdGlvbigpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVkKCkgew0KLQkJcmV0dXJuIGluY2x1ZGVkOw0KLQl9DQotCQ0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbmNsdWRlZChib29sZWFuIGluY2x1ZGVkKSB7DQotCQl0aGlzLmluY2x1ZGVkID0gaW5jbHVkZWQ7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7DQotCQl0cnkgew0KLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBnZXRGZWF0dXJlKG51bGwpOw0KLQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCk7DQotCQl9DQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUFkYXB0ZXIuZmFpbHVyZSIpOyAvLyROT04tTkxTLTEkDQotCQl9DQotCX0NCi0JcHVibGljIGJvb2xlYW4gaGFzSW5jbHVkZWRGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCXRyeSB7DQotCQkJSUZlYXR1cmVSZWZlcmVuY2UgW10gaW5jbHVkZWQgPSBnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlyZXR1cm4gaW5jbHVkZWQubGVuZ3RoPjA7DQotCQl9DQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9GZWF0dXJlUmVmZXJlbmNlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZjIwMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0ZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlciBleHRlbmRzIEZlYXR1cmVBZGFwdGVyIHsNCi0JcHJpdmF0ZSBJRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmOw0KLQlwcml2YXRlIGJvb2xlYW4gdG91Y2hlZDsNCi0NCi0JcHVibGljIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKElGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmVSZWYpIHsNCi0JCXRoaXMuZmVhdHVyZVJlZiA9IGZlYXR1cmVSZWY7DQotCQlzZXRJbmNsdWRlZChmZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSk7DQotCX0NCi0JDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGZlYXR1cmVSZWYuZ2V0RmVhdHVyZShtb25pdG9yKTsNCi0JfQ0KLQkNCi0JcHVibGljIFN0cmluZyBnZXRGYXN0TGFiZWwoKSB7DQotCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRVUkwoKS50b1N0cmluZygpOw0KLQl9DQotCQ0KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsNCi0JCXJldHVybiBmZWF0dXJlUmVmLmdldFNpdGUoKTsNCi0JfQ0KLQkNCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gZmVhdHVyZVJlZi5nZXRVUkwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsNCi0JCXJldHVybiBmZWF0dXJlUmVmIGluc3RhbmNlb2YgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSA/IA0KLQkJCSgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSlmZWF0dXJlUmVmKS5pc09wdGlvbmFsKCk6ZmFsc2U7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHRvdWNoSW5jbHVkZWRGZWF0dXJlcyhJUnVubmFibGVDb250ZXh0IGNvbnRleHQpIHsNCi0JCWlmICh0b3VjaGVkKSByZXR1cm47DQotCQlmaW5hbCBJRmVhdHVyZVJlZmVyZW5jZSBbXSBpbmNsdWRlZDsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQlpbmNsdWRlZCA9IAlnZXRGZWF0dXJlKG51bGwpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCQlpZiAoaW5jbHVkZWQubGVuZ3RoID09IDApIHJldHVybjsNCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlQm9va21hcmsuZG93bmxvYWRpbmciKSwgaW5jbHVkZWQubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQlmb3IgKGludCBpPTA7IGk8aW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJCUlGZWF0dXJlUmVmZXJlbmNlIHJlZiA9IGluY2x1ZGVkW2ldOw0KLQkJCQkJdHJ5IHsNCi0JCQkJCQltb25pdG9yLnN1YlRhc2socmVmLmdldFVSTCgpLnRvU3RyaW5nKCkpOw0KLQkJCQkJCXJlZi5nZXRGZWF0dXJlKG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOw0KLQkJCQkJCS8vbW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQl9DQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJbW9uaXRvci5kb25lKCk7DQotCQkJfQ0KLQkJfTsNCi0JCXRyeSB7DQotCQkJY29udGV4dC5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsNCi0JCQl0b3VjaGVkPXRydWU7DQotCQl9DQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJdHJ5IHsNCi0JCQlJRmVhdHVyZVJlZmVyZW5jZVtdIGluY2x1ZGVkID0NCi0JCQkJZ2V0RmVhdHVyZShtb25pdG9yKS5nZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCk7DQotCQkJRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXJbXSByZXN1bHQgPQ0KLQkJCQluZXcgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXJbaW5jbHVkZWQubGVuZ3RoXTsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7DQotCQkJCXJlc3VsdFtpXSA9IG5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihpbmNsdWRlZFtpXSk7DQotCQkJfQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgZ2V0RmVhdHVyZVJlZmVyZW5jZSgpIHsNCi0JCXJldHVybiBmZWF0dXJlUmVmOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjk3NDNkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgZXh0ZW5kcyBJRmVhdHVyZUFkYXB0ZXIsIElDb25maWd1cmVkU2l0ZUNvbnRleHQgew0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZpZ3VyZWQoKTsNCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVkKCk7DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWUyNzBkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JQ29uZmlndXJlZFNpdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGV4dGVuZHMgSUNvbmZpZ3VyZWRTaXRlQ29udGV4dCB7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lDb25maWd1cmVkU2l0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMjc4Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSUNvbmZpZ3VyZWRTaXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ29uZmlndXJlZFNpdGVDb250ZXh0IHsKLQlwdWJsaWMgSUluc3RhbGxDb25maWd1cmF0aW9uIGdldEluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci0JcHVibGljIElDb25maWd1cmVkU2l0ZSBnZXRDb25maWd1cmVkU2l0ZSgpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lGZWF0dXJlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjA2YjUwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9JRmVhdHVyZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsNCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotDQotLyoqDQotICogQHZlcnNpb24gCTEuMA0KLSAqIEBhdXRob3INCi0gKi8NCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlQWRhcHRlciB7DQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKCk7DQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb247DQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXIgW10gZ2V0SW5jbHVkZWRGZWF0dXJlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOw0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotCXB1YmxpYyBib29sZWFuIGlzSW5jbHVkZWQoKTsNCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpOw0KLQlwdWJsaWMgU3RyaW5nIGdldEZhc3RMYWJlbCgpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvSVNpdGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNTg1NTQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL0lTaXRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElTaXRlQWRhcHRlciB7DQotCQ0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7DQotCXB1YmxpYyBVUkwgZ2V0VVJMKCk7DQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7DQotDQotfQ0KLQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9NaXNzaW5nRmVhdHVyZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL01pc3NpbmdGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzcxOWQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL01pc3NpbmdGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi0NCi1wdWJsaWMgY2xhc3MgTWlzc2luZ0ZlYXR1cmUgaW1wbGVtZW50cyBJRmVhdHVyZSB7DQotDQotCXByaXZhdGUgVVJMIHVybDsNCi0JcHJpdmF0ZSBJU2l0ZSBzaXRlOw0KLQlwcml2YXRlIElGZWF0dXJlUmVmZXJlbmNlIHJlZmVyZW5jZTsNCi0JcHJpdmF0ZSBJRmVhdHVyZSBwYXJlbnQ7DQotCXByaXZhdGUgSVVSTEVudHJ5IGRlc2M7DQotCXByaXZhdGUgVmVyc2lvbmVkSWRlbnRpZmllciBpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUuaWQiKSwgIjAuMC4wIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQlwdWJsaWMgTWlzc2luZ0ZlYXR1cmUoSVNpdGUgc2l0ZSwgVVJMIHVybCkgew0KLQkJdGhpcy5zaXRlID0gc2l0ZTsNCi0JCXRoaXMudXJsID0gdXJsOw0KLQkJZGVzYyA9IG5ldyBJVVJMRW50cnkoKSB7DQotCQkJcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0JCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7DQotCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIk1pc3NpbmdGZWF0dXJlLmRlc2MudW5rbm93biIpOyAvLyROT04tTkxTLTEkDQotCQkJfQ0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsNCi0JCQkJcmV0dXJuIG51bGw7DQotCQkJfQ0KLQkJCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsNCi0JCQkJcmV0dXJuIElVUkxFbnRyeS5VUERBVEVfU0lURTsNCi0JCQl9DQotCQl9Ow0KLQl9DQotCXB1YmxpYyBNaXNzaW5nRmVhdHVyZShJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsNCi0JCXRoaXMobnVsbCwgcmVmKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgTWlzc2luZ0ZlYXR1cmUoSUZlYXR1cmUgcGFyZW50LCBJRmVhdHVyZVJlZmVyZW5jZSByZWYpIHsNCi0JCXRoaXMocmVmLmdldFNpdGUoKSwgcmVmLmdldFVSTCgpKTsNCi0JCXRoaXMucmVmZXJlbmNlID0gcmVmOw0KLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7DQotDQotCQlpZiAoaXNPcHRpb25hbCgpKSB7DQotCQkJZGVzYyA9IG5ldyBJVVJMRW50cnkoKSB7DQotCQkJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCX0NCi0JCQkJcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgew0KLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUuZGVzYy5vcHRpb25hbCIpOyAvLyROT04tTkxTLTEkDQotCQkJCX0NCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGtleSkgew0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCX0NCi0JCQkJcHVibGljIGludCBnZXRUeXBlKCkgew0KLQkJCQkJcmV0dXJuIElVUkxFbnRyeS5VUERBVEVfU0lURTsNCi0JCQkJfQ0KLQkJCX07DQotCQl9DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsNCi0JCXJldHVybiByZWZlcmVuY2UgIT0gbnVsbA0KLQkJCSYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UNCi0JCQkmJiAoKElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHJlZmVyZW5jZSkuaXNPcHRpb25hbCgpOw0KLQl9DQotDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRQYXJlbnQoKSB7DQotCQlyZXR1cm4gcGFyZW50Ow0KLQl9DQotDQotCXB1YmxpYyBVUkwgZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCkgew0KLQkJVmVyc2lvbmVkSWRlbnRpZmllciB2aWQgPSBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQlpZiAodmlkID09IG51bGwpDQotCQkJcmV0dXJuIG51bGw7DQotCQlTdHJpbmcga2V5ID0gdmlkLmdldElkZW50aWZpZXIoKTsNCi0JCXJldHVybiBVcGRhdGVVSS5nZXRPcmlnaW5hdGluZ1VSTChrZXkpOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SWRlbnRpZmllcigpDQotCSAqLw0KLQlwdWJsaWMgVmVyc2lvbmVkSWRlbnRpZmllciBnZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkgew0KLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJcmV0dXJuIHJlZmVyZW5jZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGlkOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0U2l0ZSgpDQotCSAqLw0KLQlwdWJsaWMgSVNpdGUgZ2V0U2l0ZSgpIHsNCi0JCXJldHVybiBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TGFiZWwoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbA0KLQkJCSYmIHJlZmVyZW5jZSBpbnN0YW5jZW9mIElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UpIHsNCi0JCQlTdHJpbmcgbmFtZSA9ICgoSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZSkgcmVmZXJlbmNlKS5nZXROYW1lKCk7DQotCQkJaWYgKG5hbWUgIT0gbnVsbCkNCi0JCQkJcmV0dXJuIG5hbWU7DQotCQl9DQotCQlyZXR1cm4gdXJsLnRvU3RyaW5nKCk7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRVUkwoKQ0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0VXBkYXRlSW5mbygpDQotCSAqLw0KLQlwdWJsaWMgSVVSTEVudHJ5IGdldFVwZGF0ZVNpdGVFbnRyeSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGlzY292ZXJ5SW5mb3MoKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeVtdIGdldERpc2NvdmVyeVNpdGVFbnRyaWVzKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRQcm92aWRlcigpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCkgew0KLQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiTWlzc2luZ0ZlYXR1cmUucHJvdmlkZXIiKTsgLy8kTk9OLU5MUy0xJA0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGVzY3JpcHRpb24oKQ0KLQkgKi8NCi0JcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCXJldHVybiBkZXNjOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0Q29weXJpZ2h0KCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0Q29weXJpZ2h0KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRMaWNlbnNlKCkNCi0JICovDQotCXB1YmxpYyBJVVJMRW50cnkgZ2V0TGljZW5zZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0T1MoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0V1MoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRXUygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0TkwoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXROTCgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QXJjaCgpDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldE9TQXJjaCgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW1hZ2UoKQ0KLQkgKi8NCi0JcHVibGljIFVSTCBnZXRJbWFnZSgpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW1wb3J0cygpDQotCSAqLw0KLQlwdWJsaWMgSUltcG9ydFtdIGdldEltcG9ydHMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEFyY2hpdmVzKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmdbXSBnZXRBcmNoaXZlcygpIHsNCi0JCXJldHVybiBudWxsOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RGF0YUVudHJpZXMoKQ0KLQkgKi8NCi0JcHVibGljIElOb25QbHVnaW5FbnRyeVtdIGdldE5vblBsdWdpbkVudHJpZXMoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2FkZERhdGFFbnRyeShJRGF0YUVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkTm9uUGx1Z2luRW50cnkoSU5vblBsdWdpbkVudHJ5IGRhdGFFbnRyeSkgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RG93bmxvYWRTaXplKCkNCi0JICovDQotCXB1YmxpYyBsb25nIGdldERvd25sb2FkU2l6ZSgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0SW5zdGFsbFNpemUoSVNpdGUpDQotCSAqLw0KLQlwdWJsaWMgbG9uZyBnZXRJbnN0YWxsU2l6ZSgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjaXNQcmltYXJ5KCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUHJpbWFyeSgpIHsNCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEFwcGxpY2F0aW9uKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb24oKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjZ2V0UGx1Z2luRW50cmllcygpDQotCSAqLw0KLQlwdWJsaWMgSVBsdWdpbkVudHJ5W10gZ2V0UGx1Z2luRW50cmllcygpIHsNCi0JCXJldHVybiBuZXcgSVBsdWdpbkVudHJ5WzBdOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXRQbHVnaW5FbnRyeUNvdW50KCkNCi0JICovDQotCXB1YmxpYyBpbnQgZ2V0UGx1Z2luRW50cnlDb3VudCgpIHsNCi0JCXJldHVybiAwOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNnZXREb3dubG9hZFNpemUoSVBsdWdpbkVudHJ5KQ0KLQkgKi8NCi0JcHVibGljIGxvbmcgZ2V0RG93bmxvYWRTaXplKElQbHVnaW5FbnRyeSBlbnRyeSkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2dldEluc3RhbGxTaXplKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyBsb25nIGdldEluc3RhbGxTaXplKElQbHVnaW5FbnRyeSBlbnRyeSkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJUGx1Z2luQ29udGFpbmVyI2FkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFBsdWdpbkVudHJ5KElQbHVnaW5FbnRyeSBwbHVnaW5FbnRyeSkgew0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSVBsdWdpbkNvbnRhaW5lciNzdG9yZShJUGx1Z2luRW50cnksIFN0cmluZywgSW5wdXRTdHJlYW0pDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzdG9yZShJUGx1Z2luRW50cnkgZW50cnksIFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBpblN0cmVhbSkNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElBZGFwdGFibGUjZ2V0QWRhcHRlcihDbGFzcykNCi0JICovDQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSkNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnkpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI3NldEZlYXR1cmVDb250ZW50UHJvdmlkZXIoSUZlYXR1cmVDb250ZW50UHJvdmlkZXIpDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlQ29udGVudFByb3ZpZGVyKElGZWF0dXJlQ29udGVudFByb3ZpZGVyIGZlYXR1cmVDb250ZW50UHJvdmlkZXIpIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlQ29udGVudENvbnN1bWVyIGdldEZlYXR1cmVDb250ZW50Q29uc3VtZXIoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNzZXRTaXRlKElTaXRlKQ0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0U2l0ZShJU2l0ZSBzaXRlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQl0aGlzLnNpdGUgPSBzaXRlOw0KLQl9DQotDQotCS8qDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVDb250ZW50UHJvdmlkZXIgZ2V0RmVhdHVyZUNvbnRlbnRQcm92aWRlcigpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2luc3RhbGwoSUZlYXR1cmUsSVZlcmlmaWVyLCBJUHJvZ3Jlc3NNb25pdG9yKQ0KLQkgKi8NCi0JcHVibGljIElGZWF0dXJlUmVmZXJlbmNlIGluc3RhbGwoDQotCQlJRmVhdHVyZSB0YXJnZXRGZWF0dXJlLA0KLQkJSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyLA0KLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNpbnN0YWxsKElGZWF0dXJlLCBJRmVhdHVyZVJlZmVyZW5jZVtdLCBJVmVyaWZpY2F0aW9uTGlzdGVuZXIsIElQcm9ncmVzc01vbml0b3IpDQotCSAqLw0KLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2UgaW5zdGFsbCgNCi0JCUlGZWF0dXJlIHRhcmdldEZlYXR1cmUsDQotCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMsDQotCQlJVmVyaWZpY2F0aW9uTGlzdGVuZXIgdmVyaWZpY2F0aW9uTGlzdGVuZXIsDQotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpDQotCQl0aHJvd3MgSW5zdGFsbEFib3J0ZWRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNyZW1vdmUoSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElQbHVnaW5Db250YWluZXIjcmVtb3ZlKElQbHVnaW5FbnRyeSwgSVByb2dyZXNzTW9uaXRvcikNCi0JICovDQotCXB1YmxpYyB2b2lkIHJlbW92ZShJUGx1Z2luRW50cnkgZW50cnksIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikNCi0JCXRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JfQ0KLQ0KLQkvKg0KLQkgKiBAc2VlIElGZWF0dXJlI2dldE5vblBsdWdpbkVudHJ5Q291bnQoKQ0KLQkgKi8NCi0JcHVibGljIGludCBnZXROb25QbHVnaW5FbnRyeUNvdW50KCkgew0KLQkJcmV0dXJuIDA7DQotCX0NCi0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkNCi0JICovDQotCXB1YmxpYyBJSW5zdGFsbEhhbmRsZXJFbnRyeSBnZXRJbnN0YWxsSGFuZGxlckVudHJ5KCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoNCi0JICogQHNlZSBJRmVhdHVyZSNnZXRJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VzKCkNCi0JICovDQotCXB1YmxpYyBJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQlyZXR1cm4gbmV3IElJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2VbMF07DQotCX0NCi0NCi0JLyoqDQotCSAqIEBzZWUgSUZlYXR1cmUjZ2V0QWZmaW5pdHlGZWF0dXJlKCkNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0QWZmaW5pdHlGZWF0dXJlKCkgew0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoqDQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuSUZlYXR1cmUjZ2V0UmF3SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpDQotCSAqLw0KLQlwdWJsaWMgSUluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZVtdIGdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKQ0KLQkJdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJTm9uUGx1Z2luRW50cnlbXSBnZXRSYXdOb25QbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIGdldE5vblBsdWdpbkVudHJpZXMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdQbHVnaW5FbnRyaWVzKCkNCi0JICovDQotCXB1YmxpYyBJUGx1Z2luRW50cnlbXSBnZXRSYXdQbHVnaW5FbnRyaWVzKCkgew0KLQkJcmV0dXJuIGdldFBsdWdpbkVudHJpZXMoKTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRQcmltYXJ5UGx1Z2luSUQoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5UGx1Z2luSUQoKSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNnZXRSYXdJbXBvcnRzKCkNCi0JICovDQotCXB1YmxpYyBJSW1wb3J0W10gZ2V0UmF3SW1wb3J0cygpIHsNCi0JCXJldHVybiBuZXcgSUltcG9ydFswXTsNCi0JfQ0KLQ0KLQkvKioNCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZSNpc1BhdGNoKCkNCi0JICovDQotCXB1YmxpYyBib29sZWFuIGlzUGF0Y2goKSB7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JDQotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVzaXZlKCkgew0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvTmFtZWRNb2RlbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2IyZjg5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9OYW1lZE1vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKLQotcHVibGljIGNsYXNzIE5hbWVkTW9kZWxPYmplY3QgZXh0ZW5kcyBVSU1vZGVsT2JqZWN0IAotCQkJCQkJCWltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIsIFNlcmlhbGl6YWJsZSAgewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JdHJhbnNpZW50IHByaXZhdGUgTmFtZWRNb2RlbE9iamVjdCBwYXJlbnQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9OQU1FPSJwX25hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE5hbWVkTW9kZWxPYmplY3QoKSB7Ci0JfQotCQotCXB1YmxpYyBOYW1lZE1vZGVsT2JqZWN0KFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyLmVxdWFscyhJV29ya2JlbmNoQWRhcHRlci5jbGFzcykpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKGFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQkKLQlwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLQkJT2JqZWN0IHBhcmVudCA9IGdldFBhcmVudChudWxsKTsKLQkJaWYgKHBhcmVudCE9bnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBOYW1lZE1vZGVsT2JqZWN0KQotCQkJcmV0dXJuICgoTmFtZWRNb2RlbE9iamVjdClwYXJlbnQpLmdldFBhdGgoKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBQYXRoKGdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJbm90aWZ5T2JqZWN0Q2hhbmdlZChQX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLyoqCi0JICogQHNlZSBJV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChPYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAc2VlIElXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChPYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGFyZzApIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UGFyZW50KE5hbWVkTW9kZWxPYmplY3QgcGFyZW50KSB7Ci0JCXRoaXMucGFyZW50ID0gcGFyZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaW1wbGVGZWF0dXJlQWRhcHRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTIzZjQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1NpbXBsZUZlYXR1cmVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWw7DQotDQotaW1wb3J0IGphdmEubmV0Lio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLQ0KLS8qKg0KLSAqIEB2ZXJzaW9uIAkxLjANCi0gKiBAYXV0aG9yDQotICovDQotcHVibGljIGNsYXNzIFNpbXBsZUZlYXR1cmVBZGFwdGVyIGV4dGVuZHMgRmVhdHVyZUFkYXB0ZXIgew0KLQlwcm90ZWN0ZWQgSUZlYXR1cmUgZmVhdHVyZTsNCi0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOw0KLQlwdWJsaWMgU2ltcGxlRmVhdHVyZUFkYXB0ZXIoSUZlYXR1cmUgZmVhdHVyZSkgew0KLQkJdGhpcyhmZWF0dXJlLCBmYWxzZSk7DQotCX0NCi0JcHVibGljIFNpbXBsZUZlYXR1cmVBZGFwdGVyKElGZWF0dXJlIGZlYXR1cmUsIGJvb2xlYW4gb3B0aW9uYWwpIHsNCi0JCXRoaXMuZmVhdHVyZSA9IGZlYXR1cmU7DQotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7DQotCX0NCi0JDQotCXB1YmxpYyBJRmVhdHVyZSBnZXRGZWF0dXJlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJcmV0dXJuIGZlYXR1cmU7DQotCX0NCi0JDQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFzdExhYmVsKCkgew0KLQkJcmV0dXJuIGZlYXR1cmUuZ2V0TGFiZWwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gZmVhdHVyZS5nZXRVUkwoKTsNCi0JfQ0KLQkNCi0JcHVibGljIElTaXRlIGdldFNpdGUoKSB7DQotCQlyZXR1cm4gZmVhdHVyZS5nZXRTaXRlKCk7DQotCX0NCi0JDQotCXB1YmxpYyBJRmVhdHVyZUFkYXB0ZXJbXSBnZXRJbmNsdWRlZEZlYXR1cmVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJdHJ5IHsNCi0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPSBnZXRGZWF0dXJlKG1vbml0b3IpLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQlTaW1wbGVGZWF0dXJlQWRhcHRlcltdIHJlc3VsdCA9DQotCQkJCW5ldyBTaW1wbGVGZWF0dXJlQWRhcHRlcltpbmNsdWRlZC5sZW5ndGhdOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVkZWQubGVuZ3RoOyBpKyspIHsNCi0JCQkJcmVzdWx0W2ldID0NCi0JCQkJCW5ldyBTaW1wbGVGZWF0dXJlQWRhcHRlcihpbmNsdWRlZFtpXS5nZXRGZWF0dXJlKG51bGwpLCBpbmNsdWRlZFtpXS5pc09wdGlvbmFsKCkpOw0KLQkJCQlyZXN1bHRbaV0uc2V0SW5jbHVkZWQodHJ1ZSk7DQotCQkJfQ0KLQkJCXJldHVybiByZXN1bHQ7DQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm4gbmV3IElGZWF0dXJlQWRhcHRlclswXTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgew0KLQkJcmV0dXJuIG9wdGlvbmFsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQm9va21hcmsuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQm9va21hcmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5M2VmOC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUJvb2ttYXJrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBTaXRlQm9va21hcmsgZXh0ZW5kcyBOYW1lZE1vZGVsT2JqZWN0IA0KLQkJCQkJCQlpbXBsZW1lbnRzIElTaXRlQWRhcHRlciB7DQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfVVJMPSJwX3VybCI7IC8vJE5PTi1OTFMtMSQNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9UWVBFPSJwX3R5cGUiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwcml2YXRlIFVSTCB1cmw7DQotCXRyYW5zaWVudCBwcml2YXRlIElTaXRlIHNpdGU7DQotCXRyYW5zaWVudCBwcml2YXRlIFZlY3RvciBjYXRhbG9nOw0KLQl0cmFuc2llbnQgcHJpdmF0ZSBTaXRlQ2F0ZWdvcnkgb3RoZXJDYXRlZ29yeTsNCi0JcHJpdmF0ZSBib29sZWFuIHdlYkJvb2ttYXJrOw0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWQ7DQotCXByaXZhdGUgU3RyaW5nIFtdIGlnbm9yZWRDYXRlZ29yaWVzID0gbmV3IFN0cmluZ1swXTsNCi0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBsb2NhbCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gdW5hdmFpbGFibGUgPSBmYWxzZTsNCi0NCi0JcHVibGljIFNpdGVCb29rbWFyaygpIHsNCi0JfQ0KLQkNCi0JcHVibGljIFNpdGVCb29rbWFyayhTdHJpbmcgbmFtZSwgVVJMIHVybCwgYm9vbGVhbiB3ZWJCb29rbWFyaykgew0KLQkJdGhpcyhuYW1lLCB1cmwsIHdlYkJvb2ttYXJrLCBmYWxzZSk7DQotCX0NCi0JDQotCXB1YmxpYyBTaXRlQm9va21hcmsoU3RyaW5nIG5hbWUsIFVSTCB1cmwsIGJvb2xlYW4gd2ViQm9va21hcmssIGJvb2xlYW4gc2VsZWN0ZWQpIHsNCi0JCXN1cGVyKG5hbWUpOw0KLQkJdGhpcy51cmwgPSB1cmw7DQotCQl0aGlzLndlYkJvb2ttYXJrID0gd2ViQm9va21hcms7DQotCQl0aGlzLnNlbGVjdGVkID0gc2VsZWN0ZWQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBzZWxlY3RlZCkgew0KLQkJdGhpcy5zZWxlY3RlZCA9IHNlbGVjdGVkOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgew0KLQkJcmV0dXJuIHNlbGVjdGVkOw0KLQl9DQotCQ0KLQlwdWJsaWMgU3RyaW5nIFtdIGdldElnbm9yZWRDYXRlZ29yaWVzKCkgew0KLQkJcmV0dXJuIGlnbm9yZWRDYXRlZ29yaWVzOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJZ25vcmVkQ2F0ZWdvcmllcyhTdHJpbmcgW10gY2F0ZWdvcmllcykgew0KLQkJdGhpcy5pZ25vcmVkQ2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldFdlYkJvb2ttYXJrKGJvb2xlYW4gdmFsdWUpIHsNCi0JCWlmIChpc0xvY2FsKCkpIHJldHVybjsNCi0JCXRoaXMud2ViQm9va21hcmsgPSB2YWx1ZTsNCi0JCW5vdGlmeU9iamVjdENoYW5nZWQoUF9UWVBFKTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNXZWJCb29rbWFyaygpIHsNCi0JCXJldHVybiB3ZWJCb29rbWFyazsNCi0JfQ0KLQkNCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7DQotCQlyZXR1cm4gdXJsOw0KLQl9DQotDQotDQotCXB1YmxpYyB2b2lkIHNldFVSTChVUkwgdXJsKSB7DQotCQl0aGlzLnVybCA9IHVybDsNCi0JCXNpdGUgPSBudWxsOw0KLQkJbm90aWZ5T2JqZWN0Q2hhbmdlZChQX1VSTCk7DQotCX0NCi0JDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJcmV0dXJuIGdldFNpdGUodHJ1ZSwgbW9uaXRvcik7DQotCX0NCi0JDQotCXB1YmxpYyBJU2l0ZSBnZXRTaXRlKGJvb2xlYW4gc2hvd0RpYWxvZ0lmRmFpbGVkLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCWlmIChzaXRlPT1udWxsKSB7DQotCQkJdHJ5IHsNCi0JCQkJY29ubmVjdChtb25pdG9yKTsNCi0JCQl9DQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSwgc2hvd0RpYWxvZ0lmRmFpbGVkKTsNCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gc2l0ZTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNTaXRlQ29ubmVjdGVkKCkgew0KLQkJcmV0dXJuIHNpdGUhPW51bGw7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCQljb25uZWN0KHRydWUsIG1vbml0b3IpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KGJvb2xlYW4gdXNlQ2FjaGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJdHJ5IHsNCi0JCQlpZiAobW9uaXRvcj09bnVsbCkgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7DQotCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDIpOyAvLyROT04tTkxTLTEkDQotCQkJbW9uaXRvci5zdWJUYXNrKFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIlNpdGVCb29rbWFyay5jb25uZWN0aW5nIiwgdXJsLnRvU3RyaW5nKCkpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXNpdGUgPSBTaXRlTWFuYWdlci5nZXRTaXRlKHVybCwgdXNlQ2FjaGUsIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSkpOw0KLQkJCWlmIChzaXRlIT1udWxsKSB7DQotCQkJCWNyZWF0ZUNhdGFsb2cobmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7DQotCQkJCXVuYXZhaWxhYmxlID0gZmFsc2U7DQotCQkJfSBlbHNlIHsNCi0JCQkJY2F0YWxvZyA9IG5ldyBWZWN0b3IoKTsNCi0JCQkJdW5hdmFpbGFibGUgPSB0cnVlOw0KLQkJCX0NCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCXVuYXZhaWxhYmxlID0gdHJ1ZTsNCi0JCQl0aHJvdyBlOw0KLQkJfQ0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc1VuYXZhaWxhYmxlKCkgew0KLQkJcmV0dXJuIHVuYXZhaWxhYmxlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRVbmF2YWlsYWJsZShib29sZWFuIHZhbHVlKSB7DQotCQl1bmF2YWlsYWJsZSA9IHZhbHVlOw0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2F0YWxvZyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCWNhdGFsb2cgPSBuZXcgVmVjdG9yKCk7DQotCQlvdGhlckNhdGVnb3J5ID0gbmV3IFNpdGVDYXRlZ29yeSh0aGlzLCBudWxsLCBudWxsKTsNCi0JCS8vIEFkZCBhbGwgdGhlIGNhdGVnb3JpZXMNCi0JCUlDYXRlZ29yeSBbXSBjYXRlZ29yaWVzID0gc2l0ZS5nZXRDYXRlZ29yaWVzKCk7DQotCQkNCi0JCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBbXSBmZWF0dXJlUmVmczsNCi0JCWZlYXR1cmVSZWZzID0gc2l0ZS5nZXRSYXdGZWF0dXJlUmVmZXJlbmNlcygpOw0KLQkJDQotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgZmVhdHVyZVJlZnMubGVuZ3RoICsgY2F0ZWdvcmllcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkDQotDQotCQlmb3IgKGludCBpPTA7IGk8Y2F0ZWdvcmllcy5sZW5ndGg7IGkrKykgew0KLQkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IGNhdGVnb3JpZXNbaV07DQotCQkJYWRkQ2F0ZWdvcnlUb0NhdGFsb2coY2F0ZWdvcnkpOw0KLQkJCW1vbml0b3Iud29ya2VkKDEpOw0KLQkJfQ0KLQkJLy8gQWRkIGZlYXR1cmVzIHRvIGNhdGVnb3JpZXMNCi0NCi0JCWZvciAoaW50IGk9MDsgaTxmZWF0dXJlUmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCUlTaXRlRmVhdHVyZVJlZmVyZW5jZSBmZWF0dXJlUmVmID0gZmVhdHVyZVJlZnNbaV07DQotCQkJYWRkRmVhdHVyZVRvQ2F0YWxvZyhmZWF0dXJlUmVmKTsNCi0JCQltb25pdG9yLndvcmtlZCgxKTsNCi0JCX0NCi0JCWlmIChvdGhlckNhdGVnb3J5LmdldENoaWxkQ291bnQoKT4wKQ0KLQkJICAgY2F0YWxvZy5hZGQob3RoZXJDYXRlZ29yeSk7DQotCX0NCi0NCi0JcHVibGljIE9iamVjdCBbXSBnZXRDYXRhbG9nKGJvb2xlYW4gd2l0aENhdGVnb3JpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgew0KLQkJaWYgKHdpdGhDYXRlZ29yaWVzKQ0KLQkJCXJldHVybiBjYXRhbG9nLnRvQXJyYXkoKTsNCi0JCWVsc2Ugew0KLQkJCS8vIE1ha2UgYSBmbGF0IGNhdGFsb2cNCi0JCQlWZWN0b3IgZmxhdENhdGFsb2cgPSBuZXcgVmVjdG9yKCk7DQotCQkJZm9yIChpbnQgaT0wOyBpPGNhdGFsb2cuc2l6ZSgpOyBpKyspIHsNCi0JCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSljYXRhbG9nLmdldChpKTsNCi0JCQkJY2F0ZWdvcnkuYWRkRmVhdHVyZXNUbyhmbGF0Q2F0YWxvZyk7DQotCQkJfQ0KLQkJCXJldHVybiBmbGF0Q2F0YWxvZy50b0FycmF5KCk7DQotCQl9DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBhZGRDYXRlZ29yeVRvQ2F0YWxvZyhJQ2F0ZWdvcnkgY2F0ZWdvcnkpIHsNCi0JCVN0cmluZyBuYW1lID0gY2F0ZWdvcnkuZ2V0TmFtZSgpOw0KLQkJaW50IGxvYyA9IG5hbWUuaW5kZXhPZignLycpOw0KLQkJaWYgKGxvYyA9PSAtMSkgew0KLQkJCS8vIGZpcnN0IGxldmVsDQotCQkJY2F0YWxvZy5hZGQobmV3IFNpdGVDYXRlZ29yeSh0aGlzLCBuYW1lLCBjYXRlZ29yeSkpOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOw0KLQkJCW5hbWUgPSBwYXRoLmxhc3RTZWdtZW50KCkudG9TdHJpbmcoKTsNCi0JCQlwYXRoID0gcGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7DQotCQkJU2l0ZUNhdGVnb3J5IHBhcmVudENhdGVnb3J5ID0gZmluZENhdGVnb3J5KHBhdGgsIGNhdGFsb2cudG9BcnJheSgpKTsNCi0JCQlpZiAocGFyZW50Q2F0ZWdvcnkhPW51bGwpIHsNCi0JCQkJcGFyZW50Q2F0ZWdvcnkuYWRkKG5ldyBTaXRlQ2F0ZWdvcnkodGhpcywgbmFtZSwgY2F0ZWdvcnkpKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcHJpdmF0ZSB2b2lkIGFkZEZlYXR1cmVUb0NhdGFsb2coSVNpdGVGZWF0dXJlUmVmZXJlbmNlIGZlYXR1cmUpIHsNCi0JCUlDYXRlZ29yeSBbXSBjYXRlZ29yaWVzID0gZmVhdHVyZS5nZXRDYXRlZ29yaWVzKCk7DQotCQlib29sZWFuIG9ycGhhbiA9IHRydWU7DQotDQotCQlmb3IgKGludCBpPTA7IGk8Y2F0ZWdvcmllcy5sZW5ndGg7IGkrKykgew0KLQkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IGNhdGVnb3JpZXNbaV07DQotCQkJU3RyaW5nIG5hbWUgPSBjYXRlZ29yeS5nZXROYW1lKCk7DQotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOw0KLQkJCVNpdGVDYXRlZ29yeSBwYXJlbnRDYXRlZ29yeSA9IGZpbmRDYXRlZ29yeShwYXRoLCBjYXRhbG9nLnRvQXJyYXkoKSk7DQotCQkJaWYgKHBhcmVudENhdGVnb3J5IT1udWxsKSB7DQotCQkgICAJCXBhcmVudENhdGVnb3J5LmFkZChuZXcgRmVhdHVyZVJlZmVyZW5jZUFkYXB0ZXIoZmVhdHVyZSkpOw0KLQkJICAgCQlvcnBoYW4gPSBmYWxzZTsNCi0JCQl9DQotCQl9DQotCQlpZiAob3JwaGFuKQ0KLQkJCW90aGVyQ2F0ZWdvcnkuYWRkKG5ldyBGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcihmZWF0dXJlKSk7DQotCX0NCi0JDQotCXByaXZhdGUgU2l0ZUNhdGVnb3J5IGZpbmRDYXRlZ29yeShJUGF0aCBwYXRoLCBPYmplY3QgW10gY2hpbGRyZW4pIHsNCi0JCWZvciAoaW50IGk9MDsgaTxjaGlsZHJlbi5sZW5ndGg7IGkrKykgew0KLQkJCU9iamVjdCBjaGlsZCA9IGNoaWxkcmVuW2ldOw0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgew0KLQkJCQlTaXRlQ2F0ZWdvcnkgc2MgPSAoU2l0ZUNhdGVnb3J5KWNoaWxkOw0KLQkJCQlpZiAoc2MuZ2V0TmFtZSgpLmVxdWFscyhwYXRoLnNlZ21lbnQoMCkpKSB7DQotCQkJCSAgIGlmIChwYXRoLnNlZ21lbnRDb3VudCgpPT0xKSByZXR1cm4gc2M7DQotCQkJCQllbHNlIHsNCi0JCQkJCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOw0KLQkJCQkJCXJldHVybiBmaW5kQ2F0ZWdvcnkocGF0aCwgc2MuZ2V0Q2hpbGRyZW4oKSk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkvKioNCi0JICogQHNlZSBJU2l0ZUFkYXB0ZXIjZ2V0TGFiZWwoKQ0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCXJldHVybiBnZXROYW1lKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldFJlYWRPbmx5KGJvb2xlYW4gcmVhZE9ubHkpIHsNCi0JCXRoaXMucmVhZE9ubHkgPSByZWFkT25seTsNCi0JfQ0KLQkNCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsNCi0JCXJldHVybiByZWFkT25seTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2V0TG9jYWwoYm9vbGVhbiBsb2NhbCkgew0KLQkJdGhpcy5sb2NhbCA9IGxvY2FsOw0KLQl9DQotCQ0KLQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgew0KLQkJcmV0dXJuIGxvY2FsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQ2F0ZWdvcnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9TaXRlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyNTBhYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvU2l0ZUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi0NCi1wdWJsaWMgY2xhc3MgU2l0ZUNhdGVnb3J5IGV4dGVuZHMgVUlNb2RlbE9iamVjdCB7DQotDQotCVZlY3RvciBjaGlsZHJlbjsNCi0JcHJpdmF0ZSBJQ2F0ZWdvcnkgY2F0ZWdvcnk7DQotCXByaXZhdGUgU3RyaW5nIG5hbWU7DQotCXByaXZhdGUgYm9vbGVhbiB0b3VjaGVkOw0KLQlwcml2YXRlIGludCBmZWF0dXJlQ291bnQ7DQotCXByaXZhdGUgYm9vbGVhbiBjYW5jZWxlZDsNCi0JcHJpdmF0ZSBTaXRlQm9va21hcmsgYm9va21hcms7DQotDQotCWNsYXNzIE90aGVyQ2F0ZWdvcnkgaW1wbGVtZW50cyBJQ2F0ZWdvcnkgew0KLQkJSVVSTEVudHJ5IGVudHJ5Ow0KLQkJcHVibGljIE90aGVyQ2F0ZWdvcnkoKSB7DQotCQkJZW50cnkgPSBuZXcgSVVSTEVudHJ5KCkgew0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb24oKSB7DQotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlQ2F0ZWdvcnkub3RoZXIuZGVzY3JpcHRpb24iKTsgLy8kTk9OLU5MUy0xJA0KLQkJCQl9DQotCQkJCXB1YmxpYyBVUkwgZ2V0VVJMKCkgew0KLQkJCQkJcmV0dXJuIG51bGw7DQotCQkJCX0NCi0JCQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGNsYXp6KSB7DQotCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQkJfQ0KLQkJCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7DQotCQkJCQlyZXR1cm4gSVVSTEVudHJ5LlVQREFURV9TSVRFOw0KLQkJCQl9DQotCQkJfTsNCi0JCX0NCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsNCi0JCQlyZXR1cm4gU2l0ZUNhdGVnb3J5LnRoaXMuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsNCi0JCQlyZXR1cm4gU2l0ZUNhdGVnb3J5LnRoaXMuZ2V0TmFtZSgpOw0KLQkJfQ0KLQkJcHVibGljIElVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsNCi0JCQlyZXR1cm4gZW50cnk7DQotCQl9DQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgY2xhenopIHsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5KFNpdGVCb29rbWFyayBib29rbWFyaywgU3RyaW5nIG5hbWUsIElDYXRlZ29yeSBjYXRlZ29yeSkgew0KLQkJdGhpcy5ib29rbWFyayA9IGJvb2ttYXJrOw0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpIHsNCi0JCQl0aGlzLm5hbWUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVDYXRlZ29yeS5vdGhlci5sYWJlbCIpOyAvLyROT04tTkxTLTEkDQotCQkJdGhpcy5jYXRlZ29yeSA9IG5ldyBPdGhlckNhdGVnb3J5KCk7DQotCQl9IGVsc2Ugew0KLQkJCXRoaXMubmFtZSA9IG5hbWU7DQotCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5Ow0KLQkJfQ0KLQkJY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7DQotCX0NCi0JDQotCXB1YmxpYyBTaXRlQm9va21hcmsgZ2V0Qm9va21hcmsoKSB7DQotCQlyZXR1cm4gYm9va21hcms7DQotCX0NCi0NCi0JcHVibGljIGJvb2xlYW4gaXNPdGhlckNhdGVnb3J5KCkgew0KLQkJcmV0dXJuIGNhdGVnb3J5IGluc3RhbmNlb2YgT3RoZXJDYXRlZ29yeTsNCi0JfQ0KLQ0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7DQotCQlyZXR1cm4gY2FuY2VsZWQgPyBuZXcgT2JqZWN0WzBdIDogY2hpbGRyZW4udG9BcnJheSgpOw0KLQl9DQotDQotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsNCi0JCXJldHVybiBjYW5jZWxlZCA/IDAgOiBjaGlsZHJlbi5zaXplKCk7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgew0KLQkJcmV0dXJuIG5hbWU7DQotCX0NCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsNCi0JCXJldHVybiBjYXRlZ29yeS5nZXROYW1lKCk7DQotCX0NCi0NCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsNCi0JCXJldHVybiBjYXRlZ29yeS5nZXRMYWJlbCgpOw0KLQl9DQotDQotCXB1YmxpYyBJQ2F0ZWdvcnkgZ2V0Q2F0ZWdvcnkoKSB7DQotCQlyZXR1cm4gY2F0ZWdvcnk7DQotCX0NCi0NCi0Jdm9pZCBhZGQoT2JqZWN0IGNoaWxkKSB7DQotCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpDQotCQkJZmVhdHVyZUNvdW50Kys7DQotCQljaGlsZHJlbi5hZGQoY2hpbGQpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIHRvdWNoRmVhdHVyZXMoSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7DQotCQlpZiAoY2hpbGRyZW4uc2l6ZSgpID09IDAgfHwgdG91Y2hlZCB8fCBmZWF0dXJlQ291bnQgPT0gMCkNCi0JCQlyZXR1cm47DQotDQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsNCi0JCQkJbW9uaXRvci5iZWdpblRhc2soDQotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVCb29rbWFyay5kb3dubG9hZGluZyIpLCAvLyROT04tTkxTLTEkDQotCQkJCQlmZWF0dXJlQ291bnQpOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7DQotCQkJCQlPYmplY3QgY2hpbGQgPSBjaGlsZHJlbi5nZXQoaSk7DQotCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpDQotCQkJCQkJYnJlYWs7DQotCQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsNCi0JCQkJCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpIGNoaWxkOw0KLQkJCQkJCW1vbml0b3Iuc3ViVGFzayhhZGFwdGVyLmdldEZhc3RMYWJlbCgpKTsNCi0JCQkJCQl0cnkgew0KLQkJCQkJCQlhZGFwdGVyLmdldEZlYXR1cmUoDQotCQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsNCi0JCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJbW9uaXRvci5kb25lKCk7DQotCQkJfQ0KLQkJfTsNCi0NCi0JCXRyeSB7DQotCQkJY29udGV4dC5ydW4odHJ1ZSwgdHJ1ZSwgb3ApOw0KLQkJCXRvdWNoZWQgPSB0cnVlOw0KLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgew0KLQkJCWNhbmNlbGVkID0gdHJ1ZTsNCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLQkJfQ0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGFkZEZlYXR1cmVzVG8oVmVjdG9yIGZsYXRMaXN0KSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7DQotCQkJT2JqZWN0IGNoaWxkID0gY2hpbGRyZW4uZ2V0KGkpOw0KLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSB7DQotCQkJCUZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGNmZWF0dXJlID0NCi0JCQkJCShGZWF0dXJlUmVmZXJlbmNlQWRhcHRlcikgY2hpbGQ7DQotCQkJCS8vIERvbid0IGFkZCBkdXBsaWNhdGVzIC0gdGhlcmUgbWF5IGJlIHRoZSBzYW1lDQotCQkJCS8vIGZlYXR1cmUgcHJlc2VudCBpbiBzZXZlcmFsIGNhdGVnb3JpZXMNCi0JCQkJaWYgKGZpbmRGZWF0dXJlKGZsYXRMaXN0LCBjZmVhdHVyZS5nZXRGZWF0dXJlUmVmZXJlbmNlKCkpDQotCQkJCQk9PSBudWxsKSB7DQotCQkJCQlmbGF0TGlzdC5hZGQoY2hpbGQpOw0KLQkJCQl9DQotCQkJfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgew0KLQkJCQkoKFNpdGVDYXRlZ29yeSkgY2hpbGQpLmFkZEZlYXR1cmVzVG8oZmxhdExpc3QpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGZpbmRGZWF0dXJlKA0KLQkJVmVjdG9yIGZsYXRMaXN0LA0KLQkJSUZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZVJlZikgew0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmbGF0TGlzdC5zaXplKCk7IGkrKykgew0KLQkJCUZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyIGNmZWF0dXJlID0NCi0JCQkJKEZlYXR1cmVSZWZlcmVuY2VBZGFwdGVyKSBmbGF0TGlzdC5nZXQoaSk7DQotCQkJaWYgKGNmZWF0dXJlLmdldEZlYXR1cmVSZWZlcmVuY2UoKS5lcXVhbHMoZmVhdHVyZVJlZikpDQotCQkJCXJldHVybiBjZmVhdHVyZTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VSU1vZGVsT2JqZWN0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvbW9kZWwvVUlNb2RlbE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg0ZGJmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VSU1vZGVsT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgVUlNb2RlbE9iamVjdCBleHRlbmRzIFBsYXRmb3JtT2JqZWN0IGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCVVwZGF0ZU1vZGVsIG1vZGVsOwotCQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKFVwZGF0ZU1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0JCi0JcHVibGljIFVwZGF0ZU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdENoYW5nZWQoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChtb2RlbD09bnVsbCkgcmV0dXJuOwotCQltb2RlbC5maXJlT2JqZWN0Q2hhbmdlZCh0aGlzLCBwcm9wZXJ0eSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeU9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gb2JqZWN0cykgewotCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKLQkJbW9kZWwuZmlyZU9iamVjdHNBZGRlZChwYXJlbnQsIG9iamVjdHMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlPYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3QgW10gb2JqZWN0cykgewotCQlpZiAobW9kZWw9PW51bGwpIHJldHVybjsKLQkJbW9kZWwuZmlyZU9iamVjdHNSZW1vdmVkKHBhcmVudCwgb2JqZWN0cyk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgW10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG9iaikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiB0b1N0cmluZygpOwotCX0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9tb2RlbC9VcGRhdGVNb2RlbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VwZGF0ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2FlMjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL21vZGVsL1VwZGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyANCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsOw0KLQ0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotaW1wb3J0IGphdmEudXRpbC4qOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVXBkYXRlTW9kZWwgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsNCi0JcHJpdmF0ZSBWZWN0b3IgYm9va21hcmtzID0gbmV3IFZlY3RvcigpOw0KLQlwcml2YXRlIFZlY3RvciBsaXN0ZW5lcnMgPSBuZXcgVmVjdG9yKCk7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCT09LTUFSS19GSUxFID0gImJvb2ttYXJrcy54bWwiOyAvLyROT04tTkxTLTEkDQotCQ0KLQlwdWJsaWMgVXBkYXRlTW9kZWwoKSB7DQotCQlyZXNldCgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsNCi0JCS8vIGxvYWQgYm9va21hcmtzDQotCQlib29rbWFya3MuY2xlYXIoKTsNCi0JCUJvb2ttYXJrVXRpbC5wYXJzZShnZXRCb29rbWFya3NGaWxlTmFtZSgpLCBib29rbWFya3MpOw0KLQl9DQotCQ0KLQlwcml2YXRlIFN0cmluZyBnZXRCb29rbWFya3NGaWxlTmFtZSgpIHsNCi0JCVVSTCBwbGF0Zm9ybVhNTCA9IENvbmZpZ3VyYXRvclV0aWxzLmdldEN1cnJlbnRQbGF0Zm9ybUNvbmZpZ3VyYXRpb24oKS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsNCi0JCWlmICghImZpbGUiLmVxdWFscyhwbGF0Zm9ybVhNTC5nZXRQcm90b2NvbCgpKSkgew0KLQkJCUlQYXRoIHBhdGggPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpOw0KLQkJCXBhdGggPSBwYXRoLmFwcGVuZChCT09LTUFSS19GSUxFKTsNCi0JCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCk7DQotCQl9IGVsc2Ugew0KLQkJCUZpbGUgZiA9IG5ldyBGaWxlKHBsYXRmb3JtWE1MLmdldEZpbGUoKSk7DQotCQkJZiA9IG5ldyBGaWxlKGYuZ2V0UGFyZW50RmlsZSgpLCBCT09LTUFSS19GSUxFKTsNCi0JCQlyZXR1cm4gZi5nZXRBYnNvbHV0ZVBhdGgoKTsNCi0JCX0NCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7DQotCQlzYXZlQm9va21hcmtzKCk7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNhdmVCb29rbWFya3MoKSB7DQotCQlCb29rbWFya1V0aWwuc3RvcmUoZ2V0Qm9va21hcmtzRmlsZU5hbWUoKSwgYm9va21hcmtzKTsNCi0JfQ0KLQkNCi0JDQotCXB1YmxpYyB2b2lkIGFkZEJvb2ttYXJrKE5hbWVkTW9kZWxPYmplY3QgYm9va21hcmspIHsNCi0JCWJvb2ttYXJrcy5hZGQoYm9va21hcmspOw0KLQkJYm9va21hcmsuc2V0TW9kZWwodGhpcyk7DQotCQlmaXJlT2JqZWN0c0FkZGVkKG51bGwsIG5ldyBPYmplY3QgW117Ym9va21hcmt9KTsNCi0JfQ0KLQkNCi0JcHVibGljIHZvaWQgcmVtb3ZlQm9va21hcmsoTmFtZWRNb2RlbE9iamVjdCBib29rbWFyaykgew0KLQkJYm9va21hcmtzLnJlbW92ZShib29rbWFyayk7DQotCQlib29rbWFyay5zZXRNb2RlbChudWxsKTsNCi0JCWZpcmVPYmplY3RzUmVtb3ZlZChudWxsLCBuZXcgT2JqZWN0IFtde2Jvb2ttYXJrfSk7DQotCX0NCi0JDQotCXB1YmxpYyBOYW1lZE1vZGVsT2JqZWN0IFtdIGdldEJvb2ttYXJrcygpIHsNCi0JCXJldHVybiAoTmFtZWRNb2RlbE9iamVjdFtdKWJvb2ttYXJrcy50b0FycmF5KG5ldyBOYW1lZE1vZGVsT2JqZWN0W2Jvb2ttYXJrcy5zaXplKCldKTsNCi0JfQ0KLQkNCi0JcHVibGljIFNpdGVCb29rbWFyayBbXSBnZXRCb29rbWFya0xlYWZzKCkgew0KLQkJcmV0dXJuIEJvb2ttYXJrVXRpbC5nZXRCb29rbWFya3MoYm9va21hcmtzKTsNCi0JfQ0KLQkNCi0JcHVibGljIEJvb2ttYXJrRm9sZGVyIGdldEZvbGRlcihJUGF0aCBwYXRoKSB7DQotCQlyZXR1cm4gQm9va21hcmtVdGlsLmdldEZvbGRlcihib29rbWFya3MsIHBhdGgpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBhZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWlmICghbGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgDQotCQkgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsNCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsNCi0JCWlmIChsaXN0ZW5lcnMuY29udGFpbnMobGlzdGVuZXIpKQ0KLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBmaXJlT2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdCBbXSBjaGlsZHJlbikgew0KLQkJZm9yIChJdGVyYXRvciBpdGVyPWxpc3RlbmVycy5pdGVyYXRvcigpOw0KLQkJCQlpdGVyLmhhc05leHQoKTspIHsNCi0JCQlJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIgPSAoSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKWl0ZXIubmV4dCgpOw0KLQkJCWxpc3RlbmVyLm9iamVjdHNBZGRlZChwYXJlbnQsIGNoaWxkcmVuKTsNCi0JCX0NCi0JfQ0KLQ0KLQ0KLQlwdWJsaWMgdm9pZCBmaXJlT2JqZWN0c1JlbW92ZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IFtdIGNoaWxkcmVuKSB7DQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXI9bGlzdGVuZXJzLml0ZXJhdG9yKCk7DQotCQkJCWl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIpaXRlci5uZXh0KCk7DQotCQkJbGlzdGVuZXIub2JqZWN0c1JlbW92ZWQocGFyZW50LCBjaGlsZHJlbik7DQotCQl9DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIGZpcmVPYmplY3RDaGFuZ2VkKE9iamVjdCBvYmplY3QsIFN0cmluZyBwcm9wZXJ0eSkgew0KLQkJZm9yIChJdGVyYXRvciBpdGVyPWxpc3RlbmVycy5pdGVyYXRvcigpOw0KLQkJCWl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCUlVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IChJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIpaXRlci5uZXh0KCk7DQotCQkJbGlzdGVuZXIub2JqZWN0Q2hhbmdlZChvYmplY3QsIHByb3BlcnR5KTsNCi0JCX0NCi0JfQ0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL0Fic3RyYWN0T3ZlcmxheUljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjYmRmMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvQWJzdHJhY3RPdmVybGF5SWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLQotLyoqCi0gKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPdmVybGF5SWNvbiBleHRlbmRzIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciB7Ci0KLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfV0lEVEggPSAxNjsKLQlzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSEVJR0hUID0gMTY7Ci0KLQlwcml2YXRlIFBvaW50IGZTaXplID0gbnVsbDsKLQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZPdmVybGF5c1tdW107Ci0KLQlwdWJsaWMgQWJzdHJhY3RPdmVybGF5SWNvbihJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzKSB7Ci0JCXRoaXMob3ZlcmxheXMsIG51bGwpOwotCX0KLQotCXB1YmxpYyBBYnN0cmFjdE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsIFBvaW50IHNpemUpIHsKLQkJZk92ZXJsYXlzID0gb3ZlcmxheXM7Ci0JCWlmIChzaXplICE9IG51bGwpCi0JCQlmU2l6ZSA9IHNpemU7Ci0JCWVsc2UKLQkJCWZTaXplID0gbmV3IFBvaW50KERFRkFVTFRfV0lEVEgsIERFRkFVTFRfSEVJR0hUKTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd0JvdHRvbUxlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCQl4ICs9IGlkLndpZHRoOwotCQkJfQotCQl9Ci0JfQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLQkJaW50IHggPSBnZXRTaXplKCkueDsKLQkJZm9yIChpbnQgaSA9IDI7IGkgPj0gMDsgaS0tKSB7Ci0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0JCQkJSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0JCQkJeCAtPSBpZC53aWR0aDsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJbWFnZURhdGEgZ2V0QmFzZUltYWdlRGF0YSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgewotCQlJbWFnZURhdGEgYmFzZSA9IGdldEJhc2VJbWFnZURhdGEoKTsKLQkJZHJhd0ltYWdlKGJhc2UsIDAsIDApOwotCQlpZiAoZk92ZXJsYXlzICE9IG51bGwpIHsKLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkKLQkJCQlkcmF3VG9wUmlnaHQoZk92ZXJsYXlzWzBdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAxKQotCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOwotCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpCi0JCQkJZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQotCQkJaWYgKGZPdmVybGF5cy5sZW5ndGggPiAzKQotCQkJCWRyYXdUb3BMZWZ0KGZPdmVybGF5c1szXSk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLQkJaWYgKG92ZXJsYXlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0JCWludCB4ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQlkcmF3SW1hZ2UoaWQsIHgsIDApOwotCQkJCXggKz0gaWQud2lkdGg7Ci0JCQl9Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcFJpZ2h0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7Ci0JCWlmIChvdmVybGF5cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gb3ZlcmxheXMubGVuZ3RoOwotCQlpbnQgeCA9IGdldFNpemUoKS54OwotCQlmb3IgKGludCBpID0gMjsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLQkJCQlJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLQkJCQl4IC09IGlkLndpZHRoOwotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGZTaXplOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9EZWZhdWx0Q29udGVudFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvRGVmYXVsdENvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTY3YTdiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9EZWZhdWx0Q29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHM7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsNCi0NCi1wdWJsaWMgY2xhc3MgRGVmYXVsdENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElDb250ZW50UHJvdmlkZXIgew0KLQ0KLXB1YmxpYyBEZWZhdWx0Q29udGVudFByb3ZpZGVyKCkgew0KLQlzdXBlcigpOw0KLX0NCi1wdWJsaWMgdm9pZCBkaXNwb3NlKCkge30NCi1wdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvSW1hZ2VPdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTRiOTc3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9JbWFnZU92ZXJsYXlJY29uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci0KLS8qKgotICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4KLSAqLwotcHVibGljIGNsYXNzIEltYWdlT3ZlcmxheUljb24gZXh0ZW5kcyBBYnN0cmFjdE92ZXJsYXlJY29uIHsKLQlwcml2YXRlIEltYWdlIGJhc2U7Ci0KLQlwdWJsaWMgSW1hZ2VPdmVybGF5SWNvbihJbWFnZSBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzKSB7Ci0JCXRoaXMoYmFzZSwgb3ZlcmxheXMsIG51bGwpOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2VPdmVybGF5SWNvbihJbWFnZSBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7Ci0JCXN1cGVyKG92ZXJsYXlzLCBzaXplKTsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEltYWdlRGF0YSBnZXRCYXNlSW1hZ2VEYXRhKCkgewotCQlyZXR1cm4gYmFzZS5nZXRJbWFnZURhdGEoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvT3ZlcmxheUljb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9PdmVybGF5SWNvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmY0ZTcyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9PdmVybGF5SWNvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotDQotLyoqDQotICogQW4gT3ZlcmxheUljb24gY29uc2lzdHMgb2YgYSBtYWluIGljb24gYW5kIHNldmVyYWwgYWRvcm5tZW50cy4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgT3ZlcmxheUljb24gZXh0ZW5kcyBDb21wb3NpdGVJbWFnZURlc2NyaXB0b3Igew0KLQkNCi0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIPSAxNjsNCi0Jc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVD0gMTY7DQotCQ0KLQlwcml2YXRlIFBvaW50IGZTaXplPSBudWxsOw0KLQkJDQotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOw0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmT3ZlcmxheXNbXVtdOw0KLQ0KLQlwdWJsaWMgT3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMpIHsNCi0JCWZCYXNlPSBiYXNlOw0KLQkJaWYgKGZCYXNlID09IG51bGwpDQotCQkJZkJhc2U9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7DQotCQlmT3ZlcmxheXM9IG92ZXJsYXlzOw0KLQkJZlNpemU9IG5ldyBQb2ludChERUZBVUxUX1dJRFRILCBERUZBVUxUX0hFSUdIVCk7DQotCX0NCi0JcHVibGljIE92ZXJsYXlJY29uKEltYWdlRGVzY3JpcHRvciBiYXNlLCBJbWFnZURlc2NyaXB0b3JbXVtdIG92ZXJsYXlzLCBQb2ludCBzaXplKSB7DQotCQlmQmFzZT0gYmFzZTsNCi0JCWlmIChmQmFzZSA9PSBudWxsKQ0KLQkJCWZCYXNlPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOw0KLQkJZk92ZXJsYXlzPSBvdmVybGF5czsNCi0JCWZTaXplPSBzaXplOw0KLQl9DQotCXByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21MZWZ0KEltYWdlRGVzY3JpcHRvcltdIG92ZXJsYXlzKSB7DQotCQlpZiAob3ZlcmxheXMgPT0gbnVsbCkNCi0JCQlyZXR1cm47DQotCQlpbnQgbGVuZ3RoPSBvdmVybGF5cy5sZW5ndGg7DQotCQlpbnQgeD0gMDsNCi0JCWZvciAoaW50IGk9IDA7IGkgPCAzOyBpKyspIHsNCi0JCQlpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7DQotCQkJCUltYWdlRGF0YSBpZD0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7DQotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnktaWQuaGVpZ2h0KTsNCi0JCQkJeCs9IGlkLndpZHRoOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSBnZXRTaXplKCkueDsNCi0JCWZvciAoaW50IGk9IDI7IGkgPj0gMDsgaS0tKSB7DQotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgew0KLQkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOw0KLQkJCQl4LT0gaWQud2lkdGg7DQotCQkJCWRyYXdJbWFnZShpZCwgeCwgZ2V0U2l6ZSgpLnktaWQuaGVpZ2h0KTsNCi0JCQl9DQotCQl9DQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgZHJhd0NvbXBvc2l0ZUltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCkgew0KLQkJSW1hZ2VEYXRhIGJnPSBmQmFzZS5nZXRJbWFnZURhdGEoKTsNCi0JCWRyYXdJbWFnZShiZywgMCwgMCk7DQotCQkNCi0JCWlmIChmT3ZlcmxheXMgIT0gbnVsbCkgew0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMCkNCi0JCQkJZHJhd1RvcFJpZ2h0KCBmT3ZlcmxheXNbMF0pOw0KLQkJCQkNCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDEpDQotCQkJCWRyYXdCb3R0b21SaWdodChmT3ZlcmxheXNbMV0pOw0KLQkJCQkNCi0JCQlpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDIpDQotCQkJCWRyYXdCb3R0b21MZWZ0KGZPdmVybGF5c1syXSk7DQotCQkJCQ0KLQkJCWlmIChmT3ZlcmxheXMubGVuZ3RoID4gMykNCi0JCQkJZHJhd1RvcExlZnQoZk92ZXJsYXlzWzNdKTsNCi0JCX0JDQotCX0NCi0JcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSAwOw0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IDM7IGkrKykgew0KLQkJCWlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsNCi0JCQkJSW1hZ2VEYXRhIGlkPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsNCi0JCQkJZHJhd0ltYWdlKGlkLCB4LCAwKTsNCi0JCQkJeCs9IGlkLndpZHRoOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VG9wUmlnaHQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsNCi0JCWlmIChvdmVybGF5cyA9PSBudWxsKQ0KLQkJCXJldHVybjsNCi0JCWludCBsZW5ndGg9IG92ZXJsYXlzLmxlbmd0aDsNCi0JCWludCB4PSBnZXRTaXplKCkueDsNCi0JCWZvciAoaW50IGk9IDI7IGkgPj0gMDsgaS0tKSB7DQotCQkJaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgew0KLQkJCQlJbWFnZURhdGEgaWQ9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOw0KLQkJCQl4LT0gaWQud2lkdGg7DQotCQkJCWRyYXdJbWFnZShpZCwgeCwgMCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCXByb3RlY3RlZCBQb2ludCBnZXRTaXplKCkgew0KLQkJcmV0dXJuIGZTaXplOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wYXJ0cy9QaXhlbENvbnZlcnRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4N2M2ZDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1BpeGVsQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLXB1YmxpYyBjbGFzcyBQaXhlbENvbnZlcnRlciB7Ci0JCi0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0JCi0JcHVibGljIFBpeGVsQ29udmVydGVyKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcz0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoaW50IGNoYXJzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGNoYXJzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKGludCBkbHVzKSB7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBkbHVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhpbnQgZGx1cykgewotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGRsdXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhpbnQgY2hhcnMpIHsKLQkJcmV0dXJuIERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBjaGFycyk7Ci0JfQkKLQotfQotCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NXVFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmZWUwZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotLyoqCi0gKiBAdmVyc2lvbiAJMS4wCi0gKiBAYXV0aG9yCi0gKi8KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgdG8gc2ltcGxpZnkgYWNjZXNzIHRvIHNvbWUgU1dUIHJlc291cmNlcy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RVdGlsIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmCi0JICogdGhlIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc2FwbHkuIElmIHNvLCB0aGlzCi0JICogZGlzcGxheSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRTdGFuZGFyZERpc3BsYXkoKSB7Ci0JCURpc3BsYXkgZGlzcGxheTsKLQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJZGlzcGxheSA9IERpc3BsYXkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldC4gSWYgdGhlIHdpZGdldCBkb2Vzbid0IHJlcHJlc2VudAotCSAqIGEgU1dUIG9iamVjdCB0aGF0IG1hbmFnZSBhIHNoZWxsLCA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaGVsbCBmb3IgdGhlIGdpdmVuIHdpZGdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoV2lkZ2V0IHdpZGdldCkgewotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCkKLQkJCXJldHVybiAoKENvbnRyb2wpIHdpZGdldCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIENhcmV0KQotCQkJcmV0dXJuICgoQ2FyZXQpIHdpZGdldCkuZ2V0UGFyZW50KCkuZ2V0U2hlbGwoKTsKLQkJaWYgKHdpZGdldCBpbnN0YW5jZW9mIERyYWdTb3VyY2UpCi0JCQlyZXR1cm4gKChEcmFnU291cmNlKSB3aWRnZXQpLmdldENvbnRyb2woKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgRHJvcFRhcmdldCkKLQkJCXJldHVybiAoKERyb3BUYXJnZXQpIHdpZGdldCkuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCk7Ci0JCWlmICh3aWRnZXQgaW5zdGFuY2VvZiBNZW51KQotCQkJcmV0dXJuICgoTWVudSkgd2lkZ2V0KS5nZXRQYXJlbnQoKS5nZXRTaGVsbCgpOwotCQlpZiAod2lkZ2V0IGluc3RhbmNlb2YgU2Nyb2xsQmFyKQotCQkJcmV0dXJuICgoU2Nyb2xsQmFyKSB3aWRnZXQpLmdldFBhcmVudCgpLmdldFNoZWxsKCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHdpZHRoIGhpbnQgZm9yIGEgYnV0dG9uIGNvbnRyb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0QnV0dG9uV2lkdGhIaW50KEJ1dHRvbiBidXR0b24pIHsKLQkJaWYgKGJ1dHRvbi5nZXRGb250KCkuZXF1YWxzKEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkpKQotCQkJYnV0dG9uLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJUGl4ZWxDb252ZXJ0ZXIgY29udmVydGVyPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoYnV0dG9uKTsKLQkJaW50IHdpZHRoSGludD0gY29udmVydGVyLmNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJcmV0dXJuIE1hdGgubWF4KHdpZHRoSGludCwgYnV0dG9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgdHJ1ZSkueCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGhlaWdodCBoaW50IGZvciBhIGJ1dHRvbiBjb250cm9sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEJ1dHRvbkhlaWd0aEhpbnQoQnV0dG9uIGJ1dHRvbikgewotCQlpZiAoYnV0dG9uLmdldEZvbnQoKS5lcXVhbHMoSkZhY2VSZXNvdXJjZXMuZ2V0RGVmYXVsdEZvbnQoKSkpCi0JCQlidXR0b24uc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXI9IG5ldyBQaXhlbENvbnZlcnRlcihidXR0b24pOwotCQlyZXR1cm4gY29udmVydGVyLmNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkJVVFRPTl9IRUlHSFQpOwotCX0KLQotCS8qKgotCSAqIFNldHMgd2lkdGggYW5kIGhlaWdodCBoaW50IGZvciB0aGUgYnV0dG9uIGNvbnRyb2wuCi0JICogPGI+Tm90ZTo8L2I+IFRoaXMgaXMgYSBOT1AgaWYgdGhlIGJ1dHRvbidzIGxheW91dCBkYXRhIGlzIG5vdAotCSAqIGFuIGluc3RhbmNlIG9mIDxjb2RlPkdyaWREYXRhPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gYnV0dG9uCXRoZSBidXR0b24gZm9yIHdoaWNoIHRvIHNldCB0aGUgZGltZW5zaW9uIGhpbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0QnV0dG9uRGltZW5zaW9uSGludChCdXR0b24gYnV0dG9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoYnV0dG9uKTsKLQkJT2JqZWN0IGdkID0gYnV0dG9uLmdldExheW91dERhdGEoKTsKLQkJaWYgKGdkIGluc3RhbmNlb2YgR3JpZERhdGEpIHsKLQkJCSgoR3JpZERhdGEpIGdkKS5oZWlnaHRIaW50ID0gZ2V0QnV0dG9uSGVpZ3RoSGludChidXR0b24pOwotCQkJKChHcmlkRGF0YSkgZ2QpLndpZHRoSGludCA9IGdldEJ1dHRvbldpZHRoSGludChidXR0b24pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpYWxvZ1NpemUoRGlhbG9nIGRpYWxvZywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCVBvaW50IGNvbXB1dGVkU2l6ZSA9Ci0JCQlkaWFsb2cuZ2V0U2hlbGwoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQl3aWR0aCA9IE1hdGgubWF4KGNvbXB1dGVkU2l6ZS54LCB3aWR0aCk7Ci0JCWhlaWdodCA9IE1hdGgubWF4KGNvbXB1dGVkU2l6ZS55LCBoZWlnaHQpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU2hhcmVkTGFiZWxQcm92aWRlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3BhcnRzL1NoYXJlZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxMmQ5MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcGFydHMvU2hhcmVkTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqIEB2ZXJzaW9uIAkxLjAKLSAqIEBhdXRob3IKLSAqLwotcHVibGljIGNsYXNzIFNoYXJlZExhYmVsUHJvdmlkZXIKLQlleHRlbmRzIExhYmVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfRVJST1IgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfV0FSTklORyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9DVVJSRU5UID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0lOU1RBTExBQkxFID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGX0xJTktFRCA9IDE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZfTU9EID0gMzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9VUERBVEVEID0gNjQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9VTkNPTkZJR1VSRUQgPSAxMjg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9BREQgPSAyNTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRl9ERUwgPSA1MTI7Ci0KLQlIYXNodGFibGUgaW1hZ2VzID0gbmV3IEhhc2h0YWJsZSgpOwotCUFycmF5TGlzdCBjb25zdW1lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgU2hhcmVkTGFiZWxQcm92aWRlcigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KE9iamVjdCBjb25zdW1lcikgewotCQlpZiAoIWNvbnN1bWVycy5jb250YWlucyhjb25zdW1lcikpCi0JCQljb25zdW1lcnMuYWRkKGNvbnN1bWVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KE9iamVjdCBjb25zdW1lcikgewotCQljb25zdW1lcnMucmVtb3ZlKGNvbnN1bWVyKTsKLQkJaWYgKGNvbnN1bWVycy5zaXplKCkgPT0gMCkgewotCQkJcmVzZXQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlyZXNldCgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCQlmb3IgKEVudW1lcmF0aW9uIGVudW0gPSBpbWFnZXMuZWxlbWVudHMoKTsgZW51bS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUltYWdlIGltYWdlID0gKEltYWdlKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0JCQlpbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJaW1hZ2VzLmNsZWFyKCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldChJbWFnZURlc2NyaXB0b3IgZGVzYykgewotCQlyZXR1cm4gZ2V0KGRlc2MsIDApOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXQoSW1hZ2VEZXNjcmlwdG9yIGRlc2MsIGludCBmbGFncykgewotCQlPYmplY3Qga2V5ID0gZGVzYzsKLQotCQlpZiAoZmxhZ3MgIT0gMCkgewotCQkJa2V5ID0gZ2V0S2V5KGRlc2MuaGFzaENvZGUoKSwgZmxhZ3MpOwotCQl9Ci0JCUltYWdlIGltYWdlID0gKEltYWdlKSBpbWFnZXMuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKGRlc2MsIGZsYWdzKTsKLQkJCWltYWdlcy5wdXQoa2V5LCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0KEltYWdlIGltYWdlLCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGZsYWdzPT0wKSByZXR1cm4gaW1hZ2U7Ci0JCVN0cmluZyBrZXkgPSBnZXRLZXkoaW1hZ2UuaGFzaENvZGUoKSwgZmxhZ3MpOwotCQlJbWFnZSByZXN1bHRJbWFnZSA9IChJbWFnZSlpbWFnZXMuZ2V0KGtleSk7Ci0JCWlmIChyZXN1bHRJbWFnZSA9PSBudWxsKSB7Ci0JCQlyZXN1bHRJbWFnZSA9IGNyZWF0ZUltYWdlKGltYWdlLCBmbGFncyk7Ci0JCQlpbWFnZXMucHV0KGtleSwgcmVzdWx0SW1hZ2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHRJbWFnZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRLZXkobG9uZyBoYXNoQ29kZSwgaW50IGZsYWdzKSB7Ci0JCXJldHVybiAoIiIraGFzaENvZGUpICsgIjoiK2ZsYWdzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKEltYWdlRGVzY3JpcHRvciBiYXNlRGVzYywgaW50IGZsYWdzKSB7Ci0JCWlmIChmbGFncyA9PSAwKSB7Ci0JCQlyZXR1cm4gYmFzZURlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJfQotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlckxlZnQgPSBnZXRMb3dlckxlZnRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyUmlnaHQgPSBnZXRVcHBlclJpZ2h0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSBsb3dlclJpZ2h0ID0gZ2V0TG93ZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gdXBwZXJMZWZ0ID0gZ2V0VXBwZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOwotCQlPdmVybGF5SWNvbiBjb21wRGVzYyA9Ci0JCQluZXcgT3ZlcmxheUljb24oCi0JCQkJYmFzZURlc2MsCi0JCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdW10geyB1cHBlclJpZ2h0LCBsb3dlclJpZ2h0LCBsb3dlckxlZnQsIHVwcGVyTGVmdCB9KTsKLQkJcmV0dXJuIGNvbXBEZXNjLmNyZWF0ZUltYWdlKCk7Ci0JfQotCQotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSW1hZ2UoSW1hZ2UgYmFzZUltYWdlLCBpbnQgZmxhZ3MpIHsKLQkJaWYgKGZsYWdzID09IDApIHsKLQkJCXJldHVybiBiYXNlSW1hZ2U7Ci0JCX0KLQkJSW1hZ2VEZXNjcmlwdG9yW10gbG93ZXJMZWZ0ID0gZ2V0TG93ZXJMZWZ0T3ZlcmxheXMoZmxhZ3MpOwotCQlJbWFnZURlc2NyaXB0b3JbXSB1cHBlclJpZ2h0ID0gZ2V0VXBwZXJSaWdodE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VEZXNjcmlwdG9yW10gbG93ZXJSaWdodCA9IGdldExvd2VyUmlnaHRPdmVybGF5cyhmbGFncyk7Ci0JCUltYWdlRGVzY3JpcHRvcltdIHVwcGVyTGVmdCA9IGdldFVwcGVyTGVmdE92ZXJsYXlzKGZsYWdzKTsKLQkJSW1hZ2VPdmVybGF5SWNvbiBjb21wRGVzYyA9Ci0JCQluZXcgSW1hZ2VPdmVybGF5SWNvbigKLQkJCQliYXNlSW1hZ2UsCi0JCQkJbmV3IEltYWdlRGVzY3JpcHRvcltdW10geyB1cHBlclJpZ2h0LCBsb3dlclJpZ2h0LCBsb3dlckxlZnQsIHVwcGVyTGVmdCB9KTsKLQkJcmV0dXJuIGNvbXBEZXNjLmNyZWF0ZUltYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3JbXSBnZXRMb3dlckxlZnRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIEZfRVJST1IpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19FUlJPUl9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9XQVJOSU5HKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfV0FSTklOR19DTyB9OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldFVwcGVyUmlnaHRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIEZfQUREKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfQUREX0NPIH07Ci0JCWlmICgoZmxhZ3MgJiBGX0RFTCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0RFTF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9VTkNPTkZJR1VSRUQpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfTElOS0VEKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTElOS0VEX0NPIH07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldExvd2VyUmlnaHRPdmVybGF5cyhpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIEZfQ1VSUkVOVCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0NVUlJFTlRfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfTU9EKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfTU9EX0NPIH07Ci0JCS8qCi0JCWlmICgoZmxhZ3MgJiBGX0FERCkgIT0gMCkKLQkJCXJldHVybiBuZXcgSW1hZ2VEZXNjcmlwdG9yW10geyBVcGRhdGVVSUltYWdlcy5ERVNDX0FERF9DTyB9OwotCQlpZiAoKGZsYWdzICYgRl9ERUwpICE9IDApCi0JCQlyZXR1cm4gbmV3IEltYWdlRGVzY3JpcHRvcltdIHsgVXBkYXRlVUlJbWFnZXMuREVTQ19ERUxfQ08gfTsKLQkJaWYgKChmbGFncyAmIEZfVU5DT05GSUdVUkVEKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0NPIH07Ci0JCSovCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvcltdIGdldFVwcGVyTGVmdE92ZXJsYXlzKGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgRl9VUERBVEVEKSAhPSAwKQotCQkJcmV0dXJuIG5ldyBJbWFnZURlc2NyaXB0b3JbXSB7IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVVBEQVRFRF9DTyB9OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXRUZXh0KG9iaik7Ci0JfQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGdldEltYWdlKG9iaik7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlRnJvbVVSTCgKLQkJVVJMIGluc3RhbGxVUkwsCi0JCVN0cmluZyBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgbmV3VVJMID0gbmV3IFVSTChpbnN0YWxsVVJMLCBzdWJkaXJlY3RvcnlBbmRGaWxlbmFtZSk7Ci0JCQlTdHJpbmcga2V5ID0gbmV3VVJMLnRvU3RyaW5nKCk7Ci0JCQlpbWFnZSA9IChJbWFnZSlpbWFnZXMuZ2V0KGtleSk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCUltYWdlRGVzY3JpcHRvciBkZXNjID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwobmV3VVJMKTsKLQkJCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCQlpbWFnZXMucHV0KGtleSwgaW1hZ2UpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQl9IGNhdGNoIChTV1RFeGNlcHRpb24gZSkgewotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJlZmVyZW5jZXMvTWFpblByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NWM4ZGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL01haW5QcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuV29ya2JlbmNoSGVscDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5TaXRlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgTWFpblByZWZlcmVuY2VQYWdlCi0JZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZQotCWltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCS8vcHJpdmF0ZSBMYWJlbCBoaXN0b3J5U2l6ZUxhYmVsOwotCXByaXZhdGUgVGV4dCBoaXN0b3J5U2l6ZVRleHQ7Ci0JcHJpdmF0ZSBCdXR0b24gY2hlY2tTaWduYXR1cmVDaGVja2JveDsKLQlwcml2YXRlIEJ1dHRvbiBlcXVpdmFsZW50QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGNvbXBhdGlibGVCdXR0b247Ci0JcHJpdmF0ZSBUZXh0IHVwZGF0ZVBvbGljeVRleHQ7Ci0JcHJpdmF0ZSBMYWJlbCBodHRwUHJveHlIb3N0TGFiZWw7Ci0JcHJpdmF0ZSBMYWJlbCBodHRwUHJveHlQb3J0TGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IGh0dHBQcm94eUhvc3RUZXh0OwotCXByaXZhdGUgVGV4dCBodHRwUHJveHlQb3J0VGV4dDsKLQlwcml2YXRlIEJ1dHRvbiBlbmFibGVIdHRwUHJveHk7Ci0KLQkvLyB0aGVzZSB0d28gdmFsdWVzIGFyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjb2RlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVSVZBTEVOVF9WQUxVRSA9ICJlcXVpdmFsZW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBBVElCTEVfVkFMVUUgPSAiY29tcGF0aWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTWFpblByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBQcmVmZXJlbmNlUGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChwYXJlbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTWFpblByZWZlcmVuY2VQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlDb21wb3NpdGUgbWFpbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW1haW5Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbWFpbkNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBoaXN0b3J5U2l6ZUxhYmVsID0gbmV3IExhYmVsKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJaGlzdG9yeVNpemVMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmhpc3RvcnlTaXplIikpOyAvLyROT04tTkxTLTEkCi0JCWhpc3RvcnlTaXplVGV4dCA9IG5ldyBUZXh0KG1haW5Db21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJaGlzdG9yeVNpemVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3ggPQotCQkJbmV3IEJ1dHRvbihtYWluQ29tcG9zaXRlLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3guc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS5jaGVja1NpZ25hdHVyZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGNoZWNrU2lnbmF0dXJlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgPT0gZmFsc2UpIHsKLQkJCQkJd2FyblNpZ25hdHVyZUNoZWNrKGdldFNoZWxsKCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJY3JlYXRlU3BhY2VyKG1haW5Db21wb3NpdGUsIDIpOwotCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZXF1aXZhbGVudEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWVxdWl2YWxlbnRCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucy5lcXVpdmFsZW50IikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29tcGF0aWJsZUJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWNvbXBhdGlibGVCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVWZXJzaW9ucy5jb21wYXRpYmxlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJY3JlYXRlU3BhY2VyKG1haW5Db21wb3NpdGUsIDIpOwotCi0JCWdyb3VwID0gbmV3IEdyb3VwKG1haW5Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS51cGRhdGVQb2xpY3kiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLnVwZGF0ZVBvbGljeVVSTCIpKTsgLy8kTk9OLU5MUy0xJAotCQl1cGRhdGVQb2xpY3lUZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl1cGRhdGVQb2xpY3lUZXh0LnNldExheW91dERhdGEoZ2QpOwotCi0JCWNyZWF0ZVNwYWNlcihtYWluQ29tcG9zaXRlLCAyKTsKLQkJY3JlYXRlSHR0cFByb3h5KG1haW5Db21wb3NpdGUsIDIpOwotCQlpbml0aWFsaXplKCk7Ci0JCXVwZGF0ZVBvbGljeVRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdGV4dENoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBtYWluQ29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoZ2V0Q29udHJvbCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVTcGFjZXIoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtblNwYW4pIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlSHR0cFByb3h5KENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5TcGFuKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLnByb3h5R3JvdXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGNvbHVtblNwYW47Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCWVuYWJsZUh0dHBQcm94eSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCWVuYWJsZUh0dHBQcm94eS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmVuYWJsZUh0dHBQcm94eSIpKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVuYWJsZUh0dHBQcm94eS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlodHRwUHJveHlIb3N0TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJaHR0cFByb3h5SG9zdExhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNYWluUHJlZmVyZW5jZVBhZ2UuaHR0cFByb3h5SG9zdCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWh0dHBQcm94eUhvc3RUZXh0ID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJaHR0cFByb3h5SG9zdFRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJaHR0cFByb3h5UG9ydExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWh0dHBQcm94eVBvcnRMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmh0dHBQcm94eVBvcnQiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlodHRwUHJveHlQb3J0VGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWh0dHBQcm94eVBvcnRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCWVuYWJsZUh0dHBQcm94eS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlib29sZWFuIGVuYWJsZSA9IGVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlodHRwUHJveHlQb3J0TGFiZWwuc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWh0dHBQcm94eUhvc3RMYWJlbC5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQkJaHR0cFByb3h5UG9ydFRleHQuc2V0RW5hYmxlZChlbmFibGUpOwotCQkJCWh0dHBQcm94eUhvc3RUZXh0LnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRIaXN0b3J5Q291bnQoKSB7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGNvdW50ID0gbmV3IEludGVnZXIoaGlzdG9yeVNpemVUZXh0LmdldFRleHQoKSk7Ci0JCQlyZXR1cm4gY291bnQuaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoCi0JCQlVcGRhdGVDb3JlLlBfSElTVE9SWV9TSVpFKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5zZXRNYXhpbXVtSGlzdG9yeUNvdW50KAotCQkJCQkJZ2V0SGlzdG9yeUNvdW50KCkpOwotCQkJCQlTaXRlTWFuYWdlci5zZXRIdHRwUHJveHlJbmZvKAotCQkJCQkJZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpLAotCQkJCQkJaHR0cFByb3h5SG9zdFRleHQuZ2V0VGV4dCgpLAotCQkJCQkJaHR0cFByb3h5UG9ydFRleHQuZ2V0VGV4dCgpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKAotCQkJVXBkYXRlQ29yZS5QX0NIRUNLX1NJR05BVFVSRSwKLQkJCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCQlwcmVmcy5zZXRWYWx1ZShVcGRhdGVDb3JlLlBfSElTVE9SWV9TSVpFLCBoaXN0b3J5U2l6ZVRleHQuZ2V0VGV4dCgpKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TLAotCQkJZXF1aXZhbGVudEJ1dHRvbi5nZXRTZWxlY3Rpb24oKQotCQkJCT8gRVFVSVZBTEVOVF9WQUxVRQotCQkJCTogQ09NUEFUSUJMRV9WQUxVRSk7Ci0JCXByZWZzLnNldFZhbHVlKAotCQkJVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCwKLQkJCXVwZGF0ZVBvbGljeVRleHQuZ2V0VGV4dCgpKTsKLQotCQlVcGRhdGVDb3JlLmdldFBsdWdpbigpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gc3VwZXIucGVyZm9ybU9rKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlzdXBlci5wZXJmb3JtQXBwbHkoKTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNpdGVNYW5hZ2VyLnNldEh0dHBQcm94eUluZm8oCi0JCQkJCWVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKSwKLQkJCQkJaHR0cFByb3h5SG9zdFRleHQuZ2V0VGV4dCgpLAotCQkJCQlodHRwUHJveHlQb3J0VGV4dC5nZXRUZXh0KCkpOwotCQkJfQotCQl9KTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFLAotCQkJY2hlY2tTaWduYXR1cmVDaGVja2JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCXByZWZzLnNldFZhbHVlKFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUsIGhpc3RvcnlTaXplVGV4dC5nZXRUZXh0KCkpOwotCQlwcmVmcy5zZXRWYWx1ZSgKLQkJCVVwZGF0ZUNvcmUuUF9VUERBVEVfVkVSU0lPTlMsCi0JCQllcXVpdmFsZW50QnV0dG9uLmdldFNlbGVjdGlvbigpCi0JCQkJPyBFUVVJVkFMRU5UX1ZBTFVFCi0JCQkJOiBDT01QQVRJQkxFX1ZBTFVFKTsKLQkJcHJlZnMuc2V0VmFsdWUoCi0JCQlVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMLAotCQkJdXBkYXRlUG9saWN5VGV4dC5nZXRUZXh0KCkpOwotCi0JCVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWVuYWJsZUh0dHBQcm94eS5zZXRTZWxlY3Rpb24oU2l0ZU1hbmFnZXIuaXNIdHRwUHJveHlFbmFibGUoKSk7Ci0JCVN0cmluZyBzZXJ2ZXJWYWx1ZSA9IFNpdGVNYW5hZ2VyLmdldEh0dHBQcm94eVNlcnZlcigpOwotCQlpZiAoc2VydmVyVmFsdWUgIT0gbnVsbCkKLQkJCWh0dHBQcm94eUhvc3RUZXh0LnNldFRleHQoc2VydmVyVmFsdWUpOwotCQlTdHJpbmcgcG9ydFZhbHVlID0gU2l0ZU1hbmFnZXIuZ2V0SHR0cFByb3h5UG9ydCgpOwotCQlpZiAocG9ydFZhbHVlICE9IG51bGwpCi0JCQlodHRwUHJveHlQb3J0VGV4dC5zZXRUZXh0KHBvcnRWYWx1ZSk7Ci0KLQkJaHR0cFByb3h5UG9ydExhYmVsLnNldEVuYWJsZWQoZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpKTsKLQkJaHR0cFByb3h5SG9zdExhYmVsLnNldEVuYWJsZWQoZW5hYmxlSHR0cFByb3h5LmdldFNlbGVjdGlvbigpKTsKLQkJaHR0cFByb3h5UG9ydFRleHQuc2V0RW5hYmxlZChlbmFibGVIdHRwUHJveHkuZ2V0U2VsZWN0aW9uKCkpOwotCQlodHRwUHJveHlIb3N0VGV4dC5zZXRFbmFibGVkKGVuYWJsZUh0dHBQcm94eS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWNoZWNrU2lnbmF0dXJlQ2hlY2tib3guc2V0U2VsZWN0aW9uKAotCQkJcHJlZnMuZ2V0Qm9vbGVhbihVcGRhdGVDb3JlLlBfQ0hFQ0tfU0lHTkFUVVJFKSk7Ci0KLQkJaGlzdG9yeVNpemVUZXh0LnNldFRleHQocHJlZnMuZ2V0U3RyaW5nKFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUpKTsKLQotCQlib29sZWFuIGlzQ29tcGF0aWJsZSA9Ci0JCQlVcGRhdGVDb3JlLkNPTVBBVElCTEVfVkFMVUUuZXF1YWxzKAotCQkJCXByZWZzLmdldFN0cmluZyhVcGRhdGVDb3JlLlBfVVBEQVRFX1ZFUlNJT05TKSk7Ci0JCWVxdWl2YWxlbnRCdXR0b24uc2V0U2VsZWN0aW9uKCFpc0NvbXBhdGlibGUpOwotCQljb21wYXRpYmxlQnV0dG9uLnNldFNlbGVjdGlvbihpc0NvbXBhdGlibGUpOwotCi0JCVN0cmluZyB0ZXh0ID0gcHJlZnMuZ2V0U3RyaW5nKFVwZGF0ZVV0aWxzLlBfVVBEQVRFX1BPTElDWV9VUkwpOwotCQl1cGRhdGVQb2xpY3lUZXh0LnNldFRleHQodGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRleHRDaGFuZ2VkKCkgewotCQlTdHJpbmcgdGV4dCA9IHVwZGF0ZVBvbGljeVRleHQuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJbmV3IFVSTCh0ZXh0KTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCXNldEVycm9yTWVzc2FnZShVcGRhdGVVSS5nZXRTdHJpbmcoIlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuaW52YWxpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRWYWxpZCh0cnVlKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCVByZWZlcmVuY2VzIHByZWZzID0gVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWVuYWJsZUh0dHBQcm94eS5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQlodHRwUHJveHlIb3N0VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlodHRwUHJveHlQb3J0VGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlodHRwUHJveHlQb3J0TGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWh0dHBQcm94eUhvc3RMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaHR0cFByb3h5UG9ydFRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWh0dHBQcm94eUhvc3RUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCXVwZGF0ZVBvbGljeVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQljaGVja1NpZ25hdHVyZUNoZWNrYm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJaGlzdG9yeVNpemVUZXh0LnNldFRleHQoCi0JCQlwcmVmcy5nZXREZWZhdWx0U3RyaW5nKFVwZGF0ZUNvcmUuUF9ISVNUT1JZX1NJWkUpKTsKLQkJZXF1aXZhbGVudEJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCWNvbXBhdGlibGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd2FyblNpZ25hdHVyZUNoZWNrKFNoZWxsIHNoZWxsKSB7Ci0JCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcoc2hlbGwsIFVwZGF0ZVVJLmdldFN0cmluZygiTWFpblByZWZlcmVuY2VQYWdlLmRpZ2l0YWxTaWduYXR1cmUudGl0bGUiKSwgLy8kTk9OLU5MUy0xJAotCQlVcGRhdGVVSS5nZXRTdHJpbmcoIk1haW5QcmVmZXJlbmNlUGFnZS5kaWdpdGFsU2lnbmF0dXJlLm1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcmVmZXJlbmNlcy9VcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNDBmMDkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ByZWZlcmVuY2VzL1VwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBQcmVmZXJlbmNlUGFnZQotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZQotCWV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJpdmF0ZSBUZXh0IG1hcHBpbmdzRmlsZTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVXBkYXRlU2V0dGluZ3NQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlLmRlc2NyaXB0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJVcGRhdGVTZXR0aW5nc1ByZWZlcmVuY2VQYWdlLmxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCW1hcHBpbmdzRmlsZSA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCi0JCWluaXRpYWxpemUoKTsKLQkJbWFwcGluZ3NGaWxlLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXRleHRDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQltYXBwaW5nc0ZpbGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVDb3JlLmdldFBsdWdpbigpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyB0ZXh0ID0gcHJlZi5nZXRTdHJpbmcoVXBkYXRlVXRpbHMuUF9VUERBVEVfUE9MSUNZX1VSTCk7Ci0JCW1hcHBpbmdzRmlsZS5zZXRUZXh0KHRleHQpOwotCQl0ZXh0Q2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXh0Q2hhbmdlZCgpIHsKLQkJU3RyaW5nIHRleHQgPSBtYXBwaW5nc0ZpbGUuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApIHsKLQkJCXRyeSB7Ci0JCQkJbmV3IFVSTCh0ZXh0KTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCXNldEVycm9yTWVzc2FnZShVcGRhdGVVSS5nZXRTdHJpbmcoIlVwZGF0ZVNldHRpbmdzUHJlZmVyZW5jZVBhZ2UuaW52YWxpZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlzZXRWYWxpZCh0cnVlKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHRleHQgPSBtYXBwaW5nc0ZpbGUuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA+IDApCi0JCQlwcmVmLnNldFZhbHVlKFVwZGF0ZVV0aWxzLlBfVVBEQVRFX1BPTElDWV9VUkwsIHRleHQpOwotCQllbHNlCi0JCQlwcmVmLnNldFRvRGVmYXVsdChVcGRhdGVVdGlscy5QX1VQREFURV9QT0xJQ1lfVVJMKTsKLQkJVXBkYXRlQ29yZS5nZXRQbHVnaW4oKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQltYXBwaW5nc0ZpbGUuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChnZXRDb250cm9sKCkpOwotCQkvKgotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlwYXJlbnQsIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5BcHBTZXJ2ZXJQcmVmZXJlbmNlUGFnZSIpOwotCQkqLwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjYmY5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9Db25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCS8qKgotCSAqCi0JICovCi0JcHVibGljIENvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlKCkgewotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpICB7Ci0JCUlDb25maWd1cmVkU2l0ZUFkYXB0ZXIgYWRhcHRlciA9IChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKWdldEVsZW1lbnQoKTsKLQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlhZGRQcm9wZXJ0eShjb21wb3NpdGUsIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UucGF0aCIpLCBjc2l0ZS5nZXRTaXRlKCkuZ2V0VVJMKCkudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnR5cGUiKSwgZ2V0TG9jYXRpb25UeXBlKGNzaXRlKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmVuYWJsZWQiKSwgY3NpdGUuaXNFbmFibGVkKCk/VXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS55ZXMiKTpVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLm5vIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvblR5cGUoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCWlmIChjc2l0ZS5pc0V4dGVuc2lvblNpdGUoKSkKLQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLmV4dGVuc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChjc2l0ZS5pc1Byb2R1Y3RTaXRlKCkpCi0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmVkU2l0ZVByb3BlcnR5UGFnZS5wcm9kdWN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJlZFNpdGVQcm9wZXJ0eVBhZ2UudW5rbm93biIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0eShDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoa2V5KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KHZhbHVlKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRlZjRmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlQ29weXJpZ2h0UHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgRmVhdHVyZUNvcHlyaWdodFByb3BlcnR5UGFnZSgpIHsKLQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChJRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0KLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuV1JBUCk7Ci0JCQlHcmlkRGF0YSBnZCA9Ci0JCQkJbmV3IEdyaWREYXRhKAotCQkJCQlHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJZ2Qud2lkdGhIaW50ID0gY29tcHV0ZVdpZHRoTGltaXQobGFiZWwsIDgwKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlJVVJMRW50cnkgY29weXJpZ2h0ID0gZmVhdHVyZS5nZXRDb3B5cmlnaHQoKTsKLQkJCVN0cmluZyBhbm5vdGF0aW9uID0gKGNvcHlyaWdodCAhPSBudWxsKSA/IGNvcHlyaWdodC5nZXRBbm5vdGF0aW9uKCkgOiBudWxsOwotCi0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsICYmIGFubm90YXRpb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbGFiZWwuc2V0VGV4dChhbm5vdGF0aW9uKTsKLQkJCQlmaW5hbCBVUkwgdXJsID0gY29weXJpZ2h0LmdldFVSTCgpOwotCQkJCVN0cmluZyBmaWxlbmFtZSA9ICh1cmwgIT0gbnVsbCkgPyB1cmwuZ2V0RmlsZSgpIDogbnVsbDsKLQkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbAotCQkJCQkmJiAoZmlsZW5hbWUuZW5kc1dpdGgoIi5odG0iKSB8fCBmaWxlbmFtZS5lbmRzV2l0aCgiLmh0bWwiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJCQlidXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2Uuc2hvd0luQnJvd3NlciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7Ci0JCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlTdHJpbmcgdXJsTmFtZSA9IHVybC5nZXRQcm90b2NvbCgpICsgIjoiICsgdXJsLmdldEZpbGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVVwZGF0ZVVJLnNob3dVUkwodXJsTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2Uubm9Db3B5cmlnaHQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgaW50IGNvbXB1dGVXaWR0aExpbWl0KExhYmVsIGxhYmVsLCBpbnQgbmNoYXJzKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGxhYmVsKTsKLQkJZ2Muc2V0Rm9udChsYWJlbC5nZXRGb250KCkpOwotCQlGb250TWV0cmljcyBmb250TWV0cmljcz0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlyZXR1cm4gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmb250TWV0cmljcywgbmNoYXJzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTUyNGFmLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZQotCWV4dGVuZHMgUHJvcGVydHlQYWdlCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKLQkJCi0JcHVibGljIEZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlKCkgewotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCUlGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0gKElGZWF0dXJlQWRhcHRlcikgZ2V0RWxlbWVudCgpOwotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMTU7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkKLQkJCWFkZEdlbmVyYWxTZWN0aW9uKGZlYXR1cmUsIGNvbXBvc2l0ZSk7CQotCQkJYWRkU3VwcG9ydGVkUGxhdGZvcm1zU2VjdGlvbihmZWF0dXJlLCBjb21wb3NpdGUpOwotCQkJYWRkRGVzY3JpcHRpb24oZmVhdHVyZSwgY29tcG9zaXRlKTsKLQkJCQotCQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEdlbmVyYWxTZWN0aW9uKElGZWF0dXJlIGZlYXR1cmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJYWRkRmllbGQoY29tcG9zaXRlLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLm5hbWUiKSwgZmVhdHVyZS5nZXRMYWJlbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRGaWVsZCgKLQkJCWNvbXBvc2l0ZSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuaWQiKSwgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0SWRlbnRpZmllcigpKTsKLQkJYWRkRmllbGQoCi0JCQljb21wb3NpdGUsCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLnZlcnNpb24iKSwgLy8kTk9OLU5MUy0xJAotCQkJZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQlhZGRGaWVsZChjb21wb3NpdGUsIFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UucHJvdmlkZXIiKSwgZmVhdHVyZS5nZXRQcm92aWRlcigpKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIHNpemUgPSBmZWF0dXJlLmdldEluc3RhbGxTaXplKCk7Ci0JCWlmIChzaXplICE9IENvbnRlbnRFbnRyeU1vZGVsLlVOS05PV05fU0laRSkKLQkJCWFkZEZpZWxkKGNvbXBvc2l0ZSwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5zaXplIiksIG5ldyBMb25nKHNpemUpLnRvU3RyaW5nKCkgKyAiIEtCIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTdXBwb3J0ZWRQbGF0Zm9ybXNTZWN0aW9uKElGZWF0dXJlIGZlYXR1cmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS5wbGF0Zm9ybXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2Uub3MiKSArIGV4dHJhY3RWYWx1ZShmZWF0dXJlLmdldE9TKCkpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlR2VuZXJhbFByb3BlcnR5UGFnZS53cyIpICsgZXh0cmFjdFZhbHVlKGZlYXR1cmUuZ2V0V1MoKSkpOyAvLyROT04tTkxTLTEkCi0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmFyY2giKSArIGV4dHJhY3RWYWx1ZShmZWF0dXJlLmdldE9TQXJjaCgpKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UubmwiKSArIGV4dHJhY3RWYWx1ZShmZWF0dXJlLmdldE5MKCkpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgcHJvcGVydHksIFN0cmluZyB2YWx1ZSkgewotCi0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHByb3BlcnR5KTsKLQotCQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KHZhbHVlKTsKLQkJfQotCi0JfQotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuZXF1YWxzKCIqIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVHZW5lcmFsUHJvcGVydHlQYWdlLmFsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRGVzY3JpcHRpb24oSUZlYXR1cmUgZmVhdHVyZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQlJVVJMRW50cnkgZGVzY3JpcHRpb24gPSBmZWF0dXJlLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYW5ub3RhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEFubm90YXRpb24oKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwgJiYgYW5ub3RhdGlvbi5sZW5ndGgoKSA+IDApIHsKLQkJCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUdlbmVyYWxQcm9wZXJ0eVBhZ2UuZGVzYyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJCQlnZC5oZWlnaHRIaW50ID0gMjAwOwotCQkJCWdkLndpZHRoSGludCA9IDM1MDsKLQkJCQl0ZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQl0ZXh0LnNldFRleHQoYW5ub3RhdGlvbik7Ci0JCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9GZWF0dXJlTGljZW5zZVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmUyYTQzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLQotCi1wdWJsaWMgY2xhc3MgRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJvcGVydHlQYWdlIHsKLQlwdWJsaWMgRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIHsKLQkJdHJ5IHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJSUZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoSUZlYXR1cmVBZGFwdGVyKWdldEVsZW1lbnQoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7CQkJCi0JCQlJVVJMRW50cnkgbGljZW5zZSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpOwotCQkJU3RyaW5nIGFubm90YXRpb24gPSAobGljZW5zZSAhPSBudWxsKSA/IGxpY2Vuc2UuZ2V0QW5ub3RhdGlvbigpIDogbnVsbDsKLQkJCQotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCAmJiBhbm5vdGF0aW9uLmxlbmd0aCgpID4gMCkgewotCQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQKTsKLQkJCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCQkJZ2Qud2lkdGhIaW50ID0gMzUwOwotCQkJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJdGV4dC5zZXRUZXh0KGFubm90YXRpb24pOwotCQkJCXRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJCWZpbmFsIFVSTCB1cmwgPSBsaWNlbnNlLmdldFVSTCgpOwotCQkJCVN0cmluZyBmaWxlbmFtZSA9ICh1cmwgIT0gbnVsbCkgPyB1cmwuZ2V0RmlsZSgpIDogbnVsbDsKLQkJCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCAmJiAoZmlsZW5hbWUuZW5kc1dpdGgoIi5odG0iKSB8fCB1cmwuZ2V0RmlsZSgpLmVuZHNXaXRoKCIuaHRtbCIpKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQkJCWJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZUxpY2Vuc2VQcm9wZXJ0eVBhZ2Uuc2hvd0luQnJvd3NlciIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9FTkQpKTsKLQkJCQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGJ1dHRvbik7Ci0JCQkJCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCQlTdHJpbmcgdXJsTmFtZSA9IHVybC5nZXRQcm90b2NvbCgpICsgIjoiICsgdXJsLmdldEZpbGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVVwZGF0ZVVJLnNob3dVUkwodXJsTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVMaWNlbnNlUHJvcGVydHlQYWdlLm5vTGljZW5zZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzc3ZjI4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9wcm9wZXJ0aWVzL0ZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0vKioKLSAqIEBzZWUgUHJvcGVydHlQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlU3RhdHVzUHJvcGVydHlQYWdlCi0JZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UKLQlpbXBsZW1lbnRzIElXb3JrYmVuY2hQcm9wZXJ0eVBhZ2UgewotCS8qKgotCSAqCi0JICovCi0JcHVibGljIEZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0cnkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAyMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJVGV4dCBtZXNzYWdlID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0JCQltZXNzYWdlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQltZXNzYWdlLnNldExheW91dERhdGEoZ2QpOwotCQkJCi0JCQlDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlciA9IChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGdldEVsZW1lbnQoKTsKLQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBhZGFwdGVyLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKSAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5wZW5kaW5nQ2hhbmdlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCQl9Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gZ2V0U3RhdHVzKGZlYXR1cmUpOwotCQkJaW50IHNldmVyaXR5ID0gc3RhdHVzLmdldFNldmVyaXR5KCk7Ci0JCQlpZiAoc2V2ZXJpdHkgPT0gSVN0YXR1cy5FUlJPUgotCQkJCSYmIGdldFN0YXR1c0NvZGUoZmVhdHVyZSwgc3RhdHVzKSA9PSBJRmVhdHVyZS5TVEFUVVNfSEFQUFkpIHsKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCQkJbWVzc2FnZS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5nb29kQ29uZmlndXJhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlLnNldFRleHQoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlpZiAoc2V2ZXJpdHkgIT0gSVN0YXR1cy5PSyAmJiBzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJU3RyaW5nIHJlYXNvbiA9IGdldFJlYXNvbihzdGF0dXMpOwotCQkJCWlmIChyZWFzb24ubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCUNvbXBvc2l0ZSBjb21wID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCQkJY29tcC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQkJCWNvbXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcCwgU1dULk5PTkUpOwotCQkJCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXR1c1Byb3BlcnR5UGFnZS5yZWFzb24iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQlUZXh0IHRleHQgPQotCQkJCQkJbmV3IFRleHQoY29tcCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5XUkFQIHwgU1dULlZfU0NST0xMKTsKLQkJCQkJdGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJCXRleHQuc2V0VGV4dChyZWFzb24pOwotCQkJCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCQkJCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJfQotCi0JCQl9Ci0JCQkKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlYXNvbihJU3RhdHVzIHN0YXR1cykgewotCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBjaGlsZHJlbltpXS5nZXRNZXNzYWdlKCk7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgKLQkJCQkJbWVzc2FnZQotCQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBnZXRTdGF0dXMoSUZlYXR1cmUgZmVhdHVyZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKSB7Ci0JCQlpbnQgc2V2ZXJpdHk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoKChNaXNzaW5nRmVhdHVyZSkgZmVhdHVyZSkuaXNPcHRpb25hbCgpKSB7Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQkJCW1lc3NhZ2UgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UubWlzc2luZ09wdGlvbmFsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQkJCW1lc3NhZ2UgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0dXNQcm9wZXJ0eVBhZ2UubWlzc2luZyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhzZXZlcml0eSwgVXBkYXRlVUkuUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBudWxsKTsKLQkJfQotCQlyZXR1cm4gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0RmVhdHVyZVN0YXR1cyhmZWF0dXJlKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTdGF0dXNDb2RlKElGZWF0dXJlIGZlYXR1cmUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBjb2RlID0gc3RhdHVzLmdldENvZGUoKTsKLQkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJU3RhdHVzIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCWlmIChjaGlsZC5pc011bHRpU3RhdHVzKCkKLQkJCQkJCXx8IGNoaWxkLmdldENvZGUoKSAhPSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpCi0JCQkJCQlyZXR1cm4gY29kZTsKLQkJCQl9Ci0JCQkJLy8gSWYgd2UgYXJlIGhlcmUsIGdsb2JhbCBzdGF0dXMgaXMgdW5oYXBweQotCQkJCS8vIGJlY2F1c2Ugb25lIG9yIG1vcmUgaW5jbHVkZWQgZmVhdHVyZXMKLQkJCQkvLyBpcyBkaXNhYmxlZC4KLQkJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT2Jzb2xldGVQYXRjaGVzKGZlYXR1cmUpKSB7Ci0JCQkJCS8vIFRoZSBkaXNhYmxlZCBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCQkvLyBhcmUgb2xkIHBhdGNoZXMgdGhhdCBhcmUgbm93Ci0JCQkJCS8vIHN1YnN1bWVkIGJ5IGJldHRlciB2ZXJzaW9ucyBvZgotCQkJCQkvLyB0aGUgZmVhdHVyZXMgdGhleSB3ZXJlIGRlc2lnbmVkIHRvCi0JCQkJCS8vIHBhdGNoLgotCQkJCQlyZXR1cm4gSUZlYXR1cmUuU1RBVFVTX0hBUFBZOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3Byb3BlcnRpZXMvSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMDQ3MC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvcHJvcGVydGllcy9JbnN0YWxsQ29uZmlndXJhdGlvblByb3BlcnR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQHNlZSBQcm9wZXJ0eVBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxDb25maWd1cmF0aW9uUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByb3BlcnR5UGFnZSB7Ci0JLyoqCi0JICoKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbENvbmZpZ3VyYXRpb25Qcm9wZXJ0eVBhZ2UoKSB7Ci0JCW5vRGVmYXVsdEFuZEFwcGx5QnV0dG9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJYWRkUHJvcGVydHkoY29tcG9zaXRlLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyZWRTaXRlUHJvcGVydHlQYWdlLnBhdGgiKSwgQ29uZmlndXJhdG9yVXRpbHMuZ2V0SW5zdGFsbFVSTCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnR5KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dChrZXkpOwotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQodmFsdWUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvQXV0aGVudGljYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9BdXRoZW50aWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWQ5M2MzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9BdXRoZW50aWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci0KLS8qKgotICogS2VlcHMgdXNlciBhbmQgcGFzc3dvcmQgc3RyaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIEF1dGhlbnRpY2F0aW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHVzZXI7Ci0JcHJvdGVjdGVkIFN0cmluZyBwYXNzd29yZDsKLQlwdWJsaWMgQXV0aGVudGljYXRpb24oU3RyaW5nIHVzZXIsIFN0cmluZyBwYXNzd29yZCl7Ci0JCXRoaXMudXNlciA9IHVzZXI7Ci0JCXRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhc3N3b3JkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0JCXJldHVybiBwYXNzd29yZDsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1c2VyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLQkJcmV0dXJuIHVzZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWQ1NzU5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSmFyVmVyaWZpY2F0aW9uRGlhbG9nIGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nIHsKLQotCXByaXZhdGUgSVZlcmlmaWNhdGlvblJlc3VsdCBfVmVyaWZpY2F0aW9uUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIElEaWFsb2dQYWdlIF9EaWFsb2dQYWdlOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhZ2VDb250YWluZXI7Ci0JcHJpdmF0ZSBJbWFnZSBkZWZhdWx0SW1hZ2UgPSBudWxsOwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGRlZmF1bHRJbWFnZURlc2NyaXB0b3IgPQotCQlVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVo7Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEphclZlcmlmaWNhdGlvbkRpYWxvZy4KLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgSmFyVmVyaWZpY2F0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLElEaWFsb2dQYWdlIGRpYWxvZ1BhZ2UsIElWZXJpZmljYXRpb25SZXN1bHQgdmVyaWZpY2F0aW9uUmVzdWx0KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShTV1QuVElUTEUgfCBTV1QuQk9SREVSIHwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsJCQotCQlfVmVyaWZpY2F0aW9uUmVzdWx0ID0gdmVyaWZpY2F0aW9uUmVzdWx0OwotCQlfRGlhbG9nUGFnZSA9IGRpYWxvZ1BhZ2U7Ci0JCWlmIChkaWFsb2dQYWdlIGluc3RhbmNlb2YgSmFyVmVyaWZpY2F0aW9uUGFnZSl7Ci0JCQkoKEphclZlcmlmaWNhdGlvblBhZ2UpX0RpYWxvZ1BhZ2UpLnNldFRpdGxlQXJlYURpYWxvZyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBidXR0b25zIHRvIHRoZSBkaWFsb2cncyBidXR0b24gYmFyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkKLQkJCSE9IElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQpIHsKLQotCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkpIHsKLQkJCQljcmVhdGVCdXR0b24oCi0JCQkJCXBhcmVudCwKLQkJCQkJSURpYWxvZ0NvbnN0YW50cy5PS19JRCwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuSW5zdGFsbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY3JlYXRlQnV0dG9uKAotCQkJCQlwYXJlbnQsCi0JCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJZmFsc2UpOwkJCQkKLQkJCX0KLQotCQkJLy8gUmFkaW8gYnV0dG9uOiBDYW5jZWwgaW5zdGFsbGF0aW9uCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJCWNyZWF0ZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ2FuY2VsIiksIC8vJE5PTi1OTFMtMSQKLQkJCQl0cnVlKTsJCQkJCQkJCi0JCX0gZWxzZSB7Ci0JCQljcmVhdGVCdXR0b24oCi0JCQkJcGFyZW50LAotCQkJCUlEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbmNlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJdHJ1ZSk7Ci0JCX0KLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lEKS5zZXRGb2N1cygpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIERpYWxvZy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZVBhcmVudCA9IChDb21wb3NpdGUpc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlzZXRUaXRsZUltYWdlKHRoaXMuZ2V0SW1hZ2UoKSk7Ci0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQlfRGlhbG9nUGFnZS5jcmVhdGVDb250cm9sKGNvbXBvc2l0ZVBhcmVudCk7Ci0JCXBhZ2VDb250YWluZXI9KENvbXBvc2l0ZSlfRGlhbG9nUGFnZS5nZXRDb250cm9sKCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCXBhZ2VDb250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXBhZ2VDb250YWluZXIuc2V0Rm9udChwYXJlbnQuZ2V0Rm9udCgpKTsJCQotCQkKLQkJLy8gQnVpbGQgdGhlIHNlcGFyYXRvciBsaW5lCi0JCUxhYmVsIHNlcGFyYXRvcj0gbmV3IExhYmVsKGNvbXBvc2l0ZVBhcmVudCwgU1dULkhPUklaT05UQUwgfCBTV1QuU0VQQVJBVE9SKTsKLQkJc2VwYXJhdG9yLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZVBhcmVudDsKLQl9Ci0JCi0JCS8qKgotCSAqIEBzZWUgSURpYWxvZ1BhZ2UjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGRlZmF1bHRJbWFnZSA9PSBudWxsKQotCQkJZGVmYXVsdEltYWdlID0gZGVmYXVsdEltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCi0JCXJldHVybiBkZWZhdWx0SW1hZ2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCS8vIGRpc3Bvc2Ugb2YgaW1hZ2UKLQkJaWYgKGRlZmF1bHRJbWFnZSAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0SW1hZ2UuZGlzcG9zZSgpOwotCQkJZGVmYXVsdEltYWdlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25QYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE0MGU3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9KYXJWZXJpZmljYXRpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25QYWdlIGV4dGVuZHMgQmFubmVyUGFnZSB7Ci0KLQlwcml2YXRlIElWZXJpZmljYXRpb25SZXN1bHQgX1ZlcmlmaWNhdGlvblJlc3VsdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX2ZpbGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBfc3RyRmVhdHVyZU5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIF9zdHJJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgX3N0clByb3ZpZGVyTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBUaXRsZUFyZWFEaWFsb2cgX0RpYWxvZzsKLQlwcml2YXRlIFN0cmluZyBjb21wb25lbnRWZXJpZmllZDsKLQotCS8qCi0JICogQ29uc3RydWN0b3IgZm9yIEphclZlcmlmaWNhdGlvblBhZ2UuCi0JICovCi0JcHVibGljIEphclZlcmlmaWNhdGlvblBhZ2UoSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQpIHsKLQkJc3VwZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuVmVyaWZpY2F0aW9uIikpOyAvLyROT04tTkxTLTEkCi0JCV9maWxlTmFtZSA9IHZlcmlmaWNhdGlvblJlc3VsdC5nZXRDb250ZW50UmVmZXJlbmNlKCkuZ2V0SWRlbnRpZmllcigpOwotCQlfVmVyaWZpY2F0aW9uUmVzdWx0ID0gdmVyaWZpY2F0aW9uUmVzdWx0OwotCQlfc3RySWQgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpOwotCQlfc3RyRmVhdHVyZU5hbWUgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldExhYmVsKCk7Ci0JCV9zdHJQcm92aWRlck5hbWUgPSB2ZXJpZmljYXRpb25SZXN1bHQuZ2V0RmVhdHVyZSgpLmdldFByb3ZpZGVyKCk7Ci0JCWNvbXBvbmVudFZlcmlmaWVkID0JKHZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKSkgPyAiLkZlYXR1cmUiIDogIi5GaWxlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIE1ldGhvZCBkZWNsYXJlZCBvbiBEaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZVBhcmVudCkgewotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlUGFyZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLkphclZlcmlmaWNhdGlvblBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBDb21wb3NpdGU6IENsaWVudAotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQotCQlDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50ID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGVQYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlQ2xpZW50LnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGVDbGllbnQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJLy8gVGV4dCBJbmZvcm1hdGlvbgotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQkJCi0JCWNyZWF0ZVRleHRBcmVhKGNvbXBvc2l0ZUNsaWVudCk7Ci0KLQkJLy8gQ2VydGlmaWNhdGUgQXJlYQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQotCQljcmVhdGVDZXJ0aWZpY2F0ZUFyZWEoY29tcG9zaXRlQ2xpZW50KTsKLQotCQkvLyBGaWxlIGFuZCBGZWF0dXJlIEluZm9ybWF0aW9uCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JCQotCQljcmVhdGVJbmZvcm1hdGlvbkFyZWEoY29tcG9zaXRlQ2xpZW50KTsKLQotCQkvLyBDaG9pY2UgQXJlYQotCQkvLy0tLS0tLS0tLS0tLQkJCi0JCS8vY3JlYXRlQ2hvaWNlQXJlYShjb21wb3NpdGVDbGllbnQpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlUGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZUNsaWVudDsKLQotCX0KLQotCS8qCi0JICogQ3JlYXRlcyB0aGUgSW5mb3JtYXRpb24gdGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXh0QXJlYShDb21wb3NpdGUgY29tcG9zaXRlQ2xpZW50KSB7Ci0KLQkJLy8gTGFiZWw6IEluZm9ybWF0aW9uCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUxhYmVsIGxhYmVsSW5mb3JtYXRpb24gPQotCQkJbmV3IExhYmVsKGNvbXBvc2l0ZUNsaWVudCwgU1dULldSQVApOwotCQlsYWJlbEluZm9ybWF0aW9uLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJU3RyaW5nQnVmZmVyIHN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXN3aXRjaCAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmljYXRpb25Db2RlKCkpIHsKLQotCQkJY2FzZSBJVmVyaWZpY2F0aW9uUmVzdWx0LlRZUEVfRU5UUllfTk9UX1NJR05FRCA6Ci0JCQkJU3RyaW5nIG1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQWJvdXRUb0luc3RhbGwiKyAvLyROT04tTkxTLTEkCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCk7Ci0JCQkJc2V0TWVzc2FnZShtc2csIFdBUk5JTkcpOwotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk5vdERpZ2l0YWxseVNpZ25lZCIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKSk7Ci0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNhbm5vdFZlcmlmeVByb3ZpZGVyIisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLS8qCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5pc0ZlYXR1cmVWZXJpZmljYXRpb24oKSkgewotCQkJCQlzdHJiLmFwcGVuZCgKLQkJCQkJCVVwZGF0ZVVJLmdldFJlc291cmNlU3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuSW5zdGFsbE1heUNvcnJ1cHQiKSk7Ly8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0cmIuYXBwZW5kKAotCQkJCQkJVXBkYXRlVUkuZ2V0UmVzb3VyY2VTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy5Db250aW51ZU1heUNvcnJ1cHQiKSk7Ly8kTk9OLU5MUy0xJCAJCQkJCQotCQkJCX0KLQkJCQkqLwotCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9DT1JSVVBURUQgOgotCQkJCW1zZyA9Ci0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuQ29ycnVwdGVkQ29udGVudCIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKTsKLQkJCQlzZXRNZXNzYWdlKG1zZywgRVJST1IpOwotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbXBvbmVudE5vdEluc3RhbGxlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9TSUdORURfVU5SRUNPR05JWkVEIDoKLQkJCQltc2cgPQotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlNpZ25lZENvbXBvbmVudCIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKTsKLQkJCQlzZXRNZXNzYWdlKG1zZywgV0FSTklORyk7Ci0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuVW5rbm93bkNlcnRpZmljYXRlIisgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29tcG9uZW50VmVyaWZpZWQpKTsKLQkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuVW5hYmxlVG9WZXJpZnlQcm92aWRlciIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKSk7Ci0vKgkJCQlzdHJiLmFwcGVuZCgiXHJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuaXNGZWF0dXJlVmVyaWZpY2F0aW9uKCkpIHsKLQkJCQkJc3RyYi5hcHBlbmQoCi0JCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkluc3RhbGxNYXlDb3JydXB0IikpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBlbHNlIHsKLQkJCQkJc3RyYi5hcHBlbmQoCi0JCQkJCQlVcGRhdGVVSS5nZXRSZXNvdXJjZVN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNvbnRpbnVlTWF5Q29ycnVwdCIpKTsvLyROT04tTkxTLTEkIAkJCQkJCi0JCQkJfQotCQkJCSovCi0JCQkJbGFiZWxJbmZvcm1hdGlvbi5zZXRUZXh0KHN0cmIudG9TdHJpbmcoKSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9SRUNPR05JWkVEIDoKLQkJCQltc2cgPQotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlNpZ25lZENvbXBvbmVudCIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKTsKLQkJCQlzZXRNZXNzYWdlKG1zZywgV0FSTklORyk7Ci0JCQkJc3RyYi5hcHBlbmQoCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJKYXJWZXJpZmljYXRpb25EaWFsb2cuS25vd25DZXJ0aWZpY2F0ZSIrIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWNvbXBvbmVudFZlcmlmaWVkKSk7Ci0JCQkJc3RyYi5hcHBlbmQoIlxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cmIuYXBwZW5kKAotCQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJCQkiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlByb3ZpZGVyS25vd24iKyAvLyROT04tTkxTLTEkCi0JCQkJCQljb21wb25lbnRWZXJpZmllZCkpOwotCQkJCXN0cmIuYXBwZW5kKCJcclxuIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWxhYmVsSW5mb3JtYXRpb24uc2V0VGV4dChzdHJiLnRvU3RyaW5nKCkpOwotCi0vLwkJCQljcmVhdGVDYXV0aW9uQXJlYShjb21wb3NpdGVDbGllbnQpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCQotCi0JLyoKLQkgKiBQcmVzZW50cyBGaWxlICYgRmVhdHVyZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmZvcm1hdGlvbkFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZUNsaWVudCkgewotCi0JCS8vIENvbXBvc2l0ZTogSW5mb3JtYXRpb24gbGFiZWxzCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGVJbmZvcm1hdGlvbiA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlQ2xpZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlSW5mb3JtYXRpb24uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZUluZm9ybWF0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIEZlYXR1cmUgbmFtZQotCQkvLy0tLS0tLS0tLS0tLS0tLQotCQlMYWJlbCBrZXlMYWJlbCA9IG51bGw7Ci0JCUNMYWJlbCB2YWx1ZUxhYmVsID0gbnVsbDsKLQkJaWYgKF9zdHJGZWF0dXJlTmFtZSAhPSBudWxsICYmIF9zdHJGZWF0dXJlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWtleUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQlrZXlMYWJlbC5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZlYXR1cmVOYW1lIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCXZhbHVlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQl2YWx1ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RyRmVhdHVyZU5hbWUpOwotCQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQkvLyBGZWF0dXJlIGlkZW50aWZpZXIKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJaWYgKF9zdHJJZCAhPSBudWxsICYmIF9zdHJJZC5sZW5ndGgoKSA+IDApIHsKLQkJCWtleUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQlrZXlMYWJlbC5zZXRUZXh0KAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZlYXR1cmVJZGVudGlmaWVyIikpOyAvLyROT04tTkxTLTEkCi0KLQkJCXZhbHVlTGFiZWwgPSBuZXcgQ0xhYmVsKGNvbXBvc2l0ZUluZm9ybWF0aW9uLCBTV1QuTlVMTCk7Ci0JCQl2YWx1ZUxhYmVsLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0QmFubmVyRm9udCgpKTsKLQkJCXZhbHVlTGFiZWwuc2V0VGV4dChfc3RySWQpOwotCQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQkvLyBQcm92aWRlciBuYW1lCi0JCS8vLS0tLS0tLS0tLS0tLS0KLQkJaWYgKF9zdHJQcm92aWRlck5hbWUgIT0gbnVsbCAmJiBfc3RyUHJvdmlkZXJOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCWtleUxhYmVsLnNldFRleHQoCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuUHJvdmlkZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJCXZhbHVlTGFiZWwuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRCYW5uZXJGb250KCkpOwotCQkJdmFsdWVMYWJlbC5zZXRUZXh0KF9zdHJQcm92aWRlck5hbWUpOwotCQkJdmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJfQotCQkvLyBMYWJlbDogRmlsZSBuYW1lCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0KLQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJa2V5TGFiZWwuc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkZpbGVOYW1lIikpOyAvLyROT04tTkxTLTEkCi0KLQkJdmFsdWVMYWJlbCA9IG5ldyBDTGFiZWwoY29tcG9zaXRlSW5mb3JtYXRpb24sIFNXVC5OVUxMKTsKLQkJdmFsdWVMYWJlbC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEJhbm5lckZvbnQoKSk7Ci0JCXZhbHVlTGFiZWwuc2V0VGV4dChfZmlsZU5hbWUpOwotCQl2YWx1ZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCX0KLQotCS8qCi0JICogU2hvdyBjZXJ0aWZpY2F0ZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVDZXJ0aWZpY2F0ZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZUNsaWVudCkgewotCi0JCWlmIChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFZlcmlmaWNhdGlvbkNvZGUoKQotCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9VTlJFQ09HTklaRUQKLQkJCXx8IF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpCi0JCQkJPT0gSVZlcmlmaWNhdGlvblJlc3VsdC5UWVBFX0VOVFJZX1NJR05FRF9SRUNPR05JWkVEKSB7Ci0JCQkvLyBHcm91cCBib3gKLQkJCS8vLS0tLS0tLS0tLQotCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlQ2xpZW50LCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlncm91cC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLkNlcnRpZmljYXRlSW5mbyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLyBTaWduZXIKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQotCQkJTGFiZWwga2V5TGFiZWwgPSBudWxsOwotCQkJVGV4dCB2YWx1ZVRleHQgPSBudWxsOwotCQkJLy9kYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkvL2RhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCQkvL3RleHRJbmZvcm1hdGlvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwkJCQotCQkJaWYgKF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0U2lnbmVySW5mbygpICE9IG51bGwpIHsKLQkJCQlrZXlMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5VTEwpOwotCQkJCWtleUxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJKYXJWZXJpZmljYXRpb25EaWFsb2cuU3ViamVjdENBIikpOyAvLyROT04tTkxTLTEkCi0JCQkJa2V5TGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0KLQkJCQl2YWx1ZVRleHQgPSBuZXcgVGV4dChncm91cCwgU1dULk1VTFRJfFNXVC5CT1JERVJ8U1dULldSQVB8U1dULlZfU0NST0xMKTsKLQkJCQl2YWx1ZVRleHQuc2V0VGV4dChfVmVyaWZpY2F0aW9uUmVzdWx0LmdldFNpZ25lckluZm8oKSk7Ci0JCQkJdmFsdWVUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vIEF1dGhlbnRpY2F0b3IKLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCQlpZiAoX1ZlcmlmaWNhdGlvblJlc3VsdC5nZXRWZXJpZmllckluZm8oKSAhPSBudWxsKSB7Ci0JCQkJa2V5TGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OVUxMKTsKLQkJCQlrZXlMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSmFyVmVyaWZpY2F0aW9uRGlhbG9nLlJvb3RDQSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWtleUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwkJCQkKLQotCQkJCXZhbHVlVGV4dCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuTVVMVEl8U1dULkJPUkRFUnxTV1QuV1JBUHxTV1QuVl9TQ1JPTEwpOwotCQkJCXZhbHVlVGV4dC5zZXRUZXh0KF9WZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpZXJJbmZvKCkpOwotCQkJCXZhbHVlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQkJdmFsdWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBTZXRzIHRoZSBEaWFsb2cKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaXRsZUFyZWFEaWFsb2coVGl0bGVBcmVhRGlhbG9nIGRpYWxvZykgewotCQlfRGlhbG9nID0gZGlhbG9nOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSwgaW50IG5ld1R5cGUpIHsKLQkJc3VwZXIuc2V0TWVzc2FnZShuZXdNZXNzYWdlLCBuZXdUeXBlKTsKLQkJaWYgKF9EaWFsb2cgIT0gbnVsbCkgewotCQkJX0RpYWxvZy5zZXRNZXNzYWdlKG5ld01lc3NhZ2UsIG5ld1R5cGUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uU2VydmljZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4ZmRmMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VjdXJpdHkvSmFyVmVyaWZpY2F0aW9uU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlY3VyaXR5OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlIGltcGxlbWVudHMgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHsKLQotCS8qCi0JICogVGhlIEphclZlcmlmaWVyIGlzIGEgaW5zdGFuY2UgdmFyaWFibGUKLQkgKiBiYWNhdXNlIHdlIHdhbnQgdG8gcmV1c2UgaXQgdXBvbiBtdWx0aXBsZSBjYWxscwotCSAqLwotCi0JLyoKLQkgKiB0aGUgU2hlbGwKLQkgKi8KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCQotCS8qKgotCSAqIFByb2Nlc3NlZCBDb250ZW50UmVmZXJuY2VzLiAgVGhleSB3aWxsIGJlIHNraXBwZWQgaWYgcHJvbXB0ZWQKLQkgKiB0byB2ZXJpZnkgdGhlIHNhbWUgcmVmZXJlbmNlIGFnYWluLgotCSAqLwotCXByaXZhdGUgTWFwIHByb2Nlc3NlZD1uZXcgSGFzaE1hcCgpOwotCi0JLyoKLQkgKiBJZiBubyBzaGVsbCwgY3JlYXRlIGEgbmV3IHNoZWxsIAotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQkKLQkvKgotCSAqIAotCSAqLwotCXB1YmxpYyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKFNoZWxsIGFTaGVsbCkgewotCQlzaGVsbCA9IGFTaGVsbDsKLQotCQkvLyBmaW5kIHRoZSBkZWZhdWx0IGRpc3BsYXkgYW5kIGdldCB0aGUgYWN0aXZlIHNoZWxsCi0JCWlmIChzaGVsbCA9PSBudWxsKSB7Ci0JCQlmaW5hbCBEaXNwbGF5IGRpc3AgPSBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQkJCWlmIChkaXNwID09IG51bGwpIHsKLQkJCQlzaGVsbCA9IG5ldyBTaGVsbChuZXcgRGlzcGxheSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzcC5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCXNoZWxsID0gZGlzcC5nZXRBY3RpdmVTaGVsbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IG9wZW5XaXphcmQoSVZlcmlmaWNhdGlvblJlc3VsdCByZXN1bHQpIHsKLQkJaW50IGNvZGU7Ci0JCUlEaWFsb2dQYWdlIHBhZ2UgPSBuZXcgSmFyVmVyaWZpY2F0aW9uUGFnZShyZXN1bHQpOwotCQlKYXJWZXJpZmljYXRpb25EaWFsb2cgZGlhbG9nID0KLQkJCQluZXcgSmFyVmVyaWZpY2F0aW9uRGlhbG9nKHNoZWxsLHBhZ2UscmVzdWx0KTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDYwMCwgNTAwKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkphclZlcmlmaWNhdGlvbkRpYWxvZy53dGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSmFyVmVyaWZpY2F0aW9uRGlhbG9nLk9LKQotCQkJY29kZSA9IENIT0lDRV9JTlNUQUxMX1RSVVNUX0FMV0FZUzsKLQkJZWxzZQotCQkJY29kZSA9IENIT0lDRV9BQk9SVDsKLQotCQlyZXR1cm4gY29kZTsKLQotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIGludCBwcm9tcHQoZmluYWwgSVZlcmlmaWNhdGlvblJlc3VsdCB2ZXJpZmljYXRpb25SZXN1bHQpewotCQlpZiAoIVVwZGF0ZUNvcmUuZ2V0UGx1Z2luKCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFVwZGF0ZUNvcmUuUF9DSEVDS19TSUdOQVRVUkUpKSAKLQkJCXJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0KLQkJaWYgKHZlcmlmaWNhdGlvblJlc3VsdC5hbHJlYWR5U2VlbigpKSByZXR1cm4gQ0hPSUNFX0lOU1RBTExfVFJVU1RfQUxXQVlTOwotCQkKLQkJaWYoc2VlKHZlcmlmaWNhdGlvblJlc3VsdCkpIHJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7Ci0KLQkJc3dpdGNoICh2ZXJpZmljYXRpb25SZXN1bHQuZ2V0VmVyaWZpY2F0aW9uQ29kZSgpKSB7Ci0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVU5LTk9XTl9FUlJPUiA6Ci0JCQkJCXJldHVybiBDSE9JQ0VfRVJST1I7Ci0KLQkJCWNhc2UgSVZlcmlmaWNhdGlvblJlc3VsdC5WRVJJRklDQVRJT05fQ0FOQ0VMTEVEOgotCQkJCQlyZXR1cm4gQ0hPSUNFX0FCT1JUOwotCi0JCQkvLyBjYW5ub3QgdmVyaWZ5IGl0OiBkbyBub3QgcHJvbXB0IHVzZXIuCi0JCQljYXNlIElWZXJpZmljYXRpb25SZXN1bHQuVFlQRV9FTlRSWV9VTlJFQ09HTklaRUQ6IAotCQkJCXJldHVybiBDSE9JQ0VfSU5TVEFMTF9UUlVTVF9BTFdBWVM7CQkJCQotCQkJCi0JCQlkZWZhdWx0IDoKLQkJCQl7Ci0JCQkJCWZpbmFsIGludFtdIHdpemFyZFJlc3VsdCA9IG5ldyBpbnRbMV07CQkJCQkKLQkJCQkJc2hlbGwuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl3aXphcmRSZXN1bHRbMF0gPSBvcGVuV2l6YXJkKHZlcmlmaWNhdGlvblJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlyZXR1cm4gd2l6YXJkUmVzdWx0WzBdOwotCQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIGZlYXR1cmUgYXJjaGl2ZSBoYXMgYmVlbiBzZWVuIGFscmVhZHkuCi0JICogUmVtZW1iZXJzIHRoZSBmYWN0IHRoYXQgYXJjaGl2ZSBpcyBiZWluZyBzZWVuIG5vdy4KLQkgKiBAcGFyYW0gdmVyaWZpY2F0aW9uUmVzdWx0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBhcmNoaXZlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLCBmYWxzZSBpZiBmaXJzdCB0aW1lCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNlZShmaW5hbCBJVmVyaWZpY2F0aW9uUmVzdWx0IHZlcmlmaWNhdGlvblJlc3VsdCkgewotCQlTdHJpbmcga2V5ID0gdmVyaWZpY2F0aW9uUmVzdWx0LmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkudG9TdHJpbmcoKQotCQkJKyIvIit2ZXJpZmljYXRpb25SZXN1bHQuZ2V0Q29udGVudFJlZmVyZW5jZSgpLmdldElkZW50aWZpZXIoKTsgLy8kTk9OLU5MUy0xJAotCQlMb25nIHZhbHVlID0gbmV3IExvbmcodmVyaWZpY2F0aW9uUmVzdWx0LmdldENvbnRlbnRSZWZlcmVuY2UoKS5nZXRMYXN0TW9kaWZpZWQoKSk7Ci0JCUxvbmcgY2FjaGVkVmFsdWUgPSAoTG9uZylwcm9jZXNzZWQuZ2V0KGtleSk7Ci0JCWlmKHZhbHVlLmVxdWFscyhjYWNoZWRWYWx1ZSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlewotCQkJcHJvY2Vzc2VkLnB1dChrZXksIHZhbHVlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9VcGRhdGVNYW5hZ2VyQXV0aGVudGljYXRvci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOGU1Y2UuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5zZWN1cml0eTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLS8qKgotICogVXBkYXRlIE1hbmFnZXIgQXV0aGVudGljYXRvciBTYWRseSB0aGVyZSBjYW4gb25seSBiZSBvbmUgcmVnaXN0ZXJlZCBwZXIgVk0KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJBdXRoZW50aWNhdG9yIGV4dGVuZHMgQXV0aGVudGljYXRvciB7Ci0JcHJpdmF0ZSBBdXRoZW50aWNhdGlvbiBzYXZlZFBhc3N3b3JkQXV0aGVudGljYXRpb247Ci0KLQkvKgotCSAqIEBzZWUgQXV0aGVudGljYXRvciNnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUGFzc3dvcmRBdXRoZW50aWNhdGlvbiBnZXRQYXNzd29yZEF1dGhlbnRpY2F0aW9uKCkgewotCQkvLyBTdHJpbmcgcHJvdG9jb2wgPSBnZXRSZXF1ZXN0aW5nUHJvdG9jb2woKTsKLQkJU3RyaW5nIGhvc3QgPSBnZXRSZXF1ZXN0aW5nSG9zdCgpOyAvLyBjYW4gYmUgbnVsbDsKLQkJSW5ldEFkZHJlc3MgYWRkcmVzcyA9IGdldFJlcXVlc3RpbmdTaXRlKCk7IC8vIGNhbiBiZSBudWxsOwotCQkvLyBpbnQgcG9ydCA9IGdldFJlcXVlc3RpbmdQb3J0KCk7Ci0JCVN0cmluZyBwcm9tcHQgPSBnZXRSZXF1ZXN0aW5nUHJvbXB0KCk7IC8vIHJlYWxtIG9yIG1lc3NhZ2UsIG5vdCBkb2N1bWVudGVkIHRoYXQgY2FuIGJlIG51bGwKLQkJLy8gU3RyaW5nIHNjaGVtZSA9IGdldFJlcXVlc3RpbmdTY2hlbWUoKTsgLy8gbm90IGRvY3VtZW50ZWQgdGhhdCBjYW4gYmUgbnVsbAotCi0JCVN0cmluZyBob3N0U3RyaW5nID0gaG9zdDsKLQkJaWYgKGhvc3RTdHJpbmcgPT0gbnVsbCAmJiBhZGRyZXNzICE9IG51bGwpIHsKLQkJCWFkZHJlc3MuZ2V0SG9zdE5hbWUoKTsKLQkJfQotCQlpZiAoaG9zdFN0cmluZyA9PSBudWxsKSB7Ci0JCQlob3N0U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgcHJvbXB0U3RyaW5nID0gcHJvbXB0OwotCQlpZiAocHJvbXB0ID09IG51bGwpIHsKLQkJCXByb21wdFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlBdXRoZW50aWNhdGlvbiBhdXRoID0gVXNlclZhbGlkYXRpb25EaWFsb2cuZ2V0QXV0aGVudGljYXRpb24oCi0JCQkJaG9zdFN0cmluZywgcHJvbXB0U3RyaW5nKTsKLQkJaWYgKGF1dGggIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUGFzc3dvcmRBdXRoZW50aWNhdGlvbihhdXRoLmdldFVzZXIoKSwgYXV0aAotCQkJCQkuZ2V0UGFzc3dvcmQoKS50b0NoYXJBcnJheSgpKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZWN1cml0eS9Vc2VyVmFsaWRhdGlvbkRpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTVjNGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlY3VyaXR5L1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0vKioKLSAqIFVzZXIgYXV0aGVudGljYXRpb24gZGlhbG9nCi0gKi8KLXB1YmxpYyBjbGFzcyBVc2VyVmFsaWRhdGlvbkRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JcHJvdGVjdGVkIFRleHQgdXNlcm5hbWVGaWVsZDsKLQlwcm90ZWN0ZWQgVGV4dCBwYXNzd29yZEZpZWxkOwotCi0JcHJvdGVjdGVkIFN0cmluZyBob3N0OwotCXByb3RlY3RlZCBTdHJpbmcgbWVzc2FnZTsKLQlwcm90ZWN0ZWQgQXV0aGVudGljYXRpb24gdXNlckF1dGhlbnRpY2F0aW9uID0gbnVsbDsKLQkvKioKLQkgKiBHZXRzIHVzZXIgYW5kIHBhc3N3b3JkIGZyb20gYSB1c2VyLiBNYXkgYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZAotCSAqIAotCSAqIEByZXR1cm4gVXNlckF1dGhlbnRpY2F0aW9uIHRoYXQgY29udGFpbnMgdGhlIHVzZXJpZCBhbmQgdGhlIHBhc3N3b3JkIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNhbmNlbGxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQXV0aGVudGljYXRpb24gZ2V0QXV0aGVudGljYXRpb24oZmluYWwgU3RyaW5nIGhvc3QsCi0JCQlmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotCQljbGFzcyBVSU9wZXJhdGlvbiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJCXB1YmxpYyBBdXRoZW50aWNhdGlvbiBhdXRoZW50aWNhdGlvbjsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhdXRoZW50aWNhdGlvbiA9IFVzZXJWYWxpZGF0aW9uRGlhbG9nLmFza0ZvckF1dGhlbnRpY2F0aW9uKAotCQkJCQkJaG9zdCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQotCQlVSU9wZXJhdGlvbiB1aW8gPSBuZXcgVUlPcGVyYXRpb24oKTsKLQkJaWYgKERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIHsKLQkJCXVpby5ydW4oKTsKLQkJfSBlbHNlIHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHVpbyk7Ci0JCX0KLQkJcmV0dXJuIHVpby5hdXRoZW50aWNhdGlvbjsKLQl9Ci0JLyoqCi0JICogR2V0cyB1c2VyIGFuZCBwYXNzd29yZCBmcm9tIGEgdXNlciBNdXN0IGJlIGNhbGxlZCBmcm9tIFVJIHRocmVhZAotCSAqIAotCSAqIEByZXR1cm4gVXNlckF1dGhlbnRpY2F0aW9uIHRoYXQgY29udGFpbnMgdGhlIHVzZXJpZCBhbmQgdGhlIHBhc3N3b3JkIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGlhbG9nIGhhcyBiZWVuIGNhbmNlbGxlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQXV0aGVudGljYXRpb24gYXNrRm9yQXV0aGVudGljYXRpb24oU3RyaW5nIGhvc3QsCi0JCQlTdHJpbmcgbWVzc2FnZSkgewotCQlVc2VyVmFsaWRhdGlvbkRpYWxvZyB1aSA9IG5ldyBVc2VyVmFsaWRhdGlvbkRpYWxvZyhudWxsLCBob3N0LCBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQl1aS5vcGVuKCk7Ci0JCXJldHVybiB1aS5nZXRBdXRoZW50aWNhdGlvbigpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFVzZXJWYWxpZGF0aW9uRGlhbG9nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgcGFyZW50IFNoZWxsIG9yIG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgVXNlclZhbGlkYXRpb25EaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBob3N0LAotCQkJU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmhvc3QgPSBob3N0OwotCQl0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotCQlzZXRCbG9ja09uT3Blbih0cnVlKTsKLQl9Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQluZXdTaGVsbC5zZXRUZXh0KFVwZGF0ZVVJCi0JCQkJLmdldFN0cmluZygiVXNlclZlcmlmaWNhdGlvbkRpYWxvZy5QYXNzd29yZFJlcXVpcmVkIikpOyAvLyROT04tTkxTLTEkCi0JfQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCS8vZ2l2ZSBmb2N1cyB0byB1c2VybmFtZSBmaWVsZAotCQl1c2VybmFtZUZpZWxkLnNlbGVjdEFsbCgpOwotCQl1c2VybmFtZUZpZWxkLnNldEZvY3VzKCk7Ci0JfQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgbWFpbiA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQltYWluLnNldExheW91dChsYXlvdXQpOwotCQltYWluLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKG1haW4sIFNXVC5XUkFQKTsKLQkJU3RyaW5nIHRleHQgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlVzZXJWZXJpZmljYXRpb25EaWFsb2cuQ29ubmVjdFRvIikgKyBob3N0OyAvLyROT04tTkxTLTEkCi0JCXRleHQgKz0gIlxuXG4iICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJY3JlYXRlVXNlcm5hbWVGaWVsZHMobWFpbik7Ci0JCWNyZWF0ZVBhc3N3b3JkRmllbGRzKG1haW4pOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAobWFpbiwKLQkJCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLlVzZXJWYWxpZGF0aW9uRGlhbG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG1haW47Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRocmVlIHdpZGdldHMgdGhhdCByZXByZXNlbnQgdGhlIHVzZXIgbmFtZSBlbnRyeSBhcmVhLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVBhc3N3b3JkRmllbGRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpLnNldFRleHQoVXBkYXRlVUkKLQkJCQkuZ2V0U3RyaW5nKCJVc2VyVmVyaWZpY2F0aW9uRGlhbG9nLlBhc3N3b3JkIikpOyAvLyROT04tTkxTLTEkCi0KLQkJcGFzc3dvcmRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5QQVNTV09SRCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIKTsKLQkJcGFzc3dvcmRGaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsgLy9zcGFjZXIKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdGhyZWUgd2lkZ2V0cyB0aGF0IHJlcHJlc2VudCB0aGUgdXNlciBuYW1lIGVudHJ5IGFyZWEuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVXNlcm5hbWVGaWVsZHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSkuc2V0VGV4dChVcGRhdGVVSQotCQkJCS5nZXRTdHJpbmcoIlVzZXJWZXJpZmljYXRpb25EaWFsb2cuVXNlck5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQl1c2VybmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuRU5UUllfRklFTERfV0lEVEgpOwotCQl1c2VybmFtZUZpZWxkLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOyAvL3NwYWNlcgotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVc2VyQXV0aGVudGljYXRpb24gZW50ZXJlZCBieSB0aGUgdXNlciwgb3IgbnVsbCBpZiB0aGUgdXNlcgotCSAqIGNhbmNlbGVkLgotCSAqLwotCXB1YmxpYyBBdXRoZW50aWNhdGlvbiBnZXRBdXRoZW50aWNhdGlvbigpIHsKLQkJcmV0dXJuIHVzZXJBdXRoZW50aWNhdGlvbjsKLQl9Ci0JLyoqCi0JICogTm90aWZpZXMgdGhhdCB0aGUgb2sgYnV0dG9uIG9mIHRoaXMgZGlhbG9nIGhhcyBiZWVuIHByZXNzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1c2VyQXV0aGVudGljYXRpb24gPSBuZXcgQXV0aGVudGljYXRpb24odXNlcm5hbWVGaWVsZC5nZXRUZXh0KCksCi0JCQkJcGFzc3dvcmRGaWVsZC5nZXRUZXh0KCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQ29uZmlndXJhdGlvblByZXZpZXcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uUHJldmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkyMDg1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9Db25maWd1cmF0aW9uUHJldmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5Xb3JrYmVuY2hIZWxwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLklMb2NhbFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblByZXZpZXcgaW1wbGVtZW50cyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgewotCXByaXZhdGUgU2Nyb2xsZWRGb3JtIGZvcm07Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uVmlldyB2aWV3OwotCXByaXZhdGUgRm9ybVRvb2xraXQgdG9vbGtpdDsKLQlwcml2YXRlIEZvcm1UZXh0IGRlc2M7Ci0JcHJpdmF0ZSBGb3JtVGV4dCB0YXNrTGlzdDsKLQlwcml2YXRlIElQcmV2aWV3VGFza1tdIHRhc2tzOwotCQotCXB1YmxpYyBDb25maWd1cmF0aW9uUHJldmlldyhDb25maWd1cmF0aW9uVmlldyB2aWV3KSB7Ci0JCXRoaXMudmlldyA9IHZpZXc7Ci0JCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCW1vZGVsLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQltb2RlbC5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJdG9vbGtpdC5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgb2JqZWN0c0FkZGVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JfQotCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JfQotCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGZvcm07Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRvb2xraXQgPSBuZXcgRm9ybVRvb2xraXQocGFyZW50LmdldERpc3BsYXkoKSk7Ci0JCWZvcm0gPSB0b29sa2l0LmNyZWF0ZVNjcm9sbGVkRm9ybShwYXJlbnQpOwotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlmb3JtLmdldEJvZHkoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gPSAxMDsKLQkJbGF5b3V0LnJpZ2h0TWFyZ2luID0gNTsKLQkJbGF5b3V0LnRvcE1hcmdpbiA9IDEwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMjA7Ci0JCUlIeXBlcmxpbmtMaXN0ZW5lciB1cmxBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCVN0cmluZyB1cmwgPSAoU3RyaW5nKSBlLmdldEhyZWYoKTsKLQkJCQlpZiAodXJsICE9IG51bGwpCi0JCQkJCVVwZGF0ZVVJLnNob3dVUkwodXJsKTsKLQkJCX0KLQkJfTsKLQkJSUh5cGVybGlua0xpc3RlbmVyIHRhc2tBY3Rpb24gPSBuZXcgSHlwZXJsaW5rQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGxpbmtBY3RpdmF0ZWQoSHlwZXJsaW5rRXZlbnQgZSkgewotCQkJCVN0cmluZyBpbmRleEFyZyA9IChTdHJpbmcpIGUuZ2V0SHJlZigpOwotCQkJCXRyeSB7Ci0JCQkJCWludCBpbmRleCA9IEludGVnZXIucGFyc2VJbnQoaW5kZXhBcmcpOwotCQkJCQlpZiAodGFza3MgIT0gbnVsbCkKLQkJCQkJCXRhc2tzW2luZGV4XS5ydW4oKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCS8vdGFza0FjdGlvbi5zZXRTdGF0dXNMaW5lTWFuYWdlcih2aWV3LmdldENvbmZpZ3VyYXRpb25XaW5kb3coKS5nZXRTdGF0dXNMaW5lTWFuYWdlcigpKTsKLQkJZGVzYyA9IHRvb2xraXQuY3JlYXRlRm9ybVRleHQoZm9ybS5nZXRCb2R5KCksIHRydWUpOwotCQlkZXNjLnNldEh5cGVybGlua1NldHRpbmdzKHRvb2xraXQuZ2V0SHlwZXJsaW5rR3JvdXAoKSk7Ci0JCWRlc2MuYWRkSHlwZXJsaW5rTGlzdGVuZXIodXJsQWN0aW9uKTsKLQkJZGVzYy5zZXRUZXh0KCIiLCBmYWxzZSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlV3JhcERhdGEgdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCWRlc2Muc2V0TGF5b3V0RGF0YSh0ZCk7Ci0JCXRhc2tMaXN0ID0gdG9vbGtpdC5jcmVhdGVGb3JtVGV4dChmb3JtLmdldEJvZHkoKSwgdHJ1ZSk7Ci0JCXRhc2tMaXN0LnNldEh5cGVybGlua1NldHRpbmdzKHRvb2xraXQuZ2V0SHlwZXJsaW5rR3JvdXAoKSk7Ci0JCXRhc2tMaXN0LmFkZEh5cGVybGlua0xpc3RlbmVyKHRhc2tBY3Rpb24pOyAvLyROT04tTkxTLTEkCi0JCXRhc2tMaXN0LnNldFRleHQoIiIsIGZhbHNlLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9mYWN0b3J5LnNldEh5cGVybGlua1VuZGVybGluZU1vZGUoSHlwZXJsaW5rU2V0dGluZ3MuVU5ERVJMSU5FX1JPTExPVkVSKTsKLQkJdGQgPSBuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQik7Ci0JCXRhc2tMaXN0LnNldExheW91dERhdGEodGQpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAocGFyZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLlNpdGVGb3JtIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlPYmplY3Qgb2JqZWN0ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl0YXNrcyA9IHZpZXcuZ2V0UHJldmlld1Rhc2tzKG9iamVjdCk7Ci0JCVN0cmluZyB0aXRsZSA9IGdldE9iamVjdExhYmVsKG9iamVjdCk7Ci0JCWZvcm0uc2V0VGV4dCh0aXRsZSk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldE9iamVjdERlc2NyaXB0aW9uKG9iamVjdCk7Ci0JCWJvb2xlYW4gdGFncyA9IGRlc2NyaXB0aW9uLnN0YXJ0c1dpdGgoIjxmb3JtPiIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2Muc2V0VGV4dChkZXNjcmlwdGlvbiwgdGFncywgIXRhZ3MpOwotCQlTdHJpbmcgdGFza1RleHQgPSBnZXRUYXNrc1RleHQoKTsKLQkJdGFza0xpc3Quc2V0VGV4dCh0YXNrVGV4dCwgdHJ1ZSwgZmFsc2UpOwotCQlmb3JtLnJlZmxvdyh0cnVlKTsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0T2JqZWN0TGFiZWwoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVHJlZVZpZXdlciB2aWV3ZXIgPSB2aWV3LmdldFRyZWVWaWV3ZXIoKTsKLQkJTGFiZWxQcm92aWRlciBwcm92aWRlciA9IChMYWJlbFByb3ZpZGVyKSB2aWV3ZXIuZ2V0TGFiZWxQcm92aWRlcigpOwotCQlyZXR1cm4gcHJvdmlkZXIuZ2V0VGV4dChvYmplY3QpOwotCX0KLQlwcml2YXRlIFN0cmluZyBnZXRPYmplY3REZXNjcmlwdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCXJldHVybiBnZXRGZWF0dXJlRGVzY3JpcHRpb24oKElGZWF0dXJlQWRhcHRlcikgb2JqZWN0KTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblByZXZpZXdGb3JtLmluc3RhbGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7Ci0JCQlyZXR1cm4gVXBkYXRlVUkKLQkJCQkJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblByZXZpZXdGb3JtLmNvbmZpZ0Rlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmVhdHVyZURlc2NyaXB0aW9uKElGZWF0dXJlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXRyeSB7Ci0JCQlJRmVhdHVyZSBmZWF0dXJlID0gYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpOwotCQkJSVVSTEVudHJ5IGVudHJ5ID0gZmVhdHVyZS5nZXREZXNjcmlwdGlvbigpOwotCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdGV4dCA9IGVudHJ5LmdldEFubm90YXRpb24oKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCVVSTCB1cmwgPSBlbnRyeS5nZXRVUkwoKTsKLQkJCQkJaWYgKHVybCA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nIGxpbmsgPSAiIDxhIGhyZWY9XCJ1cmxIYW5kbGVyXCIgYXJnPVwiIiArIHVybCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCSsgIlwiPk1vcmUgaW5mby4uLjwvYT4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCVN0cmluZyBmdWxsVGV4dCA9ICI8Zm9ybT48cD4iICsgdGV4dCArIGxpbmsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkrICI8L3A+PC9mb3JtPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmV0dXJuIGZ1bGxUZXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFza3NUZXh0KCkgewotCQlpZiAodGFza3MgPT0gbnVsbCB8fCB0YXNrcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiAiPGZvcm0vPiI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBoYXNFbmFibGVkVGFza3MgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRhc2tzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJaGFzRW5hYmxlZFRhc2tzID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIWhhc0VuYWJsZWRUYXNrcykKLQkJCXJldHVybiAiPGZvcm0vPiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZCgiPGZvcm0+PHA+PGI+QXZhaWxhYmxlIFRhc2tzPC9iPjwvcD4iKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHJldmlld1Rhc2sgdGFzayA9IHRhc2tzW2ldOwotCQkJaWYgKHRhc2suaXNFbmFibGVkKCkgPT0gZmFsc2UpCi0JCQkJY29udGludWU7Ci0JCQlidWYuYXBwZW5kKCI8bGkgc3R5bGU9XCJ0ZXh0XCIgaW5kZW50PVwiMFwiPjxhIGhyZWY9XCIiICsgaSArICJcIj4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkrIHRhc2suZ2V0TmFtZSgpICsgIjwvYT48L2xpPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJYnVmLmFwcGVuZCgiPGxpIHN0eWxlPVwidGV4dFwiIGluZGVudD1cIjEwXCIgdnNwYWNlPVwiZmFsc2VcIj4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyB0YXNrLmdldERlc2NyaXB0aW9uKCkgKyAiPC9saT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJYnVmLmFwcGVuZCgiPC9mb3JtPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0NvbmZpZ3VyYXRpb25WaWV3LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyYjNhMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvQ29uZmlndXJhdGlvblZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5icmFuZGluZy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICogQHNlZSBWaWV3UGFydAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvblZpZXcKLQlpbXBsZW1lbnRzCi0JCUlJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciwKLQkJSUNvbmZpZ3VyZWRTaXRlQ2hhbmdlZExpc3RlbmVyLAotCQlJTG9jYWxTaXRlQ2hhbmdlZExpc3RlbmVyIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcml2YXRlIERyaWxsRG93bkFkYXB0ZXIgZHJpbGxEb3duQWRhcHRlcjsKLQlwcml2YXRlIEFjdGlvbiBjb2xsYXBzZUFsbEFjdGlvbjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfU0hPV19VTkNPTkYgPSAiQ29uZmlndXJhdGlvblZpZXcuc2hvd1VuY29uZiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBVEVfU0hPV19TSVRFUyA9ICJDb25maWd1cmF0aW9uVmlldy5zaG93U2l0ZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTID0KLQkJIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dOZXN0ZWRGZWF0dXJlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQWN0aW9uIHNob3dTaXRlc0FjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb247Ci0JcHJpdmF0ZSBSZXBsYWNlVmVyc2lvbkFjdGlvbiBzd2FwVmVyc2lvbkFjdGlvbjsKLQlwcml2YXRlIEZlYXR1cmVTdGF0ZUFjdGlvbiBmZWF0dXJlU3RhdGVBY3Rpb247Ci0JcHJpdmF0ZSBVbmluc3RhbGxGZWF0dXJlQWN0aW9uIHVuaW5zdGFsbEZlYXR1cmVBY3Rpb247Ci0JcHJpdmF0ZSBJbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uIGluc3RhbGxPcHRGZWF0dXJlQWN0aW9uOwotCXByaXZhdGUgQWN0aW9uIHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbjsKLQlwcml2YXRlIFJldmVydENvbmZpZ3VyYXRpb25BY3Rpb24gcmV2ZXJ0QWN0aW9uOwotCXByaXZhdGUgU2hvd0FjdGl2aXRpZXNBY3Rpb24gc2hvd0FjdGl2aXRpZXNBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gcHJvcGVydGllc0FjdGlvbjsKLQlwcml2YXRlIFNpdGVTdGF0ZUFjdGlvbiBzaXRlU3RhdGVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbjsKLQlwcml2YXRlIEFjdGlvbiBuZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbjsKLQlwcml2YXRlIEZpbmRVcGRhdGVzQWN0aW9uIGZpbmRVcGRhdGVzQWN0aW9uOwotCXByaXZhdGUgU2FzaEZvcm0gc3BsaXR0ZXI7Ci0JcHJpdmF0ZSBDb25maWd1cmF0aW9uUHJldmlldyBwcmV2aWV3OwotCXByaXZhdGUgSGFzaHRhYmxlIHByZXZpZXdUYXNrczsKLQotCXByaXZhdGUgSVVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7Ci0JcHJpdmF0ZSBib29sZWFuIHJlZnJlc2hMb2NrID0gZmFsc2U7Ci0JcHJpdmF0ZSBJbWFnZSBlY2xpcHNlSW1hZ2U7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemVkOwotCXByaXZhdGUgQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cgY29uZmlndXJhdGlvbldpbmRvdzsKLQotCWNsYXNzIENvbmZpZ3VyYXRpb25Tb3J0ZXIgZXh0ZW5kcyBWaWV3ZXJTb3J0ZXIgewotCQlwdWJsaWMgaW50IGNhdGVnb3J5KE9iamVjdCBvYmopIHsKLQkJCS8vIHNpdGVzCi0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9Ci0JCQkJCSgoSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgb2JqKS5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQkJCWlmIChjc2l0ZS5pc1Byb2R1Y3RTaXRlKCkpCi0JCQkJCXJldHVybiAxOwotCQkJCWlmIChjc2l0ZS5pc0V4dGVuc2lvblNpdGUoKSkKLQkJCQkJcmV0dXJuIDI7Ci0JCQkJcmV0dXJuIDM7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuY2F0ZWdvcnkob2JqKTsKLQkJfQotCX0KLQotCWNsYXNzIExvY2FsU2l0ZVByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKAotCQkJVmlld2VyIHZpZXdlciwKLQkJCU9iamVjdCBvbGRJbnB1dCwKLQkJCU9iamVjdCBuZXdJbnB1dCkgewotCQkJaWYgKG5ld0lucHV0ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSVRyZWVDb250ZW50UHJvdmlkZXIjZ2V0Q2hpbGRyZW4oT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBVcGRhdGVNb2RlbCkgewotCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCQkJcmV0dXJuIChsb2NhbFNpdGUgIT0gbnVsbCkgPyBuZXcgT2JqZWN0W10geyBsb2NhbFNpdGUgfQotCQkJCTogbmV3IE9iamVjdFswXTsKLQkJCX0KLQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCQlPYmplY3RbXSBjc2l0ZXMgPSBvcGVuTG9jYWxTaXRlKCk7Ci0JCQkJaWYgKHNob3dTaXRlc0FjdGlvbi5pc0NoZWNrZWQoKSkKLQkJCQkJcmV0dXJuIGNzaXRlczsKLQkJCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWJvb2xlYW4gc2hvd1VuY29uZiA9IHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzaXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29uZmlndXJlZFNpdGVBZGFwdGVyIGFkYXB0ZXIgPQotCQkJCQkJKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIGNzaXRlc1tpXTsKLQkJCQkJT2JqZWN0W10gcm9vdHMgPSBnZXRGZWF0dXJlcyhhZGFwdGVyLCAhc2hvd1VuY29uZik7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcm9vdHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCXJlc3VsdC5hZGQocm9vdHNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOwotCQkJfQotCi0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJCXJldHVybiBnZXRGZWF0dXJlcygKLQkJCQkJKElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHBhcmVudCwKLQkJCQkJIXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5pc0NoZWNrZWQoKSk7Ci0JCQl9Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyCi0JCQkJJiYgc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKSB7Ci0JCQkJSUZlYXR1cmVBZGFwdGVyW10gbmVzdGVkID0KLQkJCQkJKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIHBhcmVudCkuZ2V0SW5jbHVkZWRGZWF0dXJlcygKLQkJCQkJCW51bGwpOwotCQkJCWlmIChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCi0JCQkJCXJldHVybiBuZXN0ZWQ7Ci0JCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZC5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG5lc3RlZFtpXSkuaXNDb25maWd1cmVkKCkpCi0JCQkJCQlyZXN1bHQuYWRkKG5lc3RlZFtpXSk7Ci0JCQkJfQotCQkJCXJldHVybiAoSUZlYXR1cmVBZGFwdGVyW10pIHJlc3VsdC50b0FycmF5KAotCQkJCQluZXcgSUZlYXR1cmVBZGFwdGVyW3Jlc3VsdC5zaXplKCldKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSB7Ci0JCQkJaWYgKCFzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJRmVhdHVyZUFkYXB0ZXJbXSBmZWF0dXJlcyA9Ci0JCQkJCSgoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBwYXJlbnQpLmdldEluY2x1ZGVkRmVhdHVyZXMoCi0JCQkJCQludWxsKTsKLQotCQkJCWlmIChzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCi0JCQkJCXJldHVybiBmZWF0dXJlcy5sZW5ndGggPiAwOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoKChDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGZlYXR1cmVzW2ldKQotCQkJCQkJLmlzQ29uZmlndXJlZCgpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9Ci0JCQkJCSgoQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBwYXJlbnQpLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJaWYgKHNpdGUuaXNFbmFibGVkKCkpIHsKLQkJCQkJaWYgKCFzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpCi0JCQkJCQlyZXR1cm4gc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKS5sZW5ndGggPiAwOwotCQkJCQlyZXR1cm4gc2l0ZS5nZXRGZWF0dXJlUmVmZXJlbmNlcygpLmxlbmd0aCA+IDA7Ci0JCQkJfQotCQkJCXJldHVybiAoc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGlucHV0KTsKLQkJfQotCX0KLQotCWNsYXNzIExvY2FsU2l0ZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTG9jYWxTaXRlKSB7Ci0JCQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLQkJCQlpZiAocHJvZHVjdCAhPSBudWxsKQotCQkJCQlyZXR1cm4gcHJvZHVjdC5nZXROYW1lKCk7Ci0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuY3VycmVudCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KLQkJCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKLQkJCQlyZXR1cm4gbmV3IEZpbGUoc2l0ZS5nZXRVUkwoKS5nZXRGaWxlKCkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUZlYXR1cmVBZGFwdGVyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSUZlYXR1cmUgZmVhdHVyZSA9ICgoSUZlYXR1cmVBZGFwdGVyKSBvYmopLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJCWlmIChmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmUpIHsKLQkJCQkJCXJldHVybiBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKAotCQkJCQkJCSJDb25maWd1cmF0aW9uVmlldy5taXNzaW5nRmVhdHVyZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlmZWF0dXJlLmdldExhYmVsKCkpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyB2ZXJzaW9uID0KLQkJCQkJCWZlYXR1cmUKLQkJCQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJCQkJLmdldFZlcnNpb24oKQotCQkJCQkJCS50b1N0cmluZygpOwotCQkJCQlTdHJpbmcgcGVuZGluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5maW5kUGVuZGluZ09wZXJhdGlvbihmZWF0dXJlKQotCQkJCQkJIT0gbnVsbCkKLQkJCQkJCXBlbmRpbmcgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnBlbmRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpICsgIiAiICsgdmVyc2lvbiArIHBlbmRpbmc7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KG9iaik7Ci0JCX0KLQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IG9iaikgewotCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9Ci0JCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJTG9jYWxTaXRlKQotCQkJCXJldHVybiBlY2xpcHNlSW1hZ2U7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpCi0JCQkJcmV0dXJuIGdldEZlYXR1cmVJbWFnZSgKLQkJCQkJcHJvdmlkZXIsCi0JCQkJCShDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIG9iaik7Ci0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0KLQkJCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCk7Ci0JCQkJaW50IGZsYWdzID0KLQkJCQkJY3NpdGUuaXNVcGRhdGFibGUoKSA/IDAgOiBVcGRhdGVMYWJlbFByb3ZpZGVyLkZfTElOS0VEOwotCQkJCWlmICghY3NpdGUuaXNFbmFibGVkKCkpCi0JCQkJCWZsYWdzIHw9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9VTkNPTkZJR1VSRUQ7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldCgKLQkJCQkJcHJvdmlkZXIuZ2V0TG9jYWxTaXRlRGVzY3JpcHRvcihjc2l0ZSksCi0JCQkJCWZsYWdzKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHJpdmF0ZSBJbWFnZSBnZXRGZWF0dXJlSW1hZ2UoCi0JCQlVcGRhdGVMYWJlbFByb3ZpZGVyIHByb3ZpZGVyLAotCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJCXRyeSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQlpZiAoZmVhdHVyZSBpbnN0YW5jZW9mIE1pc3NpbmdGZWF0dXJlKSB7Ci0JCQkJCWlmICgoKE1pc3NpbmdGZWF0dXJlKSBmZWF0dXJlKS5pc09wdGlvbmFsKCkpCi0JCQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAotCQkJCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfTk9USU5TVF9GRUFUVVJFX09CSik7Ci0JCQkJCXJldHVybiBwcm92aWRlci5nZXQoCi0JCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKLAotCQkJCQkJVXBkYXRlTGFiZWxQcm92aWRlci5GX0VSUk9SKTsKLQkJCQl9Ci0KLQkJCQlib29sZWFuIGVmaXggPSBmZWF0dXJlLmlzUGF0Y2goKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgYmFzZURlc2MgPQotCQkJCQllZml4Ci0JCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRUZJWF9PQkoKLQkJCQkJCTogKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkKLQkJCQkJCQk/IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQkoKLQkJCQkJCQk6IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfVU5DT05GX0ZFQVRVUkVfT0JKKTsKLQotCQkJCWludCBmbGFncyA9IDA7Ci0JCQkJaWYgKGVmaXggJiYgIWFkYXB0ZXIuaXNDb25maWd1cmVkKCkpCi0JCQkJCWZsYWdzIHw9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9VTkNPTkZJR1VSRUQ7Ci0JCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmZpbmRQZW5kaW5nT3BlcmF0aW9uKGZlYXR1cmUpID09IG51bGwpIHsKLQkJCQkJSUxvY2FsU2l0ZSBsb2NhbFNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCQkJaWYgKGxvY2FsU2l0ZSAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgY29kZSA9Ci0JCQkJCQkJZ2V0U3RhdHVzQ29kZSgKLQkJCQkJCQkJZmVhdHVyZSwKLQkJCQkJCQkJbG9jYWxTaXRlLmdldEZlYXR1cmVTdGF0dXMoZmVhdHVyZSkpOwotCQkJCQkJc3dpdGNoIChjb2RlKSB7Ci0JCQkJCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfVU5IQVBQWSA6Ci0JCQkJCQkJCWZsYWdzIHw9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUjsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJY2FzZSBJRmVhdHVyZS5TVEFUVVNfQU1CSUdVT1VTIDoKLQkJCQkJCQkJZmxhZ3MgfD0gVXBkYXRlTGFiZWxQcm92aWRlci5GX1dBUk5JTkc7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQlpZiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKQotCQkJCQkJCQkJJiYgYWRhcHRlci5pc1VwZGF0ZWQoKSkKLQkJCQkJCQkJCWZsYWdzIHw9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9VUERBVEVEOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KGJhc2VEZXNjLCBmbGFncyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KAotCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKLAotCQkJCQlVcGRhdGVMYWJlbFByb3ZpZGVyLkZfRVJST1IpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUHJldmlld1Rhc2sgaW1wbGVtZW50cyBJUHJldmlld1Rhc2sgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIFN0cmluZyBkZXNjOwotCQlwcml2YXRlIElBY3Rpb24gYWN0aW9uOwotCQlwdWJsaWMgUHJldmlld1Rhc2soU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBJQWN0aW9uIGFjdGlvbikgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCQl0aGlzLmFjdGlvbiA9IGFjdGlvbjsKLQkJfQotCQlwdWJsaWMgSUFjdGlvbiBnZXRBY3Rpb24oKSB7Ci0JCQlyZXR1cm4gYWN0aW9uOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQlyZXR1cm4gYWN0aW9uLmdldFRleHQoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2M7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpIHsKLQkJCXRoaXMuZGVzYyA9IGRlc2M7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYWN0aW9uLnJ1bigpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLQkJCXJldHVybiBhY3Rpb24uaXNFbmFibGVkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29uZmlndXJhdGlvblZpZXcoQ29uZmlndXJhdGlvbk1hbmFnZXJXaW5kb3cgd2luZG93KSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJaW5pdGlhbGl6ZUltYWdlcygpOwotCQljb25maWd1cmF0aW9uV2luZG93PXdpbmRvdzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUltYWdlcygpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGVkZXNjID0gVXBkYXRlVUlJbWFnZXMuREVTQ19BUFBfT0JKOwotCQlJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCQlpZiAocHJvZHVjdCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgd2luZG93SW1hZ2VVUkwgPSBwcm9kdWN0LmdldFByb3BlcnR5KElQcm9kdWN0Q29uc3RhbnRzLldJTkRPV19JTUFHRSk7Ci0JCQlpZiAod2luZG93SW1hZ2VVUkwgPT0gbnVsbCkgewotCQkJCVN0cmluZyB3aW5kb3dJbWFnZXNVcmxzID0gcHJvZHVjdC5nZXRQcm9wZXJ0eShJUHJvZHVjdENvbnN0YW50cy5XSU5ET1dfSU1BR0VTKTsKLQkJCQlpZiAod2luZG93SW1hZ2VzVXJscyAhPSBudWxsICkgewotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHdpbmRvd0ltYWdlc1VybHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQkJCXdpbmRvd0ltYWdlVVJMID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHdpbmRvd0ltYWdlVVJMICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJZWRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChuZXcgVVJMKHdpbmRvd0ltYWdlVVJMKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUsIGZhbHNlKTsKLQkJCQl9Ci0JCX0KLQkJZWNsaXBzZUltYWdlID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoZWRlc2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRQcm92aWRlcnMoKSB7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBMb2NhbFNpdGVQcm92aWRlcigpKTsKLQkJdHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMb2NhbFNpdGVMYWJlbFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQkJdHJlZVZpZXdlci5zZXRTb3J0ZXIobmV3IENvbmZpZ3VyYXRpb25Tb3J0ZXIoKSk7Ci0JCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCWlmIChsb2NhbFNpdGUgIT0gbnVsbCkKLQkJCWxvY2FsU2l0ZS5hZGRMb2NhbFNpdGVDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJbW9kZWxMaXN0ZW5lciA9IG5ldyBJVXBkYXRlTW9kZWxDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBvYmplY3RzQWRkZWQoT2JqZWN0IHBhcmVudCwgT2JqZWN0W10gY2hpbGRyZW4pIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG9iamVjdHNSZW1vdmVkKE9iamVjdCBwYXJlbnQsIE9iamVjdFtdIGNoaWxkcmVuKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBvYmplY3RDaGFuZ2VkKGZpbmFsIE9iamVjdCBvYmosIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCWlmIChyZWZyZXNoTG9jaykKLQkJCQkJcmV0dXJuOwotCQkJCUNvbnRyb2wgY29udHJvbCA9IGdldENvbnRyb2woKTsKLQkJCQlpZiAoIWNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCWNvbnRyb2wuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZCgKLQkJCQkJCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyCi0JCQkJCQkJCQkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCU9wZXJhdGlvbnNNYW5hZ2VyLmFkZFVwZGF0ZU1vZGVsQ2hhbmdlZExpc3RlbmVyKG1vZGVsTGlzdGVuZXIpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlnZXRDb250cm9sKCksCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvbmZpZ3VyYXRpb25WaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIElMb2NhbFNpdGUgZ2V0TG9jYWxTaXRlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIFNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBvcGVuTG9jYWxTaXRlKCkgewotCQlmaW5hbCBPYmplY3RbXVtdIGJhZyA9IG5ldyBPYmplY3RbMV1bXTsKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUlMb2NhbFNpdGUgbG9jYWxTaXRlID0gZ2V0TG9jYWxTaXRlKCk7Ci0JCQkJaWYgKGxvY2FsU2l0ZSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZyA9Ci0JCQkJCWdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkJSUNvbmZpZ3VyZWRTaXRlW10gc2l0ZXMgPSBjb25maWcuZ2V0Q29uZmlndXJlZFNpdGVzKCk7Ci0JCQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtzaXRlcy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVzdWx0W2ldID0gbmV3IENvbmZpZ3VyZWRTaXRlQWRhcHRlcihjb25maWcsIHNpdGVzW2ldKTsKLQkJCQl9Ci0JCQkJaWYgKCFpbml0aWFsaXplZCkgewotCQkJCQljb25maWcuYWRkSW5zdGFsbENvbmZpZ3VyYXRpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQkJCQlDb25maWd1cmF0aW9uVmlldy50aGlzKTsKLQkJCQkJaW5pdGlhbGl6ZWQgPSB0cnVlOwotCQkJCX0KLQkJCQliYWdbMF0gPSByZXN1bHQ7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gYmFnWzBdOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJaWYgKGluaXRpYWxpemVkKSB7Ci0JCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IGdldExvY2FsU2l0ZSgpOwotCQkJaWYgKGxvY2FsU2l0ZSAhPSBudWxsKSB7Ci0JCQkJbG9jYWxTaXRlLnJlbW92ZUxvY2FsU2l0ZUNoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQkJCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnID0KLQkJCQkJbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkJY29uZmlnLnJlbW92ZUluc3RhbGxDb25maWd1cmF0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCQkJfQotCQkJaW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQkJfQotCQlPcGVyYXRpb25zTWFuYWdlci5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcihtb2RlbExpc3RlbmVyKTsKLQkJaWYgKHByZXZpZXcgIT0gbnVsbCkKLQkJCXByZXZpZXcuZGlzcG9zZSgpOwotCQkvL3N1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucygpIHsKLQkJY29sbGFwc2VBbGxBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJdHJlZVZpZXdlci5jb2xsYXBzZVRvTGV2ZWwoCi0JCQkJCXRyZWVWaWV3ZXIuZ2V0SW5wdXQoKSwKLQkJCQkJVHJlZVZpZXdlci5BTExfTEVWRUxTKTsKLQkJCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX07Ci0JCWNvbGxhcHNlQWxsQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5jb2xsYXBzZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbGxhcHNlQWxsQWN0aW9uLnNldFRvb2xUaXBUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuY29sbGFwc2VUb29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JCWNvbGxhcHNlQWxsQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0NPTExBUFNFX0FMTCk7Ci0KLQkJZHJpbGxEb3duQWRhcHRlciA9IG5ldyBEcmlsbERvd25BZGFwdGVyKHRyZWVWaWV3ZXIpOwotCi0JCWZlYXR1cmVTdGF0ZUFjdGlvbiA9IG5ldyBGZWF0dXJlU3RhdGVBY3Rpb24oKTsKLQotCQlzaXRlU3RhdGVBY3Rpb24gPSBuZXcgU2l0ZVN0YXRlQWN0aW9uKCk7Ci0KLQkJcmV2ZXJ0QWN0aW9uID0gbmV3IFJldmVydENvbmZpZ3VyYXRpb25BY3Rpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5yZXZlcnRMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlyZXZlcnRBY3Rpb24sCi0JCQkib3JnLmVjbGlwc2UudXBkYXRlLnVpLkNvZmlndXJhdGlvblZpZXdfcmV2ZXJ0QWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uID0KLQkJCW5ldyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbEhpc3RvcnkiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfSElTVE9SWV9PQkopOwotCQlpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLnNldFRvb2xUaXBUZXh0KGluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uZ2V0VGV4dCgpKTsKLQkJCi0JCW5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uID0KLQkJCW5ldyBOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbigKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmV4dExvY2F0aW9uIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0VTSVRFX09CSik7Ci0JCQotCQlwcm9wZXJ0aWVzQWN0aW9uID0KLQkJCW5ldyBQcm9wZXJ0eURpYWxvZ0FjdGlvbigKLQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCXRyZWVWaWV3ZXIpOwotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoCi0JCQlwcm9wZXJ0aWVzQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3Byb3BlcnRpZXNBY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVuaW5zdGFsbEZlYXR1cmVBY3Rpb24gPSBuZXcgVW5pbnN0YWxsRmVhdHVyZUFjdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluc3RhbGxPcHRGZWF0dXJlQWN0aW9uID0KLQkJCW5ldyBJbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uKAotCQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXN3YXBWZXJzaW9uQWN0aW9uID0gbmV3IFJlcGxhY2VWZXJzaW9uQWN0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuYW5vdGhlclZlcnNpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5kVXBkYXRlc0FjdGlvbiA9Ci0JCQluZXcgRmluZFVwZGF0ZXNBY3Rpb24oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZmluZFVwZGF0ZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlzaG93QWN0aXZpdGllc0FjdGlvbiA9IG5ldyBTaG93QWN0aXZpdGllc0FjdGlvbihnZXRDb250cm9sKCkuZ2V0U2hlbGwoKSwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zaG93QWN0aXZpdGllc0xhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscCgKLQkJCXNob3dBY3Rpdml0aWVzQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3Nob3dBY3Rpdml0aWVzQWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQltYWtlU2hvd1VuY29uZmlndXJlZEZlYXR1cmVzQWN0aW9uKCk7Ci0JCW1ha2VTaG93U2l0ZXNBY3Rpb24oKTsKLQkJbWFrZVNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbigpOwotCQltYWtlUHJldmlld1Rhc2tzKCk7Ci0JCWNvbmZpZ3VyYXRpb25XaW5kb3cuc2V0UHJvcGVydGllc0FjdGlvbkhhbmRsZXIocHJvcGVydGllc0FjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VTaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24oKSB7Ci0JCWZpbmFsIFByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXREZWZhdWx0KFNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTLCB0cnVlKTsKLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uID0gbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCQlwcmVmLnNldFZhbHVlKAotCQkJCQlTVEFURV9TSE9XX05FU1RFRF9GRUFUVVJFUywKLQkJCQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJCX0KLQkJfTsKLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zaG93TmVzdGVkRmVhdHVyZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2hvd05lc3RlZEZlYXR1cmVzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcigKLQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfU0hPV19ISUVSQVJDSFkpOwotCQlzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoCi0JCQlVcGRhdGVVSUltYWdlcy5ERVNDX1NIT1dfSElFUkFSQ0hZX0QpOwotCi0JCXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5zZXRDaGVja2VkKAotCQkJcHJlZi5nZXRCb29sZWFuKFNUQVRFX1NIT1dfTkVTVEVEX0ZFQVRVUkVTKSk7Ci0JCXNob3dOZXN0ZWRGZWF0dXJlc0FjdGlvbi5zZXRUb29sVGlwVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dOZXN0ZWRUb29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1ha2VTaG93U2l0ZXNBY3Rpb24oKSB7Ci0JCWZpbmFsIFByZWZlcmVuY2VzIHByZWYgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXREZWZhdWx0KFNUQVRFX1NIT1dfU0lURVMsIHRydWUpOwotCQlzaG93U2l0ZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCXByZWYuc2V0VmFsdWUoU1RBVEVfU0hPV19TSVRFUywgc2hvd1NpdGVzQWN0aW9uLmlzQ2hlY2tlZCgpKTsKLQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQl9Ci0JCX07Ci0JCXNob3dTaXRlc0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuc2hvd0luc3RhbGwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2hvd1NpdGVzQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX0xTSVRFX09CSik7Ci0JCXNob3dTaXRlc0FjdGlvbi5zZXRDaGVja2VkKHByZWYuZ2V0Qm9vbGVhbihTVEFURV9TSE9XX1NJVEVTKSk7Ci0JCXNob3dTaXRlc0FjdGlvbi5zZXRUb29sVGlwVGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnNob3dJbnN0YWxsVG9vbHRpcCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBtYWtlU2hvd1VuY29uZmlndXJlZEZlYXR1cmVzQWN0aW9uKCkgewotCQlmaW5hbCBQcmVmZXJlbmNlcyBwcmVmID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWYuc2V0RGVmYXVsdChTVEFURV9TSE9XX1VOQ09ORiwgZmFsc2UpOwotCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24gPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByZWYuc2V0VmFsdWUoCi0JCQkJCVNUQVRFX1NIT1dfVU5DT05GLAotCQkJCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uaXNDaGVja2VkKCkpOwotCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQkJV29ya2JlbmNoSGVscC5zZXRIZWxwKAotCQkJc2hvd1VuY29uZkZlYXR1cmVzQWN0aW9uLAotCQkJIm9yZy5lY2xpcHNlLnVwZGF0ZS51aS5Db2ZpZ3VyYXRpb25WaWV3X3Nob3dVbmNvbmZGZWF0dXJlc0FjdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuc2hvd0Rpc2FibGVkIikpOyAvLyROT04tTkxTLTEkCi0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoCi0JCQlVcGRhdGVVSUltYWdlcy5ERVNDX1VOQ09ORl9GRUFUVVJFX09CSik7Ci0JCXNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbi5zZXRDaGVja2VkKHByZWYuZ2V0Qm9vbGVhbihTVEFURV9TSE9XX1VOQ09ORikpOwotCQlzaG93VW5jb25mRmVhdHVyZXNBY3Rpb24uc2V0VG9vbFRpcFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zaG93RGlzYWJsZWRUb29sdGlwIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbEFjdGlvbkJhcnMoVG9vbEJhck1hbmFnZXIgdGJtKSB7Ci0JCXRibS5hZGQoc2hvd1NpdGVzQWN0aW9uKTsKLQkJdGJtLmFkZChzaG93TmVzdGVkRmVhdHVyZXNBY3Rpb24pOwotCQl0Ym0uYWRkKHNob3dVbmNvbmZGZWF0dXJlc0FjdGlvbik7Ci0JCXRibS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJZHJpbGxEb3duQWRhcHRlci5hZGROYXZpZ2F0aW9uQWN0aW9ucyh0Ym0pOwotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRibS5hZGQoY29sbGFwc2VBbGxBY3Rpb24pOwotCQl0Ym0uYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCXRibS5hZGQoaW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRTZWxlY3RlZE9iamVjdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24KLQkJCSYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlpZiAoc3NlbC5zaXplKCkgPT0gMSkKLQkJCQlyZXR1cm4gc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJT2JqZWN0IG9iaiA9IGdldFNlbGVjdGVkT2JqZWN0KCk7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCW1hbmFnZXIuYWRkKHJldmVydEFjdGlvbik7Ci0JCQltYW5hZ2VyLmFkZChmaW5kVXBkYXRlc0FjdGlvbik7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJbWFuYWdlci5hZGQoc2l0ZVN0YXRlQWN0aW9uKTsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJTG9jYWxTaXRlCi0JCQl8fCBvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSB7Ci0JCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJTWVudU1hbmFnZXIgbWdyID0gbmV3IE1lbnVNYW5hZ2VyKFVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcubmV3IikpOyAvLyROT04tTkxTLTEkCi0JCQltZ3IuYWRkKG5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uKTsKLQkJCW1hbmFnZXIuYWRkKG1ncik7Ci0JCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQl9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgewotCQkJdHJ5IHsKLQkJCQlNZW51TWFuYWdlciBtZ3IgPSBuZXcgTWVudU1hbmFnZXIoVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5yZXBsYWNlV2l0aCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCW1nci5hZGQoc3dhcFZlcnNpb25BY3Rpb24pOwotCQkJCW1hbmFnZXIuYWRkKG1ncik7Ci0KLQkJCQltYW5hZ2VyLmFkZChmZWF0dXJlU3RhdGVBY3Rpb24pOwotCi0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9Ci0JCQkJCSgoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmopLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgaW5zdGFuY2VvZiBNaXNzaW5nRmVhdHVyZSkgewotCQkJCQltYW5hZ2VyLmFkZChpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWFuYWdlci5hZGQodW5pbnN0YWxsRmVhdHVyZUFjdGlvbik7Ci0JCQkJfQotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQkJbWFuYWdlci5hZGQoZmluZFVwZGF0ZXNBY3Rpb24pOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCWRyaWxsRG93bkFkYXB0ZXIuYWRkTmF2aWdhdGlvbkFjdGlvbnMobWFuYWdlcik7Ci0KLQkJaWYgKG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltYW5hZ2VyLmFkZChpbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uKTsKLQkJfQotCi0JCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIKLQkJCXx8IG9iaiBpbnN0YW5jZW9mIElMb2NhbFNpdGUKLQkJCXx8IG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmVkU2l0ZUFkYXB0ZXIpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltYW5hZ2VyLmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGxTaXRlQWRkZWQoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZVJlbW92ZWQoSUNvbmZpZ3VyZWRTaXRlIHNpdGUpIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCXB1YmxpYyB2b2lkIGZlYXR1cmVJbnN0YWxsZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlhc3luY1JlZnJlc2goKTsKLQl9Ci0JcHVibGljIHZvaWQgZmVhdHVyZVJlbW92ZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCQlhc3luY1JlZnJlc2goKTsKLQl9Ci0JcHVibGljIHZvaWQgZmVhdHVyZUNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIGZlYXR1cmVVbmNvbmZpZ3VyZWQoSUZlYXR1cmUgZmVhdHVyZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIGN1cnJlbnRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWQoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJYXN5bmNSZWZyZXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbENvbmZpZ3VyYXRpb25SZW1vdmVkKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWFzeW5jUmVmcmVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhc3luY1JlZnJlc2goKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IFNXVFV0aWwuZ2V0U3RhbmRhcmREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKQotCQkJCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRGZWF0dXJlcygKLQkJZmluYWwgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlciBzaXRlQWRhcHRlciwKLQkJZmluYWwgYm9vbGVhbiBjb25maWd1cmVkT25seSkgewotCQlmaW5hbCBJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBzaXRlQWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpOwotCQlmaW5hbCBPYmplY3RbXVtdIGJhZyA9IG5ldyBPYmplY3RbMV1bXTsKLQkJcmVmcmVzaExvY2sgPSB0cnVlOwotCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcCA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIHJlZnM7Ci0KLQkJCQlpZiAoY29uZmlndXJlZE9ubHkpCi0JCQkJCXJlZnMgPSBjc2l0ZS5nZXRDb25maWd1cmVkRmVhdHVyZXMoKTsKLQkJCQllbHNlIHsKLQkJCQkJSVNpdGUgc2l0ZSA9IGNzaXRlLmdldFNpdGUoKTsKLQkJCQkJcmVmcyA9IHNpdGUuZ2V0RmVhdHVyZVJlZmVyZW5jZXMoKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcubG9hZGluZyIpLCAvLyROT04tTkxTLTEkCi0JCQkJCXJlZnMubGVuZ3RoKTsKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCQlJRmVhdHVyZVJlZmVyZW5jZSByZWYgPSByZWZzW2ldOwotCQkJCQlJRmVhdHVyZSBmZWF0dXJlOwotCQkJCQl0cnkgewotCQkJCQkJbW9uaXRvci5zdWJUYXNrKHJlZi5nZXRVUkwoKS50b1N0cmluZygpKTsKLQkJCQkJCWZlYXR1cmUgPSByZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlmZWF0dXJlID0KLQkJCQkJCQluZXcgTWlzc2luZ0ZlYXR1cmUocmVmLmdldFNpdGUoKSwgcmVmLmdldFVSTCgpKTsKLQkJCQkJfQotCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCQkJcmVzdWx0LmFkZCgKLQkJCQkJCW5ldyBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIoCi0JCQkJCQkJc2l0ZUFkYXB0ZXIsCi0JCQkJCQkJZmVhdHVyZSwKLQkJCQkJCQljc2l0ZS5pc0NvbmZpZ3VyZWQoZmVhdHVyZSksCi0JCQkJCQkJZmFsc2UsCi0JCQkJCQkJZmFsc2UpKTsKLQkJCQl9Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJYmFnWzBdID0gZ2V0Um9vdEZlYXR1cmVzKHJlc3VsdCk7Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCWlmIChjb25maWd1cmF0aW9uV2luZG93LmdldFNoZWxsKCkuaXNWaXNpYmxlKCkpCi0JCQkJY29uZmlndXJhdGlvbldpbmRvdy5ydW4odHJ1ZSwgZmFsc2UsIG9wKTsKLQkJCWVsc2UKLQkJCQlvcC5ydW4obmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlyZWZyZXNoTG9jayA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBiYWdbMF07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRSb290RmVhdHVyZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGNmID0KLQkJCQkJKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlcikgbGlzdC5nZXQoaSk7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGNmLmdldEZlYXR1cmUobnVsbCk7Ci0JCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCQkJYWRkQ2hpbGRGZWF0dXJlcygKLQkJCQkJCWZlYXR1cmUsCi0JCQkJCQljaGlsZHJlbiwKLQkJCQkJCWNmLmlzQ29uZmlndXJlZCgpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCUNvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBjZiA9Ci0JCQkJCShDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIpIGxpc3QuZ2V0KGkpOwotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjZi5nZXRGZWF0dXJlKG51bGwpOwotCQkJCWlmIChmZWF0dXJlICE9IG51bGwKLQkJCQkJJiYgaXNDaGlsZEZlYXR1cmUoZmVhdHVyZSwgY2hpbGRyZW4pID09IGZhbHNlKQotCQkJCQlyZXN1bHQuYWRkKGNmKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbGlzdC50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b0FycmF5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENoaWxkRmVhdHVyZXMoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUFycmF5TGlzdCBjaGlsZHJlbiwKLQkJYm9vbGVhbiBjb25maWd1cmVkKSB7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaW5jbHVkZWQgPQotCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmNsdWRlZC5sZW5ndGg7IGkrKykgewotCQkJCUlGZWF0dXJlIGNoaWxkRmVhdHVyZTsKLQkJCQl0cnkgewotCQkJCQljaGlsZEZlYXR1cmUgPQotCQkJCQkJaW5jbHVkZWRbaV0uZ2V0RmVhdHVyZShudWxsKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJY2hpbGRGZWF0dXJlID0gbmV3IE1pc3NpbmdGZWF0dXJlKGluY2x1ZGVkW2ldKTsKLQkJCQl9Ci0JCQkJY2hpbGRyZW4uYWRkKGNoaWxkRmVhdHVyZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2hpbGRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBjaGlsZHJlbikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQlJRmVhdHVyZSBjaGlsZCA9IChJRmVhdHVyZSkgY2hpbGRyZW4uZ2V0KGkpOwotCQkJaWYgKGZlYXR1cmUKLQkJCQkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpCi0JCQkJLmVxdWFscyhjaGlsZC5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVEb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGUpIHsKLQkJaWYgKGUuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBvYmogPSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJaWYgKG9iaiE9bnVsbCkKLQkJCQlwcm9wZXJ0aWVzQWN0aW9uLnJ1bigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzcGxpdHRlciA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5IT1JJWk9OVEFMKTsKLQkJc3BsaXR0ZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBsZWZ0Q29udGFpbmVyID0gY3JlYXRlTGluZUNvbnRhaW5lcihzcGxpdHRlcik7Ci0JCUNvbXBvc2l0ZSByaWdodENvbnRhaW5lciA9IGNyZWF0ZUxpbmVDb250YWluZXIoc3BsaXR0ZXIpOwotCQljcmVhdGVUcmVlVmlld2VyKGxlZnRDb250YWluZXIpOwotCQltYWtlQWN0aW9ucygpOwotCQljcmVhdGVWZXJ0aWNhbExpbmUobGVmdENvbnRhaW5lcik7Ci0JCWNyZWF0ZVZlcnRpY2FsTGluZShyaWdodENvbnRhaW5lcik7Ci0JCXByZXZpZXcgPSBuZXcgQ29uZmlndXJhdGlvblByZXZpZXcodGhpcyk7Ci0JCXByZXZpZXcuY3JlYXRlQ29udHJvbChyaWdodENvbnRhaW5lcik7Ci0JCXByZXZpZXcuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNwbGl0dGVyLnNldFdlaWdodHMobmV3IGludFtdIHsgMiwgMyB9KTsKLQkJZmlsbEFjdGlvbkJhcnMoZ2V0Q29uZmlndXJhdGlvbldpbmRvdygpLmdldFRvb2xCYXJNYW5hZ2VyKCkpOwotCi0JCXRyZWVWaWV3ZXIuZXhwYW5kVG9MZXZlbCgyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVHJlZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRyZWVWaWV3ZXIgPQotCQkJbmV3IFRyZWVWaWV3ZXIocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdHJlZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQlpbml0UHJvdmlkZXJzKCk7Ci0KLQkJTWVudU1hbmFnZXIgbWVudU1nciA9IG5ldyBNZW51TWFuYWdlcigiI1BvcHVwTWVudSIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVNZ3Iuc2V0UmVtb3ZlQWxsV2hlblNob3duKHRydWUpOwotCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJCW1hbmFnZXIuYWRkKG5ldyBHcm91cE1hcmtlcigiYWRkaXRpb25zIikpOyAvLyROT04tTkxTLTEkCi0JCQkJZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOwotCQkJfQotCQl9KTsKLQotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRNZW51KAotCQkJbWVudU1nci5jcmVhdGVDb250ZXh0TWVudSh0cmVlVmlld2VyLmdldENvbnRyb2woKSkpOwotCi0JCXRyZWVWaWV3ZXIKLQkJCS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQl0cmVlVmlld2VyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3IElEb3VibGVDbGlja0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgZG91YmxlQ2xpY2soRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJCWhhbmRsZURvdWJsZUNsaWNrKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0KLQl9Ci0KLQlwdWJsaWMgVHJlZVZpZXdlciBnZXRUcmVlVmlld2VyKCkgewotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVMaW5lQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJ0aWNhbExpbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKHBhcmVudCwgU1dULlNFUEFSQVRPUiB8IFNXVC5WRVJUSUNBTCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpOwotCQlnZC53aWR0aEhpbnQgPSAxOwotCQlsaW5lLnNldExheW91dERhdGEoZ2QpOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCXJldHVybiBzcGxpdHRlcjsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRTdGF0dXNDb2RlKElGZWF0dXJlIGZlYXR1cmUsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWludCBjb2RlID0gc3RhdHVzLmdldENvZGUoKTsKLQkJaWYgKGNvZGUgPT0gSUZlYXR1cmUuU1RBVFVTX1VOSEFQUFkpIHsKLQkJCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gc3RhdHVzLmdldENoaWxkcmVuKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQlJU3RhdHVzIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQkJCWlmIChjaGlsZC5pc011bHRpU3RhdHVzKCkKLQkJCQkJCXx8IGNoaWxkLmdldENvZGUoKSAhPSBJRmVhdHVyZS5TVEFUVVNfRElTQUJMRUQpCi0JCQkJCQlyZXR1cm4gY29kZTsKLQkJCQl9Ci0JCQkJLy8gSWYgd2UgYXJlIGhlcmUsIGdsb2JhbCBzdGF0dXMgaXMgdW5oYXBweQotCQkJCS8vIGJlY2F1c2Ugb25lIG9yIG1vcmUgaW5jbHVkZWQgZmVhdHVyZXMKLQkJCQkvLyBpcyBkaXNhYmxlZC4KLQkJCQlpZiAoVXBkYXRlVXRpbHMuaGFzT2Jzb2xldGVQYXRjaGVzKGZlYXR1cmUpKSB7Ci0JCQkJCS8vIFRoZSBkaXNhYmxlZCBpbmNsdWRlZCBmZWF0dXJlcwotCQkJCQkvLyBhcmUgb2xkIHBhdGNoZXMgdGhhdCBhcmUgbm93Ci0JCQkJCS8vIHN1YnN1bWVkIGJ5IGJldHRlciB2ZXJzaW9ucyBvZgotCQkJCQkvLyB0aGUgZmVhdHVyZXMgdGhleSB3ZXJlIGRlc2lnbmVkIHRvCi0JCQkJCS8vIHBhdGNoLgotCQkJCQlyZXR1cm4gSUZlYXR1cmUuU1RBVFVTX0hBUFBZOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwpIHsKLQkJT2JqZWN0IG9iaiA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBJRmVhdHVyZUFkYXB0ZXIpIHsKLQkJCXRyeSB7Ci0JCQkJQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXIgPSAoQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyKSBvYmo7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGFkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkKLQkJCQlib29sZWFuIG1pc3NpbmcgPSBmZWF0dXJlIGluc3RhbmNlb2YgTWlzc2luZ0ZlYXR1cmU7Ci0JCQkJYm9vbGVhbiBlbmFibGUgPSAhbWlzc2luZyAmJiAoKGFkYXB0ZXIuaXNPcHRpb25hbCgpIHx8ICFhZGFwdGVyLmlzSW5jbHVkZWQoKSkpOwotCi0JCQkJZmVhdHVyZVN0YXRlQWN0aW9uLnNldEZlYXR1cmUoYWRhcHRlcik7Ci0JCQkJZmVhdHVyZVN0YXRlQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJCQkKLQkJCQl1bmluc3RhbGxGZWF0dXJlQWN0aW9uLnNldEZlYXR1cmUoYWRhcHRlcik7Ci0JCQkJdW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZSAmJiB1bmluc3RhbGxGZWF0dXJlQWN0aW9uLmNhblVuaW5zdGFsbCgpKTsKLQkJCQlpZiAoYWRhcHRlci5pc0NvbmZpZ3VyZWQoKSkKLQkJCQkJc2V0RGVzY3JpcHRpb25PblRhc2sodW5pbnN0YWxsRmVhdHVyZUFjdGlvbiwgYWRhcHRlcixVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbERlc2MyIikpOwotCQkJCWVsc2UKLQkJCQkJc2V0RGVzY3JpcHRpb25PblRhc2sodW5pbnN0YWxsRmVhdHVyZUFjdGlvbiwgYWRhcHRlcixVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnVuaW5zdGFsbERlc2MiKSk7Ci0KLQkJCQlpZiAoZW5hYmxlICYmIGFkYXB0ZXIuaXNDb25maWd1cmVkKCkpIHsKLQkJCQkJSUZlYXR1cmVbXSBmZWF0dXJlcyA9IFVwZGF0ZVV0aWxzLmdldEluc3RhbGxlZEZlYXR1cmVzKGZlYXR1cmUsIGZhbHNlKTsKLQkJCQkJc3dhcFZlcnNpb25BY3Rpb24uc2V0RW5hYmxlZChmZWF0dXJlcy5sZW5ndGggPiAxKTsKLQkJCQkJaWYgKGZlYXR1cmVzLmxlbmd0aCA+IDEpIHsKLQkJCQkJCXN3YXBWZXJzaW9uQWN0aW9uLnNldEN1cnJlbnRGZWF0dXJlKGZlYXR1cmUpOwotCQkJCQkJc3dhcFZlcnNpb25BY3Rpb24uc2V0RmVhdHVyZXMoZmVhdHVyZXMpOwotCQkJCQl9Ci0JCQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEZlYXR1cmUoZmVhdHVyZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3dhcFZlcnNpb25BY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJCWlmIChtaXNzaW5nKSB7Ci0JCQkJCU1pc3NpbmdGZWF0dXJlIG1mID0gKE1pc3NpbmdGZWF0dXJlKSBmZWF0dXJlOwotCQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbi5zZXRFbmFibGVkKAotCQkJCQkJbWYuaXNPcHRpb25hbCgpICYmIG1mLmdldE9yaWdpbmF0aW5nU2l0ZVVSTCgpICE9IG51bGwpOwotCQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbi5zZXRGZWF0dXJlKG1mKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnN0YWxsT3B0RmVhdHVyZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCQlpZiAob2JqIGluc3RhbmNlb2YgSUxvY2FsU2l0ZSkgewotCQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZmluZFVwZGF0ZXNBY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZpbmRVcGRhdGVzQWN0aW9uLnNldEZlYXR1cmUobnVsbCk7Ci0JCQlJTG9jYWxTaXRlIHNpdGUgPSBnZXRMb2NhbFNpdGUoKTsKLQkJCXJldmVydEFjdGlvbi5zZXRFbmFibGVkKHNpdGUgIT0gbnVsbCAmJiBzaXRlLmdldENvbmZpZ3VyYXRpb25IaXN0b3J5KCkubGVuZ3RoID4gMSk7Ci0JCX0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyZWRTaXRlQWRhcHRlcikgewotCQkJc2l0ZVN0YXRlQWN0aW9uLnNldFNpdGUoCi0JCQkJKChJQ29uZmlndXJlZFNpdGVBZGFwdGVyKSBvYmopLmdldENvbmZpZ3VyZWRTaXRlKCkpOwotCQkJc2l0ZVN0YXRlQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJcHJldmlldy5zZXRTZWxlY3Rpb24oc3NlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQloYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGVzY3JpcHRpb25PblRhc2soSUFjdGlvbiBhY3Rpb24sIENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyLCBTdHJpbmcgZGVzYykgewotCQlJUHJldmlld1Rhc2tbXSB0YXNrcyA9IGdldFByZXZpZXdUYXNrcyhhZGFwdGVyKTsKLQkJaWYgKHRhc2tzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGk9MDsgaTx0YXNrcy5sZW5ndGg7IGkrKykKLQkJCWlmICh0YXNrc1tpXS5nZXRBY3Rpb24oKSA9PSBhY3Rpb24pCi0JCQkJdGFza3NbaV0uc2V0RGVzY3JpcHRpb24oZGVzYyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBtYWtlUHJldmlld1Rhc2tzKCkgewotCQlwcmV2aWV3VGFza3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUNsYXNzIGtleTsKLQkJQXJyYXlMaXN0IGFycmF5ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBsb2NhbCBzaXRlIHRhc2tzCi0JCWtleSA9IElMb2NhbFNpdGUuY2xhc3M7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnJldmVydFByZXZpb3VzTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcucmV2ZXJ0UHJldmlvdXNEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXZlcnRBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudXBkYXRlTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudXBkYXRlRGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJZmluZFVwZGF0ZXNBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZXh0TG9jTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZXh0TG9jRGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJbmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbEhpc3RMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5pbnN0YWxsSGlzdERlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCWluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuYWN0aXZpdGllc0xhYmVsIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmFjdGl2aXRpZXNEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlzaG93QWN0aXZpdGllc0FjdGlvbikpOwotCi0JCXByZXZpZXdUYXNrcy5wdXQoa2V5LCBhcnJheS50b0FycmF5KG5ldyBJUHJldmlld1Rhc2tbYXJyYXkuc2l6ZSgpXSkpOwotCi0JCS8vIGNvbmZpZ3VyZWQgc2l0ZSB0YXNrcwotCQlhcnJheS5jbGVhcigpOwotCQlrZXkgPSBJQ29uZmlndXJlZFNpdGVBZGFwdGVyLmNsYXNzOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJbnVsbCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmVuYWJsZUxvY0Rlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCXNpdGVTdGF0ZUFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5leHRMb2NMYWJlbCIpLCAvLyROT04tTkxTLTEkCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5leHRMb2NEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQluZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5wcm9wZXJ0aWVzTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbFByb3BEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9wZXJ0aWVzQWN0aW9uKSk7Ci0JCXByZXZpZXdUYXNrcy5wdXQoa2V5LCBhcnJheS50b0FycmF5KG5ldyBJUHJldmlld1Rhc2tbYXJyYXkuc2l6ZSgpXSkpOwotCi0JCS8vIGZlYXR1cmUgYWRhcHRlciB0YXNrcwotCQlhcnJheS5jbGVhcigpOwotCQlrZXkgPSBJRmVhdHVyZUFkYXB0ZXIuY2xhc3M7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LnJlcGxhY2VWZXJzaW9uTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcucmVwbGFjZVZlcnNpb25EZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlzd2FwVmVyc2lvbkFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJbnVsbCwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmVuYWJsZUZlYXR1cmVEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlmZWF0dXJlU3RhdGVBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbE9wdGlvbmFsTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuaW5zdGFsbE9wdGlvbmFsRGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJaW5zdGFsbE9wdEZlYXR1cmVBY3Rpb24pKTsKLQkJYXJyYXkuYWRkKAotCQkJbmV3IFByZXZpZXdUYXNrKAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudW5pbnN0YWxsTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcudW5pbnN0YWxsRGVzYyIpLCAvLyROT04tTkxTLTEkCi0JCQkJdW5pbnN0YWxsRmVhdHVyZUFjdGlvbikpOwotCQlhcnJheS5hZGQoCi0JCQluZXcgUHJldmlld1Rhc2soCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJDb25maWd1cmF0aW9uVmlldy5zY2FuTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuc2NhbkRlc2MiKSwgLy8kTk9OLU5MUy0xJAotCQkJCWZpbmRVcGRhdGVzQWN0aW9uKSk7Ci0JCWFycmF5LmFkZCgKLQkJCW5ldyBQcmV2aWV3VGFzaygKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkNvbmZpZ3VyYXRpb25WaWV3LmZlYXR1cmVQcm9wTGFiZWwiKSwgLy8kTk9OLU5MUy0xJAotCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiQ29uZmlndXJhdGlvblZpZXcuZmVhdHVyZVByb3BEZXNjIiksIC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9wZXJ0aWVzQWN0aW9uKSk7Ci0JCXByZXZpZXdUYXNrcy5wdXQoa2V5LCBhcnJheS50b0FycmF5KG5ldyBJUHJldmlld1Rhc2tbYXJyYXkuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyBJUHJldmlld1Rhc2tbXSBnZXRQcmV2aWV3VGFza3MoT2JqZWN0IG9iamVjdCkgewotCQlJUHJldmlld1Rhc2tbXSB0YXNrcyA9IG51bGw7Ci0KLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElGZWF0dXJlQWRhcHRlcikKLQkJCXRhc2tzID0gKElQcmV2aWV3VGFza1tdKSBwcmV2aWV3VGFza3MuZ2V0KElGZWF0dXJlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTG9jYWxTaXRlKQotCQkJdGFza3MgPSAoSVByZXZpZXdUYXNrW10pIHByZXZpZXdUYXNrcy5nZXQoSUxvY2FsU2l0ZS5jbGFzcyk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ29uZmlndXJlZFNpdGVBZGFwdGVyKQotCQkJdGFza3MgPQotCQkJCShJUHJldmlld1Rhc2tbXSkgcHJldmlld1Rhc2tzLmdldChJQ29uZmlndXJlZFNpdGVBZGFwdGVyLmNsYXNzKTsKLQkJcmV0dXJuICh0YXNrcyAhPSBudWxsKSA/IHRhc2tzIDogbmV3IElQcmV2aWV3VGFza1swXTsKLQl9Ci0KLQlDb25maWd1cmF0aW9uTWFuYWdlcldpbmRvdyBnZXRDb25maWd1cmF0aW9uV2luZG93KCl7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uV2luZG93OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVTdGF0ZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZlYXR1cmVTdGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU1YmEyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GZWF0dXJlU3RhdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlU3RhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCXByaXZhdGUgQ29uZmlndXJlZEZlYXR1cmVBZGFwdGVyIGFkYXB0ZXI7Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCWlmIChhZGFwdGVyLmlzQ29uZmlndXJlZCgpKSB7Ci0JCQlzZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVN0YXRlQWN0aW9uLmRpc2FibGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlU3RhdGVBY3Rpb24uZW5hYmxlIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCQotCQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJCWlmIChzdGF0dXMgIT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihzdGF0dXMpOwotCQkJCi0JCQlib29sZWFuIGlzQ29uZmlndXJlZCA9IGFkYXB0ZXIuaXNDb25maWd1cmVkKCk7Ci0JCQkvLyBBc2sgdXNlciB0byBjb25maXJtIHRoZSBvcGVyYXRpb24KLQkJCVN0cmluZyBtZXNzYWdlID0KLQkJCQlpc0NvbmZpZ3VyZWQKLQkJCQkJPyBVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0ZUFjdGlvbi5kaXNhYmxlUXVlc3Rpb24iKSAvLyROT04tTkxTLTEkCi0JCQkJCTogVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlU3RhdGVBY3Rpb24uRW5hYmxlUXVlc3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoIWNvbmZpcm0obWVzc2FnZSkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBJZiBjdXJyZW50IGNvbmZpZyBpcyBicm9rZW4sIGNvbmZpcm0gd2l0aCB0aGUgdXNlciB0byBjb250aW51ZQotCQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCkgIT0gbnVsbCAmJgotCQkJCQkhY29uZmlybShVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGlvbnMuYnJva2VuQ29uZmlnUXVlc3Rpb24iKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCUlPcGVyYXRpb24gdG9nZ2xlT3BlcmF0aW9uID0KLQkJCQlpc0NvbmZpZ3VyZWQKLQkJCQkJPyAoSU9wZXJhdGlvbilPcGVyYXRpb25zTWFuYWdlcgotCQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkJLmNyZWF0ZVVuY29uZmlnT3BlcmF0aW9uKAotCQkJCQkJYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLAotCQkJCQkJYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpKQotCQkJCQk6IE9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkuY3JlYXRlQ29uZmlnT3BlcmF0aW9uKAotCQkJCQkJYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLAotCQkJCQkJYWRhcHRlci5nZXRGZWF0dXJlKG51bGwpKTsKLQotCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gdG9nZ2xlT3BlcmF0aW9uLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JCQlVcGRhdGVVSS5yZXF1ZXN0UmVzdGFydChyZXN0YXJ0TmVlZGVkKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCW51bGwsCi0JCQkJbnVsbCwKLQkJCQllLmdldFN0YXR1cygpKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuCi0JCQlVcGRhdGVVdGlscy5sb2dFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29uZmlybShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybSgKLQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0ZUFjdGlvbi5kaWFsb2dUaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQltZXNzYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9GaW5kVXBkYXRlc0FjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRVcGRhdGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MjdmYmYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0ZpbmRVcGRhdGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotcHVibGljIGNsYXNzIEZpbmRVcGRhdGVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgSUZlYXR1cmUgZmVhdHVyZTsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHVibGljIEZpbmRVcGRhdGVzQWN0aW9uKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGV4dCkgewotCQlzdXBlcih0ZXh0KTsKLQkJdGhpcy5zaGVsbCA9IHNoZWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlID0gZmVhdHVyZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCkgIT0gbnVsbCAmJgotCQkJCSFjb25maXJtKFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aW9ucy5icm9rZW5Db25maWdRdWVzdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQkJCi0JCQotCQlJRmVhdHVyZSBbXSBmZWF0dXJlcz1udWxsOwotCQlpZiAoZmVhdHVyZSE9bnVsbCkKLQkJCWZlYXR1cmVzID0gbmV3IElGZWF0dXJlW10geyBmZWF0dXJlIH07Ci0JCWZpbmFsIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCA9IFVwZGF0ZVV0aWxzLmNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KGZlYXR1cmVzKTsKLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJbnN0YWxsV2l6YXJkIHdpemFyZCA9IG5ldyBJbnN0YWxsV2l6YXJkKHNlYXJjaFJlcXVlc3QpOwotCQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkZpbmRVcGRhdGVzQWN0aW9uLnVwZGF0ZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29uZmlybShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybSgKLQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0ZUFjdGlvbi5kaWFsb2dUaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQltZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSVByZXZpZXdUYXNrLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSVByZXZpZXdUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyOTZiMjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0lQcmV2aWV3VGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLQotcHVibGljIGludGVyZmFjZSBJUHJldmlld1Rhc2sgewotCVN0cmluZyBnZXROYW1lKCk7Ci0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0Jdm9pZCBydW4oKTsKLQlib29sZWFuIGlzRW5hYmxlZCgpOwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2MpOwotCUlBY3Rpb24gZ2V0QWN0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0luc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9JbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzhiMWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0luc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5zZWFyY2guKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsT3B0aW9uYWxGZWF0dXJlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09QVElPTkFMX0lOU1RBTExfVElUTEUgPSAiRmVhdHVyZVBhZ2Uub3B0aW9uYWxJbnN0YWxsLnRpdGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNaXNzaW5nRmVhdHVyZSBtaXNzaW5nRmVhdHVyZTsKLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHVibGljIEluc3RhbGxPcHRpb25hbEZlYXR1cmVBY3Rpb24oU2hlbGwgc2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnNoZWxsID0gc2hlbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZShNaXNzaW5nRmVhdHVyZSBmZWF0dXJlKSB7Ci0JCXRoaXMubWlzc2luZ0ZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKG1pc3NpbmdGZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlJU3RhdHVzIHN0YXR1cyA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlUGxhdGZvcm1Db25maWdWYWxpZCgpOwotCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCwKLQkJCQkJc3RhdHVzKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJaWYgKE9wZXJhdGlvbnNNYW5hZ2VyLmdldFZhbGlkYXRvcigpLnZhbGlkYXRlQ3VycmVudFN0YXRlKCkgIT0gbnVsbCAmJgotCQkJCSFjb25maXJtKFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aW9ucy5icm9rZW5Db25maWdRdWVzdGlvbiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQkJCi0JCQotCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG1pc3NpbmdGZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsKLQkJVVJMIG9yaWdpbmF0aW5nVVJMID0gbWlzc2luZ0ZlYXR1cmUuZ2V0T3JpZ2luYXRpbmdTaXRlVVJMKCk7Ci0KLQkJVXBkYXRlU2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgVXBkYXRlU2VhcmNoU2NvcGUoKTsKLQkJc2NvcGUuYWRkU2VhcmNoU2l0ZShvcmlnaW5hdGluZ1VSTC50b1N0cmluZygpLCBvcmlnaW5hdGluZ1VSTCwgbnVsbCk7Ci0KLQkJT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgT3B0aW9uYWxGZWF0dXJlU2VhcmNoQ2F0ZWdvcnkoKTsKLQkJY2F0ZWdvcnkuYWRkVmVyc2lvbmVkSWRlbnRpZmllcih2aWQpOwotCQlmaW5hbCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QgPQotCQkJbmV3IFVwZGF0ZVNlYXJjaFJlcXVlc3QoY2F0ZWdvcnksIHNjb3BlKTsKLQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShzaGVsbC5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuV2l6YXJkKHNlYXJjaFJlcXVlc3QpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIG9wZW5XaXphcmQoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0KSB7Ci0JCUluc3RhbGxXaXphcmQgd2l6YXJkID0gbmV3IEluc3RhbGxXaXphcmQoc2VhcmNoUmVxdWVzdCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkLCBVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09QVElPTkFMX0lOU1RBTExfVElUTEUpKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY29uZmlybShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuQ29uZmlybSgKLQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVTdGF0ZUFjdGlvbi5kaWFsb2dUaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQltZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL0luc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1N2ZjNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnZpZXdzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgYnVmZlJlYWQ7Ci0JcHJpdmF0ZSBQcmludFdyaXRlciBodG1sTG9nOwotCXByaXZhdGUgRmlsZSB0ZW1wRmlsZTsKLQlwcml2YXRlIFN0cmluZyByb3dUeXBlOwotCXByaXZhdGUgSVBhdGggcGF0aDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbGlnaHRCbHVlID0gIiNFRUVFRkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHdoaXRlID0gIiNGRkZGRkYiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGRhcmtCbHVlID0gIiM5OUFBREQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbihTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGRlc2MpIHsKLQkJc3VwZXIodGV4dCwgZGVzYyk7Ci0JCVN0cmluZyBsb2NhdGlvbiA9Ci0JCQlDb25maWd1cmF0b3JVdGlscwotCQkJCS5nZXRDdXJyZW50UGxhdGZvcm1Db25maWd1cmF0aW9uKCkKLQkJCQkuZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkKLQkJCQkuZ2V0RmlsZSgpOwotCQlwYXRoID0gbmV3IFBhdGgobG9jYXRpb24pLnJlbW92ZUxhc3RTZWdtZW50cygxKS5hcHBlbmQoImluc3RhbGwubG9nIik7IC8vJE5PTi1OTFMtMSQKLQkJcm93VHlwZSA9ICJsaWdodC1yb3ciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJb3BlbkxvZygpOwotCQkJcGFyc2VMb2coKTsKLQkJCVVwZGF0ZVVJLnNob3dVUkwoImZpbGU6IiArIGdldFRlbXBGaWxlKCkuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJY2xvc2VMb2coKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuTG9nKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJYnVmZlJlYWQgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIocGF0aC50b09TU3RyaW5nKCkpKTsKLQkJCWh0bWxMb2cgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oZ2V0VGVtcEZpbGUoKSkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0VGVtcEZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICh0ZW1wRmlsZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiaW5zdGFsbC1sb2ciLCAiLmh0bWwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdGVtcEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3dDb3JlRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZW1wRmlsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VMb2coKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vCQkhQ09ORklHVVJBVElPTiA8Y29uZmlndXJhdGlvbi1kYXRlPgotCQkvLwkJIUFDVElWSVRZIDxkYXRlPiA8dGFyZ2V0PiA8YWN0aW9uPiA8c3RhdHVzPgotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdHlwZSwgZGF0ZSwgc3RhdHVzLCB0YXJnZXQsIGFjdGlvbjsKLQkJCVN0cmluZ1Rva2VuaXplciBodG1sQ29kZTsKLQotCQkJaHRtbExvZy5wcmludGxuKCI8aHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbExvZy5wcmludGxuKCI8aGVhZD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbExvZy5wcmludGxuKCI8dGl0bGU+SW5zdGFsbC1Mb2c8L3RpdGxlPiIpOyAvLyROT04tTkxTLTEkCi0JCQlhZGRDU1MoKTsKLQkJCWh0bWxMb2cucHJpbnRsbigiPC9oZWFkPiIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjxib2R5PiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24udGl0bGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGRlc2MgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uZGVzYyIpOyAvLyROT04tTkxTLTEkCi0JCQlodG1sTG9nLnByaW50bG4oIjxoMSBjbGFzcz10aXRsZT4iK3RpdGxlKyI8L2gxPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWh0bWxMb2cucHJpbnRsbigiPHAgY2xhc3M9Ym9keVRleHQ+IitkZXNjKyI8L3A+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCi0JCQlodG1sTG9nLnByaW50bG4oIjxjZW50ZXI+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQkJaHRtbExvZy5wcmludGxuKCI8dGFibGUgd2lkdGggPTEwMCUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9MSBjZWxscGFkZGluZz0yPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJCXdoaWxlIChidWZmUmVhZC5yZWFkeSgpKSB7Ci0KLQkJCQlodG1sQ29kZSA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYnVmZlJlYWQucmVhZExpbmUoKSk7Ci0JCQkJd2hpbGUgKCEoaHRtbENvZGUuaGFzTW9yZUVsZW1lbnRzKCkpKSB7Ci0JCQkJCWlmICghYnVmZlJlYWQucmVhZHkoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJaHRtbENvZGUgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGJ1ZmZSZWFkLnJlYWRMaW5lKCkpOwotCQkJCX0KLQotCQkJCXR5cGUgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQkJCQl0eXBlID0gdHlwZS5zdWJzdHJpbmcodHlwZS5pbmRleE9mKCIhIikgKyAxLCB0eXBlLmxlbmd0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaWYgKHR5cGUuZXF1YWxzKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5hY3Rpdml0eSIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXRhcmdldCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCWRhdGUgPSBuZXcgRGF0ZShuZXcgTG9uZyhodG1sQ29kZS5uZXh0VG9rZW4oKSkubG9uZ1ZhbHVlKCkpLnRvU3RyaW5nKCk7Ci0JCQkJCS8vIGlnbm9yZSBzdHJpbmcgZGF0ZQotCQkJCQlodG1sQ29kZS5uZXh0VG9rZW4oIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlodG1sQ29kZS5uZXh0VG9rZW4oIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3aGlsZSAoaHRtbENvZGUuY291bnRUb2tlbnMoKSA+IDIpCi0JCQkJCQl0YXJnZXQgPSB0YXJnZXQgKyAiICIgKyBodG1sQ29kZS5uZXh0VG9rZW4oKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCWFjdGlvbiA9IGh0bWxDb2RlLm5leHRUb2tlbigpOwotCQkJCQlzdGF0dXMgPSBodG1sQ29kZS5uZXh0VG9rZW4oKTsKLQotCQkJCQlhZGRBY3Rpdml0eShhY3Rpb24sIGRhdGUsIHN0YXR1cywgdGFyZ2V0KTsKLQotCQkJCX0gZWxzZSB7Ci0JCQkJCWh0bWxMb2cucHJpbnRsbigpOwotCQkJCQlodG1sTG9nLnByaW50bG4oCi0JCQkJCQkiPHRyIGlkPXNlcGFyYXRvcj48dGQgY29sc3Bhbj00PjwvdGQ+PC90cj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlodG1sTG9nLnByaW50bG4oKTsKLQkJCQkJZGF0ZSA9IG5ldyBEYXRlKG5ldyBMb25nKGh0bWxDb2RlLm5leHRUb2tlbigpKS5sb25nVmFsdWUoKSkudG9TdHJpbmcoKTsKLS8vCQkJCQlkYXRlID0gIiI7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCQl3aGlsZSAoaHRtbENvZGUuY291bnRUb2tlbnMoKSA+IDApCi0vLwkJCQkJCWRhdGUgPSBkYXRlICsgIiAiICsgaHRtbENvZGUubmV4dFRva2VuKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYWRkQ29uZmlndXJhdGlvbkhlYWRlcihkYXRlKTsKLQkJCQkJYWRkQWN0aXZpdHlIZWFkZXIoKTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWh0bWxMb2cucHJpbnRsbigiPC90YWJsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJaHRtbExvZy5wcmludGxuKCI8L2JvZHk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWh0bWxMb2cucHJpbnRsbigiPC9odG1sPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93Q29yZUV4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGl2aXR5KAotCQlTdHJpbmcgdHlwZSwKLQkJU3RyaW5nIGRhdGUsCi0JCVN0cmluZyBzdGF0dXMsCi0JCVN0cmluZyB0YXJnZXQpIHsKLQkJaHRtbExvZy5wcmludCgiPHRyIGNsYXNzPSIgKyByb3dUeXBlICsgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctdGV4dCB3aWR0aD0zMCU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludChkYXRlKTsKLQkJaHRtbExvZy5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctdGV4dCB3aWR0aD00MCU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCh0YXJnZXQpOwotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTIwJT4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KHR5cGUpOwotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludCgiPHRkIGNsYXNzPWxvZy10ZXh0IHdpZHRoPTEwJT4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KHN0YXR1cyk7Ci0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JCXRvZ2dsZVJvd0NvbG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENTUygpIHsKLQkJaHRtbExvZy5wcmludGxuKCI8U1RZTEUgdHlwZT1cInRleHQvY3NzXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKCJIMS50aXRsZSB7IGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyBjb2xvcjogIzk5QUFDQyB9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKCJQLmJvZHlUZXh0IHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogOXB0OyB9Iik7IC8vJE5PTi1OTFMtMSQKLQkJaHRtbExvZy5wcmludGxuKAotCQkJIlRELmxvZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZX0iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50bG4oCi0JCQkiVEQubG9nLXRleHQgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogbGlnaHRlcjsgZm9udC1zaXplOiA4cHQ7IGNvbG9yOmJsYWNrfSIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnRsbigKLQkJLy8JIlRELmNvbmZpZy1sb2ctaGVhZGVyIHsgZm9udC1mYW1pbHk6IHNhbnMtc2VyaWY7IGZvbnQtc3R5bGU6IG5vcm1hbDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc2l6ZTogOXB0OyBjb2xvcjogd2hpdGU7IDt0ZXh0LWFsaWduOiByaWdodDsgYm9yZGVyLXRvcDoxMHB4IHNvbGlkIHdoaXRlfSIpOwotCQkiVEQuY29uZmlnLWxvZy1oZWFkZXIgeyBmb250LWZhbWlseTogc2Fucy1zZXJpZjsgZm9udC1zdHlsZTogbm9ybWFsOyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zaXplOiA5cHQ7IGNvbG9yOiB3aGl0ZTsgYm9yZGVyLXRvcDoxMHB4IHNvbGlkIHdoaXRlfSIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnRsbigiVFIubGlnaHQtcm93IHtiYWNrZ3JvdW5kOiIgKyB3aGl0ZSArICJ9Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlodG1sTG9nLnByaW50bG4oIlRSLmRhcmstcm93IHtiYWNrZ3JvdW5kOiIgKyBsaWdodEJsdWUgKyAifSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaHRtbExvZy5wcmludGxuKCJUUi5oZWFkZXIge2JhY2tncm91bmQ6IiArIGRhcmtCbHVlICsgIn0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWh0bWxMb2cucHJpbnRsbigiPC9TVFlMRT4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBY3Rpdml0eUhlYWRlcigpIHsKLQkJaHRtbExvZy5wcmludCgiPHRyIGNsYXNzPWhlYWRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9bG9nLWhlYWRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbGF0aW9uSGlzdG9yeUFjdGlvbi5kYXRlVGltZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLnRhcmdldCIpKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLmFjdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoIjx0ZCBjbGFzcz1sb2ctaGVhZGVyPiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsYXRpb25IaXN0b3J5QWN0aW9uLnN0YXR1cyIpKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50bG4oIjwvdGQ+PC90cj4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb25maWd1cmF0aW9uSGVhZGVyKFN0cmluZyBkYXRlKSB7Ci0JCWlmIChkYXRlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaHRtbExvZy5wcmludCgiPHRyIGNsYXNzPWhlYWRlcj4iKTsgLy8kTk9OLU5MUy0xJAotCQlodG1sTG9nLnByaW50KCI8dGQgY2xhc3M9Y29uZmlnLWxvZy1oZWFkZXIgY29sc3Bhbj00PiIpOyAvLyROT04tTkxTLTEkCi0JCWh0bWxMb2cucHJpbnQoZGF0ZSk7Ci0JCWh0bWxMb2cucHJpbnRsbigiPC90ZD48L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHRvZ2dsZVJvd0NvbG9yKCkgewotCQlpZiAocm93VHlwZS5lcXVhbHMoImxpZ2h0LXJvdyIpKSAvLyROT04tTkxTLTEkCi0JCQlyb3dUeXBlID0gImRhcmstcm93IjsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlyb3dUeXBlID0gImxpZ2h0LXJvdyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGhyb3dDb3JlRXhjZXB0aW9uKFRocm93YWJsZSBlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKAotCQkJbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLAotCQkJCVVwZGF0ZVVJLmdldFBsdWdpbklkKCksCi0JCQkJSVN0YXR1cy5FUlJPUiwKLQkJCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxhdGlvbkhpc3RvcnlBY3Rpb24uZXJyb3JzIiksIC8vJE5PTi1OTFMtMSQKLQkJCQllKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsb3NlTG9nKCkgewotCQl0cnkgewotCQkJaWYgKGJ1ZmZSZWFkICE9IG51bGwpCi0JCQkJYnVmZlJlYWQuY2xvc2UoKTsKLQkJCWlmIChodG1sTG9nICE9IG51bGwpCi0JCQkJaHRtbExvZy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCX0gZmluYWxseSB7Ci0JCQlidWZmUmVhZCA9IG51bGw7Ci0JCQlodG1sTG9nID0gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL05ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0ZDE5Yi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS52aWV3czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0KLQlwdWJsaWMgTmV3RXh0ZW5zaW9uTG9jYXRpb25BY3Rpb24oU3RyaW5nIHRleHQsIEltYWdlRGVzY3JpcHRvciBkZXNjKSB7Ci0JCXN1cGVyKHRleHQsIGRlc2MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBEaXJlY3RvcnlEaWFsb2coVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoVXBkYXRlVUkuZ2V0U3RyaW5nKCJOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5zZWxlY3RFeHRMb2NhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBkaXIgPSBkaWFsb2cub3BlbigpOwotCQl3aGlsZSAoZGlyICE9IG51bGwpIHsKLQkJCUZpbGUgZGlyRmlsZSA9IGdldEV4dGVuc2lvblNpdGUobmV3IEZpbGUoZGlyKSk7Ci0JCQlpZiAoZGlyRmlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFkZEV4dGVuc2lvbkxvY2F0aW9uKGRpckZpbGUpKQotCQkJCQlyZXR1cm47Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHJlLW9wZW4gdGhlIGRpcmVjdG9yeSBkaWFsb2cKLQkJCQkJZGlhbG9nLnNldEZpbHRlclBhdGgoZGlyKTsKLQkJCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQl9CQotCQkJfSBlbHNlIHsKLQkJCQlNZXNzYWdlRGlhbG9nLm9wZW5JbmZvcm1hdGlvbigKLQkJCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKAotCQkJCQkJIk5ld0V4dGVuc2lvbkxvY2F0aW9uQWN0aW9uLmV4dEluZm9UaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygKLQkJCQkJCSJOZXdFeHRlbnNpb25Mb2NhdGlvbkFjdGlvbi5leHRJbmZvTWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHJlLW9wZW4gdGhlIGRpcmVjdG9yeSBkaWFsb2cKLQkJCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChkaXIpOwotCQkJCWRpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlyZWN0b3J5Ci0JICogQHJldHVybiB0aGUgc2l0ZSBmaWxlIChpbmNsdWRpbmcgImVjbGlwc2UiIHBhdGgpIHdoZW4gZGlyZWN0b3J5IGlzIGFuIGVjbGlwc2UgZXhzdGVuc2lvbiwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlzdGF0aWMgRmlsZSBnZXRFeHRlbnNpb25TaXRlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCS8vIENoZWNrIHRoZSBlY2xpcHNlIGZvbGRlcgotCQlpZiAoZGlyZWN0b3J5LmdldE5hbWUoKS5lcXVhbHMoImVjbGlwc2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB3ZSBwaWNrZWQgdXAgdGhlIGVjbGlwc2UgZGlyZWN0b3J5LCBjaGVjayBpZiBpdHMgcGFyZW50IGlzIGEgc2l0ZQotCQkJRmlsZSBzaXRlID0gZ2V0RXh0ZW5zaW9uU2l0ZShkaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpKTsKLQkJCWlmIChzaXRlICE9IG51bGwpCi0JCQkJcmV0dXJuIGRpcmVjdG9yeTsKLQkJCS8vIG90aGVyd2lzZSwgZmFsbCB0aHJvdWdoCi0JCX0KLQkJCi0JCUZpbGUgZWNsaXBzZSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgImVjbGlwc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWVjbGlwc2UuZXhpc3RzKCkgfHwgIWVjbGlwc2UuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNoZWNrIHRoZSBtYXJrZXIKLQkJRmlsZSBtYXJrZXIgPSBuZXcgRmlsZShlY2xpcHNlLCAiLmVjbGlwc2VleHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIW1hcmtlci5leGlzdHMoKSB8fCBtYXJrZXIuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWNsaXBzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWRkRXh0ZW5zaW9uTG9jYXRpb24oRmlsZSBkaXIpIHsKLQkJdHJ5IHsKLQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQkJSUNvbmZpZ3VyZWRTaXRlIGNzaXRlID0gY29uZmlnLmNyZWF0ZUxpbmtlZENvbmZpZ3VyZWRTaXRlKGRpcik7Ci0JCQljb25maWcuYWRkQ29uZmlndXJlZFNpdGUoY3NpdGUpOwotCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuc2F2ZSgpOwotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5sb2NhdGlvbi5lcnJvci50aXRsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgdGl0bGUsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOwotCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUsZmFsc2UpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmVwbGFjZVZlcnNpb25BY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXBsYWNlVmVyc2lvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI0NjU4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9SZXBsYWNlVmVyc2lvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLklGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5SZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotcHVibGljIGNsYXNzIFJlcGxhY2VWZXJzaW9uQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkKLQlwcml2YXRlIElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlOwotCXByaXZhdGUgSUZlYXR1cmVbXSBmZWF0dXJlczsKLQkKLQlwdWJsaWMgUmVwbGFjZVZlcnNpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEN1cnJlbnRGZWF0dXJlKElGZWF0dXJlIGZlYXR1cmUpIHsKLQkJY3VycmVudEZlYXR1cmUgPSBmZWF0dXJlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlcyhJRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCXRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGN1cnJlbnRGZWF0dXJlID09IG51bGwgfHwgZmVhdHVyZXMgPT0gbnVsbCB8fCBmZWF0dXJlcy5sZW5ndGggPCAyKQotCQkJcmV0dXJuOwotCQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQgd2l6YXJkID0gbmV3IFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZChjdXJyZW50RmVhdHVyZSwgZmVhdHVyZXMpOwotCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCB3aXphcmQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKS5nZXRUZXh0KCkpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDQwMCw0MDApOwotCQlkaWFsb2cub3BlbigpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1JldmVydENvbmZpZ3VyYXRpb25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmMzI3YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgUmV2ZXJ0Q29uZmlndXJhdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25BY3Rpb24oU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIodGV4dCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBsYXRmb3JtQ29uZmlnVmFsaWQoKTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsKSB7Ci0JCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJCW51bGwsCi0JCQkJCW51bGwsCi0JCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVJldmVydENvbmZpZ3VyYXRpb25XaXphcmQgd2l6YXJkID0gbmV3IFJldmVydENvbmZpZ3VyYXRpb25XaXphcmQoKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkuZ2V0VGV4dCgpKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsNTAwKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2hvd0FjdGl2aXRpZXNBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaG93QWN0aXZpdGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU4M2EzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS92aWV3cy9TaG93QWN0aXZpdGllc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5TaG93QWN0aXZpdGllc0RpYWxvZzsKLQotcHVibGljIGNsYXNzIFNob3dBY3Rpdml0aWVzQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlTaGVsbCBzaGVsbDsKLQkKLQlwdWJsaWMgU2hvd0FjdGl2aXRpZXNBY3Rpb24oU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCQl0aGlzLnNoZWxsID0gcGFyZW50U2hlbGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU2hvd0FjdGl2aXRpZXNEaWFsb2cgZGlhbG9nID0gbmV3IFNob3dBY3Rpdml0aWVzRGlhbG9nKHNoZWxsKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2hvd0FjdGl2aXRpZXNEaWFsb2cudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLm9wZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvU2l0ZVN0YXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGFmYjIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1NpdGVTdGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiBUb2dnbGVzIGEgc2l0ZSdzIGVuYWJsZWQgc3RhdGUKLSAqLwotCi1wdWJsaWMgY2xhc3MgU2l0ZVN0YXRlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcml2YXRlIElDb25maWd1cmVkU2l0ZSBzaXRlOwotCi0JcHVibGljIFNpdGVTdGF0ZUFjdGlvbigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JCWJvb2xlYW4gc3RhdGUgPSBzaXRlLmlzRW5hYmxlZCgpOwotCQlzZXRUZXh0KHN0YXRlID8gVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlU3RhdGVBY3Rpb24uZGlzYWJsZUxhYmVsIikgOiBVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVTdGF0ZUFjdGlvbi5lbmFibGVMYWJlbCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3IoCi0JCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQkJbnVsbCwKLQkJCQkJCW51bGwsCi0JCQkJCQlzdGF0dXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHNpdGUuaXNFbmFibGVkKCk7Ci0JCQlpZiAoIWNvbmZpcm0oIW9sZFZhbHVlKSkKLQkJCQlyZXR1cm47Ci0JCQkKLQkJCUlPcGVyYXRpb24gdG9nZ2xlU2l0ZU9wZXJhdGlvbiA9IE9wZXJhdGlvbnNNYW5hZ2VyLmdldE9wZXJhdGlvbkZhY3RvcnkoKS5jcmVhdGVUb2dnbGVTaXRlT3BlcmF0aW9uKHNpdGUpOwotCQkJYm9vbGVhbiByZXN0YXJ0TmVlZGVkID0gdG9nZ2xlU2l0ZU9wZXJhdGlvbi5leGVjdXRlKG51bGwsIG51bGwpOwotCQkJCQkKLQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCWUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtKGJvb2xlYW4gbmV3U3RhdGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBzaXRlLmdldFNpdGUoKS5nZXRVUkwoKS50b1N0cmluZygpOwotCQlTdHJpbmcgZW5hYmxlTWVzc2FnZSA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoIlNpdGVTdGF0ZUFjdGlvbi5lbmFibGVNZXNzYWdlIiwgbmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgZGlzYWJsZU1lc3NhZ2UgPSBVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCJTaXRlU3RhdGVBY3Rpb24uZGlzYWJsZU1lc3NhZ2UiLCBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJU3RyaW5nIG1lc3NhZ2UgPSBuZXdTdGF0ZSA/IGVuYWJsZU1lc3NhZ2UgOiBkaXNhYmxlTWVzc2FnZTsKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlbkNvbmZpcm0oVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlU3RhdGVBY3Rpb24uZGlhbG9nVGl0bGUiKSwgbWVzc2FnZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3ZpZXdzL1VuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc3OGQ5MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvdmlld3MvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudmlld3M7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgVW5pbnN0YWxsRmVhdHVyZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBDb25maWd1cmVkRmVhdHVyZUFkYXB0ZXIgYWRhcHRlcjsKLQotCXB1YmxpYyBVbmluc3RhbGxGZWF0dXJlQWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdHJ5IHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCQlpZiAoc3RhdHVzICE9IG51bGwpCi0JCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJCQotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCB8fCAhY29uZmlybShVcGRhdGVVSS5nZXRTdHJpbmcoIkZlYXR1cmVVbmluc3RhbGxBY3Rpb24udW5pbnN0YWxsUXVlc3Rpb24iKSkpIC8vJE5PTi1OTFMtMSQpKQotCQkJCXJldHVybjsKLQotCQkJLy8gSWYgY3VycmVudCBjb25maWcgaXMgYnJva2VuLCBjb25maXJtIHdpdGggdGhlIHVzZXIgdG8gY29udGludWUKLQkJCWlmIChPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZUN1cnJlbnRTdGF0ZSgpICE9IG51bGwgJiYKLQkJCQkJIWNvbmZpcm0oVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpb25zLmJyb2tlbkNvbmZpZ1F1ZXN0aW9uIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCi0JCQlJT3BlcmF0aW9uIHVuaW5zdGFsbE9wZXJhdGlvbiA9Ci0JCQkJKElPcGVyYXRpb24pIE9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJLmNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbigKLQkJCQkJYWRhcHRlci5nZXRDb25maWd1cmVkU2l0ZSgpLAotCQkJCQlhZGFwdGVyLmdldEZlYXR1cmUobnVsbCkpOwotCi0JCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSB1bmluc3RhbGxPcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCVVwZGF0ZVVJLnJlcXVlc3RSZXN0YXJ0KHJlc3RhcnROZWVkZWQpOwotCi0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCWUuZ2V0U3RhdHVzKCkpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJCVVwZGF0ZVV0aWxzLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25maXJtKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5Db25maXJtKAotCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiRmVhdHVyZVVuaW5zdGFsbEFjdGlvbi5kaWFsb2dUaXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQltZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZWF0dXJlKENvbmZpZ3VyZWRGZWF0dXJlQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJGZWF0dXJlVW5pbnN0YWxsQWN0aW9uLnVuaW5zdGFsbCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblVuaW5zdGFsbCgpIHsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCi0vLwkJaWYgKGFkYXB0ZXIuaXNDb25maWd1cmVkKCkpCi0vLwkJCXJldHVybiBmYWxzZTsKLQkJCQotCQl0cnkgewotCQkJaWYgKEluc3RhbGxSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldCgiZmVhdHVyZV8iK2FkYXB0ZXIuZ2V0RmVhdHVyZShudWxsKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkpID09IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQkJCi0JCXJldHVybiB0cnVlOwkKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9BY3Rpdml0aWVzVGFibGVWaWV3ZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0FjdGl2aXRpZXNUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzJlNjliLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0FjdGl2aXRpZXNUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsKLQotCi0vKioKLSAqIFZpZXdlciBmb3IgY29uZmlndXJhdGlvbiBhY3Rpdml0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpdml0aWVzVGFibGVWaWV3ZXJ7Ci0KLQlwcml2YXRlIHN0YXRpYyBJbnN0YWxsTG9nUGFyc2VyIHBhcnNlcjsgCi0JCi0Jc3RhdGljIGNsYXNzIEFjdGl2aXRpZXNDb250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkKLQkJcHJpdmF0ZSBib29sZWFuIHNob3dDdXJyZW50T25seTsKLQkJCi0JCXB1YmxpYyBBY3Rpdml0aWVzQ29udGVudFByb3ZpZGVyKGJvb2xlYW4gc2hvd0N1cnJlbnRPbmx5KXsKLQkJCXRoaXMuc2hvd0N1cnJlbnRPbmx5ID0gc2hvd0N1cnJlbnRPbmx5OwotCQl9Ci0JCXB1YmxpYyBBY3Rpdml0aWVzQ29udGVudFByb3ZpZGVyKCl7Ci0JCQl0aGlzLnNob3dDdXJyZW50T25seSA9IGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCUluc3RhbGxDb25maWd1cmF0aW9uIGN1cnJlbnRDb25maWcgPSAoSW5zdGFsbENvbmZpZ3VyYXRpb24pZWxlbWVudDsKLQkJCUluc3RhbGxDb25maWd1cmF0aW9uW10gY29uZmlncyA9IHBhcnNlci5nZXRDb25maWd1cmF0aW9ucygpOwotCQkJYm9vbGVhbiBoaXRDdXJyZW50Q29uZmlnID0gZmFsc2U7Ci0JCQlBcnJheUxpc3QgYWN0aXZpdGllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaTxjb25maWdzLmxlbmd0aDsgaSsrKXsKLQkJCQlpZiAoY29uZmlnc1tpXS5lcXVhbHMoY3VycmVudENvbmZpZykgJiYgIWhpdEN1cnJlbnRDb25maWcpCi0JCQkJCWhpdEN1cnJlbnRDb25maWcgPSB0cnVlOwotCQkJCWlmIChoaXRDdXJyZW50Q29uZmlnICYmIHNob3dDdXJyZW50T25seSkKLQkJCQkJcmV0dXJuIGNvbmZpZ3NbaV0uZ2V0QWN0aXZpdGllcygpOwotCQkJCWVsc2UgaWYgKGhpdEN1cnJlbnRDb25maWcpewotCQkJCQlJQWN0aXZpdHlbXSBhY3Rpdml0aWVzID0gY29uZmlnc1tpXS5nZXRBY3Rpdml0aWVzKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqPGFjdGl2aXRpZXMubGVuZ3RoOyBqKyspCi0JCQkJCQlhY3Rpdml0aWVzTGlzdC5hZGQoYWN0aXZpdGllc1tqXSk7CQotCQkJCX0KLQkJCQkKLQkJCX0KLQkJCXJldHVybiAoSUFjdGl2aXR5W10pYWN0aXZpdGllc0xpc3QudG9BcnJheShuZXcgSUFjdGl2aXR5W2FjdGl2aXRpZXNMaXN0LnNpemUoKV0pOwotCQl9Ci0JCQotCX0KLQotCXN0YXRpYyBjbGFzcyBBY3Rpdml0aWVzTGFiZWxQcm92aWRlcgotCQlleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9Ci0JCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJc3dpdGNoICgoKElBY3Rpdml0eSkgZWxlbWVudCkuZ2V0U3RhdHVzKCkpIHsKLQkJCQkJY2FzZSBJQWN0aXZpdHkuU1RBVFVTX09LIDoKLQkJCQkJCXJldHVybiBwcm92aWRlci5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19PS19TVF9PQkosIDApOwotCQkJCQljYXNlIElBY3Rpdml0eS5TVEFUVVNfTk9LIDoKLQkJCQkJCXJldHVybiBwcm92aWRlci5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19FUlJfU1RfT0JKLCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlJQWN0aXZpdHkgYWN0aXZpdHkgPSAoSUFjdGl2aXR5KSBlbGVtZW50OwotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiBVdGlsaXRpZXMuZm9ybWF0KGFjdGl2aXR5LmdldERhdGUoKSk7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJcmV0dXJuIGFjdGl2aXR5LmdldExhYmVsKCk7Ci0JCQkJY2FzZSAzIDoKLQkJCQkJcmV0dXJuIGdldEFjdGlvbkxhYmVsKGFjdGl2aXR5KTsKLQkJCX0KLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0QWN0aW9uTGFiZWwoSUFjdGl2aXR5IGFjdGl2aXR5KSB7Ci0JCQlpbnQgYWN0aW9uID0gYWN0aXZpdHkuZ2V0QWN0aW9uKCk7Ci0JCQlzd2l0Y2ggKGFjdGlvbikgewotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9DT05GSUdVUkUgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIuZW5hYmxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX0ZFQVRVUkVfSU5TVEFMTCA6Ci0JCQkJCXJldHVybiBVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5mZWF0dXJlSW5zdGFsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fRkVBVFVSRV9SRU1PVkUgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIuZmVhdHVyZVJlbW92ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9TSVRFX0lOU1RBTEwgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIuc2l0ZUluc3RhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJY2FzZSBJQWN0aXZpdHkuQUNUSU9OX1NJVEVfUkVNT1ZFIDoKLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aXZpdGllc1RhYmxlVmlld2VyLnNpdGVSZW1vdmVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fVU5DT05GSUdVUkUgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIuZGlzYWJsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNhc2UgSUFjdGl2aXR5LkFDVElPTl9SRVZFUlQgOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIucmV2ZXJ0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQljYXNlIElBY3Rpdml0eS5BQ1RJT05fUkVDT05DSUxJQVRJT04gOgotCQkJCQlyZXR1cm4gVXBkYXRlVUkuZ2V0U3RyaW5nKCJBY3Rpdml0aWVzVGFibGVWaWV3ZXIucmVjb25jaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aXZpdGllc1RhYmxlVmlld2VyLnVua25vd24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUYWJsZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgYm9vbGVhbiBzaG93Q3VycmVudE9ubHkpIHsKLQkJcGFyc2VyID0gbmV3IEluc3RhbGxMb2dQYXJzZXIoKTsKLQkJcGFyc2VyLnBhcnNlSW5zdGFsbGF0aW9uTG9nKCk7Ci0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCi0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5kYXRlIikpOyAvLyROT04tTkxTLTEkCi0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiQWN0aXZpdGllc1RhYmxlVmlld2VyLnRhcmdldCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkFjdGl2aXRpZXNUYWJsZVZpZXdlci5hY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUYWJsZVZpZXdlciBhY3Rpdml0aWVzVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJYWN0aXZpdGllc1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBBY3Rpdml0aWVzTGFiZWxQcm92aWRlcigpKTsKLQkJYWN0aXZpdGllc1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFjdGl2aXRpZXNDb250ZW50UHJvdmlkZXIoc2hvd0N1cnJlbnRPbmx5KSk7Ci0JCXJldHVybiBhY3Rpdml0aWVzVmlld2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQmFubmVyUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvQmFubmVyUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc4YzgzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0Jhbm5lclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFubmVyUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCXByaXZhdGUgSW1hZ2UgYmFubmVySW1hZ2U7Ci0JcHJpdmF0ZSBib29sZWFuIGJhbm5lclZpc2libGUgPSBmYWxzZTsKLQlwdWJsaWMgQmFubmVyUGFnZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSAxMDsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCWlmIChiYW5uZXJWaXNpYmxlKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORykpOwotCQkJbGFiZWwuc2V0SW1hZ2UoZ2V0QmFubmVySW1hZ2UoKSk7Ci0JCX0KLQotCQlDb250cm9sIGNvbnRlbnRzID0gY3JlYXRlQ29udGVudHMoY2xpZW50KTsKLQkJY29udGVudHMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXNldENvbnRyb2woY2xpZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCYW5uZXJWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQl0aGlzLmJhbm5lclZpc2libGUgPSB2aXNpYmxlOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBpc0Jhbm5lZFZpc2libGUoKSB7Ci0JCXJldHVybiBiYW5uZXJWaXNpYmxlOwotCX0KLQotCXByb3RlY3RlZCBVUkwgZ2V0QmFubmVySW1hZ2VVUkwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQlwcml2YXRlIEltYWdlIGdldEJhbm5lckltYWdlKCkgewotCQlVUkwgaW1hZ2VVUkwgPSBnZXRCYW5uZXJJbWFnZVVSTCgpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmIChpbWFnZVVSTCA9PSBudWxsKSB7Ci0JCQkvLyB1c2UgZGVmYXVsdAotCQkJYmFubmVySW1hZ2UgPQotCQkJCVVwZGF0ZVVJSW1hZ2VzLkRFU0NfSU5TVEFMTF9CQU5ORVIuY3JlYXRlSW1hZ2UoKTsKLQkJCWltYWdlID0gYmFubmVySW1hZ2U7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChiYW5uZXJJbWFnZSAhPSBudWxsKSB7Ci0JCQliYW5uZXJJbWFnZS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3MTAxMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9EdXBsaWNhdGVDb25mbGljdHNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZXh0ZW5kcyBNZXNzYWdlRGlhbG9nIHsKLQotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCXByaXZhdGUgQXJyYXlMaXN0IGNvbmZsaWN0czsKLQotCWNsYXNzIENvbmZsaWN0Q29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGNoaWxkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiAoKEFycmF5TGlzdCkgcGFyZW50KS50b0FycmF5KCk7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCX0KLQotCWNsYXNzIENvbmZsaWN0TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotCQkJCUFycmF5TGlzdCBsaXN0ID0gKEFycmF5TGlzdCkgb2JqOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCQlEdXBsaWNhdGVDb25mbGljdHNWYWxpZGF0b3IuSWRFbnRyeSBlbnRyeSA9Ci0JCQkJCQkoRHVwbGljYXRlQ29uZmxpY3RzVmFsaWRhdG9yLklkRW50cnkpIChsaXN0KS5nZXQoaSk7Ci0JCQkJCWlmIChlbnRyeS5pc0luc3RhbGxDYW5kaWRhdGUoKSkKLQkJCQkJCXJldHVybiBlbnRyeS5nZXRGZWF0dXJlKCkuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlpbnQgZmxhZ3MgPSAwOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5TGlzdCkKLQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9XQVJOSU5HOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIER1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5JZEVudHJ5Ci0JCQkJfHwgb2JqIGluc3RhbmNlb2YgQXJyYXlMaXN0KQotCQkJCXJldHVybiBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmdldCgKLQkJCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSiwKLQkJCQkJZmxhZ3MpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRHVwbGljYXRlQ29uZmxpY3RzRGlhbG9nKFNoZWxsIHNoZWxsLCBBcnJheUxpc3QgY29uZmxpY3RzKSB7Ci0JCXN1cGVyKAotCQkJc2hlbGwsCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkR1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZy50aXRsZSIpLCAvLyROT04tTkxTLTEkCi0JCQludWxsLAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cubWVzc2FnZSIpLCAvLyROT04tTkxTLTEkCi0JCQlXQVJOSU5HLAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwKLQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMIH0sCi0JCQkwKTsKLQkJdGhpcy5jb25mbGljdHMgPSBjb25mbGljdHM7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDdXN0b21BcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cudHJlZUxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0KLQkJdHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKGNsaWVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gMjAwOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCXRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEoZ2QpOwotCQl0cmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgQ29uZmxpY3RDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29uZmxpY3RMYWJlbFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldEF1dG9FeHBhbmRMZXZlbCgxMCk7Ci0JCXRyZWVWaWV3ZXIuc2V0U29ydGVyKG5ldyBWaWV3ZXJTb3J0ZXIoKSB7Ci0JCX0pOwotCQl0cmVlVmlld2VyLnNldElucHV0KGNvbmZsaWN0cyk7Ci0JCXJldHVybiBjbGllbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9FZGl0U2l0ZURpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRWRpdFNpdGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlMzJmNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9FZGl0U2l0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGNsYXNzIEVkaXRTaXRlRGlhbG9nIGV4dGVuZHMgTmV3VXBkYXRlU2l0ZURpYWxvZyB7Ci0JU2l0ZUJvb2ttYXJrIGJvb2ttYXJrOwotCi0JcHVibGljIEVkaXRTaXRlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTaXRlQm9va21hcmsgYm9va21hcmspIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLmJvb2ttYXJrID0gYm9va21hcms7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJbmFtZS5zZXRUZXh0KGJvb2ttYXJrLmdldE5hbWUoKSk7Ci0JCXVybC5zZXRUZXh0KGJvb2ttYXJrLmdldFVSTCgpLnRvU3RyaW5nKCkpOwotCQl1cmwuc2V0RWRpdGFibGUoIWJvb2ttYXJrLmlzTG9jYWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQl0cnkgewotCQkJYm9va21hcmsuc2V0TmFtZShuYW1lLmdldFRleHQoKSk7Ci0JCQlib29rbWFyay5zZXRVUkwobmV3IFVSTCh1cmwuZ2V0VGV4dCgpKSk7Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5maXJlT2JqZWN0Q2hhbmdlZChib29rbWFyaywgbnVsbCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9GZWF0dXJlU29ydGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9GZWF0dXJlU29ydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMmYwYTcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvRmVhdHVyZVNvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBGZWF0dXJlU29ydGVyIGV4dGVuZHMgVmlld2VyU29ydGVyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGRUFUVVJFX1ZFUlNJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfTEFCRUwgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFQVRVUkVfUFJPVklERVIgPSAzOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTQ0VORElORyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTQ0VORElORyA9IC0xOwotCQotCXByaXZhdGUgaW50IGtleSA9IEZFQVRVUkVfTEFCRUw7Ci0JcHJpdmF0ZSBpbnQgbGFiZWxPcmRlcjsKLQlwcml2YXRlIGludCB2ZXJzaW9uT3JkZXI7Ci0JcHJpdmF0ZSBpbnQgcHJvdmlkZXJPcmRlcjsKLQkKLQlwdWJsaWMgRmVhdHVyZVNvcnRlcigpIHsKLQkJdGhpcyhGRUFUVVJFX0xBQkVMLCBBU0NFTkRJTkcsIEFTQ0VORElORywgQVNDRU5ESU5HKTsKLQl9Ci0JCi0JcHVibGljIEZlYXR1cmVTb3J0ZXIoaW50IGtleSwgaW50IGxhYmVsT3JkZXIsIGludCB2ZXJzaW9uT3JkZXIsIGludCBwcm92aWRlck9yZGVyKSB7Ci0JCXRoaXMua2V5ID0ga2V5OwotCQl0aGlzLmxhYmVsT3JkZXIgPSBsYWJlbE9yZGVyOwotCQl0aGlzLnZlcnNpb25PcmRlciA9IHZlcnNpb25PcmRlcjsKLQkJdGhpcy5wcm92aWRlck9yZGVyID0gcHJvdmlkZXJPcmRlcjsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJaWYgKCEoZTEgaW5zdGFuY2VvZiBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pCi0JCQl8fCAhKGUyIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSkKLQkJCXJldHVybiBzdXBlci5jb21wYXJlKHZpZXdlciwgZTEsIGUyKTsKLQkJCQotCQlJRmVhdHVyZSBmMSA9ICgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKWUxKS5nZXRGZWF0dXJlKCk7Ci0JCUlGZWF0dXJlIGYyID0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pZTIpLmdldEZlYXR1cmUoKTsKLQkJCi0JCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYxID0gZjEuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjIgPSBmMi5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkKLQkJU3RyaW5nIGxhYmVsMSA9IGYxLmdldExhYmVsKCkgPT0gbnVsbCA/ICIiIDogZjEuZ2V0TGFiZWwoKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGFiZWwyID0gZjIuZ2V0TGFiZWwoKSA9PSBudWxsID8gIiIgOiBmMi5nZXRMYWJlbCgpOyAvLyROT04tTkxTLTEkCi0JCQotCQlTdHJpbmcgcHJvdmlkZXIxID0gZjEuZ2V0UHJvdmlkZXIoKSA9PSBudWxsID8gIiIgOiBmMS5nZXRQcm92aWRlcigpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwcm92aWRlcjIgPSBmMi5nZXRQcm92aWRlcigpID09IG51bGwgPyAiIiA6IGYyLmdldFByb3ZpZGVyKCk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoa2V5ID09IEZFQVRVUkVfVkVSU0lPTikgewotCQkJcmVzdWx0ID0gY29tcGFyZVZlcnNpb25zKHYxLCB2MikgKiB2ZXJzaW9uT3JkZXI7Ci0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKGxhYmVsMSwgbGFiZWwyKSAqIGxhYmVsT3JkZXI7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSAqIHByb3ZpZGVyT3JkZXI7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoa2V5ID09IEZFQVRVUkVfTEFCRUwpIHsKLQkJCXJlc3VsdCA9IGNvbGxhdG9yLmNvbXBhcmUobGFiZWwxLCBsYWJlbDIpICogbGFiZWxPcmRlcjsKLQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCXJlc3VsdCA9IGNvbXBhcmVWZXJzaW9ucyh2MSwgdjIpICogdmVyc2lvbk9yZGVyOwotCQkJCWlmIChyZXN1bHQgPT0gMCkKLQkJCQkJcmVzdWx0ID0gY29sbGF0b3IuY29tcGFyZShwcm92aWRlcjEsIHByb3ZpZGVyMikgKiBwcm92aWRlck9yZGVyOwotCQkJfQotCQl9IGVsc2UgaWYgKGtleSA9PSBGRUFUVVJFX1BST1ZJREVSKSB7Ci0JCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSAqIHByb3ZpZGVyT3JkZXI7Ci0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQlyZXN1bHQgPSBjb2xsYXRvci5jb21wYXJlKGxhYmVsMSwgbGFiZWwyKSAqIGxhYmVsT3JkZXI7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKQotCQkJCQlyZXN1bHQgPSBjb21wYXJlVmVyc2lvbnModjEsIHYyKSAqIHZlcnNpb25PcmRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGludCBjb21wYXJlVmVyc2lvbnMoUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjEsIFBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYyKSB7Ci0JCWlmICh2MS5lcXVhbHModjIpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiB2Mi5pc0dyZWF0ZXJUaGFuKHYxKSA/IC0xIDogMTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JRHluYW1pY1BhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lEeW5hbWljUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTZhOTIyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0lEeW5hbWljUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLQotLyoqCi0gKiAgQSBkeW5hbWljIHBhZ2UgaW4gdGhlIGluc3RhbGwgd2l6YXJkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUR5bmFtaWNQYWdlIHsKLQlwdWJsaWMgdm9pZCBzZXRKb2JzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBbXSBqb2JzKTsKLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSVNlYXJjaFByb3ZpZGVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JU2VhcmNoUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0NWNlZi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JU2VhcmNoUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICogQSBzZWFyY2ggcmVxdWVzdCBwcm92aWRlcgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWFyY2hQcm92aWRlciB7Ci0JVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCk7Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9JbnN0YWxsV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkM2QxOTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvSW5zdGFsbFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VjdXJpdHkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsV2l6YXJkCi0JZXh0ZW5kcyBXaXphcmQKLQlpbXBsZW1lbnRzIElPcGVyYXRpb25MaXN0ZW5lciwgSVNlYXJjaFByb3ZpZGVyIHsKLQlwcml2YXRlIE1vZGVTZWxlY3Rpb25QYWdlIG1vZGVQYWdlOwotCXByaXZhdGUgU2l0ZVBhZ2Ugc2l0ZVBhZ2U7Ci0JcHJpdmF0ZSBSZXZpZXdQYWdlIHJldmlld1BhZ2U7Ci0JcHJpdmF0ZSBMaWNlbnNlUGFnZSBsaWNlbnNlUGFnZTsKLQlwcml2YXRlIE9wdGlvbmFsRmVhdHVyZXNQYWdlIG9wdGlvbmFsRmVhdHVyZXNQYWdlOwotCXByaXZhdGUgVGFyZ2V0UGFnZSB0YXJnZXRQYWdlOwotCXByaXZhdGUgSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZzsKLQlwcml2YXRlIGludCBpbnN0YWxsQ291bnQgPSAwOwotCXByaXZhdGUgU2VhcmNoUnVubmVyIHNlYXJjaFJ1bm5lcjsKLQlwcml2YXRlIFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdDsKLQlwcml2YXRlIEFycmF5TGlzdCBqb2JzOwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc1Jlc3RhcnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1J1bm5pbmc7Ci0KLQlwdWJsaWMgSW5zdGFsbFdpemFyZCgpIHsKLQkJdGhpcygoVXBkYXRlU2VhcmNoUmVxdWVzdCkgbnVsbCk7Ci0JfQotCi0JcHVibGljIEluc3RhbGxXaXphcmQoVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0KSB7Ci0JCWlzUnVubmluZyA9IHRydWU7Ci0JCXRoaXMuc2VhcmNoUmVxdWVzdCA9IHNlYXJjaFJlcXVlc3Q7Ci0JCXNldERpYWxvZ1NldHRpbmdzKFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXREaWFsb2dTZXR0aW5ncygpKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19VUERBVEVfV0laKTsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCQlzZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJc2V0V2luZG93VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLnd0aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJbnN0YWxsV2l6YXJkKFVwZGF0ZVNlYXJjaFJlcXVlc3Qgc2VhcmNoUmVxdWVzdCwgQXJyYXlMaXN0IGpvYnMpIHsKLQkJdGhpcyhzZWFyY2hSZXF1ZXN0KTsKLQkJdGhpcy5qb2JzID0gam9iczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEluc3RhbGxDb3VudCgpIHsKLQkJcmV0dXJuIGluc3RhbGxDb3VudDsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNSZXN0YXJ0TmVlZGVkKCkgewotCQlyZXR1cm4gaW5zdGFsbENvdW50ID4gMCAmJiBuZWVkc1Jlc3RhcnQ7IC8vIG9yID09IHNlbGVjdGVkSm9icy5sZW5ndGgKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgewotCQlpc1J1bm5pbmcgPSBmYWxzZTsKLQkJaWYgKHRhcmdldFBhZ2UgIT0gbnVsbCkKLQkJCXRhcmdldFBhZ2UucmVtb3ZlQWRkZWRTaXRlcygpOwotCQlyZXR1cm4gc3VwZXIucGVyZm9ybUNhbmNlbCgpOwotCX0KLQkvKioKLQkgKiBAc2VlIFdpemFyZCNwZXJmb3JtRmluaXNoKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQl0cnkgewotCQkJZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gc2VsZWN0ZWRKb2JzID0KLQkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpOwotCQkJaW5zdGFsbENvdW50ID0gMDsKLQotCQkJc2F2ZVNldHRpbmdzKCk7Ci0JCQkKLQkJCS8vIENoZWNrIGZvciBkdXBsaWNhdGlvbiBjb25mbGljdHMKLQkJCUFycmF5TGlzdCBjb25mbGljdHMgPQotCQkJCUR1cGxpY2F0ZUNvbmZsaWN0c1ZhbGlkYXRvci5jb21wdXRlRHVwbGljYXRlQ29uZmxpY3RzKAotCQkJCQlzZWxlY3RlZEpvYnMsCi0JCQkJCWNvbmZpZyk7Ci0JCQlpZiAoY29uZmxpY3RzICE9IG51bGwpIHsKLQkJCQlEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cgZGlhbG9nID0KLQkJCQkJbmV3IER1cGxpY2F0ZUNvbmZsaWN0c0RpYWxvZyhnZXRTaGVsbCgpLCBjb25mbGljdHMpOwotCQkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJZmluYWwgSVZlcmlmaWNhdGlvbkxpc3RlbmVyIHZlcmlmaWNhdGlvbkxpc3RlbmVyID1uZXcgSmFyVmVyaWZpY2F0aW9uU2VydmljZSgKLQkJCQkJSW5zdGFsbFdpemFyZC50aGlzLmdldFNoZWxsKCkpOwotCQkJLy8gb2sgdG8gY29udGludWUJCQotCQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wZXJhdGlvbiA9IG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCQkJLy8gc2V0dXAgam9icyB3aXRoIHRoZSBjb3JyZWN0IGVudmlyb25tZW50Ci0JCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIG9wZXJhdGlvbnMgPQotCQkJCQluZXcgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW3NlbGVjdGVkSm9icy5sZW5ndGhdOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkSm9icy5sZW5ndGg7IGkrKykgewotCQkJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IHNlbGVjdGVkSm9ic1tpXTsKLQkJCQkJCUlGZWF0dXJlW10gdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9IG51bGw7Ci0JCQkJCQlJRmVhdHVyZVJlZmVyZW5jZVtdIG9wdGlvbmFsRmVhdHVyZXMgPSBudWxsOwotCQkJCQkJaWYgKFVwZGF0ZVV0aWxzLmhhc09wdGlvbmFsRmVhdHVyZXMoam9iLmdldEZlYXR1cmUoKSkpIHsKLQkJCQkJCQlvcHRpb25hbEZlYXR1cmVzID0KLQkJCQkJCQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UKLQkJCQkJCQkJCS5nZXRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcygKLQkJCQkJCQkJCWpvYik7Ci0JCQkJCQkJdW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcyA9Ci0JCQkJCQkJCW9wdGlvbmFsRmVhdHVyZXNQYWdlCi0JCQkJCQkJCQkuZ2V0VW5jb25maWd1cmVkT3B0aW9uYWxGZWF0dXJlcygKLQkJCQkJCQkJCWpvYiwKLQkJCQkJCQkJCWpvYi5nZXRUYXJnZXRTaXRlKCkpOwotCQkJCQkJfQotCQkJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIG9wID0KLQkJCQkJCQlPcGVyYXRpb25zTWFuYWdlcgotCQkJCQkJCQkuZ2V0T3BlcmF0aW9uRmFjdG9yeSgpCi0JCQkJCQkJCS5jcmVhdGVJbnN0YWxsT3BlcmF0aW9uKAotCQkJCQkJCQlqb2IuZ2V0VGFyZ2V0U2l0ZSgpLAotCQkJCQkJCQlqb2IuZ2V0RmVhdHVyZSgpLAotCQkJCQkJCQlvcHRpb25hbEZlYXR1cmVzLAotCQkJCQkJCQl1bmNvbmZpZ3VyZWRPcHRpb25hbEZlYXR1cmVzLAotCQkJCQkJCQl2ZXJpZmljYXRpb25MaXN0ZW5lcik7Ci0JCQkJCQlvcGVyYXRpb25zW2ldID0gb3A7Ci0JCQkJCX0KLQkJCQkJSU9wZXJhdGlvbiBpbnN0YWxsT3BlcmF0aW9uID0KLQkJCQkJCU9wZXJhdGlvbnNNYW5hZ2VyCi0JCQkJCQkJLmdldE9wZXJhdGlvbkZhY3RvcnkoKQotCQkJCQkJCS5jcmVhdGVCYXRjaEluc3RhbGxPcGVyYXRpb24oCi0JCQkJCQkJb3BlcmF0aW9ucyk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQluZWVkc1Jlc3RhcnQgPSBpbnN0YWxsT3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgSW5zdGFsbFdpemFyZC50aGlzKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJYm9vbGVhbiByZXRyeTsKLQkJCWRvIHsKLQkJCQlyZXRyeSA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOwotCQkJCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJCQlUaHJvd2FibGUgdGFyZ2V0RXhjZXB0aW9uID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJCQkJaWYgKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX1lbHNlIGlmKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIEZlYXR1cmVEb3dubG9hZEV4Y2VwdGlvbil7Ci0JCQkJCQkJRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uIGZkZT0oRmVhdHVyZURvd25sb2FkRXhjZXB0aW9uKXRhcmdldEV4Y2VwdGlvbjsKLQkJCQkJCQlyZXRyeSA9Ci0JCQkJCQkJTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQkJCQkJCWdldFNoZWxsKCksCi0JCQkJCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5yZXRyeVRpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJZmRlLmdldE1lc3NhZ2UoKSsiXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSsgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLnJldHJ5IikpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJaWYgKHJldHJ5KQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9IHdoaWxlIChyZXRyeSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlzUnVubmluZyA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXNlYXJjaFJ1bm5lciA9IG5ldyBTZWFyY2hSdW5uZXIoZ2V0U2hlbGwoKSwgZ2V0Q29udGFpbmVyKCkpOwotCi0JCWlmIChzZWFyY2hSZXF1ZXN0ID09IG51bGwgJiYgam9icyA9PSBudWxsKSB7Ci0JCQltb2RlUGFnZSA9IG5ldyBNb2RlU2VsZWN0aW9uUGFnZShzZWFyY2hSdW5uZXIpOwotCQkJYWRkUGFnZShtb2RlUGFnZSk7Ci0JCQlzaXRlUGFnZSA9IG5ldyBTaXRlUGFnZShzZWFyY2hSdW5uZXIpOwotCQkJYWRkUGFnZShzaXRlUGFnZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZWFyY2hSdW5uZXIuc2V0U2VhcmNoUHJvdmlkZXIodGhpcyk7Ci0JCQlpZiAoam9icyAhPSBudWxsKQotCQkJCXNlYXJjaFJ1bm5lci5zZXROZXdTZWFyY2hOZWVkZWQoZmFsc2UpOwotCQl9Ci0JCXJldmlld1BhZ2UgPSBuZXcgUmV2aWV3UGFnZShzZWFyY2hSdW5uZXIsIGpvYnMpOwotCQlzZWFyY2hSdW5uZXIuc2V0UmVzdWx0Q29sbGVjdG9yKHJldmlld1BhZ2UpOwotCQlhZGRQYWdlKHJldmlld1BhZ2UpOwotCi0JCXRyeSB7Ci0vLwkJCWNvbmZpZyA9IFVwZGF0ZVV0aWxzLmNyZWF0ZUluc3RhbGxDb25maWd1cmF0aW9uKCk7Ci0JCQljb25maWcgPSBTaXRlTWFuYWdlci5nZXRMb2NhbFNpdGUoKS5nZXRDdXJyZW50Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWxpY2Vuc2VQYWdlID0gbmV3IExpY2Vuc2VQYWdlKHRydWUpOwotCQlhZGRQYWdlKGxpY2Vuc2VQYWdlKTsKLQkJb3B0aW9uYWxGZWF0dXJlc1BhZ2UgPSBuZXcgT3B0aW9uYWxGZWF0dXJlc1BhZ2UoY29uZmlnKTsKLQkJYWRkUGFnZShvcHRpb25hbEZlYXR1cmVzUGFnZSk7Ci0JCXRhcmdldFBhZ2UgPSBuZXcgVGFyZ2V0UGFnZShjb25maWcpOwotCQlhZGRQYWdlKHRhcmdldFBhZ2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlU2V0dGluZ3MoKSB7Ci0JCWlmIChtb2RlUGFnZSAhPSBudWxsKQotCQkJbW9kZVBhZ2Uuc2F2ZVNldHRpbmdzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUGFnZVJlcXVpcmVkKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJaWYgKHBhZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJCQotCQlpZiAocGFnZS5lcXVhbHMobGljZW5zZVBhZ2UpKSB7Ci0JCQlyZXR1cm4gT3BlcmF0aW9uc01hbmFnZXIuaGFzU2VsZWN0ZWRKb2JzV2l0aExpY2Vuc2VzKAotCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCkpOwotCQl9Ci0JCWlmIChwYWdlLmVxdWFscyhvcHRpb25hbEZlYXR1cmVzUGFnZSkpIHsKLQkJCXJldHVybiBPcGVyYXRpb25zTWFuYWdlci5oYXNTZWxlY3RlZEpvYnNXaXRoT3B0aW9uYWxGZWF0dXJlcygKLQkJCQlyZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpKTsKLQkJfQotCQlpZiAocGFnZS5lcXVhbHModGFyZ2V0UGFnZSkpIHsKLQkJCXJldHVybiByZXZpZXdQYWdlLmdldFNlbGVjdGVkSm9icygpLmxlbmd0aCA+IDA7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIHBhZ2UpIHsKLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IGdldFBhZ2VzKCk7Ci0JCWJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKLQkJSVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBudWxsOwotCi0JCWlmIChtb2RlUGFnZSAhPSBudWxsICYmIHBhZ2UuZXF1YWxzKG1vZGVQYWdlKSkgewotCQkJYm9vbGVhbiB1cGRhdGUgPSBtb2RlUGFnZS5pc1VwZGF0ZU1vZGUoKTsKLQkJCWlmICh1cGRhdGUpCi0JCQkJcmV0dXJuIHJldmlld1BhZ2U7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIHNpdGVQYWdlOwotCQl9Ci0JCWlmIChzaXRlUGFnZSAhPSBudWxsICYmIHBhZ2UuZXF1YWxzKHNpdGVQYWdlKSkKLQkJCXJldHVybiByZXZpZXdQYWdlOwotCi0JCWlmIChwYWdlLmVxdWFscyhyZXZpZXdQYWdlKSkgewotCQkJdXBkYXRlRHluYW1pY1BhZ2VzKCk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGFnZXNbaV0uZXF1YWxzKHBhZ2UpKSB7Ci0JCQkJc3RhcnQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChzdGFydCkgewotCQkJCWlmIChpc1BhZ2VSZXF1aXJlZChwYWdlc1tpXSkpIHsKLQkJCQkJbmV4dFBhZ2UgPSBwYWdlc1tpXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRHluYW1pY1BhZ2VzKCkgewotCQlpZiAobGljZW5zZVBhZ2UgIT0gbnVsbCkgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gbGljZW5zZUpvYnMgPQotCQkJCU9wZXJhdGlvbnNNYW5hZ2VyLmdldFNlbGVjdGVkSm9ic1dpdGhMaWNlbnNlcygKLQkJCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKSk7Ci0JCQlsaWNlbnNlUGFnZS5zZXRKb2JzKGxpY2Vuc2VKb2JzKTsKLQkJfQotCQlpZiAob3B0aW9uYWxGZWF0dXJlc1BhZ2UgIT0gbnVsbCkgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gb3B0aW9uYWxKb2JzID0KLQkJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRTZWxlY3RlZEpvYnNXaXRoT3B0aW9uYWxGZWF0dXJlcygKLQkJCQkJcmV2aWV3UGFnZS5nZXRTZWxlY3RlZEpvYnMoKSk7Ci0JCQlvcHRpb25hbEZlYXR1cmVzUGFnZS5zZXRKb2JzKG9wdGlvbmFsSm9icyk7Ci0JCX0KLQkJaWYgKHRhcmdldFBhZ2UgIT0gbnVsbCkgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gaW5zdGFsbEpvYnMgPQotCQkJCXJldmlld1BhZ2UuZ2V0U2VsZWN0ZWRKb2JzKCk7Ci0JCQl0YXJnZXRQYWdlLnNldEpvYnMoaW5zdGFsbEpvYnMpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlJV2l6YXJkUGFnZSBwYWdlID0gZ2V0Q29udGFpbmVyKCkuZ2V0Q3VycmVudFBhZ2UoKTsKLQkJcmV0dXJuIHBhZ2UuZXF1YWxzKHRhcmdldFBhZ2UpICYmIHBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoCi0JCUlGZWF0dXJlIGZlYXR1cmUsCi0JCUlGZWF0dXJlUmVmZXJlbmNlW10gb3B0aW9uYWxGZWF0dXJlcykgewotCQkvLyB3YWxrIHRoZSBoaWVhcmFyY2h5IGFuZCBwcmVzZXJ2ZSB0aGUgb3JpZ2luYXRpbmcgVVJMCi0JCS8vIGZvciBhbGwgdGhlIG9wdGlvbmFsIGZlYXR1cmVzIHRoYXQgYXJlIG5vdCBjaG9zZW4gdG8KLQkJLy8gYmUgaW5zdGFsbGVkLgotCQlVUkwgdXJsID0gZmVhdHVyZS5nZXRTaXRlKCkuZ2V0VVJMKCk7Ci0JCXRyeSB7Ci0JCQlJSW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlW10gaXJlZnMgPQotCQkJCWZlYXR1cmUuZ2V0SW5jbHVkZWRGZWF0dXJlUmVmZXJlbmNlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgewotCQkJCUlJbmNsdWRlZEZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOwotCQkJCWJvb2xlYW4gcHJlc2VydmUgPSBmYWxzZTsKLQkJCQlpZiAoaXJlZi5pc09wdGlvbmFsKCkpIHsKLQkJCQkJYm9vbGVhbiBvblRoZUxpc3QgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBvcHRpb25hbEZlYXR1cmVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAob3B0aW9uYWxGZWF0dXJlc1tqXS5lcXVhbHMoaXJlZikpIHsKLQkJCQkJCQkvL3dhcyBvbiB0aGUgbGlzdAotCQkJCQkJCW9uVGhlTGlzdCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFvblRoZUxpc3QpCi0JCQkJCQlwcmVzZXJ2ZSA9IHRydWU7Ci0JCQkJfQotCQkJCWlmIChwcmVzZXJ2ZSkgewotCQkJCQl0cnkgewotCQkJCQkJU3RyaW5nIGlkID0KLQkJCQkJCQlpcmVmLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJCQlVcGRhdGVVSS5zZXRPcmlnaW5hdGluZ1VSTChpZCwgdXJsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBTaWxlbnRseSBpZ25vcmUKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShudWxsKTsKLQkJCQkJCXByZXNlcnZlT3JpZ2luYXRpbmdVUkxzKGlmZWF0dXJlLCBvcHRpb25hbEZlYXR1cmVzKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBTaWxlbnRseSBpZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaWxlbnRseSBpZ25vcmUKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLklPcGVyYXRpb25MaXN0ZW5lciNhZnRlckV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZnRlckV4ZWN1dGUoSU9wZXJhdGlvbiBvcGVyYXRpb24sIE9iamVjdCBkYXRhKSB7Ci0JCWlmICghKG9wZXJhdGlvbiBpbnN0YW5jZW9mIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIG9wZXJhdGlvbjsKLQkJSUZlYXR1cmUgb2xkRmVhdHVyZSA9IGpvYi5nZXRPbGRGZWF0dXJlKCk7Ci0JCWlmIChvbGRGZWF0dXJlID09IG51bGwgJiYgam9iLmdldE9wdGlvbmFsRmVhdHVyZXMoKSAhPSBudWxsKQotCQkJcHJlc2VydmVPcmlnaW5hdGluZ1VSTHMoCi0JCQkJam9iLmdldEZlYXR1cmUoKSwKLQkJCQlqb2IuZ2V0T3B0aW9uYWxGZWF0dXJlcygpKTsKLQotCQlpbnN0YWxsQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbkxpc3RlbmVyI2JlZm9yZUV4ZWN1dGUob3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuSU9wZXJhdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiZWZvcmVFeGVjdXRlKElPcGVyYXRpb24gb3BlcmF0aW9uLCBPYmplY3QgZGF0YSkgewotCQkvLwkJaWYgKG9wZXJhdGlvbiBpbnN0YW5jZW9mIElCYXRjaE9wZXJhdGlvbgotCQkvLwkJCSYmIGRhdGEgIT0gbnVsbAotCQkvLwkJCSYmIGRhdGEgaW5zdGFuY2VvZiBBcnJheUxpc3QpIHsKLQkJLy8KLQkJLy8JCQlEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cyIGRpYWxvZyA9Ci0JCS8vCQkJCW5ldyBEdXBsaWNhdGVDb25mbGljdHNEaWFsb2cyKGdldFNoZWxsKCksIChBcnJheUxpc3QpIGRhdGEpOwotCQkvLwkJCWlmIChkaWFsb2cub3BlbigpICE9IDApCi0JCS8vCQkJCXJldHVybiBmYWxzZTsKLQkJLy8JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLklTZWFyY2hQcm92aWRlcjIjZ2V0U2VhcmNoUmVxdWVzdCgpCi0JICovCi0JcHVibGljIFVwZGF0ZVNlYXJjaFJlcXVlc3QgZ2V0U2VhcmNoUmVxdWVzdCgpIHsKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1J1bm5pbmcoKSB7Ci0JCXJldHVybiBpc1J1bm5pbmc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTGljZW5zZVBhZ2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xpY2Vuc2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OGM2ZWEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTGljZW5zZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi1wdWJsaWMgY2xhc3MgTGljZW5zZVBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgSUR5bmFtaWNQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0MyID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVzYzIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BQ0NFUFQgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5hY2NlcHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERUNMSU5FID0gIkluc3RhbGxXaXphcmQuTGljZW5zZVBhZ2UuZGVjbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDQ0VQVDIgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5hY2NlcHQyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVDTElORTIgPSAiSW5zdGFsbFdpemFyZC5MaWNlbnNlUGFnZS5kZWNsaW5lMiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gbXVsdGlMaWNlbnNlTW9kZSA9IGZhbHNlOwotCXByaXZhdGUgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gam9iczsKLQlwcml2YXRlIFRleHQgdGV4dDsKLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIExpY2Vuc2VQYWdlMgotCSAqLwotCXB1YmxpYyBMaWNlbnNlUGFnZShib29sZWFuIG11bHRpTGljZW5zZU1vZGUpIHsKLQkJc3VwZXIoIkxpY2Vuc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1RJVExFKSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMubXVsdGlMaWNlbnNlTW9kZSA9IG11bHRpTGljZW5zZU1vZGU7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJc2V0RGVzY3JpcHRpb24oCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoCi0JCQkJbXVsdGlMaWNlbnNlTW9kZSA/IEtFWV9ERVNDMiA6IEtFWV9ERVNDKSk7Ci0JfQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXB1YmxpYyBMaWNlbnNlUGFnZShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7Ci0JCXRoaXMoZmFsc2UpOwotCQlzZXRKb2JzKG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSB7IGpvYiB9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRKb2JzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsKLQkJdGhpcy5qb2JzID0gam9iczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNsaWVudC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLkxpY2Vuc2VQYWdlMiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKG11bHRpTGljZW5zZU1vZGUpIHsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCi0JCQl0YWJsZSA9IG5ldyBUYWJsZShjbGllbnQsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCi0JCQl0YWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWlmIChlLml0ZW0gIT0gbnVsbCkgewotCQkJCQkJT2JqZWN0IGRhdGEgPSBlLml0ZW0uZ2V0RGF0YSgpOwotCQkJCQkJdGV4dC5zZXRUZXh0KChkYXRhID09IG51bGwpID8gIiIgOiAoU3RyaW5nKSBkYXRhKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQl0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJfQotCQl0ZXh0ID0KLQkJCW5ldyBUZXh0KAotCQkJCWNsaWVudCwKLQkJCQlTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULlJFQURfT05MWSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKG11bHRpTGljZW5zZU1vZGUpCi0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRleHQuc2V0QmFja2dyb3VuZCh0ZXh0LmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWlmIChtdWx0aUxpY2Vuc2VNb2RlKQotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJZmluYWwgQnV0dG9uIGFjY2VwdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUkFESU8pOwotCQlhY2NlcHRCdXR0b24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhtdWx0aUxpY2Vuc2VNb2RlID8gS0VZX0FDQ0VQVDIgOiBLRVlfQUNDRVBUKSk7Ci0JCWFjY2VwdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoYWNjZXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCUJ1dHRvbiBkZWNsaW5lQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5SQURJTyk7Ci0JCWRlY2xpbmVCdXR0b24uc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZyhtdWx0aUxpY2Vuc2VNb2RlID8gS0VZX0RFQ0xJTkUyIDogS0VZX0RFQ0xJTkUpKTsKLQkJZGVjbGluZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXRQYWdlQ29tcGxldGUoYWNjZXB0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0JCXNldENvbnRyb2woY2xpZW50KTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgeyAvLyBUTyBETzogT3B0aW1pemUgb3V0IHRoZSBjYXNlIHdoZXJlIGEgZmVhdHVyZSBkb2VzIG5vdCBoYXZlIGEgbGljZW5zZT8KLQkJaWYgKHZpc2libGUpIHsKLQkJCWlmIChtdWx0aUxpY2Vuc2VNb2RlKSB7Ci0JCQkJVGFibGVJdGVtIGl0ZW07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2JzW2ldLmdldEZlYXR1cmUoKTsKLQkJCQkJaXRlbSA9IG5ldyBUYWJsZUl0ZW0odGFibGUsIFNXVC5OT05FKTsKLQkJCQkJU3RyaW5nIGxhYmVsID0KLQkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKQotCQkJCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGZlYXR1cmUuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCQlpdGVtLnNldFRleHQobGFiZWwpOwotCQkJCQlpdGVtLnNldEltYWdlKAotCQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJCQkJZmVhdHVyZS5pc1BhdGNoKCkKLQkJCQkJCQkJPyBVcGRhdGVVSUltYWdlcy5ERVNDX0VGSVhfT0JKCi0JCQkJCQkJCTogVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSikpOwotCQkJCQlTdHJpbmcgbGljZW5zZSA9IGZlYXR1cmUuZ2V0TGljZW5zZSgpLmdldEFubm90YXRpb24oKTsKLQkJCQkJLy8gUXVlc3Rpb246IENhbiB0aGlzIGV2ZXIgYmUgbnVsbD8gV2hhdCBpcyB0aGUgcnVudGltZSBjb3N0PwotCQkJCQlpdGVtLnNldERhdGEobGljZW5zZSk7Ci0JCQkJfQotCi0JCQkJdGFibGUuc2V0U2VsZWN0aW9uKDApOwotCQkJfQotCQkJc2hvd0xpY2Vuc2VUZXh0KCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobXVsdGlMaWNlbnNlTW9kZSkgewotCQkJCVRhYmxlSXRlbSBpdGVtc1tdID0gdGFibGUuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0gaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJdGFibGUuZ2V0SXRlbShpKS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3dMaWNlbnNlVGV4dCgpIHsKLQkJaWYgKCFtdWx0aUxpY2Vuc2VNb2RlKSB7Ci0JCQl0ZXh0LnNldFRleHQoam9ic1swXS5nZXRGZWF0dXJlKCkuZ2V0TGljZW5zZSgpLmdldEFubm90YXRpb24oKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVGFibGVJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IHRhYmxlLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPT0gMCkgewotCQkJdGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJT2JqZWN0IGRhdGEgPSBzZWxlY3RlZEl0ZW1zWzBdLmdldERhdGEoKTsKLQkJCXRleHQuc2V0VGV4dCgoZGF0YSA9PSBudWxsKSA/ICIiIDogKFN0cmluZykgZGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xvY2FsU2l0ZVNlbGVjdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Mb2NhbFNpdGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjk2MDFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL0xvY2FsU2l0ZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbFNpdGVTZWxlY3RvciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGxhc3RMb2NhdGlvbiA9IG51bGw7Ci0JcHVibGljIExvY2FsU2l0ZVNlbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFyayBnZXRMb2NhTFNpdGUoU2hlbGwgcGFyZW50KSB7Ci0JCURpcmVjdG9yeURpYWxvZyBkaWFsb2cgPSBuZXcgRGlyZWN0b3J5RGlhbG9nKHBhcmVudCk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKAotCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJMb2NhbFNpdGVTZWxlY3Rvci5kaWFsb2dNZXNzYWdlIikpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGxhc3RMb2NhdGlvbik7Ci0JCVN0cmluZyBkaXIgPSBkaWFsb2cub3BlbigpOwotCi0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPSBudWxsOwotCQl3aGlsZSAoZGlyICE9IG51bGwgJiYgc2l0ZUJvb2ttYXJrID09IG51bGwpIHsKLQkJCUZpbGUgZGlyRmlsZSA9IG5ldyBGaWxlKGRpcik7Ci0JCQlpZiAoaXNEaXJTaXRlKGRpckZpbGUpKSB7Ci0JCQkJc2l0ZUJvb2ttYXJrID0gY3JlYXRlRGlyU2l0ZShkaXJGaWxlKTsKLQkJCQlsYXN0TG9jYXRpb24gPSBkaXI7Ci0JCQl9IGVsc2UgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCQlwYXJlbnQsCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiTG9jYWxTaXRlU2VsZWN0b3IuZGlySW5mb1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJMb2NhbFNpdGVTZWxlY3Rvci5kaXJJbmZvTWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWRpYWxvZy5zZXRGaWx0ZXJQYXRoKGRpcik7Ci0JCQkJZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2l0ZUJvb2ttYXJrOwotCX0KLQlwdWJsaWMgc3RhdGljIFNpdGVCb29rbWFyayBnZXRMb2NhTFppcHBlZFNpdGUoU2hlbGwgcGFyZW50KSB7Ci0JCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2cocGFyZW50KTsKLQkJZGlhbG9nLnNldFRleHQoCi0JCQlVcGRhdGVVSS5nZXRTdHJpbmcoIkxvY2FsU2l0ZVNlbGVjdG9yLmRpYWxvZ01lc3NhZ2V6aXAiKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy9kaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyAiKi56aXAiLCAiKi5qYXIiIH0pOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRGaWx0ZXJFeHRlbnNpb25zKG5ldyBTdHJpbmdbXSB7ICIqLmphcjsqLnppcCIgfSk7IC8vJE5PTi1OTFMtMSQKLQotCQlTaXRlQm9va21hcmsgc2l0ZUJvb2ttYXJrID0gbnVsbDsKLQotCQlTdHJpbmcgemlwID0gZGlhbG9nLm9wZW4oKTsKLQkJd2hpbGUgKHppcCAhPSBudWxsICYmIHNpdGVCb29rbWFyayA9PSBudWxsKSB7Ci0JCQlGaWxlIHppcEYgPSBuZXcgRmlsZSh6aXApOwotCQkJaWYgKGlzWmlwU2l0ZSh6aXBGKSkgewotCQkJCXNpdGVCb29rbWFyayA9IGNyZWF0ZVppcFNpdGUoemlwRik7Ci0JCQl9IGVsc2UgewotCQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKAotCQkJCQlwYXJlbnQsCi0JCQkJCVVwZGF0ZVVJLmdldFN0cmluZygiTG9jYWxTaXRlU2VsZWN0b3IuemlwSW5mb1RpdGxlIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJMb2NhbFNpdGVTZWxlY3Rvci56aXBJbmZvTWVzc2FnZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJCXppcCA9IGRpYWxvZy5vcGVuKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNpdGVCb29rbWFyazsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIHRoZSB6aXAgZmlsZSBjb250YWlucyBhbiB1cGRhdGUgc2l0ZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogQHJldHVybgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzWmlwU2l0ZShGaWxlIGZpbGUpIHsKLQkJaWYgKCFmaWxlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuemlwIikgLy8kTk9OLU5MUy0xJAotCQkJJiYgIWZpbGUuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlaaXBwZWRTaXRlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBaaXBwZWRTaXRlVmFsaWRhdG9yKGZpbGUpOwotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZSgKLQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCkuZ2V0RGlzcGxheSgpLAotCQkJdmFsaWRhdG9yKTsKLQkJcmV0dXJuIHZhbGlkYXRvci5pc1ZhbGlkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgZGlyIGNvbnRhaW5zIGFuIHVwZGF0ZSBzaXRlCi0JICogCi0JICogQHBhcmFtIGRpcgotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0RpclNpdGUoRmlsZSBkaXIpIHsKLQkJRmlsZSBzaXRlWE1MID0gbmV3IEZpbGUoZGlyLCAic2l0ZS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGZlYXR1cmVzRGlyID0gbmV3IEZpbGUoZGlyLCAiZmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIHBsdWdpbnNEaXIgPSBuZXcgRmlsZShkaXIsICJwbHVnaW5zIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHNpdGVYTUwuZXhpc3RzKCkKLQkJCXx8IGZlYXR1cmVzRGlyLmV4aXN0cygpCi0JCQkmJiBmZWF0dXJlc0Rpci5pc0RpcmVjdG9yeSgpCi0JCQkmJiBwbHVnaW5zRGlyLmV4aXN0cygpCi0JCQkmJiBwbHVnaW5zRGlyLmlzRGlyZWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJvb2ttYXJrIHRvIGEgemlwcGVkIHNpdGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgU2l0ZUJvb2ttYXJrIGNyZWF0ZVppcFNpdGUoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgZmlsZVVSTCA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJVVJMIHVybCA9Ci0JCQkJbmV3IFVSTCgKLQkJCQkJImphcjoiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCSsgZmlsZVVSTC50b0V4dGVybmFsRm9ybSgpLnJlcGxhY2UoJ1xcJywgJy8nKQotCQkJCQkJKyAiIS8iKTsgLy8kTk9OLU5MUy0xJAotCQkJU2l0ZUJvb2ttYXJrIHNpdGUgPSBuZXcgU2l0ZUJvb2ttYXJrKGZpbGUuZ2V0TmFtZSgpLCB1cmwsIGZhbHNlKTsKLQkJCXNpdGUuc2V0TG9jYWwodHJ1ZSk7Ci0JCQlyZXR1cm4gc2l0ZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGJvb2ttYXJrIHRvIGEgc2l0ZSBvbiB0aGUgZmlsZSBzeXN0ZW0KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4KLQkgKi8KLQlzdGF0aWMgU2l0ZUJvb2ttYXJrIGNyZWF0ZURpclNpdGUoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gZmlsZS50b1VSTCgpOwotCQkJU3RyaW5nIHNpdGVOYW1lID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCVNpdGVCb29rbWFyayBzaXRlID0gbmV3IFNpdGVCb29rbWFyayhzaXRlTmFtZSwgdXJsLCBmYWxzZSk7Ci0JCQlzaXRlLnNldExvY2FsKHRydWUpOwotCQkJcmV0dXJuIHNpdGU7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQlzdGF0aWMgY2xhc3MgWmlwcGVkU2l0ZVZhbGlkYXRvciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJRmlsZSBmaWxlOwotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCXB1YmxpYyBaaXBwZWRTaXRlVmFsaWRhdG9yKEZpbGUgZmlsZSkgewotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlaaXBGaWxlIHNpdGVaaXAgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBjaGVjayBpZiB0aGUgemlwIGZpbGUgY29udGFpbnMgc2l0ZS54bWwKLQkJCQlzaXRlWmlwID0gbmV3IFppcEZpbGUoZmlsZSk7Ci0JCQkJaWYgKHNpdGVaaXAuZ2V0RW50cnkoInNpdGUueG1sIikgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWJvb2xlYW4gaGFzRmVhdHVyZXMgPSBmYWxzZTsKLQkJCQlib29sZWFuIGhhc1BsdWdpbnMgPSBmYWxzZTsKLQkJCQlmb3IgKEVudW1lcmF0aW9uIGVudW0gPSBzaXRlWmlwLmVudHJpZXMoKTsKLQkJCQkJZW51bS5oYXNNb3JlRWxlbWVudHMoKTsKLQkJCQkJKSB7Ci0JCQkJCVppcEVudHJ5IHpFbnRyeSA9IChaaXBFbnRyeSkgZW51bS5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoIWhhc0ZlYXR1cmVzCi0JCQkJCQkmJiB6RW50cnkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImZlYXR1cmVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaGFzRmVhdHVyZXMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmICghaGFzUGx1Z2lucwotCQkJCQkJJiYgekVudHJ5LmdldE5hbWUoKS5zdGFydHNXaXRoKCJwbHVnaW5zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaGFzUGx1Z2lucyA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGhhc0ZlYXR1cmVzICYmIGhhc1BsdWdpbnMpIHsKLQkJCQkJCXZhbGlkID0gdHJ1ZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChzaXRlWmlwICE9IG51bGwpIHsKLQkJCQkJCXNpdGVaaXAuY2xvc2UoKTsKLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZhbGlkLiAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Nb2RlU2VsZWN0aW9uUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTW9kZVNlbGVjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMjIxYy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9Nb2RlU2VsZWN0aW9uUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5vcGVyYXRpb25zLlVwZGF0ZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTW9kZVNlbGVjdGlvblBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSVNlYXJjaFByb3ZpZGVyIHsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlTW9kZT10cnVlOwotCXByaXZhdGUgQnV0dG9uIHVwZGF0ZXNCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gbmV3RmVhdHVyZXNCdXR0b247Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7Ci0JcHJpdmF0ZSBTZWFyY2hSdW5uZXIgc2VhcmNoUnVubmVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNUSU9OX0lEID0gIk1vZGVTZWxlY3Rpb25QYWdlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX05FV19GRUFUVVJFU19NT0RFID0gIm5ldy1mZWF0dXJlcy1tb2RlIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBNb2RlU2VsZWN0aW9uUGFnZShTZWFyY2hSdW5uZXIgc2VhcmNoUnVubmVyKSB7Ci0JCXN1cGVyKCJtb2RlU2VsZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJNb2RlU2VsZWN0aW9uUGFnZS50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihVcGRhdGVVSS5nZXRTdHJpbmcoIk1vZGVTZWxlY3Rpb25QYWdlLmRlc2MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zZWFyY2hSdW5uZXIgPSBzZWFyY2hSdW5uZXI7Ci0JfQotCQotCXB1YmxpYyBVcGRhdGVTZWFyY2hSZXF1ZXN0IGdldFNlYXJjaFJlcXVlc3QoKSB7Ci0JCWluaXRpYWxpemVTZWFyY2goKTsKLQkJcmV0dXJuIHNlYXJjaFJlcXVlc3Q7Ci0JfQotCQotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGdldFNldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3MgbWFzdGVyID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZWN0aW9uID0gbWFzdGVyLmdldFNlY3Rpb24oU0VDVElPTl9JRCk7Ci0JCWlmIChzZWN0aW9uPT1udWxsKQotCQkJc2VjdGlvbiA9IG1hc3Rlci5hZGROZXdTZWN0aW9uKFNFQ1RJT05fSUQpOwotCQlyZXR1cm4gc2VjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlYXJjaCgpIHsKLQkJaWYgKHNlYXJjaFJlcXVlc3QhPW51bGwpIHJldHVybjsKLQkJc2VhcmNoUmVxdWVzdCA9IFVwZGF0ZVV0aWxzLmNyZWF0ZU5ld1VwZGF0ZXNSZXF1ZXN0KG51bGwpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLkJhbm5lclBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl1cGRhdGVzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCXVwZGF0ZXNCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIk1vZGVTZWxlY3Rpb25QYWdlLnVwZGF0ZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBuZXdGZWF0dXJlc01vZGUgPSBnZXRTZXR0aW5ncygpLmdldEJvb2xlYW4oUF9ORVdfRkVBVFVSRVNfTU9ERSk7Ci0JCXVwZGF0ZXNCdXR0b24uc2V0U2VsZWN0aW9uKCFuZXdGZWF0dXJlc01vZGUpOwotCQl1cGRhdGVzQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN3aXRjaE1vZGUoKTsKLQkJCX0KLQkJfSk7Ci0JCW5ld0ZlYXR1cmVzQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5SQURJTyk7Ci0JCW5ld0ZlYXR1cmVzQnV0dG9uLnNldFNlbGVjdGlvbihuZXdGZWF0dXJlc01vZGUpOwotCQluZXdGZWF0dXJlc0J1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTW9kZVNlbGVjdGlvblBhZ2UubmV3RmVhdHVyZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmVhdHVyZXNCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3dpdGNoTW9kZSgpOwotCQkJfQotCQl9KTsJCQotCQlzd2l0Y2hNb2RlKCk7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY29tcG9zaXRlLCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk1vZGVTZWxlY3Rpb25QYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzYXZlU2V0dGluZ3MoKSB7Ci0JCWJvb2xlYW4gdXBkYXRlTW9kZSA9IHVwZGF0ZXNCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCWdldFNldHRpbmdzKCkucHV0KFBfTkVXX0ZFQVRVUkVTX01PREUsICF1cGRhdGVNb2RlKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN3aXRjaE1vZGUoKSB7Ci0JCXVwZGF0ZU1vZGUgPSB1cGRhdGVzQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQlpZiAodXBkYXRlTW9kZSkKLQkJCXNlYXJjaFJ1bm5lci5zZXRTZWFyY2hQcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVNb2RlKCkgewotCQlyZXR1cm4gdXBkYXRlTW9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVTaXRlRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9OZXdVcGRhdGVTaXRlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZTMwOWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3VXBkYXRlU2l0ZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgTmV3VXBkYXRlU2l0ZURpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCi0JcHJvdGVjdGVkIFRleHQgbmFtZTsKLQlwcm90ZWN0ZWQgVGV4dCB1cmw7Ci0JcHJpdmF0ZSBCdXR0b24gb2tCdXR0b247Ci0JLyoqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICovCi0JcHVibGljIE5ld1VwZGF0ZVNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24oCi0JCQkJcGFyZW50LAotCQkJCUlEaWFsb2dDb25zdGFudHMuT0tfSUQsCi0JCQkJSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwKLQkJCQl0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKAotCQkJcGFyZW50LAotCQkJSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsCi0JCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwKLQkJCWZhbHNlKTsKLQkJCi0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzUwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTmV3VXBkYXRlU2l0ZURpYWxvZy5uYW1lIikpOyAvLyROT04tTkxTLTEkCi0JCQotCQluYW1lID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmFtZS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2ZXJpZnlDb21wbGV0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiTmV3VXBkYXRlU2l0ZURpYWxvZy51cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXVybCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXVybC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJdXJsLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZlcmlmeUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGaWVsZHMoKSB7Ci0JCXVybC5zZXRUZXh0KCJodHRwOi8vIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1cGRhdGUoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQl0cnkgewotCQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IG5ldyBTaXRlQm9va21hcmsobmFtZS5nZXRUZXh0KCksIG5ldyBVUkwodXJsLmdldFRleHQoKSksIGZhbHNlKTsKLQkJCW1vZGVsLmFkZEJvb2ttYXJrKGJvb2ttYXJrKTsKLQkJCW1vZGVsLnNhdmVCb29rbWFya3MoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcGxldGUoKSB7Ci0JCWlmIChva0J1dHRvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWlmIChuYW1lLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCB8fCB1cmwuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCXJldHVybjsKLQkJfQotCQotCQl0cnkgewotCQkJVVJMIG5ld1VSTCA9IG5ldyBVUkwoVVJMRGVjb2Rlci5kZWNvZGUodXJsLmdldFRleHQoKS50cmltKCksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHVybC5nZXRFZGl0YWJsZSgpKQotCQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoIW5ld1VSTC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZSAKLQkJCQlva0J1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0JCi0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3V2ViU2l0ZURpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvTmV3V2ViU2l0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDNlZWViLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL05ld1dlYlNpdGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkubW9kZWwuKjsKLQotCi1wdWJsaWMgY2xhc3MgTmV3V2ViU2l0ZURpYWxvZyBleHRlbmRzIE5ld1VwZGF0ZVNpdGVEaWFsb2cgewotCi0JcHVibGljIE5ld1dlYlNpdGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXRyeSB7Ci0JCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gbmV3IFNpdGVCb29rbWFyayhuYW1lLmdldFRleHQoKSwgbmV3IFVSTCh1cmwuZ2V0VGV4dCgpKSwgdHJ1ZSk7Ci0JCQltb2RlbC5hZGRCb29rbWFyayhib29rbWFyayk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL09wdGlvbmFsRmVhdHVyZXNQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9PcHRpb25hbEZlYXR1cmVzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2E2N2JkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL09wdGlvbmFsRmVhdHVyZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBPcHRpb25hbEZlYXR1cmVzUGFnZSBleHRlbmRzIEJhbm5lclBhZ2UgaW1wbGVtZW50cyBJRHluYW1pY1BhZ2UgewotCS8vIE5MIGtleXMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJVExFID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UudGl0bGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSRUVfTEFCRUwgPQotCQkiSW5zdGFsbFdpemFyZC5PcHRpb25hbEZlYXR1cmVzUGFnZS50cmVlTGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RfQUxMID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2Uuc2VsZWN0QWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTRUxFQ1RfQUxMID0KLQkJIkluc3RhbGxXaXphcmQuT3B0aW9uYWxGZWF0dXJlc1BhZ2UuZGVzZWxlY3RBbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQlwcml2YXRlIEJ1dHRvbiBzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gZGVzZWxlY3RBbGxCdXR0b247Ci0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOwotCXByaXZhdGUgSm9iUm9vdFtdIGpvYlJvb3RzOwotCi0JY2xhc3MgVHJlZUNvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnQpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBKb2JSb290KSB7Ci0JCQkJcmV0dXJuICgoSm9iUm9vdCkgcGFyZW50KS5nZXRFbGVtZW50cygpOwotCQkJfQotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSB7Ci0JCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZmUgPSAoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIHBhcmVudDsKLQkJCQlPYmplY3Qgcm9vdCA9IGZlLmdldFJvb3QoKTsKLQkJCQlib29sZWFuIG9sZEZlYXR1cmUgPSBmYWxzZTsKLQkJCQlpZiAocm9vdCBpbnN0YW5jZW9mIEpvYlJvb3QpIHsKLQkJCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9ICgoSm9iUm9vdClyb290KS5nZXRKb2IoKTsKLQkJCQkJYm9vbGVhbiBwYXRjaCA9IFVwZGF0ZVV0aWxzLmlzUGF0Y2goam9iLmdldEZlYXR1cmUoKSk7Ci0JCQkJCW9sZEZlYXR1cmUgPSBqb2IuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGw7Ci0JCQkJCXJldHVybiBmZS5nZXRDaGlsZHJlbihvbGRGZWF0dXJlLCBwYXRjaCwgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBjaGlsZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgcGFyZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4ocGFyZW50KS5sZW5ndGggPiAwOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJaWYgKGpvYlJvb3RzID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQlyZXR1cm4gam9iUm9vdHM7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUcmVlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IG9iaikgewotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIEpvYlJvb3QpIHsKLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gKChKb2JSb290KSBvYmopLmdldEpvYigpLmdldEZlYXR1cmUoKTsKLQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpCi0JCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChvYmogaW5zdGFuY2VvZiBGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgewotCQkJCVN0cmluZyBuYW1lID0gKChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgb2JqKS5nZXRMYWJlbCgpOwotCQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5nZXQoCi0JCQkJVXBkYXRlVUlJbWFnZXMuREVTQ19GRUFUVVJFX09CSik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmV2aWV3UGFnZTIKLQkgKi8KLQlwdWJsaWMgT3B0aW9uYWxGZWF0dXJlc1BhZ2UoSUluc3RhbGxDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlcigiT3B0aW9uYWxGZWF0dXJlcyIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZyhLRVlfVElUTEUpKTsKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9ERVNDKSk7Ci0JCXRoaXMuY29uZmlnID0gY29uZmlnOwotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmNvbm5lY3QodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Sm9icyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzKSB7Ci0JCWpvYlJvb3RzID0gbmV3IEpvYlJvb3Rbam9icy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsKLQkJCWpvYlJvb3RzW2ldID0gbmV3IEpvYlJvb3Qoam9ic1tpXSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZUNoZWNrYm94VHJlZVZpZXdlcihjbGllbnQpOwotCi0JCXNlbGVjdEFsbEJ1dHRvbiA9IG5ldyBCdXR0b24oY2xpZW50LCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RBbGwodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCQlzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX1NFTEVDVF9BTEwpKTsKLQkJR3JpZERhdGEgZ2QgPQotCQkJbmV3IEdyaWREYXRhKAotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7Ci0JCXNlbGVjdEFsbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KHNlbGVjdEFsbEJ1dHRvbik7Ci0KLQkJZGVzZWxlY3RBbGxCdXR0b24gPSBuZXcgQnV0dG9uKGNsaWVudCwgU1dULlBVU0gpOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RBbGwoZmFsc2UpOwotCQkJfQotCQl9KTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX0RFU0VMRUNUX0FMTCkpOwotCQlnZCA9Ci0JCQluZXcgR3JpZERhdGEoCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZGVzZWxlY3RBbGxCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChkZXNlbGVjdEFsbEJ1dHRvbik7Ci0JCVdvcmtiZW5jaEhlbHAuc2V0SGVscChjbGllbnQsICJvcmcuZWNsaXBzZS51cGRhdGUudWkuTXVsdGlPcHRpb25hbEZlYXR1cmVzUGFnZTIiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQkKLQkJcmV0dXJuIGNsaWVudDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2hlY2tib3hUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKEtFWV9UUkVFX0xBQkVMKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXRyZWVWaWV3ZXIgPQotCQkJbmV3IENoZWNrYm94VHJlZVZpZXdlcihwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC52ZXJ0aWNhbFNwYW4gPSAyOwotCQl0cmVlVmlld2VyLmdldFRyZWUoKS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdHJlZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRyZWVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVHJlZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXRyZWVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJaGFuZGxlQ2hlY2tlZChlLmdldEVsZW1lbnQoKSwgZS5nZXRDaGVja2VkKCkpOwotCQkJfQotCQl9KTsKLQkJdHJlZVZpZXdlci5zZXRBdXRvRXhwYW5kTGV2ZWwoQWJzdHJhY3RUcmVlVmlld2VyLkFMTF9MRVZFTFMpOwotCQl0cmVlVmlld2VyLnNldElucHV0KHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCWlmICh2aXNpYmxlKSB7Ci0JCQl0cmVlVmlld2VyLnNldElucHV0KGpvYlJvb3RzKTsKLQkJCWluaXRpYWxpemVTdGF0ZXMoKTsKLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0Rm9jdXMoKTsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTdGF0ZXMoKSB7Ci0JCUFycmF5TGlzdCBjaGVja2VkID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgZ3JheWVkID0gbmV3IEFycmF5TGlzdCgpOwotCQlBcnJheUxpc3QgZWRpdGFibGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JSb290cy5sZW5ndGg7IGkrKykgewotCQkJY2hlY2tlZC5hZGQoam9iUm9vdHNbaV0pOwotCQkJZ3JheWVkLmFkZChqb2JSb290c1tpXSk7Ci0JCQlib29sZWFuIHVwZGF0ZSA9IGpvYlJvb3RzW2ldLmdldEpvYigpLmdldE9sZEZlYXR1cmUoKSAhPSBudWxsOwotCQkJaW5pdGlhbGl6ZVN0YXRlcyh1cGRhdGUsIGpvYlJvb3RzW2ldLmdldEVsZW1lbnRzKCksIGNoZWNrZWQsIGdyYXllZCwgZWRpdGFibGUpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZEVsZW1lbnRzKGNoZWNrZWQudG9BcnJheSgpKTsKLQkJdHJlZVZpZXdlci5zZXRHcmF5ZWRFbGVtZW50cyhncmF5ZWQudG9BcnJheSgpKTsKLQkJc2VsZWN0QWxsQnV0dG9uLnNldEVuYWJsZWQoZWRpdGFibGUuc2l6ZSgpPjApOwotCQlkZXNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKGVkaXRhYmxlLnNpemUoKT4wKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVN0YXRlcygKLQkJYm9vbGVhbiB1cGRhdGUsCi0JCU9iamVjdFtdIGVsZW1lbnRzLAotCQlBcnJheUxpc3QgY2hlY2tlZCwKLQkJQXJyYXlMaXN0IGdyYXllZCwKLQkJQXJyYXlMaXN0IGVkaXRhYmxlKSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9Ci0JCQkJKEZlYXR1cmVIaWVyYXJjaHlFbGVtZW50KSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmlzQ2hlY2tlZCgpKQotCQkJCWNoZWNrZWQuYWRkKGVsZW1lbnQpOwotCQkJaWYgKCFlbGVtZW50LmlzRWRpdGFibGUoKSkKLQkJCQlncmF5ZWQuYWRkKGVsZW1lbnQpOwotCQkJZWxzZQotCQkJCWVkaXRhYmxlLmFkZChlbGVtZW50KTsKLQkJCWluaXRpYWxpemVTdGF0ZXModXBkYXRlLCBlbGVtZW50LmdldENoaWxkcmVuKCksIGNoZWNrZWQsIGdyYXllZCwgZWRpdGFibGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEFsbChib29sZWFuIHZhbHVlKSB7Ci0JCUFycmF5TGlzdCBzZWxlY3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JSb290cy5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IGpvYlJvb3RzW2ldLmdldEpvYigpOwotCQkJc2VsZWN0ZWQuYWRkKGpvYik7Ci0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGpvYlJvb3RzW2ldLmdldEVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZWxlbWVudCA9IChGZWF0dXJlSGllcmFyY2h5RWxlbWVudCkgZWxlbWVudHNbal07Ci0JCQkJc2VsZWN0QWxsKGpvYi5nZXRPbGRGZWF0dXJlKCkgIT0gbnVsbCwgZWxlbWVudCwgc2VsZWN0ZWQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQl0cmVlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyhzZWxlY3RlZC50b0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RBbGwoCi0JCWJvb2xlYW4gdXBkYXRlLAotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudCByZWYsCi0JCUFycmF5TGlzdCBzZWxlY3RlZCwKLQkJYm9vbGVhbiB2YWx1ZSkgewotCi0JCWlmICghcmVmLmlzT3B0aW9uYWwoKSkgewotCQkJc2VsZWN0ZWQuYWRkKHJlZik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmVmLmlzRWRpdGFibGUoKSkgewotCQkJCXJlZi5zZXRDaGVja2VkKHZhbHVlKTsKLQkJCQlpZiAodmFsdWUpCi0JCQkJCXNlbGVjdGVkLmFkZChyZWYpOwotCQkJfSBlbHNlIGlmIChyZWYuaXNDaGVja2VkKCkpIHsKLQkJCQlzZWxlY3RlZC5hZGQocmVmKTsKLQkJCX0KLQkJfQotCQlPYmplY3RbXSBpbmNsdWRlZCA9IHJlZi5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluY2x1ZGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlzZWxlY3RBbGwodXBkYXRlLCAoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGluY2x1ZGVkW2ldLCBzZWxlY3RlZCwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNoZWNrZWQoT2JqZWN0IGVsZW1lbnQsIGJvb2xlYW4gY2hlY2tlZCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEpvYlJvb3QpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50LCAhY2hlY2tlZCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQgZmUgPSAoRmVhdHVyZUhpZXJhcmNoeUVsZW1lbnQpIGVsZW1lbnQ7Ci0KLQkJaWYgKCFmZS5pc0VkaXRhYmxlKCkpCi0JCQl0cmVlVmlld2VyLnNldENoZWNrZWQoZWxlbWVudCwgIWNoZWNrZWQpOwotCQllbHNlIHsKLQkJCS8vIHVwZGF0ZSB0aGUgcmVzdWx0Ci0JCQlmZS5zZXRDaGVja2VkKGNoZWNrZWQpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJRmVhdHVyZVtdIGdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiwgSUNvbmZpZ3VyZWRTaXRlIHRhcmdldFNpdGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JSb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGpvYi5lcXVhbHMoam9iUm9vdHNbaV0uZ2V0Sm9iKCkpKSB7Ci0JCQkJcmV0dXJuIGpvYlJvb3RzW2ldLmdldFVuY29uZmlndXJlZE9wdGlvbmFsRmVhdHVyZXMoY29uZmlnLCB0YXJnZXRTaXRlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IElGZWF0dXJlWzBdOwotCX0KLQkKLQlwdWJsaWMgSUZlYXR1cmVSZWZlcmVuY2VbXSBnZXRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyhJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY3VycmVudEpvYikgewotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUpvYlJvb3Qgam9iUm9vdCA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JSb290cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGN1cnJlbnRKb2IuZXF1YWxzKGpvYlJvb3RzW2ldLmdldEpvYigpKSkgewotCQkJCWpvYlJvb3QgPSBqb2JSb290c1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoam9iUm9vdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJRmVhdHVyZVJlZmVyZW5jZVswXTsKLQotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iID0gam9iUm9vdC5nZXRKb2IoKTsKLQkJYm9vbGVhbiB1cGRhdGUgPSBqb2IuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGw7Ci0JCWJvb2xlYW4gcGF0Y2ggPSBVcGRhdGVVdGlscy5pc1BhdGNoKGpvYi5nZXRGZWF0dXJlKCkpOwotCQlGZWF0dXJlSGllcmFyY2h5RWxlbWVudFtdIGVsZW1lbnRzID0gam9iUm9vdC5nZXRFbGVtZW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbGVtZW50c1tpXS5hZGRDaGVja2VkT3B0aW9uYWxGZWF0dXJlcyh1cGRhdGUsIHBhdGNoLCBjb25maWcsIHNldCk7Ci0JCX0KLQkJcmV0dXJuIChJRmVhdHVyZVJlZmVyZW5jZVtdKSBzZXQudG9BcnJheShuZXcgSUZlYXR1cmVSZWZlcmVuY2Vbc2V0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOTk1YmEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5JRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZVVJSW1hZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgewotCXByaXZhdGUgUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZSBwYWdlOwotCi0JcHVibGljIFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZChJRmVhdHVyZSBjdXJyZW50RmVhdHVyZSwgSUZlYXR1cmVbXSBmZWF0dXJlcykgewotCQlzZXRXaW5kb3dUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIlJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZC50aXRsZSIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihVcGRhdGVVSUltYWdlcy5ERVNDX1VQREFURV9XSVopOwotCQlwYWdlID0gbmV3IFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UoY3VycmVudEZlYXR1cmUsIGZlYXR1cmVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShwYWdlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJcmV0dXJuIHBhZ2UucGVyZm9ybUZpbmlzaCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJlZWQ0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLQotcHVibGljIGNsYXNzIFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQkKLQlwcml2YXRlIElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlOwotCXByaXZhdGUgSUZlYXR1cmVbXSBmZWF0dXJlczsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCi0JcHVibGljIFJlcGxhY2VGZWF0dXJlVmVyc2lvbldpemFyZFBhZ2UoSUZlYXR1cmUgY3VycmVudEZlYXR1cmUsIElGZWF0dXJlW10gZmVhdHVyZXMpIHsKLQkJc3VwZXIoIlN3YXBGZWF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXBsYWNlRmVhdHVyZVZlcnNpb25XaXphcmRQYWdlLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5kZXNjIikpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMuY3VycmVudEZlYXR1cmUgPSBjdXJyZW50RmVhdHVyZTsKLQkJdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgdGFibGVDb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSBsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0YWJsZUNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiUmVwbGFjZUZlYXR1cmVWZXJzaW9uV2l6YXJkUGFnZS5sYWJlbCIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHRhYmxlQ29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPQotCQkJCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOwotCQkJCXJldHVybiBwcm92aWRlci5nZXQoVXBkYXRlVUlJbWFnZXMuREVTQ19VTkNPTkZfRkVBVFVSRV9PQkosIDApOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJSUZlYXR1cmUgZmVhdHVyZSA9IChJRmVhdHVyZSkgZWxlbWVudDsKLQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRMYWJlbCgpICsgIiAiICsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGZlYXR1cmVzOwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJfQotCQl9KTsKLQkJCi0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQkJUGx1Z2luVmVyc2lvbklkZW50aWZpZXIgdjEgPSAoKElGZWF0dXJlKWUxKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpOwotCQkJCVBsdWdpblZlcnNpb25JZGVudGlmaWVyIHYyID0gKChJRmVhdHVyZSllMikuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldFZlcnNpb24oKTsKLQkJCQlyZXR1cm4gdjEuaXNHcmVhdGVyT3JFcXVhbFRvKHYyKSA/IC0xIDogMTsKLQkJCX0KLQkJfSk7Ci0JCQotCQl0YWJsZVZpZXdlci5hZGRGaWx0ZXIobmV3IFZpZXdlckZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlTdHJpbmcgdmVyc2lvbiA9Ci0JCQkJCSgoSUZlYXR1cmUpIGVsZW1lbnQpLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsKLQkJCQlyZXR1cm4gIXZlcnNpb24uZXF1YWxzKAotCQkJCQljdXJyZW50RmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9KTsKLQotCQl0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNzZWwgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCUlGZWF0dXJlIGNob3NlbkZlYXR1cmUgPSAoSUZlYXR1cmUpc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlJU3RhdHVzIHZhbGlkYXRpb25TdGF0dXMgPQotCQkJCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdSZXBsYWNlVmVyc2lvbihjdXJyZW50RmVhdHVyZSwgY2hvc2VuRmVhdHVyZSk7Ci0JCQkJc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbCB8fCB2YWxpZGF0aW9uU3RhdHVzLmdldENvZGUoKSA9PSBJU3RhdHVzLldBUk5JTkcpOwotCQkKLQkJCQlpZiAodmFsaWRhdGlvblN0YXR1cyA9PSBudWxsKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQl9IGVsc2UgaWYgKHZhbGlkYXRpb25TdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJCXNldE1lc3NhZ2UodmFsaWRhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKHZhbGlkYXRpb25TdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoY3VycmVudEZlYXR1cmUpOwotCQl0YWJsZVZpZXdlci5nZXRUYWJsZSgpLnNlbGVjdCgwKTsKLQkJc2V0Q29udHJvbCh0YWJsZUNvbnRhaW5lcik7Ci0JCQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHRhYmxlQ29udGFpbmVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlJRmVhdHVyZSBjaG9zZW5GZWF0dXJlID0gKElGZWF0dXJlKXNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQotCQlyZXR1cm4gc3dhcChjdXJyZW50RmVhdHVyZSwgY2hvc2VuRmVhdHVyZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzd2FwKGZpbmFsIElGZWF0dXJlIGN1cnJlbnRGZWF0dXJlLCBmaW5hbCBJRmVhdHVyZSBhbm90aGVyRmVhdHVyZSkgewotLy8JCUlTdGF0dXMgc3RhdHVzID0KLS8vCQkJT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQZW5kaW5nUmVwbGFjZVZlcnNpb24oY3VycmVudEZlYXR1cmUsIGFub3RoZXJGZWF0dXJlKTsKLS8vCQlpZiAoc3RhdHVzICE9IG51bGwpIHsKLS8vCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotLy8JCQkJVXBkYXRlVUkuZ2V0QWN0aXZlV29ya2JlbmNoU2hlbGwoKSwKLS8vCQkJCW51bGwsCi0vLwkJCQludWxsLAotLy8JCQkJc3RhdHVzKTsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCUlPcGVyYXRpb24gcmV2ZXJ0T3BlcmF0aW9uID0KLQkJCQkJT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJCS5jcmVhdGVSZXBsYWNlRmVhdHVyZVZlcnNpb25PcGVyYXRpb24oY3VycmVudEZlYXR1cmUsIGFub3RoZXJGZWF0dXJlKTsKLQkJCQl0cnkgewotCQkJCQlib29sZWFuIHJlc3RhcnROZWVkZWQgPSByZXZlcnRPcGVyYXRpb24uZXhlY3V0ZShtb25pdG9yLCBudWxsKTsKLQkJCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQocmVzdGFydE5lZWRlZCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSB0YXJnZXRFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJaWYgKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWQzZTIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7Ci0KLXB1YmxpYyBjbGFzcyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nIGV4dGVuZHMgV2l6YXJkRGlhbG9nIHsKLQlwcml2YXRlIFN0cmluZyB0aXRsZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJlc2l6YWJsZSB3aXphcmQgZGlhbG9nLgotCSAqLwotCXB1YmxpYyBSZXNpemFibGVJbnN0YWxsV2l6YXJkRGlhbG9nKFNoZWxsIHBhcmVudCwgSVdpemFyZCB3aXphcmQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihwYXJlbnQsIHdpemFyZCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9CQotCQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjY3JlYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGUoKSB7Ci0JCXN1cGVyLmNyZWF0ZSgpOwotCQkKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJU1dUVXRpbC5zZXREaWFsb2dTaXplKHRoaXMsIDYwMCwgNTAwKTsKLQl9Ci0JCi0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdyNvcGVuKCkKLQkgKi8KLQlwdWJsaWMgaW50IG9wZW4oKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gT3BlcmF0aW9uc01hbmFnZXIuZ2V0VmFsaWRhdG9yKCkudmFsaWRhdGVQbGF0Zm9ybUNvbmZpZ1ZhbGlkKCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCkgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCQlVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLAotCQkJCQludWxsLAotCQkJCQludWxsLAotCQkJCQlzdGF0dXMpOwotCQkJcmV0dXJuIElEaWFsb2dDb25zdGFudHMuQUJPUlRfSUQ7Ci0JCX0KLQkJCi0JCWludCByZXR1cm5WYWx1ZSA9IHN1cGVyLm9wZW4oKTsKLQkJCi0JCWlmIChyZXR1cm5WYWx1ZSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQoKChJbnN0YWxsV2l6YXJkKWdldFdpemFyZCgpKS5pc1Jlc3RhcnROZWVkZWQoKSk7Ci0JCXJldHVybiByZXR1cm5WYWx1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmI4NGY2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1JldmVydENvbmZpZ3VyYXRpb25XaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlVUk7Ci0KLS8qKgotICogQGF1dGhvciBXYXNzaW0gTWVsaGVtCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsKLQkKLQlSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBwYWdlOwotCi0JcHVibGljIFJldmVydENvbmZpZ3VyYXRpb25XaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKFVwZGF0ZVVJLmdldFN0cmluZygiUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZC53dGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoVXBkYXRlVUlJbWFnZXMuREVTQ19DT05GSUdfV0laKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXBhZ2UgPSBuZXcgUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShwYWdlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXR1cm4gcGFnZS5wZXJmb3JtRmluaXNoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzNjIwMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9SZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotCi0KLXB1YmxpYyBjbGFzcyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBhY3Rpdml0aWVzVmlld2VyOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgY29uZmlnVmlld2VyOwotCXB1YmxpYyBzdGF0aWMgQ29sb3IgYmx1ZUJHQ29sb3I7Ci0JcHJpdmF0ZSBTYXNoRm9ybSBzYXNoRm9ybTsKLQotCXB1YmxpYyBSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIlJldmVydENvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShVcGRhdGVVSS5nZXRTdHJpbmcoIlJldmVydENvbmZpZ3VyYXRpb25XaXphcmRQYWdlLnRpdGxlIikpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UuZGVzYyIpKTsgLy8kTk9OLU5MUy0xJAotCQlibHVlQkdDb2xvciA9IG5ldyBDb2xvcihudWxsLCAyMzgsMjM4LDI1NSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzYXNoRm9ybSA9IG5ldyBTYXNoRm9ybShwYXJlbnQsIFNXVC5WRVJUSUNBTCk7Ci0JCXNhc2hGb3JtLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJc2FzaEZvcm0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJY3JlYXRlQ29uZmlndXJhdGlvbnNTZWN0aW9uKHNhc2hGb3JtKTsKLQkJY3JlYXRlQWN0aXZpdGllc1NlY3Rpb24oc2FzaEZvcm0pOwotCQlzZXRDb250cm9sKHNhc2hGb3JtKTsKLQotCQlPYmplY3QgZWxlbWVudCA9IGNvbmZpZ1ZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCWlmIChlbGVtZW50ICE9IG51bGwpCi0JCQljb25maWdWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGVsZW1lbnQpKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChzYXNoRm9ybSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNvbmZpZ3VyYXRpb25zU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0YWJsZUNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IGxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXRhYmxlQ29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQl0YWJsZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0YWJsZUNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UubGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZSh0YWJsZUNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWNvbmZpZ1ZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9Ci0JCQkJCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyLmdldChVcGRhdGVVSUltYWdlcy5ERVNDX0NPTkZJR19PQkosIDApOwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIFV0aWxpdGllcy5mb3JtYXQoCi0JCQkJCSgoSUluc3RhbGxDb25maWd1cmF0aW9uKSBlbGVtZW50KS5nZXRDcmVhdGlvbkRhdGUoKSk7Ci0JCQl9Ci0KLQkJfSk7Ci0JCWNvbmZpZ1ZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJTG9jYWxTaXRlIGxvY2FsU2l0ZSA9IChJTG9jYWxTaXRlKSBlbGVtZW50OwotCQkJCUlJbnN0YWxsQ29uZmlndXJhdGlvbiBjdXJyZW50ID0JbG9jYWxTaXRlLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCk7Ci0JCQkJSUluc3RhbGxDb25maWd1cmF0aW9uW10gY29uZmlndXJhdGlvbnMgPSBsb2NhbFNpdGUuZ2V0Q29uZmlndXJhdGlvbkhpc3RvcnkoKTsKLQkJCQlmb3IgKGludCBpID0gY29uZmlndXJhdGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQkJaWYgKCFjdXJyZW50LmVxdWFscyhjb25maWd1cmF0aW9uc1tpXSkpIHsKLQkJCQkJCXJlc3VsdC5hZGQoY29uZmlndXJhdGlvbnNbaV0pOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQudG9BcnJheSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoCi0JCQkJVmlld2VyIHZpZXdlciwKLQkJCQlPYmplY3Qgb2xkSW5wdXQsCi0JCQkJT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJY29uZmlnVmlld2VyCi0JCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJSW5zdGFsbENvbmZpZ3VyYXRpb24gY3VycmVudENvbmZpZyA9IChJbnN0YWxsQ29uZmlndXJhdGlvbilzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWFjdGl2aXRpZXNWaWV3ZXIuc2V0SW5wdXQoY3VycmVudENvbmZpZyk7Ci0JCQkJYWN0aXZpdGllc1ZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJVGFibGVJdGVtW10gaXRlbXMgPSBhY3Rpdml0aWVzVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJCQlmb3IgKGludCBpID0wOyBpPGl0ZW1zLmxlbmd0aDsgaSsrKXsKLQkJCQkJSUFjdGl2aXR5IGFjdGl2aXR5ID0gKElBY3Rpdml0eSlpdGVtc1tpXS5nZXREYXRhKCk7Ci0JCQkJCS8vIGZvciBub3csIHdlIHRlc3QgZXhhY3QgY29uZmlnIG1hdGNoLiBJZiBuZWVkZWQsIHdlIGNhbiBhbHNvIGNvbXBhcmUgZGF0ZXMsIGV0Yy4KLQkJCQkJaWYgKCgoSW5zdGFsbENvbmZpZ3VyYXRpb24pYWN0aXZpdHkuZ2V0SW5zdGFsbENvbmZpZ3VyYXRpb24oKSkuZXF1YWxzKGN1cnJlbnRDb25maWcpKQotCQkJCQkJaXRlbXNbaV0uc2V0QmFja2dyb3VuZChibHVlQkdDb2xvcik7Ci0JCQkJCWVsc2UKLQkJCQkJCWl0ZW1zW2ldLnNldEJhY2tncm91bmQoYWN0aXZpdGllc1ZpZXdlci5nZXRDb250cm9sKCkuZ2V0QmFja2dyb3VuZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXRyeSB7Ci0JCQljb25maWdWaWV3ZXIuc2V0SW5wdXQoU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQWN0aXZpdGllc1NlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5tYXJnaW5IZWlnaHQgPSBncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0KLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCgKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiUmV2ZXJ0Q29uZmlndXJhdGlvbldpemFyZFBhZ2UuYWN0aXZpdGllcyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYmxlTGF5b3V0Q29tcG9zaXRlIHRsQ29tcG9zaXRlPSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRsQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlhY3Rpdml0aWVzVmlld2VyID0gQWN0aXZpdGllc1RhYmxlVmlld2VyLmNyZWF0ZVZpZXdlcih0bENvbXBvc2l0ZSwgZmFsc2UpOwotCi0JCXRsQ29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtblBpeGVsRGF0YSgyMCwgdHJ1ZSkpOwotCQl0bENvbXBvc2l0ZS5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDIsIDE1MCwgdHJ1ZSkpOwotCQl0bENvbXBvc2l0ZS5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUsIDIwMCwgdHJ1ZSkpOwotCQl0bENvbXBvc2l0ZS5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDQsIDEwMCwgdHJ1ZSkpOwotCi0JCS8vYWN0aXZpdGllc1ZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCVRhYmxlSXRlbVtdIGNvbmZpZ3MgPSBjb25maWdWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQlpZiAoY29uZmlncy5sZW5ndGggPjApCi0JCQlhY3Rpdml0aWVzVmlld2VyLnNldElucHV0KChJbnN0YWxsQ29uZmlndXJhdGlvbiljb25maWdzWzBdLmdldERhdGEoKSk7Ci0JCQotCQljb21wb3NpdGUuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaW50IHNhc2hIZWlnaHQgPSBnZXRTYXNoRm9ybSgpLmdldFNpemUoKS55OwotCQkJCWludCBzYXNoV2lkdGggPSBnZXRTYXNoRm9ybSgpLmdldFNpemUoKS54OwotCQkJCWlmIChjb21wb3NpdGUuZ2V0U2l6ZSgpLnkgPiAoc2FzaEhlaWdodCowLjg1KSAmJiBjb21wb3NpdGUuZ2V0U2l6ZSgpLnggPiAoc2FzaFdpZHRoKjAuNSkpewotCQkJCQlnZXRTYXNoRm9ybSgpLnNldE9yaWVudGF0aW9uKFNXVC5IT1JJWk9OVEFMKTsKLQkJCQl9IGVsc2UgewotCQkJCQlnZXRTYXNoRm9ybSgpLnNldE9yaWVudGF0aW9uKFNXVC5WRVJUSUNBTCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dQYWdlI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWJsdWVCR0NvbG9yLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIFNhc2hGb3JtIGdldFNhc2hGb3JtKCl7Ci0JCXJldHVybiBzYXNoRm9ybTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJU2hlbGwgc2hlbGwgPSBnZXRDb250YWluZXIoKS5nZXRTaGVsbCgpOwotCQlib29sZWFuIHJlc3VsdCA9Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbigKLQkJCQlzaGVsbCwKLQkJCQlzaGVsbC5nZXRUZXh0KCksCi0JCQkJVXBkYXRlVUkuZ2V0U3RyaW5nKCJSZXZlcnRDb25maWd1cmF0aW9uV2l6YXJkUGFnZS5xdWVzdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXJlc3VsdCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlib29sZWFuIGZpbmlzaCA9IHBlcmZvcm1SZXZlcnQoKTsKLQkJaWYgKGZpbmlzaCkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5yZXN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIGZpbmlzaDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtUmV2ZXJ0KCkgewotCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjb25maWdWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZpbmFsIElJbnN0YWxsQ29uZmlndXJhdGlvbiB0YXJnZXQgPQotCQkJKElJbnN0YWxsQ29uZmlndXJhdGlvbikgc3NlbC5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9Ci0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdSZXZlcnQodGFyZ2V0KTsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKAotCQkJCVVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksCi0JCQkJbnVsbCwKLQkJCQludWxsLAotCQkJCXN0YXR1cyk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0JCQkJdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotCQkJCUlPcGVyYXRpb24gcmV2ZXJ0T3BlcmF0aW9uID0KLQkJCQkJT3BlcmF0aW9uc01hbmFnZXIKLQkJCQkJCS5nZXRPcGVyYXRpb25GYWN0b3J5KCkKLQkJCQkJCS5jcmVhdGVSZXZlcnRDb25maWd1cmF0aW9uT3BlcmF0aW9uKAotCQkJCQkJdGFyZ2V0LAotCQkJCQkJbmV3IFVJUHJvYmxlbUhhbmRsZXIoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV2ZXJ0T3BlcmF0aW9uLmV4ZWN1dGUobW9uaXRvciwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IG5ldyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKGUpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCWdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgdHJ1ZSwgb3BlcmF0aW9uKTsKLQkJCXJldHVybiB0cnVlOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCVRocm93YWJsZSB0YXJnZXRFeGNlcHRpb24gPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJaWYgKHRhcmdldEV4Y2VwdGlvbiBpbnN0YW5jZW9mIEluc3RhbGxBYm9ydGVkRXhjZXB0aW9uKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2aWV3UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvUmV2aWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTIxYzUyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Jldmlld1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLm9wZXJhdGlvbnMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5tb2RlbC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkucGFydHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOw0KLQ0KLXB1YmxpYyBjbGFzcyBSZXZpZXdQYWdlDQotCWV4dGVuZHMgQmFubmVyUGFnZQ0KLQlpbXBsZW1lbnRzIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3Igew0KLQ0KLQlwcml2YXRlIEFycmF5TGlzdCBqb2JzOw0KLQlwcml2YXRlIExhYmVsIGNvdW50ZXJMYWJlbDsNCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVmlld2VyOw0KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGlvblN0YXR1czsNCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIHByb2JsZW1hdGljRmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOw0KLQkvLyBmZWF0dXJlIHRoYXQgd2FzIHJlY2VudGx5IHNlbGVjdGVkIG9yIG51bGwNCi0JcHJpdmF0ZSBJRmVhdHVyZSBuZXdseVNlbGVjdGVkRmVhdHVyZTsNCi0JLy8gDQotCXByaXZhdGUgRmVhdHVyZVN0YXR1cyBsYXN0RGlzcGxheWVkU3RhdHVzOw0KLQlwcml2YXRlIFByb3BlcnR5RGlhbG9nQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247DQotCXByaXZhdGUgVGV4dCBkZXNjTGFiZWw7DQotCXByaXZhdGUgQnV0dG9uIHN0YXR1c0J1dHRvbjsNCi0JcHJpdmF0ZSBCdXR0b24gbW9yZUluZm9CdXR0b247DQotCXByaXZhdGUgQnV0dG9uIHByb3BlcnRpZXNCdXR0b247DQotCXByaXZhdGUgQnV0dG9uIGZpbHRlckNoZWNrOw0KLQlwcml2YXRlIENvbnRhaW5tZW50RmlsdGVyIGZpbHRlciA9IG5ldyBDb250YWlubWVudEZpbHRlcigpOw0KLQlwcml2YXRlIFNlYXJjaFJ1bm5lciBzZWFyY2hSdW5uZXI7DQotCXByaXZhdGUgaW50IExBQkVMX09SREVSID0gMTsNCi0JcHJpdmF0ZSBpbnQgVkVSU0lPTl9PUkRFUiA9IDE7DQotCXByaXZhdGUgaW50IFBST1ZJREVSX09SREVSID0gMTsNCi0JY2xhc3MgSm9ic0NvbnRlbnRQcm92aWRlcg0KLQkJZXh0ZW5kcyBEZWZhdWx0Q29udGVudFByb3ZpZGVyDQotCQlpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsNCi0NCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7DQotCQkJcmV0dXJuIGpvYnMudG9BcnJheSgpOw0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIEpvYnNMYWJlbFByb3ZpZGVyDQotCQlleHRlbmRzIFNoYXJlZExhYmVsUHJvdmlkZXINCi0JCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7DQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iaiwgaW50IGNvbHVtbikgew0KLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmo7DQotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYi5nZXRGZWF0dXJlKCk7DQotDQotCQkJc3dpdGNoIChjb2x1bW4pIHsNCi0JCQkJY2FzZSAwIDoNCi0JCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCk7DQotCQkJCWNhc2UgMSA6DQotCQkJCQlyZXR1cm4gZmVhdHVyZQ0KLQkJCQkJCS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkNCi0JCQkJCQkuZ2V0VmVyc2lvbigpDQotCQkJCQkJLnRvU3RyaW5nKCk7DQotCQkJCWNhc2UgMiA6DQotCQkJCQlyZXR1cm4gZmVhdHVyZS5nZXRQcm92aWRlcigpOw0KLQkJCX0NCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgY29sdW1uKSB7DQotCQkJaWYgKGNvbHVtbiA9PSAwKSB7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb2JqKS5nZXRGZWF0dXJlKCk7DQotCQkJCWJvb2xlYW4gcGF0Y2ggPSBmZWF0dXJlLmlzUGF0Y2goKTsNCi0JCQkJDQotCQkJCWJvb2xlYW4gcHJvYmxlbWF0aWM9cHJvYmxlbWF0aWNGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKTsNCi0JCQkJDQotCQkJCWlmIChwYXRjaCkgew0KLQkJCQkJcmV0dXJuIGdldChVcGRhdGVVSUltYWdlcy5ERVNDX0VGSVhfT0JKLCBwcm9ibGVtYXRpYz8gRl9FUlJPUiA6IDApOw0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJcmV0dXJuIGdldChVcGRhdGVVSUltYWdlcy5ERVNDX0ZFQVRVUkVfT0JKLCBwcm9ibGVtYXRpYz8gRl9FUlJPUiA6IDApOw0KLQkJCQl9DQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIENvbnRhaW5tZW50RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsNCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdiwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7DQotCQkJcmV0dXJuICFpc0NvbnRhaW5lZCgoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBjaGlsZCk7DQotCQl9DQotCQlwcml2YXRlIGJvb2xlYW4gaXNDb250YWluZWQoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYikgew0KLQkJCVZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gam9iLmdldEZlYXR1cmUoKS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCk7DQotDQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqb2JzLnNpemUoKTsgaSsrKSB7DQotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBjYW5kaWRhdGUgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBqb2JzLmdldChpKTsNCi0JCQkJaWYgKGNhbmRpZGF0ZS5lcXVhbHMoam9iKSkNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQlJRmVhdHVyZSBmZWF0dXJlID0gY2FuZGlkYXRlLmdldEZlYXR1cmUoKTsNCi0JCQkJaWYgKGluY2x1ZGVzKGZlYXR1cmUsIHZpZCxudWxsKSkNCi0JCQkJCXJldHVybiB0cnVlOw0KLQkJCX0NCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSUZlYXR1cmUgZmVhdHVyZSwgVmVyc2lvbmVkSWRlbnRpZmllciB2aWQsIEFycmF5TGlzdCBjeWNsZUNhbmRpZGF0ZXMpIHsNCi0JCQl0cnkgew0KLQkJCQlpZiAoY3ljbGVDYW5kaWRhdGVzID09IG51bGwpDQotCQkJCQljeWNsZUNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQkJCWlmIChjeWNsZUNhbmRpZGF0ZXMuY29udGFpbnMoZmVhdHVyZSkpDQotCQkJCQl0aHJvdyBVdGlsaXRpZXMubmV3Q29yZUV4Y2VwdGlvbihVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuY3ljbGUiLCBmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKS50b1N0cmluZygpKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQNCi0JCQkJZWxzZQ0KLQkJCQkJY3ljbGVDYW5kaWRhdGVzLmFkZChmZWF0dXJlKTsNCi0JCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9DQotCQkJCQlmZWF0dXJlLmdldEluY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpcmVmcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2UgaXJlZiA9IGlyZWZzW2ldOw0KLQkJCQkJSUZlYXR1cmUgaWZlYXR1cmUgPSBpcmVmLmdldEZlYXR1cmUobnVsbCk7DQotCQkJCQlWZXJzaW9uZWRJZGVudGlmaWVyIGl2aWQgPQ0KLQkJCQkJCWlmZWF0dXJlLmdldFZlcnNpb25lZElkZW50aWZpZXIoKTsNCi0JCQkJCWlmIChpdmlkLmVxdWFscyh2aWQpKQ0KLQkJCQkJCXJldHVybiB0cnVlOw0KLQkJCQkJaWYgKGluY2x1ZGVzKGlmZWF0dXJlLCB2aWQsIGN5Y2xlQ2FuZGlkYXRlcykpDQotCQkJCQkJcmV0dXJuIHRydWU7DQotCQkJCX0NCi0JCQkJcmV0dXJuIGZhbHNlOw0KLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgew0KLQkJCQlyZXR1cm4gZmFsc2U7DQotCQkJfSBmaW5hbGx5IHsNCi0JCQkJLy8gYWZ0ZXIgdGhpcyBmZWF0dXJlIGhhcyBiZWVuIERGUy1lZCwgaXQgaXMgbm8gbG9uZ2VyIGEgY3ljbGUgY2FuZGlkYXRlDQotCQkJCWN5Y2xlQ2FuZGlkYXRlcy5yZW1vdmUoZmVhdHVyZSk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIEZlYXR1cmVQcm9wZXJ0eURpYWxvZ0FjdGlvbiBleHRlbmRzIFByb3BlcnR5RGlhbG9nQWN0aW9uIHsNCi0JCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOw0KLQ0KLQkJcHVibGljIEZlYXR1cmVQcm9wZXJ0eURpYWxvZ0FjdGlvbigNCi0JCQlTaGVsbCBzaGVsbCwNCi0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsNCi0JCQlzdXBlcihzaGVsbCwgcHJvdmlkZXIpOw0KLQkJfQ0KLQ0KLQkJcHVibGljIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFN0cnVjdHVyZWRTZWxlY3Rpb24oKSB7DQotCQkJcmV0dXJuIHNlbGVjdGlvbjsNCi0JCX0NCi0NCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247DQotCQl9DQotDQotCX0NCi0JLyoqDQotCSAqIENvbnN0cnVjdG9yIGZvciBSZXZpZXdQYWdlMg0KLQkgKi8NCi0JcHVibGljIFJldmlld1BhZ2UoU2VhcmNoUnVubmVyIHNlYXJjaFJ1bm5lciwgQXJyYXlMaXN0IGpvYnMpIHsNCi0JCXN1cGVyKCJSZXZpZXciKTsgLy8kTk9OLU5MUy0xJA0KLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmRlc2MiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsNCi0JCXRoaXMuc2VhcmNoUnVubmVyID0gc2VhcmNoUnVubmVyOw0KLQkJc2V0QmFubmVyVmlzaWJsZShmYWxzZSk7DQotCQl0aGlzLmpvYnMgPSBqb2JzOw0KLQkJaWYgKHRoaXMuam9icz09bnVsbCkgdGhpcy5qb2JzID0gbmV3IEFycmF5TGlzdCgpOw0KLQl9DQotDQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7DQotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpLmRpc2Nvbm5lY3QodGhpcyk7DQotCQlzdXBlci5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsNCi0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQotCQkNCi0JCS8vIHdoZW4gc2VhcmNoaW5nIGZvciB1cGRhdGVzLCBvbmx5IG5lc3RlZCBwYXRjaGVzIGNhbiBiZSBzaG93bi4NCi0JCS8vIHdoZW4gc2VhcmNoaW5nIGZvciBmZWF0dXJlcywgZmVhdHVyZXMgYW5kIHBhdGNoZXMgY2FuIGJlIHNob3duDQotCQlTdHJpbmcgZmlsdGVyVGV4dCA9IGZpbHRlckNoZWNrLmdldFRleHQoKTsNCi0JCVN0cmluZyBmaWx0ZXJGZWF0dXJlcyA9IFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmZpbHRlckZlYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyBmaWx0ZXJQYXRjaGVzID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UuZmlsdGVyUGF0Y2hlcyIpOyAvLyROT04tTkxTLTEkDQotCQlib29sZWFuIGlzVXBkYXRlU2VhcmNoID0gc2VhcmNoUnVubmVyLmdldFNlYXJjaFByb3ZpZGVyKCkgaW5zdGFuY2VvZiBNb2RlU2VsZWN0aW9uUGFnZTsNCi0JCWlmIChpc1VwZGF0ZVNlYXJjaCAmJiBmaWx0ZXJUZXh0LmVxdWFscyhmaWx0ZXJGZWF0dXJlcykpDQotCQkJZmlsdGVyQ2hlY2suc2V0VGV4dChmaWx0ZXJQYXRjaGVzKTsNCi0JCWVsc2UgaWYgKCAhaXNVcGRhdGVTZWFyY2ggJiYgZmlsdGVyVGV4dC5lcXVhbHMoZmlsdGVyUGF0Y2hlcykpDQotCQkJZmlsdGVyQ2hlY2suc2V0VGV4dChmaWx0ZXJGZWF0dXJlcyk7DQotCQkNCi0JCWlmICh2aXNpYmxlICYmIHNlYXJjaFJ1bm5lci5pc05ld1NlYXJjaE5lZWRlZCgpKSB7DQotCQkJam9icy5jbGVhcigpOw0KLQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsNCi0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCQlzZWFyY2hSdW5uZXIucnVuU2VhcmNoKCk7DQotCQkJCQlwZXJmb3JtUG9zdFNlYXJjaFByb2Nlc3NpbmcoKTsNCi0JCQkJfQ0KLQkJCX0pOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBwZXJmb3JtUG9zdFNlYXJjaFByb2Nlc3NpbmcoKSB7DQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJaWYgKHRhYmxlVmlld2VyICE9IG51bGwpIHsNCi0JCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsNCi0JCQkJCXRhYmxlVmlld2VyLmdldFRhYmxlKCkubGF5b3V0KHRydWUpOw0KLQkJCQkJaWYgKHNlYXJjaFJ1bm5lci5nZXRTZWFyY2hQcm92aWRlcigpIGluc3RhbmNlb2YgTW9kZVNlbGVjdGlvblBhZ2UpIHsNCi0JCQkJCQlzZWxlY3RUcnVlVXBkYXRlcygpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXBhZ2VDaGFuZ2VkKCk7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBzZWxlY3RUcnVlVXBkYXRlcygpIHsNCi0JCUFycmF5TGlzdCB0cnVlVXBkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JCWZvciAoaW50IGk9MDsgaTxqb2JzLnNpemUoKTsgaSsrKSB7DQotCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pam9icy5nZXQoaSk7DQotCQkJaWYgKCFVcGRhdGVVdGlscy5pc1BhdGNoKGpvYi5nZXRGZWF0dXJlKCkpKQ0KLQkJCQl0cnVlVXBkYXRlcy5hZGQoam9iKTsNCi0JCX0NCi0JCXRhYmxlVmlld2VyLnNldENoZWNrZWRFbGVtZW50cyh0cnVlVXBkYXRlcy50b0FycmF5KCkpOyANCi0JfQkNCi0NCi0JLyoqDQotCSAqIEBzZWUgRGlhbG9nUGFnZSNjcmVhdGVDb250cm9sKENvbXBvc2l0ZSkNCi0JICovDQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOw0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7DQotCQljbGllbnQuc2V0TGF5b3V0KGxheW91dCk7DQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsNCi0JCWxhYmVsLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UubGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7DQotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCWNyZWF0ZVRhYmxlKGNsaWVudCk7DQotDQotCQlDb21wb3NpdGUgYnV0dG9uQ29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOw0KLQkJYnV0dG9uQ29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOw0KLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7DQotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsNCi0NCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOw0KLQkJYnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2Uuc2VsZWN0QWxsIikpOyAvLyROT04tTkxTLTEkDQotCQlnZCA9DQotCQkJbmV3IEdyaWREYXRhKA0KLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwNCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsNCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChidXR0b24pOw0KLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJaGFuZGxlU2VsZWN0QWxsKHRydWUpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJYnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsNCi0JCWJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmRlc2VsZWN0QWxsIikpOyAvLyROT04tTkxTLTEkDQotCQlnZCA9DQotCQkJbmV3IEdyaWREYXRhKA0KLQkJCQlHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwNCi0JCQkJCXwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsNCi0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChidXR0b24pOw0KLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJaGFuZGxlU2VsZWN0QWxsKGZhbHNlKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCW1vcmVJbmZvQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsNCi0JCW1vcmVJbmZvQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UubW9yZUluZm8iKSk7IC8vJE5PTi1OTFMtMSQNCi0JCWdkID0NCi0JCQluZXcgR3JpZERhdGEoDQotCQkJCUdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTA0KLQkJCQkJfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpOw0KLQkJbW9yZUluZm9CdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7DQotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQobW9yZUluZm9CdXR0b24pOw0KLQkJbW9yZUluZm9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQloYW5kbGVNb3JlSW5mbygpOw0KLQkJCX0NCi0JCX0pOw0KLQkJbW9yZUluZm9CdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7DQotCQkNCi0JCQ0KLQkJcHJvcGVydGllc0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7DQotCQlwcm9wZXJ0aWVzQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UucHJvcGVydGllcyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJZ2QgPQ0KLQkJCW5ldyBHcmlkRGF0YSgNCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMDQotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7DQotCQlwcm9wZXJ0aWVzQnV0dG9uLnNldExheW91dERhdGEoZ2QpOw0KLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KHByb3BlcnRpZXNCdXR0b24pOw0KLQkJcHJvcGVydGllc0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCWhhbmRsZVByb3BlcnRpZXMoKTsNCi0JCQl9DQotCQl9KTsNCi0JCXByb3BlcnRpZXNCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7DQotDQotCQlzdGF0dXNCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOw0KLQkJc3RhdHVzQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2Uuc2hvd1N0YXR1cyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJZ2QgPQ0KLQkJCW5ldyBHcmlkRGF0YSgNCi0JCQkJR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMDQotCQkJCQl8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0JFR0lOTklORyk7DQotCQlzdGF0dXNCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7DQotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoc3RhdHVzQnV0dG9uKTsNCi0JCXN0YXR1c0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsNCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7DQotCQkJCXNob3dTdGF0dXMoKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCS8vbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQ0KLQkJY291bnRlckxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsNCi0JCWdkLmhvcml6b250YWxTcGFuID0gMjsNCi0JCWNvdW50ZXJMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsNCi0NCi0JCWZpbHRlckNoZWNrID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5DSEVDSyk7DQotCQlmaWx0ZXJDaGVjay5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmZpbHRlckZlYXR1cmVzIikpOyAvLyROT04tTkxTLTEkDQotCQlmaWx0ZXJDaGVjay5zZXRTZWxlY3Rpb24oZmFsc2UpOw0KLQkJLy90YWJsZVZpZXdlci5hZGRGaWx0ZXIoZmlsdGVyKTsNCi0JCWZpbHRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJaWYgKGZpbHRlckNoZWNrLmdldFNlbGVjdGlvbigpKSB7DQotCQkJCQkvLyBtYWtlIHN1cmUgbW9kZWwgaXMgbG9jYWwNCi0JCQkJCWlmIChkb3dubG9hZEluY2x1ZGVkRmVhdHVyZXMoKSkgew0KLQkJCQkJCXRhYmxlVmlld2VyLmFkZEZpbHRlcihmaWx0ZXIpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQlmaWx0ZXJDaGVjay5zZXRTZWxlY3Rpb24oZmFsc2UpOw0KLQkJCQkJfQ0KLQkJCQl9IGVsc2Ugew0KLQkJCQkJdGFibGVWaWV3ZXIucmVtb3ZlRmlsdGVyKGZpbHRlcik7DQotCQkJCX0NCi0JCQkJcGFnZUNoYW5nZWQoKTsNCi0JCQl9DQotCQl9KTsNCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7DQotCQlmaWx0ZXJDaGVjay5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCXBhZ2VDaGFuZ2VkKCk7DQotDQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk11bHRpUmV2aWV3UGFnZTIiKTsgLy8kTk9OLU5MUy0xJA0KLQ0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOw0KLQ0KLQkJcmV0dXJuIGNsaWVudDsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJU2FzaEZvcm0gc2Zvcm0gPSBuZXcgU2FzaEZvcm0ocGFyZW50LCBTV1QuVkVSVElDQUwpOw0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsNCi0JCWdkLndpZHRoSGludCA9IDI1MDsNCi0JCWdkLmhlaWdodEhpbnQgPTEwMDsNCi0JCXNmb3JtLnNldExheW91dERhdGEoZ2QpOw0KLQ0KLQkJVGFibGVMYXlvdXRDb21wb3NpdGUgY29tcG9zaXRlPSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUoc2Zvcm0sIFNXVC5OT05FKTsNCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsNCi0JCXRhYmxlVmlld2VyID0NCi0JCQlDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdCgNCi0JCQkJCWNvbXBvc2l0ZSwNCi0JCQkJU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7DQotCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7DQotDQotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOw0KLQ0KLQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7DQotCQljb2x1bW4uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5mZWF0dXJlIikpOyAvLyROT04tTkxTLTEkDQotCQljb2x1bW4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlMQUJFTF9PUkRFUiAqPSAtMTsNCi0JCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKA0KLQkJCQkJbmV3IEZlYXR1cmVTb3J0ZXIoDQotCQkJCQkJRmVhdHVyZVNvcnRlci5GRUFUVVJFX0xBQkVMLA0KLQkJCQkJCUxBQkVMX09SREVSLA0KLQkJCQkJCVZFUlNJT05fT1JERVIsDQotCQkJCQkJUFJPVklERVJfT1JERVIpKTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCWNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5VTEwpOw0KLQkJY29sdW1uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlJldmlld1BhZ2UudmVyc2lvbiIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJVkVSU0lPTl9PUkRFUiAqPSAtMTsNCi0JCQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKA0KLQkJCQkJbmV3IEZlYXR1cmVTb3J0ZXIoDQotCQkJCQkJRmVhdHVyZVNvcnRlci5GRUFUVVJFX1ZFUlNJT04sDQotCQkJCQkJTEFCRUxfT1JERVIsDQotCQkJCQkJVkVSU0lPTl9PUkRFUiwNCi0JCQkJCQlQUk9WSURFUl9PUkRFUikpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTlVMTCk7DQotCQljb2x1bW4uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuUmV2aWV3UGFnZS5wcm92aWRlciIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJY29sdW1uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJUFJPVklERVJfT1JERVIgKj0gLTE7DQotCQkJCXRhYmxlVmlld2VyLnNldFNvcnRlcigNCi0JCQkJCW5ldyBGZWF0dXJlU29ydGVyKA0KLQkJCQkJCUZlYXR1cmVTb3J0ZXIuRkVBVFVSRV9QUk9WSURFUiwNCi0JCQkJCQlMQUJFTF9PUkRFUiwNCi0JCQkJCQlWRVJTSU9OX09SREVSLA0KLQkJCQkJCVBST1ZJREVSX09SREVSKSk7DQotCQkJfQ0KLQkJfSk7DQotDQotCQkvL1RhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOw0KLQkJY29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgMjc1LCB0cnVlKSk7DQotCQljb21wb3NpdGUuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCA4MCwgdHJ1ZSkpOw0KLQkJY29tcG9zaXRlLmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNSwgOTAsIHRydWUpKTsNCi0NCi0JCS8vbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtblBpeGVsRGF0YSgyMjUsIHRydWUpKTsNCi0JCS8vbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtblBpeGVsRGF0YSg4MCwgdHJ1ZSkpOw0KLQkJLy9sYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uUGl4ZWxEYXRhKDE0MCwgdHJ1ZSkpOw0KLQ0KLQkJLy90YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsNCi0NCi0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgSm9ic0NvbnRlbnRQcm92aWRlcigpKTsNCi0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEpvYnNMYWJlbFByb3ZpZGVyKCkpOw0KLQkJdGFibGVWaWV3ZXIuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsNCi0JCQkJbmV3bHlTZWxlY3RlZEZlYXR1cmUgPSBudWxsOw0KLQkJCQlpZihldmVudC5nZXRDaGVja2VkKCkpew0KLQkJCQkJLy8gc2F2ZSBjaGVja2VkIGZlZWF0dXJlLCBzbyBpdHMgZXJyb3IgY2FuIGJlIHNob3duIGlmIGFueQ0KLQkJCQkJT2JqZWN0IGNoZWNrZWQgPSBldmVudC5nZXRFbGVtZW50KCk7DQotCQkJCQlpZihjaGVja2VkIGluc3RhbmNlb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKXsNCi0JCQkJCQluZXdseVNlbGVjdGVkRmVhdHVyZT0gKChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pY2hlY2tlZCkuZ2V0RmVhdHVyZSgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXRhYmxlVmlld2VyDQotCQkJCQkuZ2V0Q29udHJvbCgpDQotCQkJCQkuZ2V0RGlzcGxheSgpDQotCQkJCQkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJCQlwYWdlQ2hhbmdlZCgpOw0KLQkJCQkJfQ0KLQkJCQl9KTsNCi0JCQl9DQotCQl9KTsNCi0NCi0JCXRhYmxlVmlld2VyDQotCQkJLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7DQotCQkJCWpvYlNlbGVjdGVkKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZS5nZXRTZWxlY3Rpb24oKSk7DQotCQkJfQ0KLQkJfSk7DQotDQotCQl0YWJsZVZpZXdlci5hZGREb3VibGVDbGlja0xpc3RlbmVyKG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7DQotCQkJCWhhbmRsZVByb3BlcnRpZXMoKTsNCi0JCQl9DQotCQl9KTsNCi0JCXRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgRmVhdHVyZVNvcnRlcigpKTsNCi0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJbWVudU1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7DQotCQltZW51TWdyLmFkZE1lbnVMaXN0ZW5lcihuZXcgSU1lbnVMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsNCi0JCQkJZmlsbENvbnRleHRNZW51KG1hbmFnZXIpOw0KLQkJCX0NCi0JCX0pOw0KLQkJdGFibGUuc2V0TWVudShtZW51TWdyLmNyZWF0ZUNvbnRleHRNZW51KHRhYmxlKSk7DQotCQkNCi0JCXRhYmxlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsNCi0JCXRhYmxlVmlld2VyLnNldEFsbENoZWNrZWQodHJ1ZSk7DQotCQkNCi0JCWRlc2NMYWJlbCA9IG5ldyBUZXh0KHNmb3JtLCBTV1QuQk9SREVSfFNXVC5XUkFQfFNXVC5NVUxUSXxTV1QuVl9TQ1JPTEwpOw0KLQkJZGVzY0xhYmVsLnNldEVkaXRhYmxlKGZhbHNlKTsNCi0JCQ0KLQkJc2Zvcm0uc2V0V2VpZ2h0cyhuZXcgaW50W10gezEwLCAyfSk7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsNCi0JCWlmICh0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHJldHVybjsNCi0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLnByb3AiKSkgeyAvLyROT04tTkxTLTEkDQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQloYW5kbGVQcm9wZXJ0aWVzKCk7DQotCQkJfQ0KLQkJfTsNCi0JCW1hbmFnZXIuYWRkKGFjdGlvbik7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIElGZWF0dXJlIGZlYXR1cmUpIHsNCi0JCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSBPcGVyYXRpb25zTWFuYWdlci5nZXRPcGVyYXRpb25GYWN0b3J5KCkuY3JlYXRlSW5zdGFsbE9wZXJhdGlvbiggbnVsbCwgZmVhdHVyZSxudWxsLCBudWxsLCBudWxsKTsNCi0JCQkJVmlld2VyRmlsdGVyW10gZmlsdGVycyA9IHRhYmxlVmlld2VyLmdldEZpbHRlcnMoKTsNCi0JCQkJYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsNCi0NCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJzLmxlbmd0aDsgaSsrKSB7DQotCQkJCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gZmlsdGVyc1tpXTsNCi0JCQkJCWlmICghZmlsdGVyLnNlbGVjdCh0YWJsZVZpZXdlciwgbnVsbCwgam9iKSkgew0KLQkJCQkJCXZpc2libGUgPSBmYWxzZTsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAodmlzaWJsZSkgew0KLQkJCQkJdGFibGVWaWV3ZXIuYWRkKGpvYik7DQotCQkJCQl1cGRhdGVJdGVtQ291bnQoMCwgLTEpOw0KLQkJCQl9DQotCQkJCWpvYnMuYWRkKGpvYik7DQotCQkJfQ0KLQkJfSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGpvYlNlbGVjdGVkKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgew0KLQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIGpvYiA9IChJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsNCi0JCUlGZWF0dXJlIGZlYXR1cmUgPSBqb2IgIT0gbnVsbCA/IGpvYi5nZXRGZWF0dXJlKCkgOiBudWxsOw0KLQkJSVVSTEVudHJ5IGRlc2NFbnRyeSA9IGZlYXR1cmUgIT0gbnVsbCA/IGZlYXR1cmUuZ2V0RGVzY3JpcHRpb24oKSA6IG51bGw7DQotCQlTdHJpbmcgZGVzYyA9IG51bGw7DQotCQlpZiAoZGVzY0VudHJ5ICE9IG51bGwpDQotCQkJZGVzYyA9IGRlc2NFbnRyeS5nZXRBbm5vdGF0aW9uKCk7DQotCQlpZiAoZGVzYyA9PSBudWxsKQ0KLQkJCWRlc2MgPSAiIjsgLy8kTk9OLU5MUy0xJA0KLQkJZGVzY0xhYmVsLnNldFRleHQoZGVzYyk7DQotCQlwcm9wZXJ0aWVzQnV0dG9uLnNldEVuYWJsZWQoZmVhdHVyZSAhPSBudWxsKTsNCi0JCW1vcmVJbmZvQnV0dG9uLnNldEVuYWJsZWQoam9iICE9IG51bGwgJiYgZ2V0TW9yZUluZm9VUkwoam9iKSAhPSBudWxsKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgew0KLQkJT2JqZWN0W10gY2hlY2tlZCA9IHRhYmxlVmlld2VyLmdldENoZWNrZWRFbGVtZW50cygpOw0KLQkJaW50IHRvdGFsQ291bnQgPSB0YWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1Db3VudCgpOw0KLQkJdXBkYXRlSXRlbUNvdW50KGNoZWNrZWQubGVuZ3RoLCB0b3RhbENvdW50KTsNCi0JCWlmIChjaGVja2VkLmxlbmd0aCA+IDApIHsNCi0JCQl2YWxpZGF0ZVNlbGVjdGlvbigpOw0KLQkJfSBlbHNlIHsNCi0JCQlsYXN0RGlzcGxheWVkU3RhdHVzID0gbnVsbDsNCi0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7DQotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCi0JCQl2YWxpZGF0aW9uU3RhdHVzID0gbnVsbDsNCi0JCQlwcm9ibGVtYXRpY0ZlYXR1cmVzLmNsZWFyKCk7DQotCQl9DQotCQl0YWJsZVZpZXdlci51cGRhdGUoam9icy50b0FycmF5KCksIG51bGwpOw0KLQkJc3RhdHVzQnV0dG9uLnNldEVuYWJsZWQodmFsaWRhdGlvblN0YXR1cyAhPSBudWxsKTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSXRlbUNvdW50KGludCBjaGVja2VkQ291bnQsIGludCB0b3RhbENvdW50KSB7DQotCQlpZiAoY2hlY2tlZENvdW50ID09IC0xKSB7DQotCQkJT2JqZWN0W10gY2hlY2tlZEVsZW1lbnRzID0gdGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZEVsZW1lbnRzKCk7DQotCQkJY2hlY2tlZENvdW50ID0gY2hlY2tlZEVsZW1lbnRzLmxlbmd0aDsNCi0JCX0NCi0JCWlmICh0b3RhbENvdW50ID09IC0xKSB7DQotCQkJdG90YWxDb3VudCA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCk7DQotCQl9DQotCQlTdHJpbmcgdG90YWwgPSAiIiArIHRvdGFsQ291bnQ7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyBzZWxlY3RlZCA9ICIiICsgY2hlY2tlZENvdW50OyAvLyROT04tTkxTLTEkDQotCQljb3VudGVyTGFiZWwuc2V0VGV4dCgNCi0JCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKA0KLQkJCQkiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmNvdW50ZXIiLCAvLyROT04tTkxTLTEkDQotCQkJCW5ldyBTdHJpbmdbXSB7IHNlbGVjdGVkLCB0b3RhbCB9KSk7DQotCQljb3VudGVyTGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdEFsbChib29sZWFuIHNlbGVjdCkgew0KLQkJdGFibGVWaWV3ZXIuc2V0QWxsQ2hlY2tlZChzZWxlY3QpOw0KLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsNCi0JCQkJcGFnZUNoYW5nZWQoKTsNCi0JCQl9DQotCQl9KTsNCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUHJvcGVydGllcygpIHsNCi0JCWZpbmFsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9DQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsNCi0NCi0JCWZpbmFsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPQ0KLQkJCShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsNCi0JCWlmIChwcm9wZXJ0aWVzQWN0aW9uID09IG51bGwpIHsNCi0JCQlwcm9wZXJ0aWVzQWN0aW9uID0NCi0JCQkJbmV3IEZlYXR1cmVQcm9wZXJ0eURpYWxvZ0FjdGlvbihnZXRTaGVsbCgpLCB0YWJsZVZpZXdlcik7DQotCQl9DQotDQotCQlCdXN5SW5kaWNhdG9yDQotCQkJLnNob3dXaGlsZSh0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlTaW1wbGVGZWF0dXJlQWRhcHRlciBhZGFwdGVyID0NCi0JCQkJCW5ldyBTaW1wbGVGZWF0dXJlQWRhcHRlcihqb2IuZ2V0RmVhdHVyZSgpKTsNCi0JCQkJcHJvcGVydGllc0FjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKA0KLQkJCQkJbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24oYWRhcHRlcikpOw0KLQkJCQlwcm9wZXJ0aWVzQWN0aW9uLnJ1bigpOw0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByaXZhdGUgU3RyaW5nIGdldE1vcmVJbmZvVVJMKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsNCi0JCUlVUkxFbnRyeSBkZXNjID0gam9iLmdldEZlYXR1cmUoKS5nZXREZXNjcmlwdGlvbigpOw0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgew0KLQkJCVVSTCB1cmwgPSBkZXNjLmdldFVSTCgpOw0KLQkJCXJldHVybiAodXJsID09IG51bGwpID8gbnVsbCA6IHVybC50b1N0cmluZygpOw0KLQkJfQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZU1vcmVJbmZvKCkgew0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0NCi0JCQkoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLQkJZmluYWwgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHNlbGVjdGVkSm9iID0NCi0JCQkoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQotCQlCdXN5SW5kaWNhdG9yDQotCQkJLnNob3dXaGlsZSh0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7DQotCQkJcHVibGljIHZvaWQgcnVuKCkgew0KLQkJCQlTdHJpbmcgdXJsTmFtZSA9IGdldE1vcmVJbmZvVVJMKHNlbGVjdGVkSm9iKTsNCi0JCQkJVXBkYXRlVUkuc2hvd1VSTCh1cmxOYW1lKTsNCi0JCQl9DQotCQl9KTsNCi0JfQ0KLQ0KLQlwdWJsaWMgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uW10gZ2V0U2VsZWN0ZWRKb2JzKCkgew0KLQkJT2JqZWN0W10gc2VsZWN0ZWQgPSB0YWJsZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsNCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIHJlc3VsdCA9IG5ldyBJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bc2VsZWN0ZWQubGVuZ3RoXTsNCi0JCVN5c3RlbS5hcnJheWNvcHkoc2VsZWN0ZWQsIDAsIHJlc3VsdCwgMCwgc2VsZWN0ZWQubGVuZ3RoKTsNCi0JCXJldHVybiByZXN1bHQ7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgdmFsaWRhdGVTZWxlY3Rpb24oKSB7DQotCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb25bXSBqb2JzID0gZ2V0U2VsZWN0ZWRKb2JzKCk7DQotCQl2YWxpZGF0aW9uU3RhdHVzID0NCi0JCQlPcGVyYXRpb25zTWFuYWdlci5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZVBlbmRpbmdDaGFuZ2VzKGpvYnMpOw0KLQkJcHJvYmxlbWF0aWNGZWF0dXJlcy5jbGVhcigpOw0KLQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgIT0gbnVsbCkgew0KLQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7DQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdGF0dXMubGVuZ3RoOyBpKyspIHsNCi0JCQkJSVN0YXR1cyBzaW5nbGVTdGF0dXMgPSBzdGF0dXNbaV07DQotCQkJCWlmKGlzU3BlY2lmaWNTdGF0dXMoc2luZ2xlU3RhdHVzKSl7DQotCQkJCQlJRmVhdHVyZSBmID0gKChGZWF0dXJlU3RhdHVzKSBzaW5nbGVTdGF0dXMpLmdldEZlYXR1cmUoKTsNCi0JCQkJCXByb2JsZW1hdGljRmVhdHVyZXMuYWRkKGYpOwkJCQkNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCXNldFBhZ2VDb21wbGV0ZSh2YWxpZGF0aW9uU3RhdHVzID09IG51bGwgfHwgdmFsaWRhdGlvblN0YXR1cy5nZXRDb2RlKCkgPT0gSVN0YXR1cy5XQVJOSU5HKTsNCi0JCQ0KLQkJdXBkYXRlV2l6YXJkTWVzc2FnZSgpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBzaG93U3RhdHVzKCkgew0KLQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgIT0gbnVsbCkgew0KLQkJCW5ldyBTdGF0dXNEaWFsb2coKS5vcGVuKCk7DQotCQl9DQotDQotCX0NCi0JLyoqDQotCSAqIENoZWNrIHdoZXRoZXIgc3RhdHVzIGlzIHJlbGV2YW50IHRvIHNob3cgZm9yDQotCSAqIGEgc3BlY2lmaWMgZmVhdHVyZSBvciBpcyBhIG90aGVyIHByb2JsZW0NCi0JICogQHBhcmFtIHN0YXR1cw0KLQkgKiBAcmV0dXJuIHRydWUgaWYgc3RhdHVzIGlzIEZlYXR1cmVTdGF0dXMgd2l0aA0KLQkgKiBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgY2VydGFpbiBlcnJvciBjb2Rlcw0KLQkgKi8NCi0JcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lmaWNTdGF0dXMoSVN0YXR1cyBzdGF0dXMpew0KLQkJaWYoIShzdGF0dXMgaW5zdGFuY2VvZiBGZWF0dXJlU3RhdHVzKSl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJaWYoc3RhdHVzLmdldFNldmVyaXR5KCkhPUlTdGF0dXMuRVJST1Ipew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0JCUZlYXR1cmVTdGF0dXMgZmVhdHVyZVN0YXR1cyA9IChGZWF0dXJlU3RhdHVzKSBzdGF0dXM7DQotCQlpZihmZWF0dXJlU3RhdHVzLmdldEZlYXR1cmUoKT09bnVsbCl7DQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJfQ0KLQkJcmV0dXJuIDAhPSAoZmVhdHVyZVN0YXR1cy5nZXRDb2RlKCkNCi0JCQkJJiBGZWF0dXJlU3RhdHVzLkNPREVfQ1lDTEUNCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfRU5WSVJPTk1FTlQNCi0JCQkJKyBGZWF0dXJlU3RhdHVzLkNPREVfRVhDTFVTSVZFDQotCQkJCSsgRmVhdHVyZVN0YXR1cy5DT0RFX09QVElPTkFMX0NISUxEDQotCQkJCSsgRmVhdHVyZVN0YXR1cy5DT0RFX1BSRVJFUV9GRUFUVVJFDQotCQkJCSsgRmVhdHVyZVN0YXR1cy5DT0RFX1BSRVJFUV9QTFVHSU4pOw0KLQl9DQotCS8qKg0KLQkgKiBVcGRhdGUgc3RhdHVzIGluIHRoZSB3aXphcmQgc3RhdHVzIGFyZWENCi0JICovDQotCXByaXZhdGUgdm9pZCB1cGRhdGVXaXphcmRNZXNzYWdlKCkgew0KLQkJaWYgKHZhbGlkYXRpb25TdGF0dXMgPT0gbnVsbCkgew0KLQkJCWxhc3REaXNwbGF5ZWRTdGF0dXM9bnVsbDsNCi0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7DQotCQl9IGVsc2UgaWYgKHZhbGlkYXRpb25TdGF0dXMuZ2V0Q29kZSgpID09IElTdGF0dXMuV0FSTklORykgew0KLQkJCWxhc3REaXNwbGF5ZWRTdGF0dXM9bnVsbDsNCi0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7DQotCQkJc2V0TWVzc2FnZSh2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsNCi0JCX0gZWxzZSB7DQotCQkJLy8gMS4gIEZlYXR1cmUgc2VsZWN0ZWQsIGNyZWF0aW5nIGEgcHJvYmxlbSBmb3IgaXQsIHNob3cgc3RhdHVzIGZvciBpdA0KLQkJCWlmKG5ld2x5U2VsZWN0ZWRGZWF0dXJlICE9bnVsbCl7DQotCQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7DQotCQkJCWZvcihpbnQgcyA9MDsgczwgc3RhdHVzLmxlbmd0aDsgcysrKXsNCi0JCQkJCWlmKGlzU3BlY2lmaWNTdGF0dXMoc3RhdHVzW3NdKSl7DQotCQkJCQkJRmVhdHVyZVN0YXR1cyBmZWF0dXJlU3RhdHVzID0gKEZlYXR1cmVTdGF0dXMpc3RhdHVzW3NdOw0KLQkJCQkJCWlmKG5ld2x5U2VsZWN0ZWRGZWF0dXJlLmVxdWFscyhmZWF0dXJlU3RhdHVzLmdldEZlYXR1cmUoKSkpew0KLQkJCQkJCQlsYXN0RGlzcGxheWVkU3RhdHVzPWZlYXR1cmVTdGF0dXM7DQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShmZWF0dXJlU3RhdHVzLmdldE1lc3NhZ2UoKSk7DQotCQkJCQkJCXJldHVybjsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQkJDQotCQkJLy8gMi4gIHNob3cgb2xkIHN0YXR1cyBpZiBwb3NzaWJsZSAoaXQgaXMgc3RpbGwgdmFsaWQpDQotCQkJaWYobGFzdERpc3BsYXllZFN0YXR1cyAhPW51bGwpew0KLQkJCQlJU3RhdHVzW10gc3RhdHVzID0gdmFsaWRhdGlvblN0YXR1cy5nZXRDaGlsZHJlbigpOw0KLQkJCQlmb3IoaW50IGk9MDsgaTxzdGF0dXMubGVuZ3RoOyBpKyspew0KLQkJCQkJaWYobGFzdERpc3BsYXllZFN0YXR1cy5lcXVhbHMoc3RhdHVzW2ldKSl7DQotCQkJCQkJLy9sYXN0RGlzcGxheWVkU3RhdHVzPWxhc3REaXNwbGF5ZWRTdGF0dXM7DQotCQkJCQkJLy9zZXRFcnJvck1lc3NhZ2Uoc3RhdHVzW2ldLmdldE1lc3NhZ2UoKSk7DQotCQkJCQkJcmV0dXJuOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWxhc3REaXNwbGF5ZWRTdGF0dXMgPSBudWxsOw0KLQkJCX0NCi0JCQkNCi0JCQkvLyAzLiAgcGljayB0aGUgZmlyc3QgcHJvYmxlbSB0aGF0IGlzIHNwZWNpZmljIHRvIHNvbWUgZmVhdHVyZQ0KLQkJCUlTdGF0dXNbXSBzdGF0dXMgPSB2YWxpZGF0aW9uU3RhdHVzLmdldENoaWxkcmVuKCk7DQotCQkJZm9yKGludCBzID0wOyBzPCBzdGF0dXMubGVuZ3RoOyBzKyspew0KLQkJCQlpZihpc1NwZWNpZmljU3RhdHVzKHN0YXR1c1tzXSkpew0KLQkJCQkJbGFzdERpc3BsYXllZFN0YXR1cyA9IChGZWF0dXJlU3RhdHVzKXN0YXR1c1tzXTsNCi0JCQkJCXNldEVycm9yTWVzc2FnZShzdGF0dXNbc10uZ2V0TWVzc2FnZSgpKTsNCi0JCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCX0NCi0JCQkJDQotCQkJLy8gNC4gIGRpc3BsYXkgdGhlIGZpcnN0IHByb2JsZW0gKG5vIHByb2JsZW1zIHNwZWNpZnkgYSBmZWF0dXJlKQ0KLQkJCWlmKHN0YXR1cy5sZW5ndGg+MCl7DQotCQkJCUlTdGF0dXMgc2luZ2xlU3RhdHVzPXN0YXR1c1swXTsNCi0JCQkJc2V0RXJyb3JNZXNzYWdlKHNpbmdsZVN0YXR1cy5nZXRNZXNzYWdlKCkpOw0KLQkJCX1lbHNlew0KLQkJCS8vIDUuIG5vdCBtdWx0aSBvciBlbXB0eSBtdWx0aSBzdGF0dXMNCi0JCQkJc2V0RXJyb3JNZXNzYWdlKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmludmFsaWQubG9uZyIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBTdGF0dXNEaWFsb2cgZXh0ZW5kcyBFcnJvckRpYWxvZyB7DQotLy8JCUJ1dHRvbiBkZXRhaWxzQnV0dG9uOw0KLQkJcHVibGljIFN0YXR1c0RpYWxvZygpIHsNCi0JCQlzdXBlcihVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpLCBVcGRhdGVVSQ0KLQkJCQkJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5SZXZpZXdQYWdlLmludmFsaWQuc2hvcnQiKSwgbnVsbCwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJdmFsaWRhdGlvblN0YXR1cywgSVN0YXR1cy5PSyB8IElTdGF0dXMuSU5GTw0KLQkJCQkJCQl8IElTdGF0dXMuV0FSTklORyB8IElTdGF0dXMuRVJST1IpOw0KLQkJfQ0KLS8vCQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbigNCi0vLwkJCQlDb21wb3NpdGUgcGFyZW50LA0KLS8vCQkJCWludCBpZCwNCi0vLwkJCQlTdHJpbmcgbGFiZWwsDQotLy8JCQkJYm9vbGVhbiBkZWZhdWx0QnV0dG9uKSB7DQotLy8JCQlCdXR0b24gYiA9IHN1cGVyLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIGlkLCBsYWJlbCwgZGVmYXVsdEJ1dHRvbik7DQotLy8JCQlpZihJRGlhbG9nQ29uc3RhbnRzLkRFVEFJTFNfSUQgPT0gaWQpew0KLS8vCQkJCWRldGFpbHNCdXR0b24gPSBiOw0KLS8vCQkJfQ0KLS8vCQkJcmV0dXJuIGI7DQotLy8JCX0NCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsNCi0JCQlzdXBlci5jcmVhdGUoKTsNCi0JCQlidXR0b25QcmVzc2VkKElEaWFsb2dDb25zdGFudHMuREVUQUlMU19JRCk7DQotLy8JCQlpZihkZXRhaWxzQnV0dG9uIT1udWxsKXsNCi0vLwkJCQlkZXRhaWxzQnV0dG9uLmRpc3Bvc2UoKTsNCi0vLwkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvKioNCi0JICogQHJldHVybiB0cnVlLCBpZiBjb21wbGV0ZWQsIGZhbHNlIGlmIGNhbmNlbGVkIGJ5IHRoZSB1c2VyDQotCSAqLw0KLQlwcml2YXRlIGJvb2xlYW4gZG93bmxvYWRJbmNsdWRlZEZlYXR1cmVzKCkgew0KLQkJdHJ5IHsNCi0JCQlEb3dubG9hZGVyIGRvd25sb2FkZXIgPSBuZXcgRG93bmxvYWRlcihqb2JzKTsNCi0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgdHJ1ZSwgZG93bmxvYWRlcik7DQotCQkJcmV0dXJuICFkb3dubG9hZGVyLmlzQ2FuY2VsZWQoKTsNCi0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7DQotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgew0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyoqDQotCSAqIFJ1bm5hYmxlIHRvIHJlc29sdmUgaW5jbHVkZWQgZmVhdHVyZSByZWZlcmVuY2VzLg0KLQkgKi8NCi0JY2xhc3MgRG93bmxvYWRlciBpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7DQotCQlib29sZWFuIGNhbmNlbGVkID0gZmFsc2U7DQotCQkvKioNCi0JCSAqIExpc3Qgb2YgSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uDQotCQkgKi8NCi0JCUFycmF5TGlzdCBvcGVyYXRpb25zOw0KLQkJcHVibGljIERvd25sb2FkZXIoQXJyYXlMaXN0IGluc3RhbGxPcGVyYXRpb25zKSB7DQotCQkJb3BlcmF0aW9ucyA9IGluc3RhbGxPcGVyYXRpb25zOw0KLQkJfQ0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsNCi0JCQlyZXR1cm4gY2FuY2VsZWQ7DQotCQl9DQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQ0KLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gew0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmF0aW9ucy5zaXplKCk7IGkrKykgew0KLQkJCQlJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gY2FuZGlkYXRlID0gKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb3BlcmF0aW9ucw0KLQkJCQkJCS5nZXQoaSk7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSBjYW5kaWRhdGUuZ2V0RmVhdHVyZSgpOw0KLQkJCQl0cnkgew0KLQkJCQkJSUZlYXR1cmVSZWZlcmVuY2VbXSBpcmVmcyA9IGZlYXR1cmUNCi0JCQkJCQkJLmdldFJhd0luY2x1ZGVkRmVhdHVyZVJlZmVyZW5jZXMoKTsNCi0JCQkJCWZvciAoaW50IGYgPSAwOyBmIDwgaXJlZnMubGVuZ3RoOyBmKyspIHsNCi0JCQkJCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsNCi0JCQkJCQkJY2FuY2VsZWQgPSB0cnVlOw0KLQkJCQkJCQlyZXR1cm47DQotCQkJCQkJfQ0KLQkJCQkJCUlGZWF0dXJlUmVmZXJlbmNlIGlyZWYgPSBpcmVmc1tmXTsNCi0JCQkJCQlJRmVhdHVyZSBpZmVhdHVyZSA9IGlyZWYuZ2V0RmVhdHVyZShtb25pdG9yKTsNCi0JCQkJCX0NCi0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJCX0NCi0JCQl9DQotCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7DQotCQkJCWNhbmNlbGVkID0gdHJ1ZTsNCi0JCQl9DQotCQl9DQotCX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvU2VhcmNoUnVubmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TZWFyY2hSdW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNjMThiYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TZWFyY2hSdW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLnNlYXJjaC4qOwotCi0vKioKLSAqIFJ1bnMgYSBzZWFyY2ggcXVlcnkKLSAqLwotcHVibGljIGNsYXNzIFNlYXJjaFJ1bm5lciB7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIElSdW5uYWJsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIElTZWFyY2hQcm92aWRlciBzZWFyY2hQcm92aWRlcjsKLQlwcml2YXRlIElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yOwotCXByaXZhdGUgYm9vbGVhbiBuZXdTZWFyY2hOZWVkZWQ7Ci0JCi0JcHVibGljIFNlYXJjaFJ1bm5lcihTaGVsbCBzaGVsbCwgSVJ1bm5hYmxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMuc2hlbGwgPSBzaGVsbDsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q29sbGVjdG9yKElVcGRhdGVTZWFyY2hSZXN1bHRDb2xsZWN0b3IgY29sbGVjdG9yKSB7Ci0JCXRoaXMuY29sbGVjdG9yID0gY29sbGVjdG9yOwotCX0KLQkKLQlwdWJsaWMgSVNlYXJjaFByb3ZpZGVyIGdldFNlYXJjaFByb3ZpZGVyKCkgewotCQlyZXR1cm4gc2VhcmNoUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaFByb3ZpZGVyKElTZWFyY2hQcm92aWRlciBzZWFyY2hQcm92aWRlcikgewotCQlpZiAodGhpcy5zZWFyY2hQcm92aWRlciE9c2VhcmNoUHJvdmlkZXIpCi0JCQluZXdTZWFyY2hOZWVkZWQgPSB0cnVlOwotCQl0aGlzLnNlYXJjaFByb3ZpZGVyID0gc2VhcmNoUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5ld1NlYXJjaE5lZWRlZChib29sZWFuIHZhbHVlKSB7Ci0JCW5ld1NlYXJjaE5lZWRlZCA9IHZhbHVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc05ld1NlYXJjaE5lZWRlZCgpIHsKLQkJcmV0dXJuIG5ld1NlYXJjaE5lZWRlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5TZWFyY2goKSB7Ci0JCWlmIChzZWFyY2hQcm92aWRlcj09bnVsbCkgcmV0dXJuOwotCQl0cnkgewotCQkJY29udGV4dC5ydW4odHJ1ZSwgdHJ1ZSwgZ2V0U2VhcmNoT3BlcmF0aW9uKGNvbGxlY3RvcikpOwotCQkJbmV3U2VhcmNoTmVlZGVkPWZhbHNlOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoISJjYW5jZWwiLmVxdWFscyhlLmdldE1lc3NhZ2UoKSkpCi0JCQkJVXBkYXRlVUkubG9nRXhjZXB0aW9uKGUpOwotCQkJbmV3U2VhcmNoTmVlZGVkPXRydWU7Ci0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJVGhyb3dhYmxlIHQgPSBlLmdldFRhcmdldEV4Y2VwdGlvbigpOwotCQkJaWYgKHQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQkJQ29yZUV4Y2VwdGlvbiBjZSA9IChDb3JlRXhjZXB0aW9uKXQ7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBjZS5nZXRTdGF0dXMoKTsKLQkJCQlpZiAoc3RhdHVzIT1udWxsICYmCi0JCQkJCXN0YXR1cy5nZXRDb2RlKCk9PUlTaXRlLlNJVEVfQUNDRVNTX0VYQ0VQVElPTikgewotCQkJCQkvLyBKdXN0IHNob3cgdGhpcyBidXQgZG8gbm90IHRocm93IGV4Y2VwdGlvbgotCQkJCQkvLyBiZWNhdXNlIHRoZXJlIG1heSBiZSByZXN1bHRzIGFueXdheS4KLQkJCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLFVwZGF0ZVVJLmdldFN0cmluZygiU2VhcmNoUnVubmVyLmNvbm5lY3Rpb25FcnJvciIpLCAvLyROT04tTkxTLTEkCi0JCQkJCQludWxsLCAKLQkJCQkJCXN0YXR1cyk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElSdW5uYWJsZVdpdGhQcm9ncmVzcyBnZXRTZWFyY2hPcGVyYXRpb24oZmluYWwgSVVwZGF0ZVNlYXJjaFJlc3VsdENvbGxlY3RvciBjb2xsZWN0b3IpIHsKLQkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCByZXF1ZXN0ID0gc2VhcmNoUHJvdmlkZXIuZ2V0U2VhcmNoUmVxdWVzdCgpOwotCQkKLQkJSVJ1bm5hYmxlV2l0aFByb2dyZXNzIG9wID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcyAoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXRyeSB7Ci0JCQkJCXJlcXVlc3QucGVyZm9ybVNlYXJjaChjb2xsZWN0b3IsIG1vbml0b3IpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihlKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQluZXdTZWFyY2hOZWVkZWQgPSB0cnVlOwotCQkJCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCJjYW5jZWwiKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJcmV0dXJuIG9wOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Nob3dBY3Rpdml0aWVzRGlhbG9nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaG93QWN0aXZpdGllc0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDcwMTU0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1Nob3dBY3Rpdml0aWVzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotCi0KLQotcHVibGljIGNsYXNzIFNob3dBY3Rpdml0aWVzRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGFjdGl2aXRpZXNWaWV3ZXI7Ci0KLQkvLyBsb2NhdGlvbiBjb25maWd1cmF0aW9uCi0JcHJpdmF0ZSBJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3M7Ci0JcHJpdmF0ZSBQb2ludCBkaWFsb2dMb2NhdGlvbjsKLQlwcml2YXRlIFBvaW50IGRpYWxvZ1NpemU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKi8KLQlwdWJsaWMgU2hvd0FjdGl2aXRpZXNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKFNXVC5SRVNJWkUgfCBTV1QuTUlOIHwgU1dULk1BWCB8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCXJlYWRDb25maWd1cmF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0JCS8vIGRpYWxvZyBsb2NhdGlvbiAKLQkJaWYgKGRpYWxvZ0xvY2F0aW9uICE9IG51bGwpCi0JCQlnZXRTaGVsbCgpLnNldExvY2F0aW9uKGRpYWxvZ0xvY2F0aW9uKTsKLQkJCi0JCS8vIGRpYWxvZyBzaXplCi0JCWlmIChkaWFsb2dTaXplICE9IG51bGwpCi0JCQlnZXRTaGVsbCgpLnNldFNpemUoZGlhbG9nU2l6ZSk7Ci0JCWVsc2UKLQkJCWdldFNoZWxsKCkuc2V0U2l6ZSg1MDAsNTAwKTsKLQkJCi0JCQotCQlhcHBseURpYWxvZ0ZvbnQoYnV0dG9uQmFyKTsKLQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEZvY3VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IGZhbHNlOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY3JlYXRlRGVzY3JpcHRpb25TZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWNyZWF0ZUFjdGl2aXRpZXNWaWV3ZXIoY29udGFpbmVyKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURlc2NyaXB0aW9uU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KXsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ2QpOwotCQl0cnkgewotCQkJTGFiZWwgdGFyZ2V0TGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCQl0YXJnZXRMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2hvd0FjdGl2aXRpZXNEaWFsb2cuZGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJTGFiZWwgdGFyZ2V0ID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQkJdGFyZ2V0LnNldFRleHQoU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKS5nZXRMYWJlbCgpKTsKLQkJCQotCQkJTGFiZWwgdXJsTGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCQl1cmxMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2hvd0FjdGl2aXRpZXNEaWFsb2cubG9jIikpOyAvLyROT04tTkxTLTEkCi0JCQlMYWJlbCB1cmwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCQl1cmwuc2V0VGV4dCgoKEluc3RhbGxDb25maWd1cmF0aW9uKVNpdGVNYW5hZ2VyLmdldExvY2FsU2l0ZSgpLmdldEN1cnJlbnRDb25maWd1cmF0aW9uKCkpLmdldFVSTCgpLmdldEZpbGUoKSk7Ci0JCQkKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVBY3Rpdml0aWVzVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDQ7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLS8vCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLS8vCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0KLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlNob3dBY3Rpdml0aWVzRGlhbG9nLmxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCWFjdGl2aXRpZXNWaWV3ZXIgPSBBY3Rpdml0aWVzVGFibGVWaWV3ZXIuY3JlYXRlVmlld2VyKGNvbXBvc2l0ZSwgdHJ1ZSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDgsIDIwLCBmYWxzZSkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgMTYwLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCAxODMsIHRydWUpKTsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIDEwMCwgdHJ1ZSkpOwotCi0JCWFjdGl2aXRpZXNWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdHJ5IHsKLQkJCWFjdGl2aXRpZXNWaWV3ZXIuc2V0SW5wdXQoU2l0ZU1hbmFnZXIuZ2V0TG9jYWxTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyYXRpb24oKSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQl9Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIE9LIGJ1dHRvbiBvbmx5IGJ5IGRlZmF1bHQKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCXN0b3JlU2V0dGluZ3MoKTsKLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCQotCS8qKgotCSAqIFN0b3JlcyB0aGUgY3VycmVudCBzdGF0ZSBpbiB0aGUgZGlhbG9nIHNldHRpbmdzLgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RvcmVTZXR0aW5ncygpIHsKLQkJd3JpdGVDb25maWd1cmF0aW9uKCk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRpYWxvZyBzZXR0aW5ncyBvYmplY3QgdXNlZCB0byBzaGFyZSBzdGF0ZQotCSAqIGJldHdlZW4gc2V2ZXJhbCBldmVudCBkZXRhaWwgZGlhbG9ncy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkaWFsb2cgc2V0dGluZ3MgdG8gYmUgdXNlZAotCSAqLwotCXByaXZhdGUgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJZGlhbG9nU2V0dGluZ3MgPSBzZXR0aW5ncy5nZXRTZWN0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJaWYgKGRpYWxvZ1NldHRpbmdzID09IG51bGwpCi0JCQlkaWFsb2dTZXR0aW5ncz0gc2V0dGluZ3MuYWRkTmV3U2VjdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0JCXJldHVybiBkaWFsb2dTZXR0aW5nczsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBpdHNlbGYgZnJvbSB0aGUgZGlhbG9nIHNldHRpbmdzIHdpdGggdGhlIHNhbWUgc3RhdGUKLQkgKiBhcyBhdCB0aGUgcHJldmlvdXMgaW52b2NhdGlvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZENvbmZpZ3VyYXRpb24oKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQl0cnkgewotCQkJaW50IHg9IHMuZ2V0SW50KCJ4Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB5PSBzLmdldEludCgieSIpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2dMb2NhdGlvbj0gbmV3IFBvaW50KHgsIHkpOwotCQkJCi0JCQl4ID0gcy5nZXRJbnQoIndpZHRoIik7IC8vJE5PTi1OTFMtMSQKLQkJCXkgPSBzLmdldEludCgiaGVpZ2h0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZ1NpemUgPSBuZXcgUG9pbnQoeCx5KTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWRpYWxvZ0xvY2F0aW9uPSBudWxsOwotCQkJZGlhbG9nU2l6ZSA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29uZmlndXJhdGlvbigpewotCQlJRGlhbG9nU2V0dGluZ3MgcyA9IGdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCVBvaW50IGxvY2F0aW9uID0gZ2V0U2hlbGwoKS5nZXRMb2NhdGlvbigpOwotCQlzLnB1dCgieCIsIGxvY2F0aW9uLngpOyAvLyROT04tTkxTLTEkCi0JCXMucHV0KCJ5IiwgbG9jYXRpb24ueSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCVBvaW50IHNpemUgPSBnZXRTaGVsbCgpLmdldFNpemUoKTsKLQkJcy5wdXQoIndpZHRoIiwgc2l6ZS54KTsgLy8kTk9OLU5MUy0xJAotCQlzLnB1dCgiaGVpZ2h0Iiwgc2l6ZS55KTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NpdGVQYWdlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9TaXRlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDUyZWYwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1NpdGVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuc2VhcmNoLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5zZWFyY2guKjsKLQotcHVibGljIGNsYXNzIFNpdGVQYWdlIGV4dGVuZHMgQmFubmVyUGFnZSBpbXBsZW1lbnRzIElTZWFyY2hQcm92aWRlciB7Ci0KLQljbGFzcyBUcmVlQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgewotCQkJcmV0dXJuIGdldEFsbFNpdGVCb29rbWFya3MoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihmaW5hbCBPYmplY3QgcGFyZW50KSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJZmluYWwgU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgcGFyZW50OwotCQkJCWlmIChib29rbWFyay5pc1VuYXZhaWxhYmxlKCkpCi0JCQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQkJCWZpbmFsIE9iamVjdFtdIGNoaWxkcmVuID0KLQkJCQkJZ2V0U2l0ZUNhdGFsb2dXaXRoSW5kaWNhdG9yKAotCQkJCQkJYm9va21hcmssCi0JCQkJCQkhYm9va21hcmsuaXNTaXRlQ29ubmVjdGVkKCkpOwotCQkJCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkKLQkJCQkJCQloYW5kbGVTaXRlRXhwYW5kZWQoYm9va21hcmssIGNoaWxkcmVuKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCXJldHVybiBjaGlsZHJlbjsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KQotCQkJCXJldHVybiAoKFNpdGVDYXRlZ29yeSkgZWxlbWVudCkuZ2V0Qm9va21hcmsoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoZWxlbWVudCBpbnN0YW5jZW9mIFNpdGVCb29rbWFyayk7Ci0JCX0KLQotCX0KLQotCWNsYXNzIFRyZWVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmopIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQm9va21hcmspCi0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAotCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX1NJVEVfT0JKKTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpCi0JCQkJcmV0dXJuIFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZ2V0KAotCQkJCQlVcGRhdGVVSUltYWdlcy5ERVNDX0NBVEVHT1JZX09CSik7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2Uob2JqKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJcmV0dXJuICgoU2l0ZUJvb2ttYXJrKSBvYmopLmdldExhYmVsKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChvYmopOwotCQl9Ci0JfQotCi0JY2xhc3MgTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIElVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG9iamVjdENoYW5nZWQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQl0cmVlVmlld2VyLnJlZnJlc2goKTsKLQkJCWNoZWNrSXRlbXMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG9iamVjdHNBZGRlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQljaGVja0l0ZW1zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBvYmplY3RzUmVtb3ZlZChPYmplY3QgcGFyZW50LCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkJdHJlZVZpZXdlci5yZWZyZXNoKCk7Ci0JCQljaGVja0l0ZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEaXNjb3ZlcnlGb2xkZXIgZGlzY292ZXJ5Rm9sZGVyID0gbmV3IERpc2NvdmVyeUZvbGRlcigpOwotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0JcHJpdmF0ZSBCdXR0b24gYWRkU2l0ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRMb2NhbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRMb2NhbFppcHBlZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlbnZGaWx0ZXJDaGVjazsKLQlwcml2YXRlIFNlYXJjaFJ1bm5lciBzZWFyY2hSdW5uZXI7Ci0JcHJpdmF0ZSBFbnZpcm9ubWVudEZpbHRlciBlbnZGaWx0ZXI7Ci0JcHJpdmF0ZSBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3Q7Ci0JcHJpdmF0ZSBNb2RlbExpc3RlbmVyIG1vZGVsTGlzdGVuZXI7Ci0KLQotCXB1YmxpYyBTaXRlUGFnZShTZWFyY2hSdW5uZXIgc2VhcmNoUnVubmVyKSB7Ci0JCXN1cGVyKCJTaXRlUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldFRpdGxlKFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5kZXNjIikpOyAvLyROT04tTkxTLTEkCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuY29ubmVjdCh0aGlzKTsKLQkJc2VhcmNoUmVxdWVzdCA9Ci0JCQluZXcgVXBkYXRlU2VhcmNoUmVxdWVzdCgKLQkJCQluZXcgU2l0ZVNlYXJjaENhdGVnb3J5KCksCi0JCQkJbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCkpOwotCQlzZWFyY2hSZXF1ZXN0LmFkZEZpbHRlcihuZXcgQmFja0xldmVsRmlsdGVyKCkpOwotCQllbnZGaWx0ZXIgPSBuZXcgRW52aXJvbm1lbnRGaWx0ZXIoKTsKLQkJdGhpcy5zZWFyY2hSdW5uZXIgPSBzZWFyY2hSdW5uZXI7Ci0JCW1vZGVsTGlzdGVuZXIgPSBuZXcgTW9kZWxMaXN0ZW5lcigpOwotCQlVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKS5hZGRVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcigKLQkJCW1vZGVsTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0b2dnbGVFbnZGaWx0ZXIoYm9vbGVhbiBhZGQpIHsKLQkJaWYgKGFkZCkKLQkJCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKGVudkZpbHRlcik7Ci0JCWVsc2UKLQkJCXNlYXJjaFJlcXVlc3QucmVtb3ZlRmlsdGVyKGVudkZpbHRlcik7Ci0JCXNlYXJjaFJ1bm5lci5zZXROZXdTZWFyY2hOZWVkZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5kaXNjb25uZWN0KHRoaXMpOwotCQlVcGRhdGVVSQotCQkJLmdldERlZmF1bHQoKQotCQkJLmdldFVwZGF0ZU1vZGVsKCkKLQkJCS5yZW1vdmVVcGRhdGVNb2RlbENoYW5nZWRMaXN0ZW5lcigKLQkJCW1vZGVsTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy5CYW5uZXJQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjbGllbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY2xpZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UubGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQljcmVhdGVUcmVlVmlld2VyKGNsaWVudCk7Ci0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX1ZFUlRJQ0FMKSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJYWRkU2l0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWFkZFNpdGVCdXR0b24uc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIlNpdGVQYWdlLmFkZFVwZGF0ZVNpdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkU2l0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKAotCQkJbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkU2l0ZUJ1dHRvbik7Ci0JCWFkZFNpdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWRkU2l0ZSgpOwotCQkJfQotCQl9KTsKLQotCQlhZGRMb2NhbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCWFkZExvY2FsQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5hZGRMb2NhbFNpdGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkTG9jYWxCdXR0b24uc2V0TGF5b3V0RGF0YSgKLQkJCW5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJU1dUVXRpbC5zZXRCdXR0b25EaW1lbnNpb25IaW50KGFkZExvY2FsQnV0dG9uKTsKLQkJYWRkTG9jYWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlQWRkTG9jYWwoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYWRkTG9jYWxaaXBwZWRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQlhZGRMb2NhbFppcHBlZEJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UuYWRkTG9jYWxaaXBwZWRTaXRlIikpOyAvLyROT04tTkxTLTEkCi0JCWFkZExvY2FsWmlwcGVkQnV0dG9uLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChhZGRMb2NhbFppcHBlZEJ1dHRvbik7Ci0JCWFkZExvY2FsWmlwcGVkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUFkZExvY2FsWmlwcGVkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5lZGl0IikpOyAvLyROT04tTkxTLTEkCi0JCWVkaXRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChlZGl0QnV0dG9uKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVFZGl0KCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29udGFpbmVyLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UucmVtb3ZlIikpOyAvLyROT04tTkxTLTEkCi0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoCi0JCQluZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChyZW1vdmVCdXR0b24pOwotCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlUmVtb3ZlKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWVudkZpbHRlckNoZWNrID0gbmV3IEJ1dHRvbihjbGllbnQsIFNXVC5DSEVDSyk7Ci0JCWVudkZpbHRlckNoZWNrLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5pZ25vcmUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZW52RmlsdGVyQ2hlY2suc2V0U2VsZWN0aW9uKHRydWUpOwotCQl0b2dnbGVFbnZGaWx0ZXIodHJ1ZSk7Ci0JCWVudkZpbHRlckNoZWNrLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXRvZ2dsZUVudkZpbHRlcihlbnZGaWx0ZXJDaGVjay5nZXRTZWxlY3Rpb24oKSk7Ci0JCQl9Ci0JCX0pOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVudkZpbHRlckNoZWNrLnNldExheW91dERhdGEoZ2QpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLlNpdGVQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gY2xpZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdHJlZVZpZXdlciA9Ci0JCQluZXcgQ2hlY2tib3hUcmVlVmlld2VyKAotCQkJCXBhcmVudCwKLQkJCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBUcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRyZWVMYWJlbFByb3ZpZGVyKCkpOwotCQl0cmVlVmlld2VyLnNldElucHV0KFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpKTsKLQotCQlpbml0aWFsaXplSXRlbXMoKTsKLQotCQl0cmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZSkgewotCQkJCU9iamVjdCBlbGVtZW50ID0gZS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQm9va21hcmspCi0JCQkJCWhhbmRsZVNpdGVDaGVja2VkKChTaXRlQm9va21hcmspIGVsZW1lbnQsIGUuZ2V0Q2hlY2tlZCgpKTsKLQkJCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU2l0ZUNhdGVnb3J5KSB7Ci0JCQkJCWhhbmRsZUNhdGVnb3J5Q2hlY2tlZCgKLQkJCQkJCShTaXRlQ2F0ZWdvcnkpIGVsZW1lbnQsCi0JCQkJCQllLmdldENoZWNrZWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl0cmVlVmlld2VyCi0JCQkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZSkgewotCQkJCWhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBlLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJfSk7Ci0KLS8vCQl0cmVlVmlld2VyLmFkZEZpbHRlcihuZXcgVmlld2VyRmlsdGVyKCkgewotLy8JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoCi0vLwkJCQlWaWV3ZXIgdmlld2VyLAotLy8JCQkJT2JqZWN0IHBhcmVudEVsZW1lbnQsCi0vLwkJCQlPYmplY3QgZWxlbWVudCkgewotLy8JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaXRlQm9va21hcmspCi0vLwkJCQkJcmV0dXJuICEoKFNpdGVCb29rbWFyaykgZWxlbWVudCkuaXNXZWJCb29rbWFyaygpOwotLy8JCQkJcmV0dXJuIHRydWU7Ci0vLwkJCX0KLS8vCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUl0ZW1zKCkgewotCQljaGVja0l0ZW1zKCk7Ci0JCXVwZGF0ZVNlYXJjaFJlcXVlc3QoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tJdGVtcygpIHsKLQkJVHJlZUl0ZW1bXSBpdGVtcyA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpLmdldEl0ZW1zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCVNpdGVCb29rbWFyayBib29rbWFyayA9IChTaXRlQm9va21hcmspIGl0ZW1zW2ldLmdldERhdGEoKTsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChib29rbWFyaywgYm9va21hcmsuaXNTZWxlY3RlZCgpKTsKLQkJCVN0cmluZ1tdIGlnbm9yZWRDYXRzID0gYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKTsKLQkJCXRyZWVWaWV3ZXIuc2V0R3JheWVkKGJvb2ttYXJrLCBpZ25vcmVkQ2F0cy5sZW5ndGggPiAwCi0JCQkJCSYmIGJvb2ttYXJrLmlzU2VsZWN0ZWQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkU2l0ZSgpIHsKLQkJTmV3VXBkYXRlU2l0ZURpYWxvZyBkaWFsb2cgPSBuZXcgTmV3VXBkYXRlU2l0ZURpYWxvZyhnZXRTaGVsbCgpKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UubmV3IikpOyAvLyROT04tTkxTLTEkCi0JCWlmIChkaWFsb2cub3BlbigpID09IE5ld1VwZGF0ZVNpdGVEaWFsb2cuT0spCi0JCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUFkZExvY2FsKCkgewotCQlTaXRlQm9va21hcmsgc2l0ZUJvb2ttYXJrID0gTG9jYWxTaXRlU2VsZWN0b3IuZ2V0TG9jYUxTaXRlKGdldFNoZWxsKCkpOwotCQlpZiAoc2l0ZUJvb2ttYXJrICE9IG51bGwpIHsKLQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQltb2RlbC5hZGRCb29rbWFyayhzaXRlQm9va21hcmspOwotCQkJbW9kZWwuc2F2ZUJvb2ttYXJrcygpOwotCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkTG9jYWxaaXBwZWQoKSB7Ci0JCVNpdGVCb29rbWFyayBzaXRlQm9va21hcmsgPQotCQkJTG9jYWxTaXRlU2VsZWN0b3IuZ2V0TG9jYUxaaXBwZWRTaXRlKGdldFNoZWxsKCkpOwotCQlpZiAoc2l0ZUJvb2ttYXJrICE9IG51bGwpIHsKLQkJCVVwZGF0ZU1vZGVsIG1vZGVsID0gVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQltb2RlbC5hZGRCb29rbWFyayhzaXRlQm9va21hcmspOwotCQkJbW9kZWwuc2F2ZUJvb2ttYXJrcygpOwotCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVtb3ZlKCkgewotCQlCdXN5SW5kaWNhdG9yCi0JCQkuc2hvd1doaWxlKHRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVVwZGF0ZU1vZGVsIHVwZGF0ZU1vZGVsID0KLQkJCQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldFVwZGF0ZU1vZGVsKCk7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCA9Ci0JCQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgdHJlZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmICghYm9va21hcmsuaXNSZWFkT25seSgpKSB7Ci0JCQkJCXVwZGF0ZU1vZGVsLnJlbW92ZUJvb2ttYXJrKGJvb2ttYXJrKTsKLQkJCQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUVkaXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWwgPQotCQkJKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlTaXRlQm9va21hcmsgYm9va21hcmsgPSAoU2l0ZUJvb2ttYXJrKSBzc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlVUkwgb2xkVVJMID0gYm9va21hcmsuZ2V0VVJMKCk7Ci0JCUVkaXRTaXRlRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0U2l0ZURpYWxvZyhnZXRTaGVsbCgpLCBib29rbWFyayk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJU3RyaW5nIHRpdGxlID0gYm9va21hcmsuaXNMb2NhbCgpID8gVXBkYXRlVUkuZ2V0U3RyaW5nKCJTaXRlUGFnZS5kaWFsb2dFZGl0TG9jYWwiKSA6IFVwZGF0ZVVJLmdldFN0cmluZygiU2l0ZVBhZ2UuZGlhbG9nRWRpdFVwZGF0ZVNpdGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMiQKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWlmIChkaWFsb2cub3BlbigpID09IEVkaXRTaXRlRGlhbG9nLk9LICkgewotCQkJVVJMIG5ld1VSTCA9IGJvb2ttYXJrLmdldFVSTCgpOwotCQkJaWYgKCFVcGRhdGVNYW5hZ2VyVXRpbHMuc2FtZVVSTChvbGRVUkwsIG5ld1VSTCkpIHsKLQkJCQlVcGRhdGVNb2RlbCBtb2RlbCA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRVcGRhdGVNb2RlbCgpOwotCQkJCW1vZGVsLmZpcmVPYmplY3RDaGFuZ2VkKGJvb2ttYXJrLCBudWxsKTsKLQkJCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7CQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNpdGVDaGVja2VkKFNpdGVCb29rbWFyayBib29rbWFyaywgYm9vbGVhbiBjaGVja2VkKSB7Ci0JCWlmIChib29rbWFyay5pc1VuYXZhaWxhYmxlKCkpIHsKLQkJCWJvb2ttYXJrLnNldFNlbGVjdGVkKGZhbHNlKTsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChib29rbWFyaywgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29rbWFyay5zZXRTZWxlY3RlZChjaGVja2VkKTsKLQkJaWYgKGNoZWNrZWQpCi0JCQlib29rbWFyay5zZXRJZ25vcmVkQ2F0ZWdvcmllcyhuZXcgU3RyaW5nWzBdKTsKLQkJCQotCQlpZiAoY2hlY2tlZCB8fCBib29rbWFyay5pc1NpdGVDb25uZWN0ZWQoKSkKLQkJCXRyZWVWaWV3ZXIuc2V0U3VidHJlZUNoZWNrZWQoYm9va21hcmssIGNoZWNrZWQpOwotCQkvLyBhdCB0aGlzIHBvaW50LCB3ZSBtYXkgcmVhbGl6ZSB0aGUgc2l0ZSBpcyBub3QgYXZhaWxhYmxlCi0JCWlmIChib29rbWFyay5pc1VuYXZhaWxhYmxlKCkpIHsKLQkJCXRyZWVWaWV3ZXIuc2V0Q2hlY2tlZChib29rbWFyaywgZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJdHJlZVZpZXdlci5zZXRHcmF5ZWQoYm9va21hcmssIGZhbHNlKTsKLQkJdXBkYXRlU2VhcmNoUmVxdWVzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaXRlRXhwYW5kZWQoU2l0ZUJvb2ttYXJrIGJvb2ttYXJrLCBPYmplY3RbXSBjYXRzKSB7Ci0JCWlmICghYm9va21hcmsuaXNTZWxlY3RlZCgpKSB7Ci0JCQl0cmVlVmlld2VyLnNldFN1YnRyZWVDaGVja2VkKGJvb2ttYXJrLCBmYWxzZSk7Ci0JCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGNhdHNbaV0gaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLQkJCQkJcmVzdWx0LmFkZCgoKFNpdGVDYXRlZ29yeSkgY2F0c1tpXSkuZ2V0RnVsbE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQkJYm9va21hcmsuc2V0SWdub3JlZENhdGVnb3JpZXMoCi0JCQkJKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmdbXSBpZ25vcmVkID0gYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKTsKLQkJCUhhc2hTZXQgaW1hcCA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGlnbm9yZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlpbWFwLmFkZChpZ25vcmVkW2ldKTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGNhdHNbaV0gaW5zdGFuY2VvZiBTaXRlQ2F0ZWdvcnkpIHsKLQkJCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgY2F0c1tpXTsKLQkJCQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKAotCQkJCQkJY2F0ZWdvcnksCi0JCQkJCQkhaW1hcC5jb250YWlucyhjYXRlZ29yeS5nZXRGdWxsTmFtZSgpKSk7Ci0JCQkJfQotCQkJfQotCQkJdHJlZVZpZXdlci5zZXRHcmF5ZWQoCi0JCQkJYm9va21hcmssCi0JCQkJaWdub3JlZC5sZW5ndGggPiAwICYmIGlnbm9yZWQubGVuZ3RoIDwgY2F0cy5sZW5ndGgpOwotCQl9Ci0JCXNlYXJjaFJ1bm5lci5zZXROZXdTZWFyY2hOZWVkZWQodHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhdGVnb3J5Q2hlY2tlZCgKLQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5LAotCQlib29sZWFuIGNoZWNrZWQpIHsKLQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gY2F0ZWdvcnkuZ2V0Qm9va21hcmsoKTsKLQkJCi0JCUFycmF5TGlzdCBhcnJheSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoYm9va21hcmsuaXNTZWxlY3RlZCgpKSB7Ci0JCQlTdHJpbmdbXSBpZ25vcmVkID0gYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlZC5sZW5ndGg7IGkrKykgCi0JCQkJYXJyYXkuYWRkKGlnbm9yZWRbaV0pOwotCQl9IGVsc2UgewotCQkJT2JqZWN0W10gY2F0ZWdzID0KLQkJCQlnZXRTaXRlQ2F0YWxvZ1dpdGhJbmRpY2F0b3IoYm9va21hcmssICFib29rbWFyay5pc1NpdGVDb25uZWN0ZWQoKSk7Ci0JCQlmb3IgKGludCBpPTA7IGk8Y2F0ZWdzLmxlbmd0aDsgaSsrKQotCQkJCWFycmF5LmFkZCgoKFNpdGVDYXRlZ29yeSljYXRlZ3NbaV0pLmdldEZ1bGxOYW1lKCkpOwotCQl9Ci0JCQotCQlpZiAoY2hlY2tlZCkgewotCQkJYXJyYXkucmVtb3ZlKGNhdGVnb3J5LmdldEZ1bGxOYW1lKCkpOwotCQl9IGVsc2UgewotCQkJYXJyYXkuYWRkKGNhdGVnb3J5LmdldEZ1bGxOYW1lKCkpOwotCQl9Ci0KLQkJYm9va21hcmsuc2V0SWdub3JlZENhdGVnb3JpZXMoCi0JCQkoU3RyaW5nW10pIGFycmF5LnRvQXJyYXkobmV3IFN0cmluZ1thcnJheS5zaXplKCldKSk7Ci0JCXNlYXJjaFJ1bm5lci5zZXROZXdTZWFyY2hOZWVkZWQodHJ1ZSk7Ci0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSAoKFRyZWVDb250ZW50UHJvdmlkZXIpIHRyZWVWaWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkpCi0JCQkJCS5nZXRDaGlsZHJlbihjYXRlZ29yeS5nZXRCb29rbWFyaygpKTsKLQkJdHJlZVZpZXdlci5zZXRDaGVja2VkKGJvb2ttYXJrLCBhcnJheS5zaXplKCkgPCBjaGlsZHJlbi5sZW5ndGgpOwotCQlib29rbWFyay5zZXRTZWxlY3RlZChhcnJheS5zaXplKCkgPCBjaGlsZHJlbi5sZW5ndGgpOwotCQl0cmVlVmlld2VyLnNldEdyYXllZCgKLQkJCWJvb2ttYXJrLAotCQkJYXJyYXkuc2l6ZSgpID4gMCAmJiBhcnJheS5zaXplKCkgPCBjaGlsZHJlbi5sZW5ndGgpOwotCQl1cGRhdGVTZWFyY2hSZXF1ZXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3NlbCkgewotCQlib29sZWFuIGVuYWJsZSA9IGZhbHNlOwotCQlPYmplY3QgaXRlbSA9IHNzZWwuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQllbmFibGUgPSAhKChTaXRlQm9va21hcmspIGl0ZW0pLmlzUmVhZE9ubHkoKTsKLQkJfQotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWFyY2hSZXF1ZXN0KCkgewotCQlPYmplY3RbXSBjaGVja2VkID0gdHJlZVZpZXdlci5nZXRDaGVja2VkRWxlbWVudHMoKTsKLQotCQlVcGRhdGVTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBVcGRhdGVTZWFyY2hTY29wZSgpOwotCQlpbnQgbnNpdGVzID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoZWNrZWQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjaGVja2VkW2ldIGluc3RhbmNlb2YgU2l0ZUJvb2ttYXJrKSB7Ci0JCQkJU2l0ZUJvb2ttYXJrIGJvb2ttYXJrID0gKFNpdGVCb29rbWFyaykgY2hlY2tlZFtpXTsKLQkJCQlzY29wZS5hZGRTZWFyY2hTaXRlKAotCQkJCQlib29rbWFyay5nZXRMYWJlbCgpLAotCQkJCQlib29rbWFyay5nZXRVUkwoKSwKLQkJCQkJYm9va21hcmsuZ2V0SWdub3JlZENhdGVnb3JpZXMoKSk7Ci0JCQkJbnNpdGVzKys7Ci0JCQl9Ci0JCX0KLQkJc2VhcmNoUmVxdWVzdC5zZXRTY29wZShzY29wZSk7Ci0JCXNlYXJjaFJ1bm5lci5zZXROZXdTZWFyY2hOZWVkZWQodHJ1ZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShuc2l0ZXMgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgVXBkYXRlU2VhcmNoUmVxdWVzdCBnZXRTZWFyY2hSZXF1ZXN0KCkgewotCQlyZXR1cm4gc2VhcmNoUmVxdWVzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2YWx1ZSk7Ci0JCWlmICh2YWx1ZSkgewotCQkJc2VhcmNoUnVubmVyLnNldFNlYXJjaFByb3ZpZGVyKHRoaXMpOwotCQkJLy8gUmVzZXQgYWxsIHVuYXZhaWxhYmxlIHNpdGVzLCBzbyB0aGV5IGNhbiBiZSB0cmllZCBhZ2FpbiBpZiB0aGUgdXNlciB3YW50cyBpdAotCQkJU2l0ZUJvb2ttYXJrW10gYm9va21hcmtzID0gZ2V0QWxsU2l0ZUJvb2ttYXJrcygpOwotCQkJZm9yIChpbnQgaT0wOyBpPGJvb2ttYXJrcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChib29rbWFya3NbaV0uaXNVbmF2YWlsYWJsZSgpKQotCQkJCQlib29rbWFya3NbaV0uc2V0VW5hdmFpbGFibGUoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgQ2F0YWxvZ0JhZyB7Ci0JCU9iamVjdFtdIGNhdGFsb2c7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRTaXRlQ2F0YWxvZ1dpdGhJbmRpY2F0b3IoCi0JCWZpbmFsIFNpdGVCb29rbWFyayBib29rbWFyaywKLQkJZmluYWwgYm9vbGVhbiBjb25uZWN0KSB7Ci0JCWZpbmFsIENhdGFsb2dCYWcgYmFnID0gbmV3IENhdGFsb2dCYWcoKTsKLQotCQlpZiAoYm9va21hcmsuaXNVbmF2YWlsYWJsZSgpKQotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIDMpOyAvLyROT04tTkxTLTEkCi0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCi0JCQkJCWlmIChjb25uZWN0KQotCQkJCQkJYm9va21hcmsuY29ubmVjdChuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQkJZWxzZQotCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJCWJhZy5jYXRhbG9nID0KLQkJCQkJCWJvb2ttYXJrLmdldENhdGFsb2coCi0JCQkJCQkJdHJ1ZSwKLQkJCQkJCQluZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCQl0cnkgewotCQkJZ2V0Q29udGFpbmVyKCkucnVuKHRydWUsIHRydWUsIG9wKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJfQotCi0JCXJldHVybiAoYmFnLmNhdGFsb2cgPT0gbnVsbCkgPyBuZXcgT2JqZWN0WzBdIDogYmFnLmNhdGFsb2c7Ci0JfQotCQotCXByaXZhdGUgU2l0ZUJvb2ttYXJrW10gZ2V0QWxsU2l0ZUJvb2ttYXJrcygpIHsKLQkJVXBkYXRlTW9kZWwgbW9kZWwgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0VXBkYXRlTW9kZWwoKTsKLQkJT2JqZWN0W10gYm9va21hcmtzID0gbW9kZWwuZ2V0Qm9va21hcmtMZWFmcygpOwotCQlPYmplY3RbXSBzaXRlc1RvVmlzaXQgPQotCQkJZGlzY292ZXJ5Rm9sZGVyLmdldENoaWxkcmVuKGRpc2NvdmVyeUZvbGRlcik7Ci0JCVNpdGVCb29rbWFya1tdIGFsbCA9IG5ldyBTaXRlQm9va21hcmtbYm9va21hcmtzLmxlbmd0aCArIHNpdGVzVG9WaXNpdC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGJvb2ttYXJrcywgMCwgYWxsLCAwLCBib29rbWFya3MubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weSgKLQkJCXNpdGVzVG9WaXNpdCwKLQkJCTAsCi0JCQlhbGwsCi0JCQlib29rbWFya3MubGVuZ3RoLAotCQkJc2l0ZXNUb1Zpc2l0Lmxlbmd0aCk7Ci0JCXJldHVybiBhbGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOTk3ZjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFibGVMYXlvdXRDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5QaXhlbERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotCi0vKioKLSAqIEEgc3BlY2lhbCBjb21wb3NpdGUgdG8gbGF5b3V0IGNvbHVtbnMgaW5zaWRlIGEgdGFibGUuIFRoZSBjb21wb3NpdGUgaXMgbmVlZGVkIHNpbmNlIHdlIGhhdmUKLSAqIHRvIGxheW91dCB0aGUgY29sdW1ucyAiYmVmb3JlIiB0aGUgYWN0dWFsIHRhYmxlIGdldHMgbGF5b3V0ZWQuIEhlbmNlIHdlIGNhbid0IHVzZSBhIG5vcm1hbAotICogbGF5b3V0IG1hbmFnZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlwcml2YXRlIExpc3QgY29sdW1ucz0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUxheW91dENvbXBvc2l0ZTwvY29kZT4uCi0JICovCi0JcHVibGljIFRhYmxlTGF5b3V0Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLSAgICAgICAgYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbnRyb2xSZXNpemVkKENvbnRyb2xFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgUmVjdGFuZ2xlIGFyZWE9IGdldENsaWVudEFyZWEoKTsKLSAgICAgICAgICAgICAgICBUYWJsZSB0YWJsZT0gKFRhYmxlKWdldENoaWxkcmVuKClbMF07Ci0gICAgICAgICAgICAgICAgUG9pbnQgcHJlZmVycmVkU2l6ZT0gY29tcHV0ZVRhYmxlU2l6ZSh0YWJsZSk7Ci0gICAgICAgICAgICAgICAgaW50IHdpZHRoPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0gICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgd2lkdGggLT0gdkJhclNpemUueDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbGF5b3V0VGFibGUodGFibGUsIHdpZHRoLCBhcmVhLCB0YWJsZS5nZXRTaXplKCkueCA8IGFyZWEud2lkdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBhIG5ldyBjb2x1bW4gb2YgZGF0YSB0byB0aGlzIHRhYmxlIGxheW91dC4KLQkgKgotCSAqIEBwYXJhbSBkYXRhIHRoZSBjb2x1bW4gbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5EYXRhKENvbHVtbkxheW91dERhdGEgZGF0YSkgewotCQljb2x1bW5zLmFkZChkYXRhKTsKLQl9Ci0JCi0JLy8tLS0tIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCQotCXByaXZhdGUgUG9pbnQgY29tcHV0ZVRhYmxlU2l6ZShUYWJsZSB0YWJsZSkgewotCQlQb2ludCByZXN1bHQ9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQotCQlpbnQgd2lkdGg9IDA7Ci0JCWludCBzaXplPSBjb2x1bW5zLnNpemUoKTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJQ29sdW1uTGF5b3V0RGF0YSBsYXlvdXREYXRhPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtblBpeGVsRGF0YSkgewotCQkJCUNvbHVtblBpeGVsRGF0YSBjb2w9IChDb2x1bW5QaXhlbERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLndpZHRoOwotCQkJfSBlbHNlIGlmIChsYXlvdXREYXRhIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY29sPSAoQ29sdW1uV2VpZ2h0RGF0YSkgbGF5b3V0RGF0YTsKLQkJCQl3aWR0aCArPSBjb2wubWluaW11bVdpZHRoOwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWlmICh3aWR0aCA+IHJlc3VsdC54KQotCQkJcmVzdWx0Lng9IHdpZHRoOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbGF5b3V0VGFibGUoVGFibGUgdGFibGUsIGludCB3aWR0aCwgUmVjdGFuZ2xlIGFyZWEsIGJvb2xlYW4gaW5jcmVhc2UpIHsKLQkJLy8gWFhYOiBMYXlvdXQgaXMgYmVpbmcgY2FsbGVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZSB0aGUgZmlyc3QgdGltZQotCQkvLyBpdCBpcyBiZWluZyBjYWxsZWQgb24gTGludXguIFRoaXMgbWV0aG9kIHJlc2V0cyB0aGUKLQkJLy8gTGF5b3V0IHRvIG51bGwgc28gd2UgbWFrZSBzdXJlIHdlIHJ1biBpdCBvbmx5IHdoZW4KLQkJLy8gdGhlIHZhbHVlIGlzIE9LLgotCQlpZiAod2lkdGggPD0gMSkKLQkJCXJldHVybjsKLQotCQlUYWJsZUNvbHVtbltdIHRhYmxlQ29sdW1ucz0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZT0gTWF0aC5taW4oY29sdW1ucy5zaXplKCksIHRhYmxlQ29sdW1ucy5sZW5ndGgpOwotCQlpbnRbXSB3aWR0aHM9IG5ldyBpbnRbc2l6ZV07Ci0JCWludCBmaXhlZFdpZHRoPSAwOwotCQlpbnQgbnVtYmVyT2ZXZWlnaHRDb2x1bW5zPSAwOwotCQlpbnQgdG90YWxXZWlnaHQ9IDA7Ci0KLQkJLy8gRmlyc3QgY2FsYyBzcGFjZSBvY2N1cGllZCBieSBmaXhlZCBjb2x1bW5zCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7Ci0JCQkJaW50IHBpeGVscz0gKChDb2x1bW5QaXhlbERhdGEpIGNvbCkud2lkdGg7Ci0JCQkJd2lkdGhzW2ldPSBwaXhlbHM7Ci0JCQkJZml4ZWRXaWR0aCArPSBwaXhlbHM7Ci0JCQl9IGVsc2UgaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCW51bWJlck9mV2VpZ2h0Q29sdW1ucysrOwotCQkJCS8vIGZpcnN0IHRpbWUsIHVzZSB0aGUgd2VpZ2h0IHNwZWNpZmllZCBieSB0aGUgY29sdW1uIGRhdGEsIG90aGVyd2lzZSB1c2UgdGhlIGFjdHVhbCB3aWR0aCBhcyB0aGUgd2VpZ2h0Ci0JCQkJLy8gaW50IHdlaWdodCA9IGZpcnN0VGltZSA/IGN3LndlaWdodCA6IHRhYmxlQ29sdW1uc1tpXS5nZXRXaWR0aCgpOwotCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKLQkJCQlmaXhlZFdpZHRoKz1jdy5taW5pbXVtV2lkdGg7Ci0JCQkJdG90YWxXZWlnaHQgKz0gd2VpZ2h0OwotCQkJfSBlbHNlIHsKLQkJCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCAiVW5rbm93biBjb2x1bW4gbGF5b3V0IGRhdGEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJLy8gRG8gd2UgaGF2ZSBjb2x1bW5zIHRoYXQgaGF2ZSBhIHdlaWdodAotCQlpZiAobnVtYmVyT2ZXZWlnaHRDb2x1bW5zID4gMCkgewotCQkJLy8gTm93IGRpc3RyaWJ1dGUgdGhlIHJlc3QgdG8gdGhlIGNvbHVtbnMgd2l0aCB3ZWlnaHQuCi0JCQlpbnQgcmVzdD0gd2lkdGggLSBmaXhlZFdpZHRoOwotCQkJaW50IHRvdGFsRGlzdHJpYnV0ZWQ9IDA7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQlDb2x1bW5XZWlnaHREYXRhIGN3PSAoQ29sdW1uV2VpZ2h0RGF0YSkgY29sOwotCQkJCQkvLyBjYWxjdWxhdGUgd2VpZ2h0IGFzIGFib3ZlCi0JCQkJCS8vIGludCB3ZWlnaHQgPSBmaXJzdFRpbWUgPyBjdy53ZWlnaHQgOiB0YWJsZUNvbHVtbnNbaV0uZ2V0V2lkdGgoKTsKLQkJCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCQlpbnQgc3BhcmVQaXhlbHM9IHRvdGFsV2VpZ2h0ID09IDAgPyAwIDogd2VpZ2h0ICogcmVzdCAvIHRvdGFsV2VpZ2h0OwotCQkJCQlpbnQgbmV3V2lkdGggPSBjdy5taW5pbXVtV2lkdGg7Ci0JCQkJCWlmIChzcGFyZVBpeGVscyA+MCApCi0JCQkJCQluZXdXaWR0aCArPSBzcGFyZVBpeGVsczsKLQkJCQkJdG90YWxEaXN0cmlidXRlZCArPSBuZXdXaWR0aDsKLQkJCQkJd2lkdGhzW2ldPSBuZXdXaWR0aDsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIERpc3RyaWJ1dGUgYW55IHJlbWFpbmluZyBwaXhlbHMgdG8gY29sdW1ucyB3aXRoIHdlaWdodC4KLQkJCWludCBkaWZmPSByZXN0IC0gdG90YWxEaXN0cmlidXRlZDsKLQkJCWZvciAoaW50IGk9IDA7IGRpZmYgPiAwOyArK2kpIHsKLQkJCQlpZiAoaSA9PSBzaXplKQotCQkJCQlpPSAwOwotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJKyt3aWR0aHNbaV07Ci0JCQkJCS0tZGlmZjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChpbmNyZWFzZSkgewotCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdGFibGVDb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoc1tpXSk7Ci0JCX0KLQkJaWYgKCFpbmNyZWFzZSkgewotCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3dpemFyZHMvVGFyZ2V0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY3NTExLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1RhcmdldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIA0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkczsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdGlvbi4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuY29yZS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwub3BlcmF0aW9ucy4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnBhcnRzLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5vcGVyYXRpb25zLio7DQotDQotcHVibGljIGNsYXNzIFRhcmdldFBhZ2UgZXh0ZW5kcyBCYW5uZXJQYWdlIGltcGxlbWVudHMgSUR5bmFtaWNQYWdlIHsNCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBqb2JWaWV3ZXI7DQotCXByaXZhdGUgVGFibGVWaWV3ZXIgc2l0ZVZpZXdlcjsNCi0JcHJpdmF0ZSBJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnOw0KLQlwcml2YXRlIENvbmZpZ0xpc3RlbmVyIGNvbmZpZ0xpc3RlbmVyOw0KLQlwcml2YXRlIExhYmVsIHJlcXVpcmVkU3BhY2VMYWJlbDsNCi0JcHJpdmF0ZSBMYWJlbCBhdmFpbGFibGVTcGFjZUxhYmVsOw0KLQlwcml2YXRlIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnM7DQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsNCi0JcHJpdmF0ZSBCdXR0b24gZGVsZXRlQnV0dG9uOw0KLQlwcml2YXRlIEhhc2hTZXQgYWRkZWQ7DQotDQotCWNsYXNzIEpvYnNDb250ZW50UHJvdmlkZXINCi0JCWV4dGVuZHMgRGVmYXVsdENvbnRlbnRQcm92aWRlcg0KLQkJaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7DQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IHBhcmVudCkgew0KLQkJCXJldHVybiBqb2JzOw0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIFNpdGVzQ29udGVudFByb3ZpZGVyDQotCQlleHRlbmRzIERlZmF1bHRDb250ZW50UHJvdmlkZXINCi0JCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgew0KLQ0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBwYXJlbnQpIHsNCi0JCQlyZXR1cm4gY29uZmlnLmdldENvbmZpZ3VyZWRTaXRlcygpOw0KLQkJfQ0KLQl9DQotDQotCWNsYXNzIEpvYnNMYWJlbFByb3ZpZGVyDQotCQlleHRlbmRzIExhYmVsUHJvdmlkZXINCi0JCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7DQotCQkJDQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iaiwgaW50IGNvbCkgew0KLQkJCVVwZGF0ZUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBVcGRhdGVVSS5nZXREZWZhdWx0KCkuZ2V0TGFiZWxQcm92aWRlcigpOw0KLQ0KLQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBvYmo7DQotCQkJSW1hZ2VEZXNjcmlwdG9yIGJhc2UgPQ0KLQkJCQlqb2IuZ2V0RmVhdHVyZSgpLmlzUGF0Y2goKQ0KLQkJCQkJPyBVcGRhdGVVSUltYWdlcy5ERVNDX0VGSVhfT0JKDQotCQkJCQk6IFVwZGF0ZVVJSW1hZ2VzLkRFU0NfRkVBVFVSRV9PQko7DQotCQkJaW50IGZsYWdzID0gMDsNCi0JCQlpZiAoam9iLmdldFRhcmdldFNpdGUoKSA9PSBudWxsKQ0KLQkJCQlmbGFncyA9IFVwZGF0ZUxhYmVsUHJvdmlkZXIuRl9FUlJPUjsNCi0JCQlyZXR1cm4gcHJvdmlkZXIuZ2V0KGJhc2UsIGZsYWdzKTsNCi0JCX0NCi0NCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3Qgb2JqLCBpbnQgY29sKSB7DQotCQkJaWYgKGNvbCA9PSAwKSB7DQotCQkJCUlGZWF0dXJlIGZlYXR1cmUgPSAoKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbikgb2JqKS5nZXRGZWF0dXJlKCk7DQotCQkJCXJldHVybiBmZWF0dXJlLmdldExhYmVsKCkNCi0JCQkJCSsgIiAiIC8vJE5PTi1OTFMtMSQNCi0JCQkJCSsgZmVhdHVyZS5nZXRWZXJzaW9uZWRJZGVudGlmaWVyKCkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7DQotCQkJfQ0KLQkJCXJldHVybiBudWxsOw0KLQkJfQ0KLQl9DQotCQ0KLQljbGFzcyBTaXRlc0xhYmVsUHJvdmlkZXINCi0JZXh0ZW5kcyBMYWJlbFByb3ZpZGVyDQotCWltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7DQotCQkNCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqLCBpbnQgY29sKSB7DQotCQkJVXBkYXRlTGFiZWxQcm92aWRlciBwcm92aWRlciA9IFVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCk7DQotCQkJcmV0dXJuIHByb3ZpZGVyLmdldExvY2FsU2l0ZUltYWdlKChJQ29uZmlndXJlZFNpdGUpIG9iaik7DQotCQl9DQotCQ0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmosIGludCBjb2wpIHsNCi0JCQlpZiAoY29sID09IDApIHsNCi0JCQkJSVNpdGUgc2l0ZSA9ICgoSUNvbmZpZ3VyZWRTaXRlKSBvYmopLmdldFNpdGUoKTsNCi0JCQkJcmV0dXJuIG5ldyBGaWxlKHNpdGUuZ2V0VVJMKCkuZ2V0RmlsZSgpKS50b1N0cmluZygpOw0KLQkJCX0NCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQljbGFzcyBDb25maWdMaXN0ZW5lciBpbXBsZW1lbnRzIElJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lciB7DQotCQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZUFkZGVkKElDb25maWd1cmVkU2l0ZSBjc2l0ZSkgew0KLQkJCXNpdGVWaWV3ZXIuYWRkKGNzaXRlKTsNCi0JCQlpZiAoYWRkZWQgPT0gbnVsbCkNCi0JCQkJYWRkZWQgPSBuZXcgSGFzaFNldCgpOw0KLQkJCWFkZGVkLmFkZChjc2l0ZSk7DQotCQkJDQotCQkJLy8gc2V0IHRoZSBzaXRlIGFzIHRhcmdldCBmb3IgYWxsIGpvYnMgd2l0aG91dCBhIHRhcmdldA0KLQkJCWZvciAoaW50IGk9MDsgam9icyAhPSBudWxsICYmIGk8am9icy5sZW5ndGg7IGkrKykNCi0JCQkJaWYgKGpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpID09IG51bGwgJiYgZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUsIGpvYnNbaV0pKSB7DQotCQkJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoY3NpdGUpOw0KLQkJCQl9DQotDQotCQkJam9iVmlld2VyLnJlZnJlc2goKTsNCi0JCQkNCi0JCQlzaXRlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjc2l0ZSkpOw0KLQkJCXNpdGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7DQotCQl9DQotDQotCQlwdWJsaWMgdm9pZCBpbnN0YWxsU2l0ZVJlbW92ZWQoSUNvbmZpZ3VyZWRTaXRlIGNzaXRlKSB7DQotCQkJc2l0ZVZpZXdlci5yZW1vdmUoY3NpdGUpOw0KLQkJCWlmIChhZGRlZCAhPSBudWxsKQ0KLQkJCQlhZGRlZC5yZW1vdmUoY3NpdGUpOw0KLQkJCQ0KLQkJCS8vIHJlbW92ZSB0aGUgdGFyZ2V0IHNpdGUgZm9yIGFsbCBqb2JzIHRoYXQgdXNlIGl0DQotCQkJLy8gc2V0IHRoZSBzaXRlIGFzIHRhcmdldCBmb3IgYWxsIGpvYnMgd2l0aG91dCBhIHRhcmdldA0KLQkJCWJvb2xlYW4gcmVmcmVzaEpvYnMgPSBmYWxzZTsNCi0JCQlmb3IgKGludCBpPTA7IGpvYnMgIT0gbnVsbCAmJiBpPGpvYnMubGVuZ3RoOyBpKyspDQotCQkJCWlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSA9PSBjc2l0ZSkgew0KLQkJCQkJam9ic1tpXS5zZXRUYXJnZXRTaXRlKG51bGwpOw0KLQkJCQkJcmVmcmVzaEpvYnMgPSB0cnVlOw0KLQkJCQl9DQotCQkJCQ0KLQkJCXBhZ2VDaGFuZ2VkKCk7DQotCQkJDQotCQkJam9iVmlld2VyLnJlZnJlc2goKTsNCi0JCQlpZiAocmVmcmVzaEpvYnMpIHsNCi0JCQkJam9iVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOw0KLQkJCX0gZWxzZQ0KLQkJCQlzaXRlVmlld2VyLmdldENvbnRyb2woKS5zZXRGb2N1cygpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiBDb25zdHJ1Y3RvciBmb3IgUmV2aWV3UGFnZTINCi0JICovDQotCXB1YmxpYyBUYXJnZXRQYWdlKElJbnN0YWxsQ29uZmlndXJhdGlvbiBjb25maWcpIHsNCi0JCXN1cGVyKCJUYXJnZXQiKTsgLy8kTk9OLU5MUy0xJA0KLQkJc2V0VGl0bGUoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UudGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXNldERlc2NyaXB0aW9uKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmRlc2MiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXRoaXMuY29uZmlnID0gY29uZmlnOw0KLQkJVXBkYXRlVUkuZ2V0RGVmYXVsdCgpLmdldExhYmVsUHJvdmlkZXIoKS5jb25uZWN0KHRoaXMpOw0KLQkJY29uZmlnTGlzdGVuZXIgPSBuZXcgQ29uZmlnTGlzdGVuZXIoKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRKb2JzKElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbltdIGpvYnMpIHsNCi0JCXRoaXMuam9icyA9IGpvYnM7DQotCX0NCi0NCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsNCi0JCVVwZGF0ZVVJLmdldERlZmF1bHQoKS5nZXRMYWJlbFByb3ZpZGVyKCkuZGlzY29ubmVjdCh0aGlzKTsNCi0JCWNvbmZpZy5yZW1vdmVJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdMaXN0ZW5lcik7DQotCQlzdXBlci5kaXNwb3NlKCk7DQotCX0NCi0NCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgew0KLQkJQ29tcG9zaXRlIGNsaWVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7DQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7DQotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7DQotCQlsYXlvdXQubWFyZ2luV2lkdGggPSBsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCWNsaWVudC5zZXRMYXlvdXQobGF5b3V0KTsNCi0NCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5qb2JzTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCWxhYmVsID0gbmV3IExhYmVsKGNsaWVudCwgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5zaXRlTGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQNCi0NCi0JCW5ldyBMYWJlbChjbGllbnQsIFNXVC5OVUxMKTsNCi0NCi0JCWNyZWF0ZUpvYlZpZXdlcihjbGllbnQpOw0KLQkJY3JlYXRlU2l0ZVZpZXdlcihjbGllbnQpOw0KLQ0KLQkJQ29tcG9zaXRlIGJ1dHRvbkNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUoY2xpZW50LCBTV1QuTlVMTCk7DQotCQlHcmlkTGF5b3V0IGJsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJYmxheW91dC5tYXJnaW5XaWR0aCA9IGJsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsNCi0JCWJ1dHRvbkNvbnRhaW5lci5zZXRMYXlvdXQoYmxheW91dCk7DQotCQlidXR0b25Db250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOw0KLQkJDQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbnRhaW5lciwgU1dULlBVU0gpOw0KLQkJYWRkQnV0dG9uLnNldFRleHQoVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubmV3IikpOyAvLyROT04tTkxTLTEkDQotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7DQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgew0KLQkJCQlhZGRUYXJnZXRMb2NhdGlvbigpOw0KLQkJCX0NCi0JCX0pOw0KLQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOw0KLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQ0VOVEVSKSk7DQotCQlTV1RVdGlsLnNldEJ1dHRvbkRpbWVuc2lvbkhpbnQoYWRkQnV0dG9uKTsNCi0JCQ0KLQkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db250YWluZXIsIFNXVC5QVVNIKTsNCi0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmRlbGV0ZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCXJlbW92ZVNlbGVjdGlvbigpOw0KLQkJCQl9DQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7DQotCQkJCQlVcGRhdGVVSS5sb2dFeGNlcHRpb24oZXgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfSk7DQotCQlkZWxldGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7DQotCQlkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVIpKTsNCi0JCVNXVFV0aWwuc2V0QnV0dG9uRGltZW5zaW9uSGludChkZWxldGVCdXR0b24pOwkJDQotCQkNCi0JCQkJDQotCQlDb21wb3NpdGUgc3RhdHVzID0gbmV3IENvbXBvc2l0ZShjbGllbnQsIFNXVC5OVUxMKTsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7DQotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7DQotCQlzdGF0dXMuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOw0KLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOw0KLQkJc3RhdHVzLnNldExheW91dChsYXlvdXQpOw0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoc3RhdHVzLCBTV1QuTlVMTCk7DQotCQlsYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnJlcXVpcmVkU3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCXJlcXVpcmVkU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsNCi0JCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsNCi0JCWxhYmVsID0gbmV3IExhYmVsKHN0YXR1cywgU1dULk5VTEwpOw0KLQkJbGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5hdmFpbGFibGVTcGFjZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJYXZhaWxhYmxlU3BhY2VMYWJlbCA9IG5ldyBMYWJlbChzdGF0dXMsIFNXVC5OVUxMKTsNCi0JCWF2YWlsYWJsZVNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7DQotDQotCQlXb3JrYmVuY2hIZWxwLnNldEhlbHAoY2xpZW50LCAib3JnLmVjbGlwc2UudXBkYXRlLnVpLk11bHRpVGFyZ2V0UGFnZTIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJDQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7DQotCQkNCi0JCXJldHVybiBjbGllbnQ7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvYlZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7DQotCQlqb2JWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQotCQlnZC53aWR0aEhpbnQgPSAxNTA7DQotCQlqb2JWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGdkKTsNCi0JCWpvYlZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEpvYnNDb250ZW50UHJvdmlkZXIoKSk7DQotCQlqb2JWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgSm9ic0xhYmVsUHJvdmlkZXIoKSk7DQotDQotCQlqb2JWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgew0KLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7DQotCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7DQotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7DQotCQkJCWlmIChqb2IgIT0gbnVsbCkgew0KLQkJCQkJc2l0ZVZpZXdlci5zZXRJbnB1dChqb2IpOw0KLQkJCQkJLy9JQ29uZmlndXJlZFNpdGUgYWZmaW5pdHlTaXRlID0gVXBkYXRlVXRpbHMuZ2V0QWZmaW5pdHlTaXRlKGNvbmZpZywgam9iLmdldEZlYXR1cmUoKSk7DQotCQkJCQlJQ29uZmlndXJlZFNpdGUgYWZmaW5pdHlTaXRlID0gVXBkYXRlVXRpbHMuZ2V0RGVmYXVsdFRhcmdldFNpdGUoY29uZmlnLCBqb2IsIHRydWUpOw0KLQkJCQkJYWRkQnV0dG9uLnNldEVuYWJsZWQoYWZmaW5pdHlTaXRlID09IG51bGwpOw0KLQkJCQkJaWYgKGpvYi5nZXRUYXJnZXRTaXRlKCkgIT0gbnVsbCkgew0KLQkJCQkJCXNpdGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGpvYi5nZXRUYXJnZXRTaXRlKCkpKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCX0pOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBjcmVhdGVTaXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsNCi0JCXNpdGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsNCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7DQotCQlnZC53aWR0aEhpbnQgPSAyMDA7DQotCQlzaXRlVmlld2VyLmdldFRhYmxlKCkuc2V0TGF5b3V0RGF0YShnZCk7DQotCQlzaXRlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgU2l0ZXNDb250ZW50UHJvdmlkZXIoKSk7DQotCQlzaXRlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFNpdGVzTGFiZWxQcm92aWRlcigpKTsNCi0JCXNpdGVWaWV3ZXIuYWRkRmlsdGVyKG5ldyBWaWV3ZXJGaWx0ZXIoKSB7DQotCQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2LCBPYmplY3QgcGFyZW50LCBPYmplY3Qgb2JqKSB7DQotCQkJCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBzaXRlVmlld2VyLmdldElucHV0KCk7DQotCQkJCXJldHVybiBnZXRTaXRlVmlzaWJpbGl0eSgoSUNvbmZpZ3VyZWRTaXRlKSBvYmosIGpvYik7DQotCQkJfQ0KLQkJfSk7DQotCQlzaXRlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsNCi0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgew0KLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzc2VsID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKTsNCi0JCQkJc2VsZWN0VGFyZ2V0U2l0ZShzc2VsKTsNCi0JCQkJdXBkYXRlRGVsZXRlQnV0dG9uKHNzZWwpOw0KLQkJCX0NCi0JCX0pOw0KLQ0KLQkJaWYgKGNvbmZpZyAhPSBudWxsKQ0KLQkJCWNvbmZpZy5hZGRJbnN0YWxsQ29uZmlndXJhdGlvbkNoYW5nZWRMaXN0ZW5lcihjb25maWdMaXN0ZW5lcik7DQotCX0NCi0JDQotCXByaXZhdGUgdm9pZCB1cGRhdGVEZWxldGVCdXR0b24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQotCQlib29sZWFuIGVuYWJsZSA9IGFkZGVkICE9IG51bGwgJiYgIWFkZGVkLmlzRW1wdHkoKTsNCi0JCWlmIChlbmFibGUpIHsNCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7DQotCQkJCWlmICghYWRkZWQuY29udGFpbnMoaXRlci5uZXh0KCkpKSB7DQotCQkJCQllbmFibGUgPSBmYWxzZTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlKTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgew0KLQkJaWYgKHZpc2libGUpIHsNCi0JCQlpbml0aWFsaXplRGVmYXVsdFRhcmdldFNpdGVzKCk7DQotCQkJam9iVmlld2VyLnNldElucHV0KGpvYnMpOw0KLQkJCWlmIChqb2JWaWV3ZXIuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpICYmIGpvYnMubGVuZ3RoID4gMCkNCi0JCQkJam9iVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihqb2JzWzBdKSk7DQotCQl9DQotCQkNCi0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vdEVtcHR5KGJvb2xlYW4gZW1wdHkpIHsNCi0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOw0KLQkJaWYgKGVtcHR5KQ0KLQkJCWVycm9yTWVzc2FnZSA9IFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLmVtcHR5Iik7IC8vJE5PTi1OTFMtMSQNCi0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOw0KLQkJc2V0UGFnZUNvbXBsZXRlKCFlbXB0eSk7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdFRhcmdldFNpdGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7DQotCQlJQ29uZmlndXJlZFNpdGUgc2l0ZSA9IChJQ29uZmlndXJlZFNpdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsNCi0JCUlJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IgPSAoSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uKSBzaXRlVmlld2VyLmdldElucHV0KCk7DQotCQlpZiAoam9iICE9IG51bGwpIHsNCi0JCQlpZiAoc2l0ZSAhPSBudWxsKQ0KLQkJCQlqb2Iuc2V0VGFyZ2V0U2l0ZShzaXRlKTsNCi0JCQlwYWdlQ2hhbmdlZCgpOw0KLQkJfQ0KLQkJdXBkYXRlU3RhdHVzKHNpdGUpOw0KLQl9DQotDQotCXByaXZhdGUgdm9pZCBhZGRUYXJnZXRMb2NhdGlvbigpIHsNCi0JCURpcmVjdG9yeURpYWxvZyBkZCA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0Q29udGFpbmVyKCkuZ2V0U2hlbGwoKSk7DQotCQlkZC5zZXRNZXNzYWdlKFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLmxvY2F0aW9uLm1lc3NhZ2UiKSk7IC8vJE5PTi1OTFMtMSQNCi0JCVN0cmluZyBwYXRoID0gZGQub3BlbigpOw0KLQkJaWYgKHBhdGggIT0gbnVsbCkgew0KLQkJCWFkZENvbmZpZ3VyZWRTaXRlKGdldENvbnRhaW5lcigpLmdldFNoZWxsKCksIGNvbmZpZywgbmV3IEZpbGUocGF0aCkpOw0KLQkJfQ0KLQl9DQotCQ0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU2VsZWN0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gew0KLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzaXRlVmlld2VyLmdldFNlbGVjdGlvbigpOw0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgew0KLQkJCUlDb25maWd1cmVkU2l0ZSB0YXJnZXRTaXRlID0gKElDb25maWd1cmVkU2l0ZSkgaXRlci5uZXh0KCk7DQotCQkJY29uZmlnLnJlbW92ZUNvbmZpZ3VyZWRTaXRlKHRhcmdldFNpdGUpOw0KLQkJfQ0KLQl9DQotDQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGFkZENvbmZpZ3VyZWRTaXRlKA0KLQkJU2hlbGwgc2hlbGwsDQotCQlJSW5zdGFsbENvbmZpZ3VyYXRpb24gY29uZmlnLA0KLQkJRmlsZSBmaWxlKSB7DQotCQl0cnkgew0KLQkJCUlDb25maWd1cmVkU2l0ZSBjc2l0ZSA9IGNvbmZpZy5jcmVhdGVDb25maWd1cmVkU2l0ZShmaWxlKTsNCi0JCQlJU3RhdHVzIHN0YXR1cyA9IGNzaXRlLnZlcmlmeVVwZGF0YWJsZVN0YXR1cygpOw0KLQkJCWlmIChzdGF0dXMuaXNPSygpKQ0KLQkJCQljb25maWcuYWRkQ29uZmlndXJlZFNpdGUoY3NpdGUpOw0KLQkJCWVsc2UgDQotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKHN0YXR1cyk7DQotCQkJDQotCQkJcmV0dXJuIGNzaXRlOw0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7DQotCQkJU3RyaW5nIHRpdGxlID0gVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2UubG9jYXRpb24uZXJyb3IudGl0bGUiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgdGl0bGUsIG51bGwsIGUuZ2V0U3RhdHVzKCkpOw0KLQkJCVVwZGF0ZVVJLmxvZ0V4Y2VwdGlvbihlKTsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQ0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU3RhdHVzKE9iamVjdCBlbGVtZW50KSB7DQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7DQotCQkJcmVxdWlyZWRTcGFjZUxhYmVsLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkDQotCQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJA0KLQkJCXJldHVybjsNCi0JCX0NCi0JCUlDb25maWd1cmVkU2l0ZSBzaXRlID0gKElDb25maWd1cmVkU2l0ZSkgZWxlbWVudDsNCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHNpdGUuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKSk7DQotCQlsb25nIGF2YWlsYWJsZSA9IExvY2FsU3lzdGVtSW5mby5nZXRGcmVlU3BhY2UoZmlsZSk7DQotCQlsb25nIHJlcXVpcmVkID0gY29tcHV0ZVJlcXVpcmVkU2l6ZUZvcihzaXRlKTsNCi0JCWlmIChyZXF1aXJlZCA9PSAtMSkNCi0JCQlyZXF1aXJlZFNwYWNlTGFiZWwuc2V0VGV4dChVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS51bmtub3duU2l6ZSIpKTsgLy8kTk9OLU5MUy0xJA0KLQkJZWxzZQ0KLQkJCXJlcXVpcmVkU3BhY2VMYWJlbC5zZXRUZXh0KA0KLQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2Uuc2l6ZSIsICIiICsgcmVxdWlyZWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkDQotDQotCQlpZiAoYXZhaWxhYmxlID09IExvY2FsU3lzdGVtSW5mby5TSVpFX1VOS05PV04pDQotCQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFdpemFyZC5UYXJnZXRQYWdlLnVua25vd25TaXplIikpOyAvLyROT04tTkxTLTEkDQotCQllbHNlDQotCQkJYXZhaWxhYmxlU3BhY2VMYWJlbC5zZXRUZXh0KA0KLQkJCQlVcGRhdGVVSS5nZXRGb3JtYXR0ZWRNZXNzYWdlKCJJbnN0YWxsV2l6YXJkLlRhcmdldFBhZ2Uuc2l6ZSIsICIiICsgYXZhaWxhYmxlKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJA0KLQl9DQotDQotCXByaXZhdGUgbG9uZyBjb21wdXRlUmVxdWlyZWRTaXplRm9yKElDb25maWd1cmVkU2l0ZSBzaXRlKSB7DQotCQlsb25nIHRvdGFsU2l6ZSA9IDA7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoc2l0ZS5lcXVhbHMoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkpKSB7DQotCQkJCWxvbmcgam9iU2l6ZSA9IHNpdGUuZ2V0U2l0ZSgpLmdldEluc3RhbGxTaXplRm9yKGpvYnNbaV0uZ2V0RmVhdHVyZSgpKTsNCi0JCQkJaWYgKGpvYlNpemUgPT0gLTEpDQotCQkJCQlyZXR1cm4gLTE7DQotCQkJCXRvdGFsU2l6ZSArPSBqb2JTaXplOw0KLQkJCX0NCi0JCX0NCi0JCXJldHVybiB0b3RhbFNpemU7DQotCX0NCi0NCi0JcHJpdmF0ZSB2b2lkIHBhZ2VDaGFuZ2VkKCkgew0KLQkJYm9vbGVhbiBlbXB0eSA9IGZhbHNlOw0KLQkJZm9yIChpbnQgaT0wOyBqb2JzIT1udWxsICYmIGk8am9icy5sZW5ndGg7IGkrKykgew0KLQkJCWlmIChqb2JzW2ldLmdldFRhcmdldFNpdGUoKSA9PSBudWxsKSB7DQotCQkJCWVtcHR5ID0gdHJ1ZTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJDQotCQkJSUZlYXR1cmUgZmVhdHVyZSA9IGpvYnNbaV0uZ2V0RmVhdHVyZSgpOw0KLQkJCWlmIChmZWF0dXJlLmlzUGF0Y2goKSkgew0KLQkJCQkvLyBQYXRjaGVzIG11c3QgZ28gdG9nZXRoZXIgd2l0aCB0aGUgZmVhdHVyZXMNCi0JCQkJLy8gdGhleSBhcmUgcGF0Y2hpbmcuDQotCQkJCQ0KLQkJCQkvLyBDaGVjayBjdXJyZW50IGpvYnMNCi0JCQkJSUluc3RhbGxGZWF0dXJlT3BlcmF0aW9uIHBhdGNoZWRGZWF0dXJlSm9iID0gZmluZFBhdGNoZWRGZWF0dXJlKGZlYXR1cmUpOw0KLQkJCQlpZiAocGF0Y2hlZEZlYXR1cmVKb2IgIT0gbnVsbA0KLQkJCQkJJiYgcGF0Y2hlZEZlYXR1cmVKb2IuZ2V0VGFyZ2V0U2l0ZSgpICE9IG51bGwNCi0JCQkJCSYmICFqb2JzW2ldLmdldFRhcmdldFNpdGUoKS5lcXVhbHMocGF0Y2hlZEZlYXR1cmVKb2IuZ2V0VGFyZ2V0U2l0ZSgpKSkgew0KLQkJCQkJU3RyaW5nIG1zZyA9IFVwZGF0ZVVJLmdldEZvcm1hdHRlZE1lc3NhZ2UoDQotCQkJCQkJIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5wYXRjaEVycm9yIiwgLy8kTk9OLU5MUy0xJA0KLQkJCQkJCW5ldyBTdHJpbmdbXSB7DQotCQkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKSwNCi0JCQkJCQkJcGF0Y2hlZEZlYXR1cmVKb2IuZ2V0RmVhdHVyZSgpLmdldExhYmVsKCl9KTsNCi0JCQkJCXNldEVycm9yTWVzc2FnZShtc2cpOw0KLQkJCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsNCi0JCQkJCXJldHVybjsNCi0JCQkJfQ0KLQkJCQkvLyBDaGVjayBpbnN0YWxsZWQgZmVhdHVyZXMNCi0JCQkJSUZlYXR1cmUgcGF0Y2hlZEZlYXR1cmUgPSBVcGRhdGVVdGlscy5nZXRQYXRjaGVkRmVhdHVyZShmZWF0dXJlKTsNCi0JCQkJaWYgKHBhdGNoZWRGZWF0dXJlICE9IG51bGwgIA0KLQkJCQkJJiYgIWpvYnNbaV0uZ2V0VGFyZ2V0U2l0ZSgpLmVxdWFscyhwYXRjaGVkRmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkpKSB7DQotCQkJCQlTdHJpbmcgbXNnID0gVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgNCi0JCQkJCQkJIkluc3RhbGxXaXphcmQuVGFyZ2V0UGFnZS5wYXRjaEVycm9yMiIsIC8vJE5PTi1OTFMtMSQNCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsNCi0JCQkJCQkJCWZlYXR1cmUuZ2V0TGFiZWwoKSwNCi0JCQkJCQkJCXBhdGNoZWRGZWF0dXJlLmdldExhYmVsKCksDQotCQkJCQkJCQlwYXRjaGVkRmVhdHVyZS5nZXRTaXRlKCkuZ2V0Q3VycmVudENvbmZpZ3VyZWRTaXRlKCkuZ2V0U2l0ZSgpLmdldFVSTCgpLmdldEZpbGUoKX0pOw0KLQkJCQkJc2V0RXJyb3JNZXNzYWdlKG1zZyk7DQotCQkJCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KLQkJCQkJcmV0dXJuOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJdmVyaWZ5Tm90RW1wdHkoZW1wdHkpOw0KLQl9DQotCQ0KLQl2b2lkIHJlbW92ZUFkZGVkU2l0ZXMoKSB7DQotCQlpZiAoYWRkZWQgIT0gbnVsbCkgew0KLQkJCXdoaWxlICghYWRkZWQuaXNFbXB0eSgpKSB7DQotCQkJCUl0ZXJhdG9yIGl0ID0gYWRkZWQuaXRlcmF0b3IoKTsgDQotCQkJCWlmIChpdC5oYXNOZXh0KCkpDQotCQkJCQljb25maWcucmVtb3ZlQ29uZmlndXJlZFNpdGUoKElDb25maWd1cmVkU2l0ZSkgaXQubmV4dCgpKTsNCi0JCQl9DQotCQl9DQotCQkJDQotCX0NCi0JDQotCXByaXZhdGUgIGJvb2xlYW4gZ2V0U2l0ZVZpc2liaWxpdHkoSUNvbmZpZ3VyZWRTaXRlIHNpdGUsIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBqb2IpIHsNCi0JCS8vIERvIG5vdCBhbGxvdyBpbnN0YWxsaW5nIGludG8gYSBub24tdXBkYXRlYWJsZSBzaXRlDQotCQlpZiAoIXNpdGUuaXNVcGRhdGFibGUoKSkNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQkNCi0JCS8vIElmIGFmZmluaXR5IHNpdGUgaXMga25vd24sIG9ubHkgaXQgc2hvdWxkIGJlIHNob3duDQotCQlJQ29uZmlndXJlZFNpdGUgYWZmaW5pdHlTaXRlID0gVXBkYXRlVXRpbHMuZ2V0QWZmaW5pdHlTaXRlKGNvbmZpZywgam9iLmdldEZlYXR1cmUoKSk7DQotCQlpZiAoYWZmaW5pdHlTaXRlICE9IG51bGwpIHsNCi0JCQkvLyBNdXN0IGNvbXBhcmUgcmVmZXJlbmNlZCBzaXRlcyBiZWNhdXNlDQotCQkJLy8gY29uZmlndXJlZCBzaXRlcyB0aGVtc2VsdmVzIG1heSBjb21lIGZyb20gDQotCQkJLy8gZGlmZmVyZW50IGNvbmZpZ3VyYXRpb25zDQotCQkJcmV0dXJuIHNpdGUuZ2V0U2l0ZSgpLmVxdWFscyhhZmZpbml0eVNpdGUuZ2V0U2l0ZSgpKTsNCi0JCX0NCi0JCQ0KLQkJLy8gQ28tbG9jYXRlIHVwZGF0ZXMgd2l0aCB0aGUgb2xkIGZlYXR1cmUNCi0JCWlmIChqb2IuZ2V0T2xkRmVhdHVyZSgpICE9IG51bGwpIHsNCi0JCQlJQ29uZmlndXJlZFNpdGUgb2xkU2l0ZSA9IFVwZGF0ZVV0aWxzLmdldFNpdGVXaXRoRmVhdHVyZShjb25maWcsIGpvYi5nZXRPbGRGZWF0dXJlKCkuZ2V0VmVyc2lvbmVkSWRlbnRpZmllcigpLmdldElkZW50aWZpZXIoKSk7DQotCQkJcmV0dXJuIChzaXRlID09IG9sZFNpdGUpOw0KLQkJfQ0KLQ0KLQkJLy8gQWxsb3cgaW5zdGFsbGluZyBpbnRvIGFueSBzaXRlIHRoYXQgaXMgdXBkYXRlYWJsZSBhbmQgdGhlcmUgaXMgbm8gYWZmaW5pdHkgc3BlY2lmaWVkDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEZWZhdWx0VGFyZ2V0U2l0ZXMoKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGpvYnMubGVuZ3RoOyBpKyspIHsNCi0JCQlpZiAoam9ic1tpXS5nZXRUYXJnZXRTaXRlKCkgIT0gbnVsbCkNCi0JCQkJY29udGludWU7DQotCQkJDQotCQkJSUNvbmZpZ3VyZWRTaXRlIGFmZmluaXR5U2l0ZSA9CVVwZGF0ZVV0aWxzLmdldEFmZmluaXR5U2l0ZShjb25maWcsIGpvYnNbaV0uZ2V0RmVhdHVyZSgpKTsNCi0JCQlpZiAoYWZmaW5pdHlTaXRlICE9IG51bGwpIHsNCi0JCQkJam9ic1tpXS5zZXRUYXJnZXRTaXRlKGFmZmluaXR5U2l0ZSk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCi0NCi0JCQlJQ29uZmlndXJlZFNpdGUgZGVmYXVsdFNpdGUgPSBVcGRhdGVVdGlscy5nZXREZWZhdWx0VGFyZ2V0U2l0ZShjb25maWcsIGpvYnNbaV0sIGZhbHNlKTsNCi0JCQlpZiAoZGVmYXVsdFNpdGUgIT0gbnVsbCkgew0KLQkJCQlqb2JzW2ldLnNldFRhcmdldFNpdGUoZGVmYXVsdFNpdGUpOw0KLQkJCQljb250aW51ZTsNCi0JCQl9DQotDQotCQkJam9ic1tpXS5zZXRUYXJnZXRTaXRlKGdldEZpcnN0VGFyZ2V0U2l0ZShqb2JzW2ldKSk7DQotDQotCQl9DQotCX0NCi0JDQotDQotCXByaXZhdGUgSUNvbmZpZ3VyZWRTaXRlIGdldEZpcnN0VGFyZ2V0U2l0ZShJSW5zdGFsbEZlYXR1cmVPcGVyYXRpb24gam9iKSB7DQotCQlJQ29uZmlndXJlZFNpdGVbXSBzaXRlcyA9IGNvbmZpZy5nZXRDb25maWd1cmVkU2l0ZXMoKTsNCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZXMubGVuZ3RoOyBpKyspIHsNCi0JCQlJQ29uZmlndXJlZFNpdGUgY3NpdGUgPSBzaXRlc1tpXTsNCi0JCQlpZiAoZ2V0U2l0ZVZpc2liaWxpdHkoY3NpdGUsIGpvYikpIA0KLQkJCQlyZXR1cm4gY3NpdGU7DQotCQl9DQotCQlyZXR1cm4gbnVsbDsNCi0JfQ0KLQkNCi0JcHVibGljIElJbnN0YWxsRmVhdHVyZU9wZXJhdGlvbiBmaW5kUGF0Y2hlZEZlYXR1cmUoSUZlYXR1cmUgcGF0Y2gpIHsNCi0JCWZvciAoaW50IGk9MDsgaTxqb2JzLmxlbmd0aDsgaSsrKSB7DQotCQkJSUZlYXR1cmUgdGFyZ2V0ID0gam9ic1tpXS5nZXRGZWF0dXJlKCk7DQotCQkJaWYgKCF0YXJnZXQuZXF1YWxzKHBhdGNoKSAmJiBVcGRhdGVVdGlscy5pc1BhdGNoKHRhcmdldCwgcGF0Y2gpKQ0KLQkJCQlyZXR1cm4gam9ic1tpXTsNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1VJUHJvYmxlbUhhbmRsZXIuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS93aXphcmRzL1VJUHJvYmxlbUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3NTY5MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvd2l6YXJkcy9VSVByb2JsZW1IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAzIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIENvbW1vbiBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0aW9uLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFVJUHJvYmxlbUhhbmRsZXIgaW1wbGVtZW50cyBJUHJvYmxlbUhhbmRsZXIgewotCi0JLyoKLQkgKiBAc2VlIElQcm9ibGVtSGFuZGxlciNyZXBvcnRQcm9ibGVtKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXBvcnRQcm9ibGVtKFN0cmluZyBwcm9ibGVtVGV4dCkgewotCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlJldmVydC5Qcm9ibGVtRGlhbG9nLnRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKFVwZGF0ZVVJLmdldEFjdGl2ZVdvcmtiZW5jaFNoZWxsKCksIHRpdGxlLCBwcm9ibGVtVGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL1VwZGF0ZU1hbmFnZXJVSS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL3VpL1VwZGF0ZU1hbmFnZXJVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzVhZDE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS91aS9VcGRhdGVNYW5hZ2VyVUkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkud2l6YXJkcy4qOwotCi0vKioKLSAqIEVudHJ5IHBvaW50IGludG8gdXBkYXRlIG1hbmFnZXIgVUkuCi0gKiBDbGllbnRzIGNhbiB1c2UgdGhpcyBjbGFzcyB0byBsYXVuY2ggdGhlIGNvbmZpZ3VyYXRpb24gbWFuYWdlciB3aW5kb3cgb3IgdGhlIGluc3RhbGwgd2l6YXJkLgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlTWFuYWdlclVJIHsKLQotCS8qKgotCSAqIE9wZW5zIHRoZSBjb25maWd1cmF0aW9uIG1hbmFnZXIgd2luZG93LiBUaGlzIGlzIHVzZWQgdG8gbWFuYWdlIGEgY3VycmVudCBpbnN0YWxsYXRpb24gCi0JICogY29uZmlndXJhdGlvbjogYnJvd3NlciBzaXRlcywgZW5hYmxlL2Rpc2FibGUgZmVhdHVyZXMsIGV0Yy4KLQkgKiBAcGFyYW0gc2hlbGwgdGhlIHBhcmVudCBzaGVsbCB0byB1c2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkNvbmZpZ3VyYXRpb25NYW5hZ2VyKFNoZWxsIHNoZWxsKSB7Ci0KLQkJQXBwbGljYXRpb25XaW5kb3cgYXBwV2luZG93ID0gbmV3IENvbmZpZ3VyYXRpb25NYW5hZ2VyV2luZG93KHNoZWxsKTsKLQkJYXBwV2luZG93LmNyZWF0ZSgpOwotCQlhcHBXaW5kb3cub3BlbigpOwotCX0KLQkKLQkvKioKLQkgKiBPcGVucyB0aGUgaW5zdGFsbCB3aXphcmQgZGlhbG9nLiBUaGlzIHdpemFyZCBpcyB1c2VkIHRvIGZpbmQgYW5kIGluc3RhbGwgdXBkYXRlcyB0byBleGlzdGluZwotCSAqIGZlYXR1cmVzLCBvciB0byBmaW5kIGFuZCBpbnN0YWxsIG5ldyBmZWF0dXJlcy4KLQkgKiBAcGFyYW0gc2hlbGwgdGhlIGRpYWxvZyBwYXJlbnQgc2hlbGwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgb3Blbkluc3RhbGxlcihTaGVsbCBzaGVsbCkgewotCQlJbnN0YWxsV2l6YXJkIHdpemFyZCA9IG5ldyBJbnN0YWxsV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgUmVzaXphYmxlSW5zdGFsbFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxXaXphcmRBY3Rpb24udGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvc3JjX3dlYmFwcC9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvc2VydmxldHMvSW5zdGFsbFNlcnZsZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkNzAzMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL0luc3RhbGxTZXJ2bGV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsKLWltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuKjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnNlYXJjaC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5wYXJ0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS53aXphcmRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuc2VhcmNoLio7Ci0KLS8qKgotICoKLSAqIFRvIGNoYW5nZSB0aGlzIGdlbmVyYXRlZCBjb21tZW50IGVkaXQgdGhlIHRlbXBsYXRlIHZhcmlhYmxlICJ0eXBlY29tbWVudCI6Ci0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5UZW1wbGF0ZXMuCi0gKiBUbyBlbmFibGUgYW5kIGRpc2FibGUgdGhlIGNyZWF0aW9uIG9mIHR5cGUgY29tbWVudHMgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewotCXByaXZhdGUgU2VydmxldENvbmZpZyBzZXJ2bGV0Q29uZmlnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZMRVRfTkFNRSA9ICIvSW5zdGFsbFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBpbml0KFNlcnZsZXRDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2VydmxldENvbmZpZyA9IGNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotCX0KLQotCXB1YmxpYyBTZXJ2bGV0Q29uZmlnIGdldFNlcnZsZXRDb25maWcoKSB7Ci0JCXJldHVybiBzZXJ2bGV0Q29uZmlnOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VydmxldEluZm8oKSB7Ci0JCXJldHVybiAiRWNsaXBzZSBJbnN0YWxsIHNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2VydmljZSgKLQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LAotCQlIdHRwU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSkKLQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0KLQkJCVNlcnZsZXRzVXRpbC5jcmVhdGVSZXNwb25zZVByb2xvZ3VlKHNlcnZsZXRSZXNwb25zZSk7Ci0JCWV4ZWN1dGUod3JpdGVyLCBzZXJ2bGV0UmVxdWVzdCk7Ci0JCVNlcnZsZXRzVXRpbC5jcmVhdGVSZXNwb25zZUVwaWxvZ3VlKAotCQkJc2VydmxldFJlcXVlc3QsCi0JCQlzZXJ2bGV0UmVzcG9uc2UsCi0JCQl3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBleGVjdXRlLgotCSAqIEBwYXJhbSBzZXJ2bGV0UmVxdWVzdAotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlKAotCQlQcmludFdyaXRlciB3cml0ZXIsCi0JCUh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCkgewotCQlTdHJpbmcgc2VydmVyVVJMID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJzZXJ2ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbGljZW5zZSA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlcigibGljZW5zZSIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gbmVlZExpY2Vuc2VQYWdlID0gdHJ1ZTsKLQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCAmJiBsaWNlbnNlLmVxdWFsc0lnbm9yZUNhc2UoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCW5lZWRMaWNlbnNlUGFnZSA9IGZhbHNlOwotCi0JCVN0cmluZ1tdIHZlcnNpb25lZElkcyA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcygiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHNlcnZlclVSTCA9PSBudWxsKSB7Ci0JCQljcmVhdGVQYWdlRXJyb3Iod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LnVua25vd25TZXJ2ZXJVUkwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodmVyc2lvbmVkSWRzID09IG51bGwpIHsKLQkJCWNyZWF0ZVBhZ2VFcnJvcih3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiSW5zdGFsbFNlcnZsZXQubm9GZWF0dXJlcyIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChPcGVyYXRpb25zTWFuYWdlci5pc0luUHJvZ3Jlc3MoKSkgewotCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5pblByb2dyZXNzIiksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLS8vCQlpZiAoRGV0YWlsc0Zvcm0uaXNJblByb2dyZXNzKCkpIHsKLS8vCQkJU2VydmxldHNVdGlsLmNyZWF0ZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0U3RyaW5nKCJJbnN0YWxsU2VydmxldC5pblByb2dyZXNzIiksIG51bGwpOwotLy8JCQlyZXR1cm47Ci0vLwkJfQotCQl0cnkgewotCQkJVVJMIHVybCA9IG5ldyBVUkwoc2VydmVyVVJMKTsKLQkJCVZlcnNpb25lZElkZW50aWZpZXJbXSB2aWRzID0KLQkJCQljb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnModmVyc2lvbmVkSWRzKTsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9Ci0JCQkJZXhlY3V0ZUluc3RhbGwod3JpdGVyLCB1cmwsIHZpZHMsIG5lZWRMaWNlbnNlUGFnZSk7Ci0JCQlpZiAoc3VjY2VzcykKLQkJCQlTZXJ2bGV0c1V0aWwuY3JlYXRlSW5mbyh3cml0ZXIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJY3JlYXRlUGFnZUVycm9yKHdyaXRlciwgVXBkYXRlVUkuZ2V0Rm9ybWF0dGVkTWVzc2FnZSgiSW5zdGFsbFNlcnZsZXQuaW5jb3JyZWN0VVJMRm9ybWF0IiwgLy8kTk9OLU5MUy0xJAotCQkJc2VydmVyVVJMLnRvU3RyaW5nKCkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQYWdlRXJyb3IoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgcHJvYmxlbSkgewotCQlTZXJ2bGV0c1V0aWwuY3JlYXRlRXJyb3Iod3JpdGVyLCBwcm9ibGVtLCBVcGRhdGVVSS5nZXRTdHJpbmcoIkluc3RhbGxTZXJ2bGV0LmNvbnRhY3RXZWJtYXN0ZXIiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFZlcnNpb25lZElkZW50aWZpZXJbXSBjb21wdXRlVmVyc2lvbmVkSWRlbnRpZmllcnMoU3RyaW5nW10gYXJyYXkpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGlkX3ZlcnNpb24gPSBhcnJheVtpXTsKLQkJCWludCBzZXAgPSBpZF92ZXJzaW9uLmxhc3RJbmRleE9mKCdfJyk7Ci0JCQlpZiAoc2VwID09IC0xKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGlkID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoMCwgc2VwKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gaWRfdmVyc2lvbi5zdWJzdHJpbmcoc2VwICsgMSk7Ci0JCQlWZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyKGlkLCB2ZXJzaW9uKTsKLQkJCXJlc3VsdC5hZGQodmlkKTsKLQkJfQotCQlyZXR1cm4gKFZlcnNpb25lZElkZW50aWZpZXJbXSkgcmVzdWx0LnRvQXJyYXkoCi0JCQluZXcgVmVyc2lvbmVkSWRlbnRpZmllcltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4ZWN1dGVJbnN0YWxsKAotCQlmaW5hbCBQcmludFdyaXRlciB3cml0ZXIsCi0JCWZpbmFsIFVSTCBzaXRlVVJMLAotCQlmaW5hbCBWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBTV1RVdGlsLmdldFN0YW5kYXJkRGlzcGxheSgpOwotCQlmaW5hbCBib29sZWFuW10gcmVzdWx0ID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0KLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJZmluYWwgU2hlbGwgc2hlbGwgPSBVcGRhdGVVSS5nZXRBY3RpdmVXb3JrYmVuY2hTaGVsbCgpOwotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKHNoZWxsLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlyZXN1bHRbMF0gPQotCQkJCQkJCWRvRXhlY3V0ZUluc3RhbGwoCi0JCQkJCQkJCXdyaXRlciwKLQkJCQkJCQkJc2hlbGwsCi0JCQkJCQkJCXNpdGVVUkwsCi0JCQkJCQkJCXZpZHMsCi0JCQkJCQkJCW5lZWRMaWNlbnNlUGFnZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRvRXhlY3V0ZUluc3RhbGwoCi0JCVByaW50V3JpdGVyIHdyaXRlciwKLQkJZmluYWwgU2hlbGwgc2hlbGwsCi0JCVVSTCBzaXRlVVJMLAotCQlWZXJzaW9uZWRJZGVudGlmaWVyW10gdmlkcywKLQkJZmluYWwgYm9vbGVhbiBuZWVkTGljZW5zZVBhZ2UpIHsKLQkJCQotCQlzaGVsbC5mb3JjZUFjdGl2ZSgpOwotCi0JCVVwZGF0ZVNlYXJjaFNjb3BlIHNlYXJjaFNjb3BlID0gbmV3IFVwZGF0ZVNlYXJjaFNjb3BlKCk7Ci0JCXNlYXJjaFNjb3BlLmFkZFNlYXJjaFNpdGUoCi0JCQlzaXRlVVJMLnRvU3RyaW5nKCksCi0JCQlzaXRlVVJMLAotCQkJbmV3IFN0cmluZ1swXSk7Ci0KLQkJZmluYWwgVXBkYXRlU2VhcmNoUmVxdWVzdCBzZWFyY2hSZXF1ZXN0ID0KLQkJCW5ldyBVcGRhdGVTZWFyY2hSZXF1ZXN0KAotCQkJCW5ldyBTaXRlU2VhcmNoQ2F0ZWdvcnkoKSwKLQkJCQlzZWFyY2hTY29wZSk7Ci0JCi0JCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBWZXJzaW9uZWRJZGVudGlmaWVyc0ZpbHRlcih2aWRzKSk7Ci0JCXNlYXJjaFJlcXVlc3QuYWRkRmlsdGVyKG5ldyBFbnZpcm9ubWVudEZpbHRlcigpKTsKLQkJc2VhcmNoUmVxdWVzdC5hZGRGaWx0ZXIobmV3IEJhY2tMZXZlbEZpbHRlcigpKTsKLQotCQlzaGVsbC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlvcGVuV2l6YXJkKHNoZWxsLCBzZWFyY2hSZXF1ZXN0KTsKLQkJCX0KLQkJfSk7CQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2l6YXJkKFNoZWxsIHNoZWxsLCBVcGRhdGVTZWFyY2hSZXF1ZXN0IHNlYXJjaFJlcXVlc3QpIHsKLQkJSW5zdGFsbFdpemFyZCB3aXphcmQgPSBuZXcgSW5zdGFsbFdpemFyZChzZWFyY2hSZXF1ZXN0KTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBSZXNpemFibGVXaXphcmREaWFsb2coc2hlbGwsIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLS8vCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KAotLy8JCQlVcGRhdGVVSS5nZXRTdHJpbmcoS0VZX09QVElPTkFMX0lOU1RBTExfVElUTEUpKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsIDUwMCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmICh3aXphcmQuaXNTdWNjZXNzZnVsSW5zdGFsbCgpKQotCQkJVXBkYXRlVUkucmVxdWVzdFJlc3RhcnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS9zcmNfd2ViYXBwL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9zZXJ2bGV0cy9TZXJ2bGV0c1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZWZmMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3NyY193ZWJhcHAvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL3NlcnZsZXRzL1NlcnZsZXRzVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDMgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnNlcnZsZXRzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmJvb3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuKjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXJ2bGV0c1V0aWwgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VydmVySW5mbyhIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QpIHsKLQkJU3RyaW5nIGhvc3QgPSBzZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7Ci0JCWludCBwb3J0ID0gc2VydmxldFJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpOwotCQlTdHJpbmcgY29udGV4dCA9IHNlcnZsZXRSZXF1ZXN0LmdldENvbnRleHRQYXRoKCk7Ci0KLQkJRW51bWVyYXRpb24gYXR0cyA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKDsgYXR0cy5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBhdHROYW1lID0gKFN0cmluZykgYXR0cy5uZXh0RWxlbWVudCgpOwotCQkJT2JqZWN0IGF0dFZhbHVlID0gc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKGF0dE5hbWUpOwotCQkJYnVmZi5hcHBlbmQoYXR0TmFtZSArICI9IiArICJcIiIgKyBhdHRWYWx1ZSArICJcIisiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlyZXR1cm4gaG9zdCArICI6IiArIHBvcnQgKyBjb250ZXh0ICsgIj8iICsgYnVmZi50b1N0cmluZygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByaW50V3JpdGVyIGNyZWF0ZVJlc3BvbnNlUHJvbG9ndWUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKLQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmVzcG9uc2Uuc2V0Q29udGVudFR5cGUoInRleHQvaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCVByaW50V3JpdGVyIHdyaXRlciA9IHJlc3BvbnNlLmdldFdyaXRlcigpOwotCQlTdHJpbmcgdGl0bGUgPSBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC5yZXNwb25zZVRpdGxlIik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oCi0JCQkiIiAvLyROT04tTkxTLTEkCi0JCQkJKyAiPCFET0NUWVBFIEhUTUwgUFVCTElDIFwiIC0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU5cIj4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICJcbiA8SFRNTD4gXG4gPEhFQUQ+IFxuIiAvLyROT04tTkxTLTEkCi0JCQkJKyAiPFRJVExFPiIrdGl0bGUrIjwvVElUTEU+XG4iIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCSsgIjxNRVRBIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PVVURi04XCI+XG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkrICI8L0hFQUQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIiA8Qk9EWSB0b3BtYXJnaW49XCIwXCIgbGVmdG1hcmdpbj1cIjBcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gd3JpdGVyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVFcnJvcigKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlTdHJpbmcgcHJvYmxlbSwKLQkJU3RyaW5nIHJlc29sdXRpb24pIHsKLQkJY3JlYXRlSGVhZGluZyh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnVwZGF0ZUZhaWxlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQlzdGFydFRleHRBcmVhKHdyaXRlcik7Ci0JCWNyZWF0ZVBhcmFncmFwaCh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnByb2JsZW0iKSwgcHJvYmxlbSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc29sdXRpb24gIT0gbnVsbCkgewotCQkJd3JpdGVyLnByaW50bG4oIjxwPiIpOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVQYXJhZ3JhcGgod3JpdGVyLCBVcGRhdGVVSS5nZXRTdHJpbmcoIlNlcnZsZXRzVXRpbC53aGF0VG9EbyIpLCByZXNvbHV0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVuZFRleHRBcmVhKHdyaXRlcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVBhcmFncmFwaCgKLQkJUHJpbnRXcml0ZXIgd3JpdGVyLAotCQlTdHJpbmcgaGVhZGluZywKLQkJU3RyaW5nIHRleHQpIHsKLQkJd3JpdGVyLnByaW50KCI8Yj48Zm9udCBjb2xvcj1cIiM1Qjc4QUNcIj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnQoaGVhZGluZyk7Ci0JCXdyaXRlci5wcmludGxuKCI8L2I+PC9mb250Pjxicj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbih0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSW5mbyhQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJY3JlYXRlSGVhZGluZyh3cml0ZXIsIFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnVwZGF0ZUluUHJvZ3Jlc3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJc3RhcnRUZXh0QXJlYSh3cml0ZXIpOwotCQl3cml0ZXIucHJpbnRsbigKLQkJCVVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLnVwZGF0ZUluaXRpYXRlZCIpKTsgLy8kTk9OLU5MUy0xJAotCQllbmRUZXh0QXJlYSh3cml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzV2luMzIoKSB7Ci0JCXJldHVybiBCb290TG9hZGVyLmdldFdTKCkuZXF1YWxzKCJ3aW4zMiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdGFydFRleHRBcmVhKFByaW50V3JpdGVyIHdyaXRlcikgewotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGFibGUgYm9yZGVyPVwiMFwiIHdpZHRoPVwiMTAwJVwiIGNlbGxzcGFjaW5nPVwiNVwiIGNlbGxwYWRkaW5nPVwiNVwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8dHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50KCI8dGQgd2lkdGg9XCIxMDAlXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlzV2luMzIoKSkKLQkJCXdyaXRlci5wcmludGxuKCI8Zm9udCBmYWNlPVwiTVMgU2FucyBTZXJpZlwiIHNpemU9XCIxXCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJd3JpdGVyLnByaW50bG4oIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCXByaXZhdGUgc3RhdGljIHZvaWQgZW5kVGV4dEFyZWEoUHJpbnRXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChpc1dpbjMyKCkpCi0JCQl3cml0ZXIucHJpbnRsbigiPC9mb250PiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RyPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RhYmxlPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUhlYWRpbmcoUHJpbnRXcml0ZXIgd3JpdGVyLCBTdHJpbmcgdGl0bGUpIHsKLQkJd3JpdGVyLnByaW50bG4oCi0JCQkiPHRhYmxlIGNvbHM9MSB3aWR0aD1cIjU4OFwiIGNlbGxzcGFjaW5nPVwiMFwiIGNlbGxwYWRkaW5nPVwiMFwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8dHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oCi0JCQkiPHRkIGJhY2tncm91bmQ9XCJpbWFnZXMvZm9ybV9iYW5uZXIuanBnXCIgd2lkdGg9XCI1ODBcIiBoZWlnaHQ9XCIzMFwiPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludCgiPHA+PGI+PGZvbnQgc2l6ZT1cIjNcIiBmYWNlPVwiVGFob21hXCI+Jm5ic3A7Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50KHRpdGxlKTsKLQkJd3JpdGVyLnByaW50bG4oIjwvZm9udD48L2I+PC9wPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RkPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5wcmludGxuKCI8L3RyPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJd3JpdGVyLnByaW50bG4oIjx0cj4iKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigKLQkJCSI8dGQgd2lkdGg9XCI1ODBcIj48aW1nIGJvcmRlcj1cIjBcIiBzcmM9XCJpbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnXCIgd2lkdGg9XCI2MDBcIiBoZWlnaHQ9XCIxNVwiPjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGQ+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdHI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJd3JpdGVyLnByaW50bG4oIjwvdGFibGU+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUmVzcG9uc2VFcGlsb2d1ZSgKLQkJSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCi0JCUh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCi0JCVByaW50V3JpdGVyIHdyaXRlcikgewotCi0JCVN0cmluZyBiYWNrVVJMID0gZ2V0T3JpZ2luYXRpbmdVUkwocmVxdWVzdCk7Ci0JCWlmIChiYWNrVVJMICE9IG51bGwpIHsKLQkJCXN0YXJ0VGV4dEFyZWEod3JpdGVyKTsKLQkJCVN0cmluZyBiYWNrVGV4dCA9IFVwZGF0ZVVJLmdldFN0cmluZygiU2VydmxldHNVdGlsLmJhY2siKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLnByaW50KCI8aW1nIGJvcmRlcj1cIjBcIiBzcmM9XCJpbWFnZXMvYmFja3dhcmRfbmF2LmdpZlwiLz48YSBocmVmPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdyaXRlci5wcmludChnZXRPcmlnaW5hdGluZ1VSTChyZXF1ZXN0KSk7Ci0JCQl3cml0ZXIucHJpbnQoIlwiPiIrYmFja1RleHQrIjwvYT4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbmRUZXh0QXJlYSh3cml0ZXIpOwotCQl9Ci0JCXdyaXRlci5wcmludGxuKCIgPC9CT0RZPiAiKTsgLy8kTk9OLU5MUy0xJAotCQl3cml0ZXIucHJpbnRsbigiPC9IVE1MPiIpOyAvLyROT04tTkxTLTEkCi0JCXdyaXRlci5jbG9zZSgpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3JpZ2luYXRpbmdVUkwoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJcmV0dXJuIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJiYWNrVVJMIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGIwN2U5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWNsYXNzZXMKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL2xpYi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDI5MmEzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL1dFQi1JTkYvbGliLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi11cGRhdGUtc2VydmxldHMuamFyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODQ3NzQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotCi0KLTwhRE9DVFlQRSB3ZWItYXBwCi0gICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMi8vRU4iCi0gICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS9kdGRzL3dlYi1hcHBfMi4yLmR0ZCI+Ci0KLTx3ZWItYXBwPgotCi0gICAgPHNlcnZsZXQ+Ci0gICAgICAgIDxzZXJ2bGV0LW5hbWU+aW5zdGFsbDwvc2VydmxldC1uYW1lPgotICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuc2VydmxldHMuSW5zdGFsbFNlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+Ci0gICAgPC9zZXJ2bGV0PgotICAgIAotCTxzZXJ2bGV0LW1hcHBpbmc+Ci0JCTxzZXJ2bGV0LW5hbWU+aW5zdGFsbDwvc2VydmxldC1uYW1lPgotCQk8dXJsLXBhdHRlcm4+L2luc3RhbGw8L3VybC1wYXR0ZXJuPgotCTwvc2VydmxldC1tYXBwaW5nPgotCi08L3dlYi1hcHA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2JhY2t3YXJkX25hdi5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvYmFja3dhcmRfbmF2LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxODhiNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvYmFja3dhcmRfbmF2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV9iYW5uZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNlMmQyLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUudWkvd2ViYXBwL2ltYWdlcy9mb3JtX2Jhbm5lci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS51aS93ZWJhcHAvaW1hZ2VzL2Zvcm1fdW5kZXJsaW5lLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmM2QwYi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlLnVpL3dlYmFwcC9pbWFnZXMvZm9ybV91bmRlcmxpbmUuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY2xhc3NwYXRoIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTI1MzFkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiIHBhdGg9IkpSRV9MSUIiIHJvb3RwYXRoPSJKUkVfU1JDUk9PVCIgc291cmNlcGF0aD0iSlJFX1NSQyIvPgotICAgIDxjbGFzc3BhdGhlbnRyeSBraW5kPSJ2YXIiCi0gICAgICAgIHBhdGg9IkVDTElQU0VfSE9NRS9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUuYm9vdC9ib290LmphciIgc291cmNlcGF0aD0iRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ib290L2Jvb3RzcmMuemlwIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIKLSAgICAgICAgcGF0aD0iRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lL3J1bnRpbWUuamFyIiBzb3VyY2VwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUvcnVudGltZXNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIgotICAgICAgICBwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS5zd3Qvc3d0LmphciIgc291cmNlcGF0aD0iRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2Uuc3d0L3N3dHNyYy56aXAiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0idmFyIgotICAgICAgICBwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS51aS93b3JrYmVuY2guamFyIiBzb3VyY2VwYXRoPSJFQ0xJUFNFX0hPTUUvcGx1Z2lucy9vcmcuZWNsaXBzZS51aS93b3JrYmVuY2hzcmMuemlwIi8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InZhciIgcGF0aD0iRUNMSVBTRV9IT01FL3BsdWdpbnMvb3JnLmVjbGlwc2Uud2ViZGF2L3dlYmRhdi5qYXIiLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY3ZzaWdub3JlIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvLnZjbV9tZXRhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8udmNtX21ldGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTVmOGQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS8udmNtX21ldGEKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPHByb2plY3QtZGVzY3JpcHRpb24+DQotCTxjb21tZW50PjwvY29tbWVudD4NCi0JPG5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIvPg0KLQk8YnVpbGRlciBuYW1lPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlciI+DQotCTwvYnVpbGRlcj4NCi08L3Byb2plY3QtZGVzY3JpcHRpb24+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9hYm91dC5odG1sIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTE1ZTVjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTxodG1sPg0KLTxoZWFkPg0KLTx0aXRsZT5BYm91dDwvdGl0bGU+DQotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi1wLCB0YWJsZSwgdGQsIHRoIHsgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIGdlbmV2YTsgZm9udC1zaXplOiAxMHB0fQ0KLXByZSB7IGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9DQotaDIgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDE4cHQ7IGZvbnQtd2VpZ2h0OiBib2xkIDsgbGluZS1oZWlnaHQ6IDE0cHh9DQotY29kZSB7IGZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciLCBDb3VyaWVyLCBtb25vOyBmb250LXNpemU6IDEwcHR9DQotc3VwIHsgZm9udC1mYW1pbHk6IGFyaWFsLGhlbHZldGljYSxnZW5ldmE7IGZvbnQtc2l6ZTogMTBweH0NCi1oMyB7IGZvbnQtZmFtaWx5OiBhcmlhbCwgaGVsdmV0aWNhLCBnZW5ldmE7IGZvbnQtc2l6ZTogMTRwdDsgZm9udC13ZWlnaHQ6IGJvbGR9DQotbGkgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHR9DQotaDEgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDI4cHg7IGZvbnQtd2VpZ2h0OiBib2xkfQ0KLWJvZHkgeyBmb250LWZhbWlseTogYXJpYWwsIGhlbHZldGljYSwgZ2VuZXZhOyBmb250LXNpemU6IDEwcHQ7IGNsaXA6IHJlY3QoICAgKTsgbWFyZ2luLXRvcDogNW1tOyBtYXJnaW4tbGVmdDogM21tfQ0KLTwvc3R5bGU+DQotPC9oZWFkPg0KLTxib2R5Pg0KLTxib2R5IGxhbmc9RU4tVVMgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4NCi08dGFibGUgYm9yZGVyPTAgY2VsbHNwYWNpbmc9NSBjZWxscGFkZGluZz0yIHdpZHRoPSIxMDAlIiA+DQotICA8dHI+IA0KLSAgICA8dGQgYWxpZ249TEVGVCB2YWxpZ249VE9QIGNvbHNwYW49IjIiIGJnY29sb3I9IiMwMDgwQzAiPjxiPjxmb250IGNvbG9yPSIjRkZGRkZGIiBmYWNlPSJBcmlhbCxIZWx2ZXRpY2EiPkFib3V0IFRoaXMgUGx1Zy1pbjwvZm9udD48L2I+PC90ZD4NCi0gIDwvdHI+DQotICA8dHI+IA0KLSAgICA8dGQ+IA0KLTxwPjFzdCBOb3ZlbWJlciwgMjAwMTwvcD4JDQotPGgzPkxpY2Vuc2U8L2gzPg0KLTxwPkVjbGlwc2Uub3JnIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4uICBUaGUgcGx1Zy1pbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQ0KLTxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYwNS5odG1sIj5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAwLjU8L2E+LiAgRm9yIHB1cnBvc2VzIG9mIHRoZSBDb21tb24gUHVibGljIExpY2Vuc2UsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBwbHVnLWluLjwvcD4NCi08L3RkPjwvdHI+PC90YWJsZT4NCi08L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvYnVpbGQucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3ZGEwMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLXNvdXJjZS51cGRhdGUuamFyPXNyYy8NCi1iaW4uaW5jbHVkZXM9cGx1Z2luLnhtbCxpY29ucy8scGx1Z2luLnByb3BlcnRpZXMsKi5qYXIsYWJvdXQuaHRtbA0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC9jdG9vbDE2L25ldy5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvY3Rvb2wxNi9uZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTZkNWIwLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC9jdG9vbDE2L25ldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvY3Rvb2wxNi91cGRhdGUuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL2N0b29sMTYvdXBkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAxMWQ4YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvY3Rvb2wxNi91cGRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL3dpemJhbi9uZXcuZ2lmIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL3dpemJhbi9uZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTBjNzkzLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC93aXpiYW4vbmV3LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC93aXpiYW4vcmV2ZXJ0LmdpZiBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvaWNvbnMvZnVsbC93aXpiYW4vcmV2ZXJ0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc0MDJhMi4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvd2l6YmFuL3JldmVydC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvd2l6YmFuL3VwZGF0ZS5naWYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL2ljb25zL2Z1bGwvd2l6YmFuL3VwZGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZjE1ZGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9pY29ucy9mdWxsL3dpemJhbi91cGRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9wbHVnaW4ucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDUyZWUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotU19FY2xpcHNlX1VwZGF0ZV9NYW5hZ2VyX1BsdWdpbiA9IEluc3RhbGwvVXBkYXRlIE1hbmFnZXINCi1TX1NvZnR3YXJlX1VwZGF0ZXMgPSAmU29mdHdhcmUgVXBkYXRlcw0KLVNfU29mdHdhcmVfVXBkYXRlc19QcmVmZXJlbmNlcyA9IFNvZnR3YXJlIFVwZGF0ZXMNCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3BsdWdpbi54bWwgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3Zjg3ODcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tIEZpbGUgd3JpdHRlbiBieSBQREUgMS4wIC0tPg0KLTxwbHVnaW4NCi0gICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlIg0KLSAgIG5hbWU9IiVTX0VjbGlwc2VfVXBkYXRlX01hbmFnZXJfUGx1Z2luIg0KLSAgIHZlcnNpb249IjEuMCINCi0gICBwcm92aWRlci1uYW1lPSJJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuIg0KLSAgIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VcGRhdGVNYW5hZ2VyUGx1Z2luIj4NCi08cmVxdWlyZXM+DQotICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPg0KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPg0KLSAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS53ZWJkYXYiLz4NCi08L3JlcXVpcmVzPg0KLQ0KLTxydW50aW1lPg0KLSAgIDxsaWJyYXJ5IG5hbWU9InVwZGF0ZS5qYXIiLz4NCi08L3J1bnRpbWU+DQotDQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSBVcGRhdGUgTWFuYWdlciBIZWxwIE1lbnUgQWN0aW9uIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotPGV4dGVuc2lvbg0KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4NCi0gICA8YWN0aW9uU2V0DQotICAgICAgICAgbGFiZWw9IiVTX1NvZnR3YXJlX1VwZGF0ZXMiDQotICAgICAgICAgdmlzaWJsZT0iZmFsc2UiDQotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVNYW5hZ2VyQWN0aW9uU2V0Ij4NCi0gICAgICA8YWN0aW9uDQotICAgICAgICAgICAgbGFiZWw9IiVTX1NvZnR3YXJlX1VwZGF0ZXMiDQotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VTURpYWxvZ0FjdGlvbiINCi0gICAgICAgICAgICBtZW51YmFyUGF0aD0iaGVscC9oZWxwRW5kIg0KLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVXBkYXRlTWFuYWdlckFjdGlvbiI+DQotICAgICAgPC9hY3Rpb24+DQotICAgPC9hY3Rpb25TZXQ+DQotPC9leHRlbnNpb24+DQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4NCi08IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLTwhLS0gVXBkYXRlIE1hbmFnZXIgQXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLTxleHRlbnNpb24NCi0gICAgICBpZD0idXBkYXRlTWFuYWdlciINCi0gICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+DQotICAgPGFwcGxpY2F0aW9uPg0KLSAgICAgIDxydW4NCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVNQXBwbGljYXRpb25Vc2VySW50ZXJmYWNlIj4NCi0gICAgICA8L3J1bj4NCi0gICA8L2FwcGxpY2F0aW9uPg0KLTwvZXh0ZW5zaW9uPg0KLTwvcGx1Z2luPg0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvcGx1Z2luLnhtbC5vZmYgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3BsdWdpbi54bWwub2ZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTgzODMxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvcGx1Z2luLnhtbC5vZmYKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLQ0KLTwhLS0gRWNsaXBzZSBVcGRhdGUgTWFuYWdlciBQbHVnaW4gLS0+DQotDQotPHBsdWdpbg0KLSAgICBpZCAgICAgICAgICA9ICJvcmcuZWNsaXBzZS51cGRhdGUiDQotICAgIG5hbWUgICAgICAgID0gIiVTX0VjbGlwc2VfVXBkYXRlX01hbmFnZXJfUGx1Z2luIg0KLSAgICB2ZXJzaW9uICAgICA9ICIxLjAiDQotICAgIHByb3ZpZGVyLW5hbWUgPSAiSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiINCi0gICAgY2xhc3MgICAgICAgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclBsdWdpbiI+DQotDQotICAgIDxyZXF1aXJlcz4NCi0gICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiLz4NCi0gICAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS51aSIvPg0KLSAgICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLndlYmRhdiIvPg0KLSAgICA8L3JlcXVpcmVzPg0KLQ0KLSAgICA8cnVudGltZT4NCi0gICAgICAgIDxsaWJyYXJ5IG5hbWU9InVwZGF0ZS5qYXIiIC8+DQotICAgIDwvcnVudGltZT4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tIFVwZGF0ZSBNYW5hZ2VyIFByZWZlcmVuY2UgUGFnZSBTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPg0KLSAgICAgICAgPHBhZ2UgaWQgICAgICAgPSAiVU1QcmVmZXJlbmNlUGFnZVNldHRpbmdzIg0KLSAgICAgICAgICAgICAgbmFtZSAgICAgPSAiJVNfU29mdHdhcmVfVXBkYXRlc19QcmVmZXJlbmNlcyINCi0gICAgICAgICAgICAgIGNsYXNzICAgID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VTVByZWZlcmVuY2VQYWdlU2V0dGluZ3MiPg0KLSAgICAgICAgPC9wYWdlPg0KLSAgICA8L2V4dGVuc2lvbj4NCi0NCi0gICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPg0KLSAgICA8IS0tIFVwZGF0ZSBNYW5hZ2VyIEhlbHAgTWVudSBBY3Rpb24gU2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4NCi0gICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPg0KLSAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRzIj4NCi0gICAgICAgIDxhY3Rpb25TZXQNCi0gICAgICAgICAgICBpZCAgICAgID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS5VcGRhdGVNYW5hZ2VyQWN0aW9uU2V0Ig0KLSAgICAgICAgICAgIGxhYmVsICAgPSAiJVNfU29mdHdhcmVfVXBkYXRlcyINCi0gICAgICAgICAgICB2aXNpYmxlID0gInRydWUiPg0KLSAgICAgICAgICAgIDxhY3Rpb24gaWQgICAgICAgICAgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVwZGF0ZU1hbmFnZXJBY3Rpb24iDQotICAgICAgICAgICAgICAgICAgICBtZW51YmFyUGF0aCA9ICJoZWxwL2hlbHBFbmQiDQotICAgICAgICAgICAgICAgICAgICBsYWJlbCAgICAgICA9ICIlU19Tb2Z0d2FyZV9VcGRhdGVzIg0KLSAgICAgICAgICAgICAgICAgICAgY2xhc3MgICAgICAgPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLlVNRGlhbG9nQWN0aW9uIi8+DQotICAgICAgICA8L2FjdGlvblNldD4NCi0gICAgPC9leHRlbnNpb24+DQotDQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gVXBkYXRlIE1hbmFnZXIgQXBwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+DQotICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+DQotICAgIDxleHRlbnNpb24gaWQ9InVwZGF0ZU1hbmFnZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4NCi0gICAgICAgIDxhcHBsaWNhdGlvbj4NCi0gICAgICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2UiPg0KLSAgICAgICAgICAgIDwvcnVuPg0KLSAgICAgICAgPC9hcHBsaWNhdGlvbj4NCi0gICAgPC9leHRlbnNpb24+DQotPC9wbHVnaW4+DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVNlc3Npb25EZWZpbmVyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2Vzc2lvbkRlZmluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI2Y2EwNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9JU2Vzc2lvbkRlZmluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICovDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi0NCi1wdWJsaWMgaW50ZXJmYWNlIElTZXNzaW9uRGVmaW5lciB7DQotLyoqDQotICogQ3JlYXRlcyBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIGZvciB0aGUgY3VycmVudCBzZXNzaW9uLg0KLSAqLw0KLXZvaWQgZGVmaW5lT3BlcmF0aW9ucyggVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiwgSUluc3RhbGxhYmxlW10gZGVzY3JpcHRvcnMsIGJvb2xlYW4gYlZlcmlmeUphcnMgKTsNCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVVNTG9jay5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvSVVNTG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjVjOTA3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL0lVTUxvY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICovDQotcHVibGljIGludGVyZmFjZSBJVU1Mb2NrIHsNCi0vKioNCi0gKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBVTUxvY2sgZmlsZSBpcyB0aGVyZS4gIElmIHllcywgcmV0dXJucyB0cnVlDQotICovDQotcHVibGljIGJvb2xlYW4gZXhpc3RzKCk7DQotLyoqDQotICovDQotdm9pZCByZW1vdmUoKTsNCi0vKioNCi0gKi8NCi12b2lkIHNldCgpOw0KLS8qKg0KLSAqLw0KLXZvaWQgc2V0KFN0cmluZyBtc2cpOw0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTUxvY2suamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNTG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzA4ZDlhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNTG9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi0vKioNCi0gKi8NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLWltcG9ydCBqYXZhLmlvLio7DQotaW1wb3J0IGphdmEubmV0Lio7DQotcHVibGljIGNsYXNzIFVNTG9jayBpbXBsZW1lbnRzIElVTUxvY2sgew0KLQlGaWxlIGZpbGUgPSBudWxsOw0KLS8qKg0KLSAqIFVNTG9jayBjb25zdHJ1Y3RvciBjb21tZW50Lg0KLSAqLw0KLXB1YmxpYyBVTUxvY2soKSB7DQotCXN1cGVyKCk7DQotCVVSTCBsb2NrZmlsZVVSTCA9IG51bGw7DQotCXRyeSB7DQotCQlsb2NrZmlsZVVSTCA9IG5ldyBVUkwoVU1FY2xpcHNlVHJlZS5nZXRJbnN0YWxsVHJlZVVSTCgpLCBJTWFuaWZlc3RBdHRyaWJ1dGVzLlVNX0xPQ0spOw0KLQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JfQ0KLQlmaWxlID0gZ2V0RmlsZShsb2NrZmlsZVVSTCk7DQotfQ0KLS8qKg0KLSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIFVNTG9jayBmaWxlIGlzIHRoZXJlLiAgSWYgeWVzLCByZXR1cm5zIHRydWUNCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7DQotCQ0KLQlpZiAoZmlsZSAhPSBudWxsKSB7DQotCQlpZiAoZmlsZS5leGlzdHMoKSA9PSB0cnVlKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCX0NCi0JcmV0dXJuIGZhbHNlOw0KLX0NCi0vKioNCi0gKi8NCi1wdWJsaWMgc3RhdGljIEZpbGUgZ2V0RmlsZShVUkwgdXJsKSB7DQotCUZpbGUgZmlsZSA9IG51bGw7DQotCWlmICh1cmwgIT0gbnVsbCkgew0KLQ0KLQkJLy8gQ29udmVydCB0aGUgVVJMIHRvIGEgc3RyaW5nDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVN0cmluZyBzdHJGaWxlc3BlYyA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcodXJsKTsNCi0NCi0JCWZpbGUgPSBuZXcgRmlsZShzdHJGaWxlc3BlYyk7DQotCX0NCi0JcmV0dXJuIGZpbGU7DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsNCi0JaWYgKGV4aXN0cygpKQ0KLQkJZmlsZS5kZWxldGUoKTsNCi0JCQ0KLX0NCi0vKioNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXQoKSB7DQotCXNldCgiIik7DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldChTdHJpbmcgbXNnKSB7DQotCVVSTCBsb2NrZmlsZVVSTCA9IG51bGw7DQotCXRyeSB7DQotCQlsb2NrZmlsZVVSTCA9IG5ldyBVUkwoVU1FY2xpcHNlVHJlZS5nZXRJbnN0YWxsVHJlZVVSTCgpLCBJTWFuaWZlc3RBdHRyaWJ1dGVzLlVNX0xPQ0spOw0KLQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JfQ0KLQkNCi0JLy8gQ3JlYXRlIGEgbG9jayBmaWxlDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlMb2cgbG9ja2ZpbGUgPSBuZXcgTG9nKCk7DQotDQotCXRyeSB7DQotCQlsb2NrZmlsZS5sb2FkKGxvY2tmaWxlVVJMKTsJCS8vIGNyZWF0ZXMgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0DQotCX0NCi0JY2F0Y2ggKExvZ1N0b3JlRXhjZXB0aW9uIGV4KSB7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JLy8gQWRkIGFuIGVudHJ5DQotCS8vLS0tLS0tLS0tLS0tLQ0KLQlMb2dFbnRyeSBsb2NrRW50cnkgPSBuZXcgTG9nRW50cnkoIGxvY2tmaWxlLCBtc2cgKTsNCi0JbG9ja2ZpbGUuYWRkQ2hpbGRFbnRyeSggbG9ja0VudHJ5ICk7DQotDQotDQotCXRyeSB7DQotCQlsb2NrZmlsZS5zYXZlKGxvY2tmaWxlVVJMKTsNCi0JfQ0KLQljYXRjaCAoTG9nU3RvcmVFeGNlcHRpb24gZXgpIHsNCi0JCXJldHVybjsNCi0JfQ0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uRGVmaW5lclJlZmVyZW5jZVVwZGF0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uRGVmaW5lclJlZmVyZW5jZVVwZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDAwOTFiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbkRlZmluZXJSZWZlcmVuY2VVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLS8qKg0KLSAqLw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5MYXVuY2hJbmZvOw0KLQ0KLXB1YmxpYyBjbGFzcyBVTVNlc3Npb25EZWZpbmVyUmVmZXJlbmNlVXBkYXRlIGltcGxlbWVudHMgSVNlc3Npb25EZWZpbmVyIHsNCi0vKioNCi0gKiBVTVVwZGF0ZXJDYWNoZWQgY29uc3RydWN0b3IgY29tbWVudC4NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uRGVmaW5lclJlZmVyZW5jZVVwZGF0ZSgpIHsNCi0Jc3VwZXIoKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIGZvciB0aGUgY3VycmVudCBwYXJjZWwuDQotICovDQotcHVibGljIHZvaWQgZGVmaW5lQ29tcG9uZW50T3BlcmF0aW9uKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsLCBJSW5zdGFsbGFibGUgZGVzY3JpcHRvciwgYm9vbGVhbiBiVmVyaWZ5SmFycykgew0KLQ0KLQlJQ29tcG9uZW50RGVzY3JpcHRvciBjb21wb25lbnREZXNjcmlwdG9yID0gbnVsbDsNCi0NCi0JaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBJQ29tcG9uZW50RGVzY3JpcHRvcikgew0KLQkJY29tcG9uZW50RGVzY3JpcHRvciA9IChJQ29tcG9uZW50RGVzY3JpcHRvcikgZGVzY3JpcHRvcjsNCi0JfQ0KLQllbHNlIGlmIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJY29tcG9uZW50RGVzY3JpcHRvciA9ICgoSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcigpOw0KLQl9DQotCWlmIChjb21wb25lbnREZXNjcmlwdG9yID09IG51bGwpDQotCQlyZXR1cm47IA0KLQ0KLQlVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uIG9wZXJhdGlvbiA9IG51bGw7DQotDQotCS8vIENyZWF0ZSBkb3dubG9hZCBvcGVyYXRpb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlvcGVyYXRpb24gPSBwYXJjZWwuY3JlYXRlT3BlcmF0aW9uKCk7DQotCW9wZXJhdGlvbi5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQ09QWSk7DQotCW9wZXJhdGlvbi5zZXRJZChjb21wb25lbnREZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCW9wZXJhdGlvbi5zZXRTb3VyY2UoY29tcG9uZW50RGVzY3JpcHRvci5nZXREb3dubG9hZFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQlTdHJpbmcgZG93bmxvYWRUYXJnZXQgPSBVTUVjbGlwc2VUcmVlLmdldFN0YWdpbmdBcmVhKCkudG9FeHRlcm5hbEZvcm0oKSArIGNvbXBvbmVudERlc2NyaXB0b3IuZ2V0RGlyTmFtZSgpICsgIi5qYXIiOw0KLQlvcGVyYXRpb24uc2V0VGFyZ2V0KGRvd25sb2FkVGFyZ2V0KTsNCi0Jb3BlcmF0aW9uLnNldERhdGEoZGVzY3JpcHRvcik7DQotDQotCS8vIENyZWF0ZSBqYXIgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKGJWZXJpZnlKYXJzID09IHRydWUpIHsNCi0JCW9wZXJhdGlvbiA9IHBhcmNlbC5jcmVhdGVPcGVyYXRpb24oKTsNCi0JCW9wZXJhdGlvbi5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVkVSSUZZX0pBUik7DQotCQlvcGVyYXRpb24uc2V0SWQoY29tcG9uZW50RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQkJb3BlcmF0aW9uLnNldFNvdXJjZShkb3dubG9hZFRhcmdldCk7DQotCQlvcGVyYXRpb24uc2V0VGFyZ2V0KG51bGwpOw0KLQkJb3BlcmF0aW9uLnNldERhdGEoZGVzY3JpcHRvcik7DQotCX0NCi0NCi0JLy8gQ3JlYXRlIGFwcGx5IG9wZXJhdGlvbiBmb3IgY29tcG9uZW50IGZpbGVzIChmaWxlcyBub3QgaW4gcGx1Z2lucy8gZGlyIHN0cnVjdHVyZSkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQlvcGVyYXRpb24uc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0lOU1RBTEwpOw0KLQlvcGVyYXRpb24uc2V0SWQoY29tcG9uZW50RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQlvcGVyYXRpb24uc2V0U291cmNlKGRvd25sb2FkVGFyZ2V0KTsNCi0JU3RyaW5nIGFwcGx5VGFyZ2V0ID0gVU1FY2xpcHNlVHJlZS5nZXRCYXNlSW5zdGFsbFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7DQotCS8vCVN0cmluZyBhcHBseVRhcmdldCA9ICJmaWxlOi8vL2M6L3RlbXAveC8iIDsNCi0Jb3BlcmF0aW9uLnNldFRhcmdldChhcHBseVRhcmdldCk7DQotCW9wZXJhdGlvbi5zZXREYXRhKGRlc2NyaXB0b3IpOw0KLQ0KLQkvLyBDcmVhdGUgYXBwbHkgb3BlcmF0aW9uIGZvciBwbHVnLWlucwkJDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlQbHVnaW5FbnRyeURlc2NyaXB0b3JbXSBwbHVnaW5zID0gY29tcG9uZW50RGVzY3JpcHRvci5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCUlGcmFnbWVudEVudHJ5RGVzY3JpcHRvcltdIGZyYWdtZW50cyA9IGNvbXBvbmVudERlc2NyaXB0b3IuZ2V0RnJhZ21lbnRFbnRyaWVzKCk7DQotCWlmICgocGx1Z2lucy5sZW5ndGggPiAwKSB8fCAoZnJhZ21lbnRzLmxlbmd0aCA+MCkpIHsNCi0JCW9wZXJhdGlvbiA9IHBhcmNlbC5jcmVhdGVPcGVyYXRpb24oKTsNCi0JCW9wZXJhdGlvbi5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUyk7DQotCQlvcGVyYXRpb24uc2V0SWQoY29tcG9uZW50RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQkJb3BlcmF0aW9uLnNldFNvdXJjZShkb3dubG9hZFRhcmdldCk7DQotCQkvLyBieSBzcGVjaWZpeWluZyB0aGUgaW5zdGFsbCBkaXIgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLCB0aGUgdW56aXAgbWV0aG9kDQotCQkvLyB3aWxsIGp1c3QgdW56aXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBqYXIgaW50byB0aGUgZGlyDQotCQlhcHBseVRhcmdldCA9IFVNRWNsaXBzZVRyZWUuZ2V0QmFzZUluc3RhbGxVUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJLy8JYXBwbHlUYXJnZXQgPSAiZmlsZTovLy9jOi90ZW1wL3gvIiA7DQotCQlvcGVyYXRpb24uc2V0VGFyZ2V0KGFwcGx5VGFyZ2V0KTsNCi0JCW9wZXJhdGlvbi5zZXREYXRhKGRlc2NyaXB0b3IpOw0KLQl9DQotDQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgb25lIG9yIG1vcmUgb3BlcmF0aW9ucyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi4NCi0gKi8NCi1wdWJsaWMgdm9pZCBkZWZpbmVPcGVyYXRpb25zKFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24sIElJbnN0YWxsYWJsZVtdIGRlc2NyaXB0b3JzLCBib29sZWFuIGJWZXJpZnlKYXJzKSB7DQotDQotCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsNCi0NCi0JCS8vIFByb2R1Y3RzDQotCQkvLy0tLS0tLS0tLQ0KLQkJaWYgKGRlc2NyaXB0b3JzW2ldIGluc3RhbmNlb2YgSVByb2R1Y3REZXNjcmlwdG9yKSB7DQotDQotCQkJVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBwYXJjZWwgPSBudWxsOw0KLQ0KLQkJCS8vIENyZWF0ZSBwYXJjZWwNCi0JCQkvLy0tLS0tLS0tLS0tLS0tDQotCQkJcGFyY2VsID0gc2Vzc2lvbi5jcmVhdGVQYXJjZWwoKTsNCi0JCQlwYXJjZWwuc2V0VHlwZShJTWFuaWZlc3RBdHRyaWJ1dGVzLlBST0RVQ1QpOw0KLQkJCXBhcmNlbC5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQUNUSU9OX0lOU1RBTEwpOw0KLQkJCXBhcmNlbC5zZXRJZCgoKElQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNbaV0pLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCQkJcGFyY2VsLnNldERhdGEoKElQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNbaV0pOw0KLQ0KLQkJCWRlZmluZVByb2R1Y3RPcGVyYXRpb24ocGFyY2VsLCBkZXNjcmlwdG9yc1tpXSwgYlZlcmlmeUphcnMpOw0KLQkJfQ0KLQ0KLQkJLy8gQ29tcG9uZW50cw0KLQkJLy8tLS0tLS0tLS0tLQ0KLQkJZWxzZSBpZiAoZGVzY3JpcHRvcnNbaV0gaW5zdGFuY2VvZiBJQ29tcG9uZW50RGVzY3JpcHRvcikgew0KLQ0KLQkJCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsID0gbnVsbDsNCi0NCi0JCQkvLyBDcmVhdGUgcGFyY2VsDQotCQkJLy8tLS0tLS0tLS0tLS0tLQ0KLQkJCXBhcmNlbCA9IHNlc3Npb24uY3JlYXRlUGFyY2VsKCk7DQotCQkJcGFyY2VsLnNldFR5cGUoSU1hbmlmZXN0QXR0cmlidXRlcy5DT01QT05FTlQpOw0KLQkJCXBhcmNlbC5zZXRBY3Rpb24oVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQUNUSU9OX0lOU1RBTEwpOw0KLQkJCXBhcmNlbC5zZXRJZCgoKElDb21wb25lbnREZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1tpXSkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0JCQlwYXJjZWwuc2V0RGF0YSgoSUNvbXBvbmVudERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzW2ldKTsNCi0NCi0JCQlkZWZpbmVDb21wb25lbnRPcGVyYXRpb24ocGFyY2VsLCBkZXNjcmlwdG9yc1tpXSwgYlZlcmlmeUphcnMpOw0KLQkJfQ0KLQ0KLQkJLy8gQ29tcG9uZW50IEVudHJpZXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCQllbHNlIGlmIChkZXNjcmlwdG9yc1tpXSBpbnN0YW5jZW9mIElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIHsNCi0NCi0JCQlVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIHBhcmNlbCA9IG51bGw7DQotDQotCQkJLy8gQ3JlYXRlIHBhcmNlbA0KLQkJCS8vLS0tLS0tLS0tLS0tLS0NCi0JCQlwYXJjZWwgPSBzZXNzaW9uLmNyZWF0ZVBhcmNlbCgpOw0KLQkJCXBhcmNlbC5zZXRUeXBlKElNYW5pZmVzdEF0dHJpYnV0ZXMuQ09NUE9ORU5UKTsNCi0JCQlwYXJjZWwuc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX0FDVElPTl9JTlNUQUxMKTsNCi0JCQlwYXJjZWwuc2V0SWQoKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1tpXSkuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0JCQlwYXJjZWwuc2V0RGF0YSgoSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNbaV0pOw0KLQ0KLQkJCWRlZmluZUNvbXBvbmVudE9wZXJhdGlvbihwYXJjZWwsIGRlc2NyaXB0b3JzW2ldLCBiVmVyaWZ5SmFycyk7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogQ3JlYXRlcyBvbmUgb3IgbW9yZSBvcGVyYXRpb25zIGZvciB0aGUgY3VycmVudCBwYXJjZWwuDQotICovDQotcHVibGljIHZvaWQgZGVmaW5lUHJvZHVjdE9wZXJhdGlvbihVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIHBhcmNlbCwgSUluc3RhbGxhYmxlIGRlc2NyaXB0b3IsIGJvb2xlYW4gYlZlcmlmeUphcnMpIHsNCi0NCi0JSVByb2R1Y3REZXNjcmlwdG9yIHByb2R1Y3REZXNjcmlwdG9yID0gKElQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcjsNCi0JVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsOw0KLQ0KLQkvLyBDcmVhdGUgZG93bmxvYWQgb3BlcmF0aW9uDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQlvcGVyYXRpb24uc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX0NPUFkpOw0KLQlvcGVyYXRpb24uc2V0SWQocHJvZHVjdERlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpKTsNCi0Jb3BlcmF0aW9uLnNldFNvdXJjZShwcm9kdWN0RGVzY3JpcHRvci5nZXREb3dubG9hZFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOw0KLQlTdHJpbmcgZG93bmxvYWRUYXJnZXQgPSBVTUVjbGlwc2VUcmVlLmdldFN0YWdpbmdBcmVhKCkudG9TdHJpbmcoKSArIHByb2R1Y3REZXNjcmlwdG9yLmdldERpck5hbWUoKSArICIuamFyIjsNCi0Jb3BlcmF0aW9uLnNldFRhcmdldChkb3dubG9hZFRhcmdldCk7DQotCW9wZXJhdGlvbi5zZXREYXRhKHByb2R1Y3REZXNjcmlwdG9yKTsNCi0NCi0JLy8gQ3JlYXRlIGphciB2ZXJpZmljYXRpb24gb3BlcmF0aW9uDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoYlZlcmlmeUphcnMgPT0gdHJ1ZSkgew0KLQkJb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQkJb3BlcmF0aW9uLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9WRVJJRllfSkFSKTsNCi0JCW9wZXJhdGlvbi5zZXRJZChwcm9kdWN0RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQkJb3BlcmF0aW9uLnNldFNvdXJjZShkb3dubG9hZFRhcmdldCk7DQotCQlvcGVyYXRpb24uc2V0VGFyZ2V0KG51bGwpOw0KLQkJb3BlcmF0aW9uLnNldERhdGEocHJvZHVjdERlc2NyaXB0b3IpOw0KLQl9DQotDQotCS8vIENyZWF0ZSBhcHBseSBvcGVyYXRpb24gZm9yIHByb2R1Y3QgZmlsZXMgICAgIA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCW9wZXJhdGlvbiA9IHBhcmNlbC5jcmVhdGVPcGVyYXRpb24oKTsNCi0Jb3BlcmF0aW9uLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMKTsNCi0Jb3BlcmF0aW9uLnNldElkKHByb2R1Y3REZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCW9wZXJhdGlvbi5zZXRTb3VyY2UoZG93bmxvYWRUYXJnZXQpOw0KLQlTdHJpbmcgYXBwbHlUYXJnZXQgPSBVTUVjbGlwc2VUcmVlLmdldEJhc2VJbnN0YWxsVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsNCi0Jb3BlcmF0aW9uLnNldFRhcmdldChhcHBseVRhcmdldCk7DQotCW9wZXJhdGlvbi5zZXREYXRhKHByb2R1Y3REZXNjcmlwdG9yKTsNCi0NCi0JLy8gQ3JlYXRlIGNvbXBvbmVudCBzdWItcGFyY2Vscw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlDb21wb25lbnRFbnRyeURlc2NyaXB0b3JbXSBlbnRyaWVzID0gcHJvZHVjdERlc2NyaXB0b3IuZ2V0Q29tcG9uZW50RW50cmllcygpOw0KLQlmb3IgKGludCBqID0gMDsgaiA8IGVudHJpZXMubGVuZ3RoOyArK2opIHsNCi0JCWlmIChlbnRyaWVzW2pdLmlzU2VsZWN0ZWQoKSkgew0KLQ0KLQkJCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgc3VicGFyY2VsID0gbnVsbDsNCi0JCQkvLyBDcmVhdGUgcGFyY2VsIGZvciBlYWNoIGNvbXBvbmVudA0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJc3VicGFyY2VsID0gcGFyY2VsLmNyZWF0ZVBhcmNlbCgpOw0KLQkJCXN1YnBhcmNlbC5zZXRUeXBlKElNYW5pZmVzdEF0dHJpYnV0ZXMuQ09NUE9ORU5UKTsNCi0JCQlzdWJwYXJjZWwuc2V0QWN0aW9uKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX0FDVElPTl9JTlNUQUxMKTsNCi0JCQlzdWJwYXJjZWwuc2V0SWQoZW50cmllc1tqXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpOw0KLQkJCXN1YnBhcmNlbC5zZXREYXRhKGVudHJpZXNbal0pOw0KLQ0KLQkJCWRlZmluZUNvbXBvbmVudE9wZXJhdGlvbihzdWJwYXJjZWwsIGVudHJpZXNbal0sIGJWZXJpZnlKYXJzKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBDcmVhdGUgYXBwbHkgb3BlcmF0aW9uIGZvciBwcm9kdWN0IGZpbGVzICAgICANCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlTdHJpbmcgYXBwID0gTGF1bmNoSW5mby5nZXRDdXJyZW50KCkuZ2V0QXBwbGljYXRpb25Db25maWd1cmF0aW9uSWRlbnRpZmllcigpOw0KLQlpZiAoKGFwcCAhPSBudWxsKSAmJiAoYXBwLmVxdWFscyhwcm9kdWN0RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCkpKSkgeyAJLy8gZG9taW5hbnQgYXBwPw0KLQkJb3BlcmF0aW9uID0gcGFyY2VsLmNyZWF0ZU9wZXJhdGlvbigpOw0KLQkJb3BlcmF0aW9uLnNldEFjdGlvbihVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9CSU5ESVIpOw0KLQkJb3BlcmF0aW9uLnNldElkKHByb2R1Y3REZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSk7DQotCQlvcGVyYXRpb24uc2V0U291cmNlKGRvd25sb2FkVGFyZ2V0KTsNCi0JCW9wZXJhdGlvbi5zZXRUYXJnZXQoYXBwbHlUYXJnZXQpOw0KLQkJb3BlcmF0aW9uLnNldERhdGEocHJvZHVjdERlc2NyaXB0b3IpOw0KLQl9DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMzc5YjUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLio7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotLyoqDQotICogU2Vzc2lvbiBNYW5hZ2VyIGV4ZWN1dGVzIGRlZmluZWQgc2Vzc2lvbnMsIGFuZCBtYW5hZ2VzIHRoZSB1cGRhdGUgYW5kIHVwZGF0ZSBoaXN0b3J5IGxvZ3MuDQotICogTG9ncyBsb29rIGxpa2UgdGhpczoNCi0gKg0KLSAqIDxzZXNzaW9uIHRpbWVzdGFtcD0ieHh4eCIgc3RhdHVzPSJjb21wbGV0ZSIgYXR0ZW1wdHM9IjEiPg0KLSAqICAgPG9wZXJhdGlvbiBhY3Rpb249InVybHRvY2FjaGUiIHN0YXR1cz0iY29tcGxldGUiIGF0dGVtcHRzPSIxIj4NCi0gKiAgICAgIDxwYXJjZWwgdHlwZT0iY29tcG9uZW50IiBpZD0ieHh4IiBhY3Rpb249ImFkZCIgc3RhdHVzPSJjb21wbGV0ZSIgYXR0ZW1wdHM9IjEiPg0KLSAqICAgICAgICAgPGl0ZW0gaWQ9Inh4eCIgc291cmNlPSJmaWxlOi8vL0M6L3RlbXAvc2FtcGxlX2luLmphdmEiIHRhcmdldD0iZmlsZTovLy9DOi90ZW1wL3NhbXBsZV9vdXQuamF2YSIgc3RhdHVzPSJjb21wbGV0ZSIgYXR0ZW1wdHM9IjEiPg0KLSAqICAgICAgICAgICAgPG1lc3NhZ2UgdGV4dD0ic3VjY2Vzc2Z1bCIgdGltZXN0YW1wPSJUaHUgTWFyIDAxIDA5OjU2OjQ5IEVTVCAyMDAxIiAvPg0KLSAqICAgICAgICAgPC9pdGVtPg0KLSAqICAgICAgPC9wYXJjZWw+DQotICogICA8L29wZXJhdGlvbj4NCi0gKiA8L3Nlc3Npb24+DQotICoNCi0gKg0KLSAqICBFYWNoIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYW4gVXBkYXRlTWFuYWdlclh5eiBjbGFzcyBhbmQgaGF2ZSBzcGVjaWZpYw0KLSAqIG1lbWJlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyBkb21haW4gc3BlY2lmaWMgYXR0cmlidXRlcyBhbmQgY2hpbGQgZWxlbWVudHMuDQotICogVGhlICJzdGF0dXMiIGF0dHJpYnV0ZSBjYW4gYmUgb25lIG9mICJwZW5kaW5nIiwgImZhaWxlZCIsIG9yICJjb21wbGV0ZSIuDQotICovDQotDQotcHVibGljIGNsYXNzIFVNU2Vzc2lvbk1hbmFnZXIgew0KLQkNCi0JcHJvdGVjdGVkIExvZyBfbG9nVXBkYXRlICA9IG51bGw7DQotCXByb3RlY3RlZCBMb2cgX2xvZ0hpc3RvcnkgPSBudWxsOw0KLQkNCi0JcHJvdGVjdGVkIFVSTCBfdXJsVXBkYXRlICA9IG51bGw7DQotCXByb3RlY3RlZCBVUkwgX3VybEhpc3RvcnkgPSBudWxsOw0KLQ0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IF9hbFVwZGF0ZVNlc3Npb25zID0gbmV3IEFycmF5TGlzdCgpOw0KLS8qKg0KLSAqIENvbnN0cnVjdHMgYW4gVXBkYXRlTWFuYWdlciB3aXRoIHRoZSB1cGRhdGUgbG9nIGFuZCBoaXN0b3J5IGxvZyBVUkxzLg0KLSAqIFRoZSBib29sZWFuIHNwZWNpZmllcyB3aGV0aGVyIGFuIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duIGlmIG9uZSBvZg0KLSAqIHRoZSBsb2dzIGlzIG5vdCBmb3VuZC4NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlcihVUkwgdXJsVXBkYXRlTG9nLCBVUkwgdXJsSGlzdG9yeUxvZywgYm9vbGVhbiBub3RpZnlJZkxvZ05vdEZvdW5kKSB0aHJvd3MgTG9nU3RvcmVFeGNlcHRpb24gew0KLQ0KLQlfdXJsVXBkYXRlID0gdXJsVXBkYXRlTG9nOw0KLQlfdXJsSGlzdG9yeSA9IHVybEhpc3RvcnlMb2c7DQotDQotCS8vIEF0dGVtcHQgdG8gb3BlbiB0aGUgdHdvIGxvZ3MNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlfbG9nVXBkYXRlID0gbmV3IExvZygpOw0KLQlfbG9nSGlzdG9yeSA9IG5ldyBMb2coKTsNCi0NCi0JLy8gSWYgdGhlIGZpbGVzIGRvIG5vdCBleGlzdA0KLQkvLyBub3RpZnkgaWYgcmVxdWlyZWQuICBPdGhlcndpc2UgYXNzdW1lIG5ldyBmaWxlcw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQl0cnkgew0KLQkJX2xvZ1VwZGF0ZS5sb2FkKF91cmxVcGRhdGUpOw0KLQl9DQotCWNhdGNoIChMb2dTdG9yZUV4Y2VwdGlvbiBleCkgew0KLS8vCQlfbG9nVXBkYXRlLnByaW50RW50cnlUcmVlKDApOw0KLQkJaWYgKG5vdGlmeUlmTG9nTm90Rm91bmQgPT0gdHJ1ZSkgew0KLQkJCXRocm93IGV4Ow0KLQkJfQ0KLQl9DQotDQotCS8vIENyZWF0ZSB0aGUgdXBkYXRlIHNlc3Npb24gc3RydWN0dXJlIGZyb20gdGhlIGxvZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JYnVpbGRUcmVlRnJvbUxvZyggX2xvZ1VwZGF0ZSApOw0KLQ0KLS8qCQ0KLQl0cnkgew0KLQkJX2xvZ0hpc3RvcnkubG9hZChfdXJsVXBkYXRlKTsNCi0JfQ0KLQljYXRjaCAoTG9nU3RvcmVFeGNlcHRpb24gZXgpIHsNCi0JCQ0KLQkJaWYgKG5vdGlmeUlmTG9nTm90Rm91bmQgPT0gdHJ1ZSkgew0KLQkJCXRocm93IGV4Ow0KLQkJfQ0KLQl9DQotDQotCV9sb2dIaXN0b3J5LnByaW50RW50cnlUcmVlKDApOw0KLSovDQotfQ0KLS8qKg0KLSAqIENyZWF0ZXMgYSB0cmVlIG9mIHNlc3Npb25zIGZyb20gdGhlIGdpdmVuIGxvZy4NCi0gKiBAcGFyYW0gbG9nVXBkYXRlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkxvZw0KLSAqIEBwYXJhbSBhbFVwZGF0ZSBqYXZhLnV0aWwuQXJyYXlMaXN0DQotICovDQotcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZUZyb21Mb2coTG9nIGxvZ1VwZGF0ZSApIHsNCi0JDQotCUlMb2dFbnRyeVtdIGVudHJ5Q2hpbGRyZW4gPSBsb2dVcGRhdGUuZ2V0Q2hpbGRFbnRyaWVzKCk7DQotDQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24gPSBudWxsOw0KLQkNCi0JZm9yKCBpbnQgaT0wOyBpPGVudHJ5Q2hpbGRyZW4ubGVuZ3RoOyArK2kgKQ0KLQl7DQotCQlzZXNzaW9uID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uKCBlbnRyeUNoaWxkcmVuW2ldICk7DQotDQotCQlfYWxVcGRhdGVTZXNzaW9ucy5hZGQoIHNlc3Npb24gKTsNCi0JCQ0KLQkJc2Vzc2lvbi5idWlsZFRyZWVGcm9tTG9nKCBlbnRyeUNoaWxkcmVuW2ldICk7DQotCX0NCi0JDQotCXJldHVybjsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhIG5ldyB1cGRhdGUgc2Vzc2lvbiB3aGVyZSBwZW5kaW5nIG9wZXJhdGlvbnMgbWF5IGJlIGRlZmluZWQgZm9yDQotICogY29tcGxldGlvbi4NCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIGNyZWF0ZVVwZGF0ZVNlc3Npb24oKSB7DQotDQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHVtU2Vzc2lvbiA9IG51bGw7DQotCQ0KLQlpZiggX2xvZ1VwZGF0ZSAhPSBudWxsICkNCi0Jew0KLQkJSUxvZ0VudHJ5IGVudHJ5U2Vzc2lvbiA9IG5ldyBMb2dFbnRyeSggX2xvZ1VwZGF0ZSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfU0VTU0lPTiApOw0KLQkJDQotCQlfbG9nVXBkYXRlLmFkZENoaWxkRW50cnkoIGVudHJ5U2Vzc2lvbiApOw0KLQ0KLQkJdW1TZXNzaW9uID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uKCBlbnRyeVNlc3Npb24gKTsNCi0NCi0JCXVtU2Vzc2lvbi5idWlsZFRyZWVGcm9tTG9nKCBlbnRyeVNlc3Npb24gKTsNCi0NCi0JCV9hbFVwZGF0ZVNlc3Npb25zLmFkZCggdW1TZXNzaW9uICk7DQotCX0NCi0JDQotCXJldHVybiB1bVNlc3Npb247DQotfQ0KLS8qKg0KLSAqIFJ1bnMgYWxsIHNlc3Npb25zDQotICovDQotcHVibGljIGJvb2xlYW4gZXhlY3V0ZVBlbmRpbmdTZXNzaW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQkvLyBSdW4gZWFjaCBvZiB0aGUgZmFpbGVkIHNlc3Npb25zDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JYm9vbGVhbiBiU3VjY2VzcyA9IHRydWU7DQotDQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24gPSBudWxsOw0KLQ0KLQlJdGVyYXRvciBpdGVyID0gX2FsVXBkYXRlU2Vzc2lvbnMuaXRlcmF0b3IoKTsNCi0NCi0Jd2hpbGUgKGl0ZXIuaGFzTmV4dCgpID09IHRydWUpIHsNCi0NCi0JCXNlc3Npb24gPSAoVU1TZXNzaW9uTWFuYWdlclNlc3Npb24pIGl0ZXIubmV4dCgpOw0KLQ0KLQkJaWYgKHNlc3Npb24uZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1BFTkRJTkcpID09IHRydWUpIHsNCi0JCQlpZiAoc2Vzc2lvbi5leGVjdXRlKHByb2dyZXNzTW9uaXRvcikgPT0gZmFsc2UpIHsNCi0JCQkJYlN1Y2Nlc3MgPSBmYWxzZTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JcmV0dXJuIGJTdWNjZXNzOw0KLX0NCi0vKioNCi0gKiBSdW5zIG9uZSBzZXNzaW9uDQotICovDQotcHVibGljIGJvb2xlYW4gZXhlY3V0ZVNlc3Npb24oVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JaWYgKHNlc3Npb24gPT0gbnVsbCkNCi0JCXJldHVybiBmYWxzZTsNCi0NCi0JLy8gUnVuIHRoZSBzZXNzaW9uDQotCS8vLS0tLS0tLS0tLS0tLS0tLQ0KLQlyZXR1cm4gc2Vzc2lvbi5leGVjdXRlKHByb2dyZXNzTW9uaXRvcik7DQotfQ0KLS8qKg0KLSAqIFJ1bnMgb25lIHNlc3Npb24NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlU2Vzc2lvblVuZG8oVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JaWYgKHNlc3Npb24gPT0gbnVsbCkNCi0JCXJldHVybiBmYWxzZTsNCi0NCi0JLy8gUnVuIHRoZSBzZXNzaW9uDQotCS8vLS0tLS0tLS0tLS0tLS0tLQ0KLQlyZXR1cm4gc2Vzc2lvbi5leGVjdXRlVW5kbyhwcm9ncmVzc01vbml0b3IpOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNlc3Npb25zIHRoYXQgYXJlIGNvbXBsZXRlLg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVU1TZXNzaW9uTWFuYWdlclNlc3Npb25bXQ0KLSAqLw0KLXByaXZhdGUgVU1TZXNzaW9uTWFuYWdlclNlc3Npb25bXSBnZXRVcGRhdGVTZXNzaW9uc0NvbXBsZXRlZCgpIHsNCi0NCi0JLy8gT2J0YWluIHRoZSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHNlc3Npb25zDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsNCi0NCi0JQXJyYXlMaXN0IGFsU2Vzc2lvbnNDb21wbGV0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7DQotDQotCUl0ZXJhdG9yIGl0ZXIgPSBfYWxVcGRhdGVTZXNzaW9ucy5pdGVyYXRvcigpOw0KLQ0KLQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgPT0gdHJ1ZSkgew0KLQ0KLQkJc2Vzc2lvbiA9IChVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbikgaXRlci5uZXh0KCk7DQotDQotCQlpZiAoc2Vzc2lvbi5pc0NvbXBsZXRlKCkgPT0gdHJ1ZSkgew0KLQkJCWFsU2Vzc2lvbnNDb21wbGV0ZWQuYWRkKHNlc3Npb24pOw0KLQkJfQ0KLQl9DQotDQotCU9iamVjdFtdIG9iakFycmF5ID0gYWxTZXNzaW9uc0NvbXBsZXRlZC50b0FycmF5KCk7DQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uW10gc2Vzc2lvbnMgPSBuZXcgVU1TZXNzaW9uTWFuYWdlclNlc3Npb25bb2JqQXJyYXkubGVuZ3RoXTsNCi0JU3lzdGVtLmFycmF5Y29weShvYmpBcnJheSwgMCwgc2Vzc2lvbnMsIDAsIG9iakFycmF5Lmxlbmd0aCk7DQotDQotCXJldHVybiBzZXNzaW9uczsNCi19DQotLyoqDQotICogUmVtb3ZlcyBhbiBleGlzdGluZyB1cGRhdGUgc2Vzc2lvbg0KLSAqDQotICovDQotcHJpdmF0ZSBib29sZWFuIHJlbW92ZVVwZGF0ZVNlc3Npb24oVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbikgew0KLQ0KLQlpZiAoc2Vzc2lvbiAhPSBudWxsICYmIF9sb2dVcGRhdGUgIT0gbnVsbCkgew0KLQ0KLQkgICAgLy8gRW5zdXJlIHNlc3Npb24gZXhpc3RzDQotCSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmIChfYWxVcGRhdGVTZXNzaW9ucy5jb250YWlucyhzZXNzaW9uKSA9PSBmYWxzZSkgew0KLQkJCXJldHVybiBmYWxzZTsNCi0JCX0NCi0NCi0JCS8vIFJlbW92ZSB0aGUgbG9nIGVudHJ5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHNlc3Npb24uZ2V0TG9nRW50cnkoKSAhPSBudWxsKSB7DQotDQotCQkJaWYgKF9sb2dVcGRhdGUucmVtb3ZlQ2hpbGRFbnRyeShzZXNzaW9uLmdldExvZ0VudHJ5KCkpID09IGZhbHNlKSB7DQotCQkJCXJldHVybiBmYWxzZTsNCi0JCQl9DQotDQotCQkJLy8gUmVtb3ZlIHRoZSBzZXNzaW9uDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJX2FsVXBkYXRlU2Vzc2lvbnMucmVtb3ZlKHNlc3Npb24pOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiBTYXZlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdXBkYXRlIGxvZy4NCi0gKi8NCi1wdWJsaWMgdm9pZCBzYXZlVXBkYXRlTG9nKCkgdGhyb3dzIExvZ1N0b3JlRXhjZXB0aW9uIHsNCi0JX2xvZ1VwZGF0ZS5zYXZlKCBfdXJsVXBkYXRlICk7DQotfQ0KLS8qKg0KLSAqIE1vdmVzIGFsbCBjb21wbGV0ZWQgc2Vzc2lvbnMgaW4gdGhlIHVwZGF0ZSBsb2cgdG8gdGhlIGhpc3RvcnkgbG9nLg0KLSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBhcnNlIHRoZSBoaXN0b3J5IGZpbGUuICBTZXNzaW9ucyBhcmUgd3JpdHRlbiB0bw0KLSAqIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgbG9nIGFuZCByZW1vdmVkIGZyb20gdGhlIHVwZGF0ZSBsb2cgdHJlZSwgYW5kIHVwZGF0ZQ0KLSAqIHNlc3Npb24gdHJlZS4gIFRoZSB1cGRhdGUgbG9nIGlzIHNhdmVkLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHVwZGF0ZUFuZFNhdmVMb2dzKCkgdGhyb3dzIExvZ1N0b3JlRXhjZXB0aW9uIHsNCi0NCi0JLy8gQ2hlY2sgZm9yIGhpc3RvcnkgbG9nIFVSTA0KLQkvLyBJZiBub25lLCBzYXZlIHRoZSB1cGRhdGUgbG9nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKF91cmxIaXN0b3J5ID09IG51bGwpIHsNCi0JCXNhdmVVcGRhdGVMb2coKTsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQkvLyBPYnRhaW4gYSBsaXN0IG9mIGNvbXBsZXRlZCB1cGRhdGUgc2Vzc2lvbnMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uW10gc2Vzc2lvbnNDb21wbGV0ZWQgPSBnZXRVcGRhdGVTZXNzaW9uc0NvbXBsZXRlZCgpOw0KLQ0KLQkvLyBJZiB0aGVyZSBhcmUgbm9uZSwgc2F2ZSB0aGUgdXBkYXRlIGxvZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc2Vzc2lvbnNDb21wbGV0ZWQubGVuZ3RoIDw9IDApIHsNCi0JCXNhdmVVcGRhdGVMb2coKTsNCi0JCXJldHVybjsNCi0JfQ0KLQ0KLQkvLyBBdHRlbXB0IHRvIG9wZW4gdGhlIG91dHB1dCBsb2cNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVN0cmluZyBzdHJGaWxlc3BlYyA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcoX3VybEhpc3RvcnkpOw0KLQkNCi0NCi0JRmlsZSBmaWxlID0gbmV3IEZpbGUoc3RyRmlsZXNwZWMpOw0KLQ0KLQlib29sZWFuIGJFeGlzdHMgPSBmaWxlLmV4aXN0cygpOw0KLQ0KLQlpZiAoYkV4aXN0cyA9PSBmYWxzZSkgew0KLQkJdHJ5IHsNCi0JCQliRXhpc3RzID0gZmlsZS5jcmVhdGVOZXdGaWxlKCk7DQotCQl9DQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi0NCi0JLy8gQ3JlYXRlIGEgZmlsZSB3cml0ZXIgYW5kIHNlZWsgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVJhbmRvbUFjY2Vzc0ZpbGUgZmlsZVdyaXRlciA9IG51bGw7DQotDQotCWlmIChiRXhpc3RzID09IHRydWUpIHsNCi0JCXRyeSB7DQotCQkJZmlsZVdyaXRlciA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZpbGUsICJydyIpOw0KLQkJCWxvbmcgbExlbmd0aCA9IGZpbGVXcml0ZXIubGVuZ3RoKCk7DQotCQkJZmlsZVdyaXRlci5zZWVrKGxMZW5ndGgpOw0KLQkJfQ0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJZmlsZVdyaXRlciA9IG51bGw7DQotCQl9DQotCX0NCi0NCi0JLy8gV3JpdGUgb3V0IGVhY2ggc2Vzc2lvbiBsb2cgdG8gdGhlIGhpc3RvcnkgbG9nDQotCS8vIFJlbW92ZSB0aGUgc2Vzc2lvbiBsb2cgZnJvbSB0aGUgdXBkYXRlIGxvZw0KLQkvLyBTYXZlIGJvdGggbG9ncw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JU3RyaW5nQnVmZmVyIHN0cmIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7DQotDQotCWlmIChmaWxlV3JpdGVyICE9IG51bGwpIHsNCi0NCi0JCUlMb2dFbnRyeSBsb2dFbnRyeSA9IG51bGw7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlc3Npb25zQ29tcGxldGVkLmxlbmd0aDsgKytpKSB7DQotDQotCQkJbG9nRW50cnkgPSBzZXNzaW9uc0NvbXBsZXRlZFtpXS5nZXRMb2dFbnRyeSgpOw0KLQ0KLQkJCWlmIChsb2dFbnRyeSAhPSBudWxsKSB7DQotCQkJCWxvZ0VudHJ5LnByaW50UGVyc2lzdGVudEVudHJ5U3RyaW5nKHN0cmIsIDApOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvLyBXcml0ZSB0aGUgYnVmZmVyIHRvIHRoZSBlbmQgb2YgdGhlIGhpc3RvcnkgZmlsZQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyYi5sZW5ndGgoKSA+IDApIHsNCi0JCXRyeSB7DQotCQkJZmlsZVdyaXRlci53cml0ZShzdHJiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7DQotCQkJZmlsZVdyaXRlci5jbG9zZSgpOw0KLQkJfQ0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotDQotCQl9DQotCX0NCi0NCi0JLy8gUmVtb3ZlIHRoZSB1cGRhdGUgc2Vzc2lvbnMgZnJvbSB0aGUgdXBkYXRlIGxvZw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSAwOyBpIDwgc2Vzc2lvbnNDb21wbGV0ZWQubGVuZ3RoOyArK2kpIHsNCi0JCXJlbW92ZVVwZGF0ZVNlc3Npb24oc2Vzc2lvbnNDb21wbGV0ZWRbaV0pOw0KLQl9DQotDQotCS8vIFNhdmUgdGhlIHVwZGF0ZSBsb2cgdG8ga2VlcCBsb2dzIGluIHN5bmMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlzYXZlVXBkYXRlTG9nKCk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyRW50cnkuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDYxNmM4Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLio7DQotLyoqDQotICogQWJzdHJhY3QgY2xhc3MgZm9yIHVwZGF0ZSBtYW5hZ2VyIG9iamVjdHMgdGhhdCBoYXZlIGFuIElMb2dFbnRyeQ0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBVTVNlc3Npb25NYW5hZ2VyRW50cnkgew0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5IF9sb2dFbnRyeSA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlTdGF0dXMgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5QXR0ZW1wdHMgPSBudWxsOw0KLQlwcm90ZWN0ZWQgT2JqZWN0ICAgICAgICAgICAgX29iakRhdGEgPSBudWxsOw0KLS8qKg0KLSAqIFVwZGF0ZU1hbmFnZXJFbnRyeSBjb25zdHJ1Y3RvciBjb21tZW50Lg0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyRW50cnkoIElMb2dFbnRyeSBsb2dFbnRyeSApIHsNCi0JX2xvZ0VudHJ5ID0gbG9nRW50cnk7DQotDQotCS8vIFN0YXR1cw0KLQkvLy0tLS0tLS0NCi0JX3Byb3BlcnR5U3RhdHVzID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1NUQVRVUyk7DQotDQotCWlmIChfcHJvcGVydHlTdGF0dXMgPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5U3RhdHVzID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1NUQVRVUywgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfUEVORElORyApOw0KLQkJbG9nRW50cnkuYWRkUHJvcGVydHkoIF9wcm9wZXJ0eVN0YXR1cyApOw0KLQl9DQotDQotCS8vIEF0dGVtcHRzDQotCS8vLS0tLS0tLS0tDQotCV9wcm9wZXJ0eUF0dGVtcHRzID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FUVEVNUFRTKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eUF0dGVtcHRzID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUF0dGVtcHRzID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FUVEVNUFRTLCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR18wICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5QXR0ZW1wdHMgKTsNCi0JfQ0KLQ0KLX0NCi0vKioNCi0gKiBAcGFyYW0gbG9nRW50cnkgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSUxvZ0VudHJ5DQotICovDQotcHVibGljIHZvaWQgYnVpbGRUcmVlRnJvbUxvZyhJTG9nRW50cnkgbG9nRW50cnkpIHsNCi0JDQotCS8vIEF0dGVtcHRzDQotCS8vLS0tLS0tLS0tDQotCUlMb2dFbnRyeVByb3BlcnR5IHByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FUVEVNUFRTKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUF0dGVtcHRzID0gcHJvcGVydHk7DQotCX0NCi0JDQotCS8vIFN0YXR1cw0KLQkvLy0tLS0tLS0NCi0JcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfU1RBVFVTKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVN0YXR1cyA9IHByb3BlcnR5Ow0KLQl9DQotfQ0KLS8qKg0KLSAqIA0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqIEBwYXJhbSBzdHJQcmVmaXggamF2YS5sYW5nLlN0cmluZw0KLSAqIEBwYXJhbSBleCBqYXZhLmxhbmcuRXhjZXB0aW9uDQotICovDQotcHVibGljIFN0cmluZyBjcmVhdGVNZXNzYWdlU3RyaW5nKFN0cmluZyBzdHJQcmVmaXgsIEV4Y2VwdGlvbiBleCkgew0KLQ0KLQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyUHJlZml4KTsNCi0NCi0JaWYgKGV4ICE9IG51bGwpIHsNCi0JCWlmIChleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgIT0gbnVsbCkgew0KLQkJCXN0cmIuYXBwZW5kKCI6ICIgKyBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOw0KLQkJfQ0KLQ0KLQkJZWxzZSBpZiAoZXgudG9TdHJpbmcoKSAhPSBudWxsICYmIGV4LnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7DQotCQkJc3RyYi5hcHBlbmQoIjogIiArIGV4LnRvU3RyaW5nKCkpOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiBzdHJiLnRvU3RyaW5nKCk7DQotfQ0KLS8qKg0KLSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgb3IgZmFpbGVkIHVwZGF0ZXMuDQotICovDQotcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZSggSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKTsNCi0vKioNCi0gKiBFeGVjdXRlIGFueSBwZW5kaW5nIG9yIGZhaWxlZCB1cGRhdGVzLg0KLSAqLw0KLXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGV4ZWN1dGVVbmRvKCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApOw0KLS8qKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdA0KLSAqLw0KLXB1YmxpYyBqYXZhLmxhbmcuT2JqZWN0IGdldERhdGEoKSB7DQotCXJldHVybiBfb2JqRGF0YTsNCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgbG9nIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlc3Npb24gb2JqZWN0Lg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSUxvZ0VudHJ5DQotICovDQotcHVibGljIElMb2dFbnRyeSBnZXRMb2dFbnRyeSgpIHsNCi0JcmV0dXJuIF9sb2dFbnRyeTsNCi19DQotLyoqDQotICoNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldFN0YXR1cygpIHsNCi0NCi0JcmV0dXJuIF9wcm9wZXJ0eVN0YXR1cy5nZXRWYWx1ZSgpOw0KLX0NCi0vKioNCi0gKiBAcGFyYW0gc3RyYiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyDQotICogQHBhcmFtIGlJbmRlbnRhdGlvbiBpbnQNCi0gKi8NCi1wdWJsaWMgYWJzdHJhY3Qgdm9pZCBnZXRTdGF0dXNTdHJpbmcoU3RyaW5nQnVmZmVyIHN0cmIsIGludCBpSW5kZW50YXRpb24pOw0KLS8qKg0KLSAqIEluY3JlbWVudHMgdGhlIHZhbHVlIG9mIHRoZSBudW1iZXIgb2YgYXR0ZW1wdHMNCi0gKi8NCi1wdWJsaWMgdm9pZCBpbmNyZW1lbnRBdHRlbXB0Q291bnQoKSB7DQotDQotCWludCBpQXR0ZW1wdHMgPSAwOw0KLQ0KLQl0cnkgew0KLQkJaUF0dGVtcHRzID0gbmV3IEludGVnZXIoX3Byb3BlcnR5QXR0ZW1wdHMuZ2V0VmFsdWUoKSkuaW50VmFsdWUoKTsNCi0JfQ0KLQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotCX0NCi0NCi0JX3Byb3BlcnR5QXR0ZW1wdHMuc2V0VmFsdWUoIEludGVnZXIudG9TdHJpbmcoICsraUF0dGVtcHRzICkgKTsNCi19DQotLyoqDQotICogQHBhcmFtIHN0cmIgamF2YS5sYW5nLlN0cmluZ0J1ZmZlcg0KLSAqIEBwYXJhbSBpSW5kZW50YXRpb24gaW50DQotICovDQotcHVibGljIHZvaWQgaW5kZW50KFN0cmluZ0J1ZmZlciBzdHJiLCBpbnQgaUluZGVudGF0aW9uKSB7DQotDQotCS8vIExpbmUgZmVlZA0KLQkvLy0tLS0tLS0tLS0NCi0Jc3RyYi5hcHBlbmQoICJcbiIgKTsNCi0NCi0JLy8gSW5kZW50YXRpb24gc3BhY2VzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IoIGludCBpPTA7IGk8aUluZGVudGF0aW9uOyArK2kgKXsNCi0JCXN0cmIuYXBwZW5kKCAiICIgKTsNCi0JfQ0KLX0NCi0vKioNCi0gKi8NCi1wdWJsaWMgdm9pZCByZXNldEF0dGVtcHRDb3VudCgpIHsNCi0JX3Byb3BlcnR5QXR0ZW1wdHMuc2V0VmFsdWUoIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HXzAgKTsNCi19DQotLyoqDQotICogU3RvcmVzIElNYW5pZmVzdERlc2NyaXB0b3INCi0gKiBAcGFyYW0gbmV3RGF0YSBqYXZhLmxhbmcuT2JqZWN0DQotICovDQotcHVibGljIHZvaWQgc2V0RGF0YShqYXZhLmxhbmcuT2JqZWN0IG9iakRhdGEpIHsNCi0JX29iakRhdGEgPSBvYmpEYXRhOw0KLX0NCi0vKioNCi0gKiBFdmVyeSBlbnRyeSBoYXMgYSBzdGF0dXMgcHJvcGVydHkuDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICogQHBhcmFtIHN0YXR1cyBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIHZvaWQgc2V0U3RhdHVzKFN0cmluZyBzdHJTdGF0dXMpIHsNCi0NCi0JX3Byb3BlcnR5U3RhdHVzLnNldFZhbHVlKCBzdHJTdGF0dXMgIT0gbnVsbCA/IHN0clN0YXR1cyA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyTWVzc2FnZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E5YzliOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS4qOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBmYWlsdXJlIG1lc3NhZ2UgYW5kIGNvbnNpc3RzIG9mIGEgdGltZXN0YW1wIGFuZCB0ZXh0Lg0KLSAqDQotICovDQotDQotcHVibGljIGNsYXNzIFVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlIHsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeSBfbG9nRW50cnkgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5VGltZXN0YW1wID0gbnVsbDsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eVRleHQgICAgICA9IG51bGw7DQotLyoqDQotICoNCi0gKiBAcGFyYW0gbG9nRW50cnkgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuSUxvZ0VudHJ5DQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlKElMb2dFbnRyeSBsb2dFbnRyeSkgew0KLQ0KLQlfbG9nRW50cnkgPSBsb2dFbnRyeTsNCi0JDQotCS8vIFRleHQNCi0JLy8tLS0tLQ0KLQlfcHJvcGVydHlUZXh0ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RFWFQpOw0KLQ0KLQlpZiAoX3Byb3BlcnR5VGV4dCA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlUZXh0ID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RFWFQsIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5VGV4dCApOw0KLQl9DQotDQotCS8vIFRpbWVzdGFtcA0KLQkvLy0tLS0tLS0tLS0NCi0JX3Byb3BlcnR5VGltZXN0YW1wID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RJTUVTVEFNUCk7DQotDQotCWlmIChfcHJvcGVydHlUaW1lc3RhbXAgPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5VGltZXN0YW1wID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RJTUVTVEFNUCwgbmV3IERhdGUoKS50b1N0cmluZygpICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5VGltZXN0YW1wICk7DQotCX0NCi19DQotLyoqDQotICogQHBhcmFtIGxvZ0VudHJ5IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkxvZ0VudHJ5DQotICovDQotcHVibGljIHZvaWQgYnVpbGRUcmVlRnJvbUxvZyhJTG9nRW50cnkgbG9nRW50cnkpIHsNCi0JCQ0KLQkvLyBUZXh0DQotCS8vLS0tLS0NCi0JSUxvZ0VudHJ5UHJvcGVydHkgcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVEVYVCk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlUZXh0ID0gcHJvcGVydHk7DQotCX0NCi0NCi0JLy8gU291cmNlDQotCS8vLS0tLS0tLQ0KLQlwcm9wZXJ0eSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19USU1FU1RBTVApOw0KLQ0KLQlpZiAocHJvcGVydHkgIT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5VGltZXN0YW1wID0gcHJvcGVydHk7DQotCX0NCi19DQotLyoqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRUZXh0KCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eVRleHQuZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRUZXh0KCBTdHJpbmcgc3RySUQgKSB7DQotCV9wcm9wZXJ0eVRleHQuc2V0VmFsdWUoIHN0cklEICE9IG51bGwgPyBzdHJJRCA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWFkZDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2Lmh0dHAuY2xpZW50LlJlc3BvbnNlOw0KLWltcG9ydCBqYXZhLnV0aWwuamFyLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuTGF1bmNoSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgamF2YS5pby4qOw0KLWltcG9ydCBqYXZhLm5ldC4qOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gb3BlcmF0aW9uIHN1Y2ggYXMgImNvcHkiIG9yICJ1bnppcCIuDQotICogQXR0cmlidXRlcyBhcmUgaWQsIHN0YXR1cyAocGVuZGluZy9jb21wbGV0ZSksIGFjdGlvbiwNCi0gKiBzb3VyY2UsIHRhcmdldC4gIENoaWxkcmVuIGFyZSBtZXNzYWdlcy4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiBleHRlbmRzIFVNU2Vzc2lvbk1hbmFnZXJFbnRyeSB7DQotCQkNCi0JcHJvdGVjdGVkIEFycmF5TGlzdCAgICAgICAgIF9hbE1lc3NhZ2VzICAgICA9IG5ldyBBcnJheUxpc3QoKTsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eUFjdGlvbiA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlJRCAgICAgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5U291cmNlID0gbnVsbDsNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eVRhcmdldCA9IG51bGw7DQotLyoqDQotICogVXBkYXRlTWFuYWdlck9wZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50Lg0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uKCBJTG9nRW50cnkgbG9nRW50cnkgKSB7DQotCXN1cGVyKCBsb2dFbnRyeSApOw0KLQ0KLQkvLyBBY3Rpb24NCi0JLy8tLS0tLS0tDQotCV9wcm9wZXJ0eUFjdGlvbiA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19BQ1RJT04pOw0KLQ0KLQlpZiAoX3Byb3BlcnR5QWN0aW9uID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eUFjdGlvbiA9IG5ldyBMb2dFbnRyeVByb3BlcnR5KGxvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19BQ1RJT04sIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5QWN0aW9uICk7DQotCX0NCi0NCi0JLy8gSWQNCi0JLy8tLS0NCi0JX3Byb3BlcnR5SUQgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfSUQpOw0KLQ0KLQlpZiAoX3Byb3BlcnR5SUQgPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5SUQgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfSUQsIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5SUQgKTsNCi0JfQ0KLQ0KLQkvLyBTb3VyY2UNCi0JLy8tLS0tLS0tDQotCV9wcm9wZXJ0eVNvdXJjZSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19TT1VSQ0UpOw0KLQ0KLQlpZiAoX3Byb3BlcnR5U291cmNlID09IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVNvdXJjZSA9IG5ldyBMb2dFbnRyeVByb3BlcnR5KGxvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19TT1VSQ0UsIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5U291cmNlICk7DQotCX0NCi0NCi0JLy8gVGFyZ2V0DQotCS8vLS0tLS0tLQ0KLQlfcHJvcGVydHlUYXJnZXQgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVEFSR0VUKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eVRhcmdldCA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlUYXJnZXQgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVEFSR0VULCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLQkJbG9nRW50cnkuYWRkUHJvcGVydHkoIF9wcm9wZXJ0eVRhcmdldCk7DQotCX0NCi19DQotLyoqDQotICogQHBhcmFtIGxvZ0VudHJ5IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLkxvZ0VudHJ5DQotICovDQotcHVibGljIHZvaWQgYnVpbGRUcmVlRnJvbUxvZyhJTG9nRW50cnkgbG9nRW50cnkpIHsNCi0JDQotCXN1cGVyLmJ1aWxkVHJlZUZyb21Mb2coIGxvZ0VudHJ5ICk7DQotCQ0KLQkvLyBBY3Rpb24NCi0JLy8tLS0tLS0tDQotCUlMb2dFbnRyeVByb3BlcnR5IHByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FDVElPTik7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlBY3Rpb24gPSBwcm9wZXJ0eTsNCi0JfQ0KLQkNCi0NCi0JLy8gSWQNCi0JLy8tLS0NCi0JcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfSUQpOw0KLQ0KLQlpZiAocHJvcGVydHkgIT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5SUQgPSBwcm9wZXJ0eTsNCi0JfQ0KLQ0KLQkvLyBTb3VyY2UNCi0JLy8tLS0tLS0tDQotCXByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1NPVVJDRSk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlTb3VyY2UgPSBwcm9wZXJ0eTsNCi0JfQ0KLQ0KLQkvLyBUYXJnZXQNCi0JLy8tLS0tLS0tDQotCXByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RBUkdFVCk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlUYXJnZXQgPSBwcm9wZXJ0eTsNCi0JfQ0KLQ0KLQ0KLQlJTG9nRW50cnlbXSBlbnRyaWVzID0gbG9nRW50cnkuZ2V0Q2hpbGRFbnRyaWVzKCk7DQotDQotCS8vIE1lc3NhZ2VzDQotCS8vLS0tLS0tLS0tDQotCWludCBpSW5kZXggPSAwOw0KLQlVTVNlc3Npb25NYW5hZ2VyTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsNCi0JDQotCWZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KLQkJaWYgKGVudHJpZXNbaV0gIT0gbnVsbCAmJiBlbnRyaWVzW2ldLmdldE5hbWUoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfTUVTU0FHRSkgPT0gdHJ1ZSkgew0KLQkJCW1lc3NhZ2UgPSBuZXcgVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UoIGVudHJpZXNbaV0gKTsJCQkNCi0JICAgICAgICBfYWxNZXNzYWdlcy5hZGQoIG1lc3NhZ2UgKTsNCi0NCi0JICAgICAgICBtZXNzYWdlLmJ1aWxkVHJlZUZyb21Mb2coIGVudHJpZXNbaV0gKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBDb3BpZXMgYWxsIGRhdGEgZnJvbSBpbnB1dCBzdHJlYW0gdG8gb3V0cHV0IHN0cmVhbS4NCi0gKiBAcGFyYW0gaW5wdXRTdHJlYW0gamF2YS5pby5JbnB1dFN0cmVhbQ0KLSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0gamF2YS5pby5PdXRwdXRTdHJlYW0NCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGNvcHlTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtSW5wdXQsIE91dHB1dFN0cmVhbSBzdHJlYW1PdXRwdXQsIGxvbmcgbENvbnRlbnRMZW5ndGgsIFN0cmluZyBzdHJUYXNrTmFtZSwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IsIGJvb2xlYW4gYlN1YnRhc2spIHsNCi0NCi0JU3RyaW5nIHN0ckVycm9yTWVzc2FnZSA9IG51bGw7DQotDQotCS8vIEFsbG9jYXRlIGJ1ZmZlcg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0gDQotCWJ5dGVbXSBieXRlQXJyYXkgPSBudWxsOw0KLQ0KLQlpZiAoc3RyZWFtSW5wdXQgIT0gbnVsbCAmJiBzdHJlYW1PdXRwdXQgIT0gbnVsbCkgew0KLQkJYnl0ZUFycmF5ID0gbmV3IGJ5dGVbNjQwMDBdOw0KLQl9DQotDQotCWlmIChieXRlQXJyYXkgIT0gbnVsbCkgew0KLQ0KLQkJLy8gQ29weQ0KLQkJLy8tLS0tLQ0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSB7DQotCQkJaWYgKGJTdWJ0YXNrID09IGZhbHNlKSB7DQotCQkJCWlmIChsQ29udGVudExlbmd0aCA+IDAgJiYgbENvbnRlbnRMZW5ndGggPCBJbnRlZ2VyLk1BWF9WQUxVRSkNCi0JCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0NvcHkiKSArICI6ICIgK3N0clRhc2tOYW1lLCAoaW50KSBsQ29udGVudExlbmd0aCk7DQotCQkJCWVsc2UNCi0JCQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0NvcHkiKSArICI6ICIgICsgc3RyVGFza05hbWUsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfQ29weSIpICsgIjogIiAgKyBzdHJUYXNrTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJaW50IGlCeXRlc1JlY2VpdmVkID0gMDsNCi0NCi0JCWRvIHsNCi0JCQkvLyBSZWFkDQotCQkJLy8tLS0tLQ0KLQkJCXRyeSB7DQotCQkJCWlCeXRlc1JlY2VpdmVkID0gc3RyZWFtSW5wdXQucmVhZChieXRlQXJyYXkpOw0KLQkJCX0NCi0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7DQotCQkJCWlCeXRlc1JlY2VpdmVkID0gMDsNCi0JCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0Vycm9yX3JlYWRpbmdfZnJvbV9pbnB1dF9zdHJlYW0iKSArICI6ICIgKyBleC5nZXRNZXNzYWdlKCk7DQotCQkJfQ0KLQ0KLQkJCS8vIFdyaXRlDQotCQkJLy8tLS0tLS0NCi0JCQlpZiAoaUJ5dGVzUmVjZWl2ZWQgPiAwKSB7DQotCQkJCXRyeSB7DQotCQkJCQlzdHJlYW1PdXRwdXQud3JpdGUoYnl0ZUFycmF5LCAwLCBpQnl0ZXNSZWNlaXZlZCk7DQotDQotCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgYlN1YnRhc2sgPT0gZmFsc2UpDQotCQkJCQkJcHJvZ3Jlc3NNb25pdG9yLndvcmtlZChpQnl0ZXNSZWNlaXZlZCk7DQotCQkJCX0NCi0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJCQlpQnl0ZXNSZWNlaXZlZCA9IDA7DQotCQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXJyb3Jfd3JpdGluZ190b19vdXRwdXRfc3RyZWFtIikgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQkJd2hpbGUgKGlCeXRlc1JlY2VpdmVkID4gMCk7DQotDQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgYlN1YnRhc2sgPT0gZmFsc2UpIHsNCi0JCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiBzdHJFcnJvck1lc3NhZ2U7DQotfQ0KLS8qKg0KLSAqDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VTVNlc3Npb25NYW5hZ2VyTWVzc2FnZQ0KLSAqIEBwYXJhbSBhY3Rpb25UeXBlIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UgY3JlYXRlTWVzc2FnZSgpIHsNCi0NCi0JLy8gQ3JlYXRlIGEgbmV3IGxvZyBlbnRyeQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlMb2dFbnRyeSBsb2dFbnRyeUNoaWxkID0gbmV3IExvZ0VudHJ5KCBfbG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX01FU1NBR0UgKTsNCi0JX2xvZ0VudHJ5LmFkZENoaWxkRW50cnkoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0NCi0JLy8gQ3JlYXRlIHRoZSBvcGVyYXRpb24gb2JqZWN0DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVTVNlc3Npb25NYW5hZ2VyTWVzc2FnZSBtZXNzYWdlID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlKCBsb2dFbnRyeUNoaWxkICk7DQotCQ0KLQltZXNzYWdlLmJ1aWxkVHJlZUZyb21Mb2coIGxvZ0VudHJ5Q2hpbGQgKTsNCi0JDQotCV9hbE1lc3NhZ2VzLmFkZCggbWVzc2FnZSApOw0KLQkNCi0JcmV0dXJuIG1lc3NhZ2U7DQotfQ0KLS8qKg0KLSAqDQotICogDQotICovDQotcHVibGljIGJvb2xlYW4gZG9Db3B5KElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCVN0cmluZyBzdHJFcnJvck1lc3NhZ2UgPSBudWxsOw0KLQ0KLQkvLyBJbnB1dCBVUkwNCi0JLy8tLS0tLS0tLS0tDQotCVVSTCB1cmxJbnB1dCA9IG51bGw7DQotDQotCXRyeSB7DQotCQl1cmxJbnB1dCA9IG5ldyBVUkwoZ2V0U291cmNlKCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1NvdXJjZV9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQlVUkwgdXJsT3V0cHV0ID0gbnVsbDsNCi0NCi0JLy8gT3V0cHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0tDQotCXRyeSB7DQotCQl1cmxPdXRwdXQgPSBuZXcgVVJMKGdldFRhcmdldCgpKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19UYXJnZXRfVVJMX2lzX21hbGZvcm1lZCIpLCBleCk7DQotCX0NCi0NCi0JLy8gSW5wdXQNCi0JLy8tLS0tLS0tDQotCUlucHV0U3RyZWFtIHN0cmVhbUlucHV0ID0gbnVsbDsNCi0NCi0JbG9uZyBsQ29udGVudExlbmd0aCA9IDA7DQotDQotCWlmICh1cmxJbnB1dCAhPSBudWxsICYmIHVybE91dHB1dCAhPSBudWxsKSB7DQotDQotCQkvLyBJbnB1dCBzdHJlYW0NCi0JCS8vLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQlVUkxIYW5kbGVyLlJlc3BvbnNlIHJlc3BvbnNlID0gKFVSTEhhbmRsZXIuUmVzcG9uc2UpVVJMSGFuZGxlci5vcGVuKHVybElucHV0KTsNCi0JCQlsQ29udGVudExlbmd0aCA9IHJlc3BvbnNlLmdldENvbnRlbnRMZW5ndGgoKTsNCi0JCQlpZiggcmVzcG9uc2UuZ2V0UmVzcG9uc2VDb2RlKCkgPT0gSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9PSyApDQotCQkJCXN0cmVhbUlucHV0ID0gcmVzcG9uc2UuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCX0NCi0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19vYnRhaW5fc291cmNlX2lucHV0X3N0cmVhbSIpLCBleCk7DQotCQl9DQotDQotCX0NCi0NCi0JLy8gT3V0cHV0DQotCS8vLS0tLS0tLQ0KLQlPdXRwdXRTdHJlYW0gc3RyZWFtT3V0cHV0ID0gbnVsbDsNCi0NCi0JaWYgKHN0cmVhbUlucHV0ICE9IG51bGwpIHsNCi0NCi0JCS8vIE91dHB1dCBjb25uZWN0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uT3V0cHV0ID0gbnVsbDsNCi0JCQ0KLQkJdHJ5IHsNCi0JCQl1cmxDb25uZWN0aW9uT3V0cHV0ID0gdXJsT3V0cHV0Lm9wZW5Db25uZWN0aW9uKCk7DQotCQkJdXJsQ29ubmVjdGlvbk91dHB1dC5zZXREb091dHB1dCh0cnVlKTsNCi0JCX0NCi0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fY29ubmVjdCIpLCBleCApOw0KLQkJfQ0KLQ0KLQkJLy8gT3V0cHV0IHN0cmVhbQ0KLQkJLy8tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHVybENvbm5lY3Rpb25PdXRwdXQgIT0gbnVsbCkgew0KLQkJCXRyeSB7DQotCQkJCXN0cmVhbU91dHB1dCA9IHVybENvbm5lY3Rpb25PdXRwdXQuZ2V0T3V0cHV0U3RyZWFtKCk7DQotCQkJfQ0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgew0KLQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKCBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5hYmxlX3RvX29idGFpbl90YXJnZXRfb3V0cHV0X3N0cmVhbSIpLCBleCApOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIEF0dGVtcHQgdG8gY3JlYXRlIGEgZmlsZSBvdXRwdXQgc3RyZWFtDQotCQkvLyBUaGlzIGlzIHVzZWQgd2hlbiBwcm90b2NvbCBpcyBmaWxlOiBvciB2YWxvYWRlcjoNCi0JCS8vIHRodXMgb3VyIGxvY2FsIHdyaXRlcyBhcmUgYWxsIGZpbGUgSS9PIGN1cnJlbnRseQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoc3RyZWFtT3V0cHV0ID09IG51bGwpIHsNCi0JICAgICAgICB0cnkNCi0JICAgICAgICB7DQotCQkgCQlzdHJlYW1PdXRwdXQgPSBnZXRGaWxlT3V0cHV0U3RyZWFtKHVybE91dHB1dCk7DQotCSAgICAgICAgfQ0KLQkgICAgICAgIGNhdGNoKCBJT0V4Y2VwdGlvbiBleCl7DQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fY3JlYXRlX2ZpbGUiKSwgZXggKTsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JaWYoIHN0cmVhbUlucHV0ICE9IG51bGwgJiYgc3RyZWFtT3V0cHV0ICE9IG51bGwgKQ0KLQl7DQotCSAgICBzdHJFcnJvck1lc3NhZ2UgPSBjb3B5U3RyZWFtKCBzdHJlYW1JbnB1dCwgc3RyZWFtT3V0cHV0LCBsQ29udGVudExlbmd0aCwgdXJsSW5wdXQudG9FeHRlcm5hbEZvcm0oKSwgcHJvZ3Jlc3NNb25pdG9yLCBmYWxzZSApOw0KLQl9ICAgIA0KLQ0KLQkvLyBDbG9zZSBpbnB1dCBzdHJlYW0NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChzdHJlYW1JbnB1dCAhPSBudWxsKSB7DQotCQl0cnkgew0KLQkJCXN0cmVhbUlucHV0LmNsb3NlKCk7DQotCQl9DQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBDbG9zZSBvdXRwdXQgc3RyZWFtDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKHN0cmVhbU91dHB1dCAhPSBudWxsKSB7DQotCQl0cnkgew0KLQkJCXN0cmVhbU91dHB1dC5mbHVzaCgpOw0KLQkJCXN0cmVhbU91dHB1dC5jbG9zZSgpOw0KLQkJfQ0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyggVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0Vycm9yX2Nsb3Npbmdfb3V0cHV0X3N0cmVhbSIpLCBleCApOw0KLQkJfQ0KLQl9DQotCQ0KLQkvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhdHRlbXB0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpbmNyZW1lbnRBdHRlbXB0Q291bnQoKTsNCi0NCi0JLy8gRXJyb3IgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlICE9IG51bGwpIHsNCi0JCVVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlIG1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlKCk7DQotCQltZXNzYWdlLnNldFRleHQoc3RyRXJyb3JNZXNzYWdlKTsNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIFN1Y2Nlc3NmdWwgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpOw0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICoNCi0gKiANCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBkb1VuemlwKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCVN0cmluZyBzdHJFcnJvck1lc3NhZ2UgPSBudWxsOw0KLQlpbnQgcmMgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlVOREVGSU5FRF9DT05URU5UUzsNCi0NCi0JLy8gSW5wdXQgVVJMDQotCS8vLS0tLS0tLS0tLQ0KLQlVUkwgdXJsSW5wdXQgPSBudWxsOw0KLQl0cnkgew0KLQkJdXJsSW5wdXQgPSBuZXcgVVJMKGdldFNvdXJjZSgpKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Tb3VyY2VfVVJMX2lzX21hbGZvcm1lZCIpLCBleCk7DQotCX0NCi0NCi0JLy8gT3V0cHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0tDQotCVVSTCB1cmxPdXRwdXQgPSBudWxsOw0KLQl0cnkgew0KLQkJdXJsT3V0cHV0ID0gbmV3IFVSTChnZXRUYXJnZXQoKSk7DQotCX0NCi0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVGFyZ2V0X1VSTF9pc19tYWxmb3JtZWQiKSwgZXgpOw0KLQl9DQotDQotCS8vIEZvciB1bnppcHBpbmcgcGx1Z2lucyBvciBjb21wb25lbnQvY29uZmlndXJhdGlvbiBqYXIsIA0KLQkvLyBzZXQgdXAgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gbG9vayBmb3IsIGFsc28gY2FsbA0KLQkvLyBMYXVuY2hJbmZvLmluc3RhbGxQZW5kaW5nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVmVjdG9yIGRpck5hbWVzID0gbmV3IFZlY3RvcigpOw0KLQlWZWN0b3IgZGlyTmFtZXNJbnN0YWxsZWQgPSBuZXcgVmVjdG9yKCk7Ly8ga2VlcCB0cmFjayBvZiBwbHVnaW5zL2ZyYWdtZW50cyB1bnppcHBlZA0KLQlWZWN0b3IgZGlyTmFtZXNVbmV4cGVjdGVkID0gbmV3IFZlY3RvcigpOwkvLyBrZWVwIHRyYWNrIG9mIHVuZXhwZWN0ZWQgcGx1Z2lucy9mcmFnbWVudHMgZGlyDQotCUFycmF5TGlzdCBwcm9kdWN0VklEcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JQXJyYXlMaXN0IGNvbXBvbmVudFZJRHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCUFycmF5TGlzdCBwbHVnaW5WSURzID0gbmV3IEFycmF5TGlzdCgpOw0KLQlBcnJheUxpc3QgZnJhZ21lbnRWSURzID0gbmV3IEFycmF5TGlzdCgpOw0KLQ0KLQlpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUyApIHsNCi0JCUlDb21wb25lbnREZXNjcmlwdG9yIGNvbXAgPSBudWxsOw0KLQkJaWYgKGdldERhdGEoKSBpbnN0YW5jZW9mIElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIHsNCi0JCQljb21wID0gKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBnZXREYXRhKCkpLmdldENvbXBvbmVudERlc2NyaXB0b3IoKTsNCi0JCX0gZWxzZSB7DQotCQkJY29tcCA9IChJQ29tcG9uZW50RGVzY3JpcHRvcikgZ2V0RGF0YSgpOw0KLQkJfQ0KLQkJaWYgKGNvbXAgIT0gbnVsbCkgew0KLQkJCUlQbHVnaW5FbnRyeURlc2NyaXB0b3JbXSBwbHVnaW5zID0gY29tcC5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJZGlyTmFtZXMuYWRkRWxlbWVudCggVU1FY2xpcHNlVHJlZS5QTFVHSU5TX0RJUiArICIvIiArIHBsdWdpbnNbaV0uZ2V0RGlyTmFtZSgpKTsNCi0JCQkJcGx1Z2luVklEcy5hZGQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihwbHVnaW5zW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgcGx1Z2luc1tpXS5nZXRWZXJzaW9uU3RyKCkpKTsNCi0JCQl9DQotCQkJSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yW10gZnJhZ21lbnRzID0gY29tcC5nZXRGcmFnbWVudEVudHJpZXMoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8ZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJCWRpck5hbWVzLmFkZEVsZW1lbnQoIFVNRWNsaXBzZVRyZWUuRlJBR01FTlRTX0RJUiArICIvIiArIGZyYWdtZW50c1tpXS5nZXREaXJOYW1lKCkpOwkNCi0JCQkJZnJhZ21lbnRWSURzLmFkZChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKHBsdWdpbnNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBwbHVnaW5zW2ldLmdldFZlcnNpb25TdHIoKSkpOw0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0Vycm9yX2luX3JlZ2lzdHJ5Iik7DQotCQl9DQotCX0gZWxzZSBpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCkgew0KLQkJcmMgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLklOU1RBTExfWE1MX01JU1NJTkc7DQotCQlpZiAoZ2V0RGF0YSgpIGluc3RhbmNlb2YgSVByb2R1Y3REZXNjcmlwdG9yKSB7DQotCQkJSVByb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoSVByb2R1Y3REZXNjcmlwdG9yKSBnZXREYXRhKCk7DQotCQkJZGlyTmFtZXMuYWRkRWxlbWVudChVTUVjbGlwc2VUcmVlLklOU1RBTExfRElSICsgIi8iICsgVU1FY2xpcHNlVHJlZS5QUk9EVUNUU19ESVIgKyAiLyIgKyBkZXNjLmdldERpck5hbWUoKSk7DQotCQkJcHJvZHVjdFZJRHMuYWRkKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZGVzYy5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGRlc2MuZ2V0VmVyc2lvblN0cigpKSk7DQotCQl9IGVsc2UgeyANCi0JCQlJQ29tcG9uZW50RGVzY3JpcHRvciBkZXNjID0gbnVsbDsNCi0JCQlpZiAoZ2V0RGF0YSgpIGluc3RhbmNlb2YgSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgew0KLQkJCQlkZXNjID0gKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBnZXREYXRhKCkpLmdldENvbXBvbmVudERlc2NyaXB0b3IoKTsNCi0JCQl9IGVsc2Ugew0KLQkJCQlkZXNjID0gKElDb21wb25lbnREZXNjcmlwdG9yKSBnZXREYXRhKCk7DQotCQkJfQ0KLQkJCWRpck5hbWVzLmFkZEVsZW1lbnQoVU1FY2xpcHNlVHJlZS5JTlNUQUxMX0RJUiArICIvIiArIFVNRWNsaXBzZVRyZWUuQ09NUE9ORU5UU19ESVIgKyAiLyIgKyBkZXNjLmdldERpck5hbWUoKSk7DQotCQkJY29tcG9uZW50VklEcy5hZGQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihkZXNjLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZGVzYy5nZXRWZXJzaW9uU3RyKCkpKTsNCi0JCX0NCi0JfQ0KLQlpZiAoIUxhdW5jaEluZm8uZ2V0Q3VycmVudCgpLmluc3RhbGxQZW5kaW5nKHByb2R1Y3RWSURzLCBjb21wb25lbnRWSURzLCBwbHVnaW5WSURzLCBmcmFnbWVudFZJRHMpKSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRXJyb3Jfb2NjdXJyZWRfZHVyaW5nX2luc3RhbGxhdGlvbl9zZXR1cCIpOw0KLQl9DQotCQ0KLQkNCi0JLy8gQ3JlYXRlIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIGlucHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVN0cmluZyBzdHJGaWxlc3BlYyA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcodXJsSW5wdXQpOw0KLQ0KLQlKYXJGaWxlIGphckZpbGUgPSBudWxsOw0KLQ0KLQl0cnkgew0KLQkJamFyRmlsZSA9IG5ldyBKYXJGaWxlKHN0ckZpbGVzcGVjKTsNCi0JfQ0KLQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19vcGVuX0phcl9maWxlIiksIGV4KTsNCi0JfQ0KLQ0KLQlpZiAoKGphckZpbGUgIT0gbnVsbCkgJiYgKHN0ckVycm9yTWVzc2FnZSA9PSBudWxsKSkgew0KLQ0KLQkJSmFyRW50cnkgZW50cnkgPSBudWxsOw0KLQkJSW5wdXRTdHJlYW0gc3RyZWFtSW5wdXRFbnRyeSA9IG51bGw7DQotDQotCQlpbnQgaUNvdW50ID0gamFyRmlsZS5zaXplKCk7DQotCQkNCi0JCS8vIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yDQotCQkvLyBDb21wdXRlIHRoZSBmaWxlbmFtZSB3aXRob3V0IHRoZSBwYXRoIGluZm9ybWF0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlTdHJpbmcgc3RyRmlsZW5hbWUgPSBzdHJGaWxlc3BlYzsNCi0JCWludCBpSW5kZXggPSBzdHJGaWxlc3BlYy5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvckNoYXIpOw0KLQkJDQotCQlpZiAoaUluZGV4ID49IDAgJiYgaUluZGV4IDwgc3RyRmlsZXNwZWMubGVuZ3RoKCkgLSAxKSB7DQotCQkJc3RyRmlsZW5hbWUgPSBzdHJGaWxlc3BlYy5zdWJzdHJpbmcoaUluZGV4ICsgMSk7DQotCQl9DQotDQotCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsNCi0JCQlwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19JbnN0YWxsIikgKyAiOiAiICsgc3RyRmlsZW5hbWUsIGlDb3VudCk7DQotCQl9DQotDQotDQotCQkvLyBEbyBlYWNoIGphciBmaWxlIGVudHJ5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlFbnVtZXJhdGlvbiBlbnVtID0gamFyRmlsZS5lbnRyaWVzKCk7DQotCQl3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSA9PSB0cnVlKSB7DQotCQkJZW50cnkgPSAoSmFyRW50cnkpIGVudW0ubmV4dEVsZW1lbnQoKTsNCi0JCQlTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOw0KLQkJCQ0KLQkJCWlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9QTFVHSU5TICkgew0KLQkJCQkvLyBVbnppcCBwbHVnaW5zIGFuZCBmcmFnbWVudHMuICBTa2lwIGVudHJpZXMgbm90IHVuZGVyIHBsdWdpbnMvICBvciBmcmFnbWVudHMvIHRyZWVzDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKCghZW50cnlOYW1lLnN0YXJ0c1dpdGgoVU1FY2xpcHNlVHJlZS5QTFVHSU5TX0RJUikgJiYNCi0JCQkJCSFlbnRyeU5hbWUuc3RhcnRzV2l0aChVTUVjbGlwc2VUcmVlLkZSQUdNRU5UU19ESVIpKSANCi0JCQkJCXx8IGVudHJ5TmFtZS5lbmRzV2l0aCgiLyIpKSB7DQotCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQlTdHJpbmcgcHJlZml4ID0gZW50cnlOYW1lOw0KLQkJCQlpbnQgc2Vjb25kX3NsYXNoID0gZW50cnlOYW1lLmluZGV4T2YoIi8iLCAoZW50cnlOYW1lLmluZGV4T2YoIi8iKSsxKSk7DQotCQkJCWlmIChzZWNvbmRfc2xhc2ggPiAwKSANCi0JCQkJCXByZWZpeCA9IGVudHJ5TmFtZS5zdWJzdHJpbmcoMCxzZWNvbmRfc2xhc2gpOw0KLQkJCQlpbnQgbWF0Y2ggPSBkaXJOYW1lcy5pbmRleE9mKHByZWZpeCk7DQotCQkJCWlmIChtYXRjaCA8IDApIHsgICAvLyBub3QgYSB2YWxpZCBwbHVnaW4NCi0JCQkJCWlmICghZGlyTmFtZXNVbmV4cGVjdGVkLmNvbnRhaW5zKHByZWZpeCkpDQotCQkJCQkJZGlyTmFtZXNVbmV4cGVjdGVkLmFkZEVsZW1lbnQocHJlZml4KTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCS8vIGdvdCBhbiBlbnRyeSB3aXRoIG1hdGNoaW5nIGRpcmVjdG9yeSANCi0JCQkJLy8ga2VlcCB0cmFjayBvZiB3aGljaCBvbmVzIHRoZXkgYXJlDQotCQkJCWlmICghZGlyTmFtZXNJbnN0YWxsZWQuY29udGFpbnMocHJlZml4KSkNCi0JCQkJCWRpck5hbWVzSW5zdGFsbGVkLmFkZEVsZW1lbnQocHJlZml4KTsNCi0JCQl9IGVsc2UgaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0lOU1RBTEwpIHsNCi0JCQkJLy8gU2tpcCBvdmVyIGVudHJpZXMgdGhhdCBkb24ndCBzdGFydCB3aXRoIHRoZSByaWdodCBkaXIgbmFtaW5nIGNvbnZlbnRpb24gKGlkX3ZlcnNpb24pDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoIWVudHJ5TmFtZS5zdGFydHNXaXRoKChTdHJpbmcpZGlyTmFtZXMuZmlyc3RFbGVtZW50KCkpIHx8IGVudHJ5TmFtZS5lbmRzV2l0aCgiLyIpKSB7DQotCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQkvLyBnb3QgYW4gZW50cnkgLSBhcyBsb25nIGFzIHdlIGhhdmUgaW5zdGFsbC54bWwgd2UncmUgaGFwcHkNCi0JCQkJaWYgKGVudHJ5TmFtZS5lcXVhbHMoKFN0cmluZylkaXJOYW1lcy5maXJzdEVsZW1lbnQoKSsiLyIrSU1hbmlmZXN0QXR0cmlidXRlcy5JTlNUQUxMX01BTklGRVNUKSkNCi0JCQkJCXJjID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PSzsNCi0JCQl9IGVsc2UgaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0JJTkRJUikgew0KLQkJCQkvLyBVbnppcCB0aGUgYmluIGRpcmVjdG9yeSwgaWYgaXQgZXhpc3RzDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKCFlbnRyeU5hbWUuc3RhcnRzV2l0aChVTUVjbGlwc2VUcmVlLkJJTl9ESVIpIHx8IGVudHJ5TmFtZS5lbmRzV2l0aCgiLyIpKSB7DQotCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCQkvLyBnb3QgYmluIGRpcg0KLQkJCQlyYyA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT0s7DQotCQkJfQ0KLQkJCXRyeSB7DQotCQkJCXN0cmVhbUlucHV0RW50cnkgPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsNCi0JCQl9DQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQkJCXN0cmVhbUlucHV0RW50cnkgPSBudWxsOw0KLQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fb3Blbl9qYXJfZW50cnlfaW5wdXRfc3RyZWFtIiksIGV4KTsNCi0JCQkJYnJlYWs7DQotCQkJfQ0KLQkJCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgew0KLQkJCQlzdHJlYW1JbnB1dEVudHJ5ID0gbnVsbDsNCi0JCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfRW5jb3VudGVyZWRfamFyX2VudHJ5X3NlY3VyaXR5X2V4Y2VwdGlvbiIpLCBleCk7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0NCi0NCi0JCQkvLyBDcmVhdGUgYW4gb3V0cHV0IFVSTA0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJVVJMIHVybE91dHB1dEZpbGUgPSBudWxsOw0KLQ0KLQkJCWlmIChzdHJlYW1JbnB1dEVudHJ5ICE9IG51bGwpIHsNCi0JCQkJdHJ5IHsNCi0JCQkJCS8vIEVuc3VyZSBmaWxlIHNlcGFyYXRvciBiZXR3ZWVuIHRhcmdldCBkaXJlY3RvcnksIGFuZCBzb3VyY2UgZmlsZSBwYXRoDQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJU3RyaW5nQnVmZmVyIHN0cmJUYXJnZXQgPSBuZXcgU3RyaW5nQnVmZmVyKGdldFRhcmdldCgpKTsNCi0JCQkJCWlmIChnZXRUYXJnZXQoKS5lbmRzV2l0aCgiLyIpID09IGZhbHNlKSB7DQotCQkJCQkJc3RyYlRhcmdldC5hcHBlbmQoJy8nKTsNCi0JCQkJCX0NCi0JCQkJCXN0cmJUYXJnZXQuYXBwZW5kKGVudHJ5TmFtZSk7DQotCQkJCQl1cmxPdXRwdXRGaWxlID0gbmV3IFVSTChzdHJiVGFyZ2V0LnRvU3RyaW5nKCkpOw0KLQkJCQkJRmlsZSBmVGFyZ2V0ID0gbmV3IEZpbGUoVU1FY2xpcHNlVHJlZS5nZXRGaWxlSW5QbGF0Zm9ybVN0cmluZyh1cmxPdXRwdXRGaWxlKSk7DQotCQkJCQlpZiAoZlRhcmdldC5leGlzdHMoKSAmJg0KLQkJCQkJCShnZXRBY3Rpb24oKSAhPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9CSU5ESVIpKSB7CQkNCi0JCQkJCQkvLyB3ZSB3aWxsIG5vdCBvdmVycmlkZSBleGlzdGluZyBmaWxlcywgZXhjZXB0IGluIGJpbi8NCi0JCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQkJY29udGludWU7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJCQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5hYmxlX3RvX2NyZWF0ZV9qYXJfZW50cnlfVVJMIiksIGV4KTsNCi0JCQkJCWJyZWFrOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQ0KLQkJCS8vIENyZWF0ZSBhIGZpbGUgb3V0cHV0IHN0cmVhbQ0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCU91dHB1dFN0cmVhbSBzdHJlYW1PdXRwdXRGaWxlID0gbnVsbDsNCi0NCi0JCQlpZiAodXJsT3V0cHV0RmlsZSAhPSBudWxsKSB7DQotCQkJCXRyeSB7DQotCQkJCQlzdHJlYW1PdXRwdXRGaWxlID0gZ2V0RmlsZU91dHB1dFN0cmVhbSh1cmxPdXRwdXRGaWxlKTsNCi0JCQkJfQ0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsNCi0JCQkJCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1VuYWJsZV90b19jcmVhdGVfb3V0cHV0X2ZpbGVfZm9yX0phcl9lbnRyeSIpICsgIjogIiArIHVybE91dHB1dEZpbGUudG9FeHRlcm5hbEZvcm0oKSwgZXgpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJLy8gQ29weSBmcm9tIGlucHV0IHRvIG91dHB1dCBzdHJlYW0NCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCWlmIChzdHJlYW1JbnB1dEVudHJ5ICE9IG51bGwgJiYgc3RyZWFtT3V0cHV0RmlsZSAhPSBudWxsKSB7DQotDQotCSAgICAgICAgICAgIC8vIERvIG5vdCBhbHRlciBwcm9ncmVzcyBtb25pdG9yDQotCSAgICAgICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IGNvcHlTdHJlYW0oc3RyZWFtSW5wdXRFbnRyeSwgc3RyZWFtT3V0cHV0RmlsZSwgMCwgZW50cnlOYW1lLCBudWxsLCB0cnVlICk7DQotCQkJCWlmIChzdHJFcnJvck1lc3NhZ2UgIT0gbnVsbCkgew0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQkJdHJ5IHsNCi0JCQkJaWYgKHN0cmVhbUlucHV0RW50cnkgIT0gbnVsbCkgCXN0cmVhbUlucHV0RW50cnkuY2xvc2UoKTsNCi0JCQkJaWYgKHN0cmVhbU91dHB1dEZpbGUgIT0gbnVsbCkgCXN0cmVhbU91dHB1dEZpbGUuY2xvc2UoKTsNCi0JCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7DQotCQkJCS8vIHVuY2hlY2tlZA0KLQkJCX0NCi0JCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQl9CS8vIHdoaWxlDQotLy8JCXN0ckVycm9yTWVzc2FnZSA9ICJFcnJvciBJbmplY3RlZCEiOw0KLQkJdHJ5IHsNCi0JCQlqYXJGaWxlLmNsb3NlKCk7DQotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7DQotCQkJLy8gdW5jaGVja2VkDQotCQl9CQkNCi0JfQkvLyBpZiBqYXJGaWxlIGlzIG5vdCBudWxsDQotDQotCS8vIHRhbGx5IHVwIHdoYXQncyB1bnppcHBlZCBhbmQgd2hhdCdzIG5vdA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlID09IG51bGwpIHsNCi0JCWlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9QTFVHSU5TICkgew0KLQkJCWlmIChkaXJOYW1lc1VuZXhwZWN0ZWQuc2l6ZSgpID4gMCkgew0KLQkJCQlyYyA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVU5ERUZJTkVEX0NPTlRFTlRTOw0KLQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5kZWZpbmVkX2NvbnRlbnRzX2ZvdW5kX2luX0phciIpOw0KLQkJCX0NCi0JCQllbHNlIGlmICghZGlyTmFtZXNJbnN0YWxsZWQuY29udGFpbnNBbGwoZGlyTmFtZXMpKSB7DQotCQkJCXJjID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5NSVNTSU5HX0NPTlRFTlRTOw0KLQkJCQlzdHJFcnJvck1lc3NhZ2UgPSBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfVW5hYmxlX3RvX2ZpbmRfZGVmaW5lZF9jb250ZW50c19pbl9KYXIiKTsNCi0JCQl9IA0KLQkJfSBlbHNlIGlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMKSB7DQotCQkJaWYgKHJjICE9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT0spDQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fZmluZF9pbnN0YWxsX21hbmlmZXN0X2ZpbGVfaW5fSmFyIik7DQotCQl9DQotCX0JCQ0KLQkNCi0JLy8gQ2FsbCBMYXVuY2hJbmZvLmluc3RhbGxDb25maXJtZWQgaWYgYWxsIGNsZWFuDQotCS8vIE90aGVyd2lzZSwgY2FsbCBhZnRlciB3ZSd2ZSBjbGVhbmVkIHVwICh1bmRvKikNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlID09IG51bGwpIHsNCi0JCWlmICghTGF1bmNoSW5mby5nZXRDdXJyZW50KCkuaW5zdGFsbENvbmZpcm1lZChwcm9kdWN0VklEcywgY29tcG9uZW50VklEcywgcGx1Z2luVklEcywgZnJhZ21lbnRWSURzKSkgew0KLQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19FcnJvcl9vY2N1cnJlZF9kdXJpbmdfaW5zdGFsbGF0aW9uX2NvbXBsZXRpb24iKTsNCi0JCX0NCi0JfQ0KLQkNCi0JaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSBwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KLQ0KLQkvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhdHRlbXB0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpbmNyZW1lbnRBdHRlbXB0Q291bnQoKTsNCi0NCi0JLy8gRXJyb3IgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlICE9IG51bGwpIHsNCi0JCVVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlIG1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlKCk7DQotCQltZXNzYWdlLnNldFRleHQoc3RyRXJyb3JNZXNzYWdlKTsNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIFN1Y2Nlc3NmdWwgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpOw0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICoNCi0gKiANCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBkb1ZlcmlmeShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQlTdHJpbmcgc3RyRXJyb3JNZXNzYWdlID0gbnVsbDsNCi0NCi0JLy8gSW5wdXQgVVJMDQotCS8vLS0tLS0tLS0tLQ0KLQlVUkwgdXJsSW5wdXQgPSBudWxsOw0KLQ0KLQl0cnkgew0KLQkJdXJsSW5wdXQgPSBuZXcgVVJMKGdldFNvdXJjZSgpKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Tb3VyY2VfVVJMX2lzX21hbGZvcm1lZCIpLCBleCk7DQotCX0NCi0NCi0JSUluc3RhbGxhYmxlIGluc3RhbGxhYmxlID0gKElJbnN0YWxsYWJsZSkgZ2V0RGF0YSgpOw0KLQ0KLQlTdHJpbmcgc3RyTmFtZSA9IGluc3RhbGxhYmxlLmdldExhYmVsKCk7DQotCVN0cmluZyBzdHJJZCA9IG51bGw7DQotCVN0cmluZyBzdHJQcm92aWRlck5hbWUgPSBudWxsOw0KLQ0KLQlpZiAoaW5zdGFsbGFibGUgaW5zdGFuY2VvZiBJUHJvZHVjdERlc2NyaXB0b3IpIHsNCi0JCXN0cklkID0gKChJUHJvZHVjdERlc2NyaXB0b3IpIGluc3RhbGxhYmxlKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQotCQlzdHJQcm92aWRlck5hbWUgPSAoKElQcm9kdWN0RGVzY3JpcHRvcikgaW5zdGFsbGFibGUpLmdldFByb3ZpZGVyTmFtZSgpOw0KLQl9DQotCWVsc2UgaWYgKGluc3RhbGxhYmxlIGluc3RhbmNlb2YgSUNvbXBvbmVudERlc2NyaXB0b3IpIHsNCi0JCXN0cklkID0gKChJQ29tcG9uZW50RGVzY3JpcHRvcikgaW5zdGFsbGFibGUpLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCXN0clByb3ZpZGVyTmFtZSA9ICgoSUNvbXBvbmVudERlc2NyaXB0b3IpIGluc3RhbGxhYmxlKS5nZXRQcm92aWRlck5hbWUoKTsNCi0JfQ0KLQllbHNlIGlmIChpbnN0YWxsYWJsZSBpbnN0YW5jZW9mIElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIHsNCi0JCXN0cklkID0gKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBpbnN0YWxsYWJsZSkuZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQl9DQotCWVsc2UgaWYgKGluc3RhbGxhYmxlIGluc3RhbmNlb2YgSVBsdWdpbkVudHJ5RGVzY3JpcHRvcikgew0KLQkJc3RySWQgPSAoKElQbHVnaW5FbnRyeURlc2NyaXB0b3IpIGluc3RhbGxhYmxlKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQotCX0NCi0JZWxzZSBpZiAoaW5zdGFsbGFibGUgaW5zdGFuY2VvZiBJRnJhZ21lbnRFbnRyeURlc2NyaXB0b3IpIHsNCi0JCXN0cklkID0gKChJRnJhZ21lbnRFbnRyeURlc2NyaXB0b3IpIGluc3RhbGxhYmxlKS5nZXRVbmlxdWVJZGVudGlmaWVyKCk7DQotCX0NCi0NCi0JSmFyVmVyaWZpY2F0aW9uU2VydmljZSB2ZXJpZmllciA9IFVwZGF0ZU1hbmFnZXIuZ2V0Q3VycmVudEluc3RhbmNlKCkuZ2V0SmFyVmVyaWZpZXIoKTsNCi0NCi0JSmFyVmVyaWZpY2F0aW9uUmVzdWx0IHJlc3VsdCA9IHZlcmlmaWVyLm9rVG9JbnN0YWxsKG5ldyBGaWxlKHVybElucHV0LmdldEZpbGUoKSksIHN0cklkLCBzdHJOYW1lLCBzdHJQcm92aWRlck5hbWUsIHByb2dyZXNzTW9uaXRvcik7DQotDQotCWlmIChyZXN1bHQuZ2V0UmVzdWx0Q29kZSgpID09IEphclZlcmlmaWNhdGlvblJlc3VsdC5DQU5DRUxfSU5TVEFMTCkgew0KLQkJRXhjZXB0aW9uIGV4ID0gcmVzdWx0LmdldFJlc3VsdEV4Y2VwdGlvbigpOw0KLQkJc3RyRXJyb3JNZXNzYWdlID0gY3JlYXRlTWVzc2FnZVN0cmluZyhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfSW5zdGFsbGF0aW9uX2NhbmNlbGxlZF9ieV91c2VyIiksIGV4KTsNCi0JfQ0KLQ0KLQkvLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhdHRlbXB0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpbmNyZW1lbnRBdHRlbXB0Q291bnQoKTsNCi0NCi0JLy8gRXJyb3IgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlICE9IG51bGwpIHsNCi0JCVVNU2Vzc2lvbk1hbmFnZXJNZXNzYWdlIG1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlKCk7DQotCQltZXNzYWdlLnNldFRleHQoc3RyRXJyb3JNZXNzYWdlKTsNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpOw0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8vIFN1Y2Nlc3NmdWwgcmV0dXJuDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpOw0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotLyoqDQotICogRXhlY3V0ZSBjb3B5IGZyb20gc291cmNlIFVSTCB0byB0YXJnZXQgVVJMLg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0lOU1RBTEwgfHwNCi0JCWdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX1BMVUdJTlMgfHwNCi0JCWdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0JJTkRJUikgew0KLQkJcmV0dXJuIGRvVW56aXAocHJvZ3Jlc3NNb25pdG9yKTsNCi0JfQ0KLQkNCi0JZWxzZSBpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fQ09QWSkgew0KLQkJcmV0dXJuIGRvQ29weShwcm9ncmVzc01vbml0b3IpOw0KLQl9DQotCWVsc2UgaWYgKGdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1ZFUklGWV9KQVIpIHsNCi0JCXJldHVybiBkb1ZlcmlmeShwcm9ncmVzc01vbml0b3IpOw0KLQl9DQotCXJldHVybiBmYWxzZTsNCi19DQotLyoqDQotICogRXhlY3V0ZSBhbnkgcGVuZGluZyBvciBmYWlsZWQgdXBkYXRlcy4NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlVW5kbyhJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQkvLyBVbmRvIGFsbCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQgb3BlcmF0aW9ucw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1BFTkRJTkcpID09IGZhbHNlKSB7DQotCQlpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCB8fA0KLQkJCWdldEFjdGlvbigpID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX1BMVUdJTlMpIHsNCi0JCQlyZXR1cm4gdW5kb1VuemlwKHByb2dyZXNzTW9uaXRvcik7DQotCQl9DQotCQllbHNlIGlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9DT1BZKSB7DQotCQkJcmV0dXJuIHVuZG9Db3B5KHByb2dyZXNzTW9uaXRvcik7DQotCQl9DQotCQllbHNlIGlmIChnZXRBY3Rpb24oKSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9WRVJJRllfSkFSKXsNCi0JCQlyZXR1cm4gdW5kb1ZlcmlmeShwcm9ncmVzc01vbml0b3IpOw0KLQkJfQ0KLQl9DQotDQotCXJldHVybiB0cnVlOw0KLX0NCi0vKioNCi0gKiANCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsNCi0JDQotCXJldHVybiBfcHJvcGVydHlBY3Rpb24uZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICogQ3JlYXRlcyBhIGZpbGUgb3V0cHV0IHN0cmVhbSBmcm9tIHRoZSBVUkwuDQotICogQHBhcmFtIHVybCBqYXZhLm5ldC5VUkwNCi0gKi8NCi1wcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gZ2V0RmlsZU91dHB1dFN0cmVhbShVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQ0KLQkvLyBDb252ZXJ0IHRoZSBVUkwgdG8gYSBzdHJpbmcNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVN0cmluZyBzdHJGaWxlc3BlYyA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcodXJsKTsNCi0NCi0NCi0JLy8gQ3JlYXRlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaW50IGlJbmRleCA9IHN0ckZpbGVzcGVjLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKTsNCi0JaWYgKGlJbmRleCA+PSAwKSB7DQotCQlTdHJpbmcgc3RyUGF0aCA9IHN0ckZpbGVzcGVjLnN1YnN0cmluZygwLCBpSW5kZXgrMSk7DQotDQotCQlGaWxlIGZpbGVEaXJlY3RvcnkgPSBuZXcgRmlsZShzdHJQYXRoKTsNCi0JCWlmIChmaWxlRGlyZWN0b3J5LmV4aXN0cygpID09IGZhbHNlKSB7DQotCQkJZmlsZURpcmVjdG9yeS5ta2RpcnMoKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBPcGVuIC8gY3JlYXRlIHRoZSBmaWxlDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JRmlsZSBmaWxlID0gbmV3IEZpbGUoc3RyRmlsZXNwZWMpOw0KLQlib29sZWFuIGJFeGlzdHMgPSBmaWxlLmV4aXN0cygpOw0KLQ0KLQlpZiAoYkV4aXN0cyA9PSBmYWxzZSkgew0KLQkJYkV4aXN0cyA9IGZpbGUuY3JlYXRlTmV3RmlsZSgpOw0KLQl9DQotDQotCS8vIENyZWF0ZSB0aGUgb3V0cHV0IHN0cmVhbQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOw0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldElkKCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eUlELmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7DQotCQ0KLQlyZXR1cm4gX3Byb3BlcnR5U291cmNlLmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBzdHJiIGphdmEubGFuZy5TdHJpbmdCdWZmZXINCi0gKiBAcGFyYW0gaUluZGVudGF0aW9uIGludA0KLSAqLw0KLXB1YmxpYyB2b2lkIGdldFN0YXR1c1N0cmluZyhqYXZhLmxhbmcuU3RyaW5nQnVmZmVyIHN0cmIsIGludCBpSW5kZW50YXRpb24pIHsNCi0NCi0JaWYgKGdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQpID09IHRydWUpIHsNCi0JCXJldHVybjsNCi0JfQ0KLQllbHNlIGlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfUEVORElORykgPT0gdHJ1ZSkgew0KLQkJcmV0dXJuOw0KLQl9DQotDQotCWVsc2Ugew0KLQkJaWYgKGdldEFjdGlvbigpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9DT1BZKSA9PSB0cnVlKSB7DQotCQkJaW5kZW50KHN0cmIsIGlJbmRlbnRhdGlvbik7DQotCQkJc3RyYi5hcHBlbmQoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0NvcHkiKSArICI6ICIgKyBnZXRTb3VyY2UoKSk7DQotCQl9DQotCQllbHNlIGlmIChnZXRBY3Rpb24oKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCkgfHwNCi0JCQkJZ2V0QWN0aW9uKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX1BMVUdJTlMpID09IHRydWUpIHsNCi0JCQlpbmRlbnQoc3RyYiwgaUluZGVudGF0aW9uKTsNCi0JCQlzdHJiLmFwcGVuZChVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfSW5zdGFsbCIpICsgIjogIiArIGdldFNvdXJjZSgpKTsNCi0JCX0NCi0NCi0JCS8vIE9idGFpbiBtZXNzYWdlcw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tDQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9hbE1lc3NhZ2VzLnNpemUoKTsgKytpKSB7DQotCQkJaW5kZW50KHN0cmIsIGlJbmRlbnRhdGlvbiArIDIpOw0KLQkJCXN0cmIuYXBwZW5kKCgoVU1TZXNzaW9uTWFuYWdlck1lc3NhZ2UpIF9hbE1lc3NhZ2VzLmdldChpKSkuZ2V0VGV4dCgpKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0KCkgew0KLQkNCi0JcmV0dXJuIF9wcm9wZXJ0eVRhcmdldC5nZXRWYWx1ZSgpOw0KLX0NCi0vKioNCi0gKg0KLSAqIEBwYXJhbSBhY3Rpb25UeXBlIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRBY3Rpb24oU3RyaW5nIHN0ckFjdGlvbikgew0KLQlfcHJvcGVydHlBY3Rpb24uc2V0VmFsdWUoIHN0ckFjdGlvbiAhPSBudWxsID8gc3RyQWN0aW9uIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRJZCggU3RyaW5nIHN0cklEICkgew0KLQlfcHJvcGVydHlJRC5zZXRWYWx1ZSggc3RySUQgIT0gbnVsbCA/IHN0cklEIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRTb3VyY2UoIFN0cmluZyBzdHJTb3VyY2UgKSB7DQotCV9wcm9wZXJ0eVNvdXJjZS5zZXRWYWx1ZSggc3RyU291cmNlICE9IG51bGwgPyBzdHJTb3VyY2UgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19FTVBUWSApOw0KLX0NCi0vKioNCi0gKg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldFRhcmdldCggU3RyaW5nIHN0clRhcmdldCApIHsNCi0JX3Byb3BlcnR5VGFyZ2V0LnNldFZhbHVlKCBzdHJUYXJnZXQgIT0gbnVsbCA/IHN0clRhcmdldCA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotfQ0KLS8qKg0KLSAqDQotICogDQotICovDQotcHVibGljIGJvb2xlYW4gdW5kb0NvcHkoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JU3RyaW5nIHN0ckVycm9yTWVzc2FnZSA9IG51bGw7DQotDQotCS8vIE91dHB1dCBVUkwNCi0JLy8tLS0tLS0tLS0tLQ0KLQlVUkwgdXJsT3V0cHV0ID0gbnVsbDsNCi0NCi0JdHJ5IHsNCi0JCXVybE91dHB1dCA9IG5ldyBVUkwoZ2V0VGFyZ2V0KCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1RhcmdldF9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQlpZiAodXJsT3V0cHV0ICE9IG51bGwpIHsNCi0NCi0JCS8vIENvbnZlcnQgdGhlIFVSTCB0byBhIHN0cmluZw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlTdHJpbmcgc3RyRmlsZXNwZWMgPSBVTUVjbGlwc2VUcmVlLmdldEZpbGVJblBsYXRmb3JtU3RyaW5nKHVybE91dHB1dCk7DQotDQotCQkvLyBEZWxldGUgdGhlIGZpbGUNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLQ0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoc3RyRmlsZXNwZWMpOw0KLQkJaWYgKGZpbGUuZXhpc3RzKCkgPT0gdHJ1ZSkgew0KLQkJCWlmIChmaWxlLmRlbGV0ZSgpID09IGZhbHNlKSB7DQotCQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fZGVsZXRlX2ZpbGUiKSArICI6ICIgKyBzdHJGaWxlc3BlYzsNCi0JCQl9DQotCQl9DQotCX0NCi0NCi0JLy8gUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXJlc2V0QXR0ZW1wdENvdW50KCk7DQotDQotCS8vIEVycm9yIHJldHVybg0KLQkvLy0tLS0tLS0tLS0tLS0NCi0JaWYgKHN0ckVycm9yTWVzc2FnZSAhPSBudWxsKSB7DQotCQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCkgPT0gdHJ1ZSkNCi0JCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEX1VORE9fRkFJTEVEKTsNCi0JCWVsc2UNCi0JCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEX1VORE9fRkFJTEVEKTsNCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvLyBTdWNjZXNzZnVsIHJldHVybg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCkgPT0gdHJ1ZSkNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERURfVU5ET19TVUNDRUVERUQpOw0KLQllbHNlDQotCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEX1VORE9fU1VDQ0VFREVEKTsNCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqDQotICogDQotICovDQotcHVibGljIGJvb2xlYW4gdW5kb1VuemlwKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCVN0cmluZyBzdHJFcnJvck1lc3NhZ2UgPSBudWxsOw0KLQ0KLQkvLyBJbnB1dCBVUkwNCi0JLy8tLS0tLS0tLS0tDQotCVVSTCB1cmxJbnB1dCA9IG51bGw7DQotCXRyeSB7DQotCQl1cmxJbnB1dCA9IG5ldyBVUkwoZ2V0U291cmNlKCkpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXN0ckVycm9yTWVzc2FnZSA9IGNyZWF0ZU1lc3NhZ2VTdHJpbmcoVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1NvdXJjZV9VUkxfaXNfbWFsZm9ybWVkIiksIGV4KTsNCi0JfQ0KLQ0KLQkvLyBPdXRwdXQgVVJMDQotCS8vLS0tLS0tLS0tLS0NCi0JVVJMIHVybE91dHB1dCA9IG51bGw7DQotCXRyeSB7DQotCQl1cmxPdXRwdXQgPSBuZXcgVVJMKGdldFRhcmdldCgpKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19UYXJnZXRfVVJMX2lzX21hbGZvcm1lZCIpLCBleCk7DQotCX0NCi0NCi0JLy8gRm9yIHBsdWdpbnMgb3IgY29tcG9uZW50L2NvbmZpZ3VyYXRpb24gamFyLCANCi0JLy8gc2V0IHVwIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGxvb2sgZm9yDQotCS8vIFRoaXMgc2VjdGlvbiBjb250YWlucyBzdWJ0bGUgZGlmZmVyZW5jZXMgZnJvbSBkb1VuemlwKCkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlWZWN0b3IgZGlyTmFtZXMgPSBuZXcgVmVjdG9yKCk7DQotCUFycmF5TGlzdCBwcm9kdWN0VklEcyA9IG5ldyBBcnJheUxpc3QoKTsNCi0JQXJyYXlMaXN0IGNvbXBvbmVudFZJRHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCUFycmF5TGlzdCBwbHVnaW5WSURzID0gbmV3IEFycmF5TGlzdCgpOw0KLQlBcnJheUxpc3QgZnJhZ21lbnRWSURzID0gbmV3IEFycmF5TGlzdCgpOw0KLQlpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUyApIHsNCi0JCUlDb21wb25lbnREZXNjcmlwdG9yIGNvbXAgPSBudWxsOw0KLQkJaWYgKGdldERhdGEoKSBpbnN0YW5jZW9mIElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIHsNCi0JCQljb21wID0gKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKSBnZXREYXRhKCkpLmdldENvbXBvbmVudERlc2NyaXB0b3IoKTsNCi0JCX0gZWxzZSB7DQotCQkJY29tcCA9IChJQ29tcG9uZW50RGVzY3JpcHRvcikgZ2V0RGF0YSgpOw0KLQkJfQ0KLQkJaWYgKGNvbXAgIT0gbnVsbCkgew0KLQkJCUlQbHVnaW5FbnRyeURlc2NyaXB0b3JbXSBwbHVnaW5zID0gY29tcC5nZXRQbHVnaW5FbnRyaWVzKCk7DQotCQkJZm9yIChpbnQgaT0wOyBpPHBsdWdpbnMubGVuZ3RoOyBpKyspIHsNCi0JCQkJZGlyTmFtZXMuYWRkRWxlbWVudCggVU1FY2xpcHNlVHJlZS5QTFVHSU5TX0RJUiArICIvIiArIHBsdWdpbnNbaV0uZ2V0RGlyTmFtZSgpKTsNCi0JCQkJcGx1Z2luVklEcy5hZGQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihwbHVnaW5zW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgcGx1Z2luc1tpXS5nZXRWZXJzaW9uU3RyKCkpKTsNCi0JCQl9DQotCQkJSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yW10gZnJhZ21lbnRzID0gY29tcC5nZXRGcmFnbWVudEVudHJpZXMoKTsNCi0JCQlmb3IgKGludCBpPTA7IGk8ZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7DQotCQkJCWRpck5hbWVzLmFkZEVsZW1lbnQoIFVNRWNsaXBzZVRyZWUuRlJBR01FTlRTX0RJUiArICIvIiArIGZyYWdtZW50c1tpXS5nZXREaXJOYW1lKCkpOwkNCi0JCQkJZnJhZ21lbnRWSURzLmFkZChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKHBsdWdpbnNbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBwbHVnaW5zW2ldLmdldFZlcnNpb25TdHIoKSkpOw0KLQkJCX0NCi0JCX0gZWxzZSB7DQotCQkJc3RyRXJyb3JNZXNzYWdlID0gVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0Vycm9yX2luX3JlZ2lzdHJ5Iik7DQotCQl9DQotCX0gZWxzZSBpZiAoZ2V0QWN0aW9uKCkgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfSU5TVEFMTCkgew0KLQkJLy8gcmMgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLklOU1RBTExfWE1MX01JU1NJTkc7DQotCQlpZiAoZ2V0RGF0YSgpIGluc3RhbmNlb2YgSVByb2R1Y3REZXNjcmlwdG9yKSB7DQotCQkJSVByb2R1Y3REZXNjcmlwdG9yIGRlc2MgPSAoSVByb2R1Y3REZXNjcmlwdG9yKSBnZXREYXRhKCk7DQotCQkJZGlyTmFtZXMuYWRkRWxlbWVudChVTUVjbGlwc2VUcmVlLklOU1RBTExfRElSICsgIi8iICsgVU1FY2xpcHNlVHJlZS5QUk9EVUNUU19ESVIgKyAiLyIgKyBkZXNjLmdldERpck5hbWUoKSArICIvIik7DQotCQkJcHJvZHVjdFZJRHMuYWRkKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZGVzYy5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGRlc2MuZ2V0VmVyc2lvblN0cigpKSk7DQotCQl9IGVsc2UgeyANCi0JCQlJQ29tcG9uZW50RGVzY3JpcHRvciBkZXNjID0gKElDb21wb25lbnREZXNjcmlwdG9yKSBnZXREYXRhKCk7DQotCQkJZGlyTmFtZXMuYWRkRWxlbWVudChVTUVjbGlwc2VUcmVlLklOU1RBTExfRElSICsgIi8iICsgVU1FY2xpcHNlVHJlZS5DT01QT05FTlRTX0RJUiArICIvIiArIGRlc2MuZ2V0RGlyTmFtZSgpICsgIi8iKTsNCi0JCQljb21wb25lbnRWSURzLmFkZChuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKGRlc2MuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBkZXNjLmdldFZlcnNpb25TdHIoKSkpOw0KLQkJfQ0KLQl9DQotDQotCQkNCi0JLy8gQ3JlYXRlIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIGlucHV0IFVSTA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVN0cmluZyBzdHJGaWxlc3BlYyA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcodXJsSW5wdXQpOw0KLQ0KLQlKYXJGaWxlIGphckZpbGUgPSBudWxsOw0KLQkNCi0JdHJ5IHsNCi0JCWphckZpbGUgPSBuZXcgSmFyRmlsZShzdHJGaWxlc3BlYyk7DQotCX0NCi0JY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7DQotCQlzdHJFcnJvck1lc3NhZ2UgPSBjcmVhdGVNZXNzYWdlU3RyaW5nKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fb3Blbl9KYXJfZmlsZSIpLCBleCk7DQotCX0NCi0NCi0JaWYgKGphckZpbGUgIT0gbnVsbCkgew0KLQ0KLQkJSmFyRW50cnkgZW50cnkgPSBudWxsOw0KLQ0KLQkJaW50IGlDb3VudCA9IGphckZpbGUuc2l6ZSgpOw0KLQ0KLQkJLy8gU2V0IHVwIHByb2dyZXNzIG1vbml0b3INCi0JCS8vIENvbXB1dGUgdGhlIGZpbGVuYW1lIHdpdGhvdXQgdGhlIHBhdGggaW5mb3JtYXRpb24NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVN0cmluZyBzdHJGaWxlbmFtZSA9IHN0ckZpbGVzcGVjOw0KLQkJaW50IGlJbmRleCA9IHN0ckZpbGVzcGVjLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcik7DQotCQkNCi0JCWlmIChpSW5kZXggPj0gMCAmJiBpSW5kZXggPCBzdHJGaWxlc3BlYy5sZW5ndGgoKSAtIDEpIHsNCi0JCQlzdHJGaWxlbmFtZSA9IHN0ckZpbGVzcGVjLnN1YnN0cmluZyhpSW5kZXggKyAxKTsNCi0JCX0NCi0JCQ0KLQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSBwcm9ncmVzc01vbml0b3IuYmVnaW5UYXNrKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmRvIikgKyAiOiAiICsgc3RyRmlsZW5hbWUsIGlDb3VudCk7DQotDQotCQkvLyBEbyBlYWNoIGphciBmaWxlIGVudHJ5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlFbnVtZXJhdGlvbiBlbnVtID0gamFyRmlsZS5lbnRyaWVzKCk7DQotDQotCQl3aGlsZSAoZW51bS5oYXNNb3JlRWxlbWVudHMoKSA9PSB0cnVlKSB7DQotCQkJZW50cnkgPSAoSmFyRW50cnkpIGVudW0ubmV4dEVsZW1lbnQoKTsNCi0JCQlTdHJpbmcgZW50cnlOYW1lID0gZW50cnkuZ2V0TmFtZSgpOw0KLQkJCQ0KLQkJCWlmIChnZXRBY3Rpb24oKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PUEVSQVRJT05fVU5aSVBfUExVR0lOUykpIHsNCi0JCQkJLy8gUmVtb3ZlIHRoZSBwbHVnaW5zIGFuZCBmcmFnbWVudHMuICBTa2lwIGVudHJpZXMgbm90IHVuZGVyIHBsdWdpbnMvIG9yIGZyYWdtZW50cy8gdHJlZXMNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCWlmICgoIWVudHJ5TmFtZS5zdGFydHNXaXRoKFVNRWNsaXBzZVRyZWUuUExVR0lOU19ESVIpKSAmJg0KLQkJCQkJKCFlbnRyeU5hbWUuc3RhcnRzV2l0aChVTUVjbGlwc2VUcmVlLkZSQUdNRU5UU19ESVIpKSkgew0KLQkJCQkJaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSBwcm9ncmVzc01vbml0b3Iud29ya2VkKDEpOw0KLQkJCQkJY29udGludWU7DQotCQkJCX0JCQkJCQkJCQkJCQkNCi0JCQkJaWYgKChlbnRyeU5hbWUuZXF1YWxzKFVNRWNsaXBzZVRyZWUuUExVR0lOU19ESVIgKyAiLyIpKSB8fA0KLQkJCQkJKGVudHJ5TmFtZS5lcXVhbHMoVU1FY2xpcHNlVHJlZS5GUkFHTUVOVFNfRElSICsgIi8iKSkpIHsNCi0JCQkJCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsNCi0JCQkJCWNvbnRpbnVlOw0KLQkJCQl9DQotCQkJCS8vIERvbid0IGJvdGhlciBjbGVhbmluZyB1cCB0aGUgZW50cmllcyBub3QgbWF0Y2hpbmcgdGhlIGV4cGVjdGVkIGxpc3QNCi0JCQkJLy8gVGhleSB3ZXJlbid0IHVuemlwcGVkIGluIHRoZSBmaXJzdCBwbGFjZQ0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCVN0cmluZyBwcmVmaXggPSBlbnRyeU5hbWU7DQotCQkJCWludCBzZWNvbmRfc2xhc2ggPSBlbnRyeU5hbWUuaW5kZXhPZigiLyIsIChlbnRyeU5hbWUuaW5kZXhPZigiLyIpKzEpKTsNCi0JCQkJaWYgKHNlY29uZF9zbGFzaCA+IDApIA0KLQkJCQkJcHJlZml4ID0gZW50cnlOYW1lLnN1YnN0cmluZygwLHNlY29uZF9zbGFzaCk7DQotCQkJCWludCBtYXRjaCA9IGRpck5hbWVzLmluZGV4T2YocHJlZml4KTsNCi0JCQkJaWYgKG1hdGNoIDwgMCkgeyAgIC8vIG5vdCBhIHZhbGlkIHBsdWdpbg0KLQkJCQkJY29udGludWU7DQotCQkJCX0NCi0JCQl9IGVsc2UgaWYgKGdldEFjdGlvbigpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLk9QRVJBVElPTl9VTlpJUF9JTlNUQUxMKSkgew0KLQkJCQkvLyBSZW1vdmUgdGhlIGNvbXBvbmVudC9wcm9kdWN0IGl0ZW1zLiAgU2tpcCBvdmVyIGVudHJpZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgZGlybmFtZQ0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlpZiAoIWVudHJ5TmFtZS5zdGFydHNXaXRoKChTdHJpbmcpZGlyTmFtZXMuZmlyc3RFbGVtZW50KCkpKSB7DQotCQkJCQlpZiAocHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCQljb250aW51ZTsNCi0JCQkJfQ0KLQkJCX0gZWxzZSBpZiAoZ2V0QWN0aW9uKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT1BFUkFUSU9OX1VOWklQX0JJTkRJUikpIHsNCi0JCQkJLy8gTm8tb3AuICAgVGhlIGJpbiBkaXJlY3RvcnkgY29udGVudHMgY2Fubm90IGJlIHVuZG9uZQ0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCWJyZWFrOw0KLQkJCX0NCi0NCi0JCQlpZiAodXJsT3V0cHV0ICE9IG51bGwpIHsNCi0JCQkJLy8gQnVpbGQgcGF0aG5hbWUgdG8gYWN0dWFsIGluc3RhbGwgbG9jYXRpb24NCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJc3RyRmlsZXNwZWMgPSB1cmxPdXRwdXQuZ2V0RmlsZSgpICsgIi8iICsgZW50cnlOYW1lOw0KLQkJCQlzdHJGaWxlc3BlYyA9IHN0ckZpbGVzcGVjLnJlcGxhY2UoJy8nLEZpbGUuc2VwYXJhdG9yQ2hhcik7DQotCQkJCWludCBrID0gc3RyRmlsZXNwZWMuaW5kZXhPZihVTUVjbGlwc2VUcmVlLkRFVklDRV9TRVBBUkFUT1IpOw0KLQkJCQlpZiAoayAhPSAtMSAmJiBzdHJGaWxlc3BlYy5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgew0KLQkJCQkJc3RyRmlsZXNwZWMgPSBzdHJGaWxlc3BlYy5zdWJzdHJpbmcoMSk7DQotCQkJCX0NCi0NCi0JCQkJLy8gRGVsZXRlIHRoZSBmaWxlIG9yIGRpcmVjdG9yeQ0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHN0ckZpbGVzcGVjKTsNCi0JCQkJaWYgKGZpbGUuZXhpc3RzKCkgPT0gdHJ1ZSkgew0KLQkJCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkNCi0JCQkJCQlVcGRhdGVNYW5hZ2VyLmNsZWFudXBEaXJlY3RvcnkoZmlsZSk7DQotCQkJCQlpZiAoZmlsZS5kZWxldGUoKSA9PSBmYWxzZSkgew0KLQkJCQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fZGVsZXRlX2ZpbGUiKSArICI6ICIgKyBzdHJGaWxlc3BlYzsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0JCWlmIChwcm9ncmVzc01vbml0b3IgIT0gbnVsbCkgcHJvZ3Jlc3NNb25pdG9yLndvcmtlZCgxKTsJCQ0KLQkJfSAvLyB3aGlsZQ0KLQ0KLQkJdHJ5IHsNCi0JCQlqYXJGaWxlLmNsb3NlKCk7DQotCQl9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGV4KSB7DQotCQkJLy8gdW5jaGVja2VkDQotCQl9DQotCX0gLy8gaWYgamFyRmlsZSBpcyBub3QgbnVsbA0KLQ0KLQkvLyBDYWxsIExhdW5jaEluZm8uaW5zdGFsbENvbmZpcm1lZCBpZiBhbGwgY2xlYW4NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc3RyRXJyb3JNZXNzYWdlID09IG51bGwpIHsNCi0JCWlmICghTGF1bmNoSW5mby5nZXRDdXJyZW50KCkuaW5zdGFsbENvbmZpcm1lZChwcm9kdWN0VklEcywgY29tcG9uZW50VklEcywgcGx1Z2luVklEcywgZnJhZ21lbnRWSURzKSkgew0KLQkJCXN0ckVycm9yTWVzc2FnZSA9IFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19FcnJvcl9vY2N1cnJlZF9kdXJpbmdfaW5zdGFsbGF0aW9uX2NvbXBsZXRpb24iKTsNCi0JCX0NCi0JfQ0KLQkNCi0JaWYgKHByb2dyZXNzTW9uaXRvciAhPSBudWxsKSBwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KLQkNCi0JLy8gUmVzZXQgdGhlIG51bWJlciBvZiBhdHRlbXB0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXJlc2V0QXR0ZW1wdENvdW50KCk7DQotDQotCS8vIEVycm9yIHJldHVybg0KLQkvLy0tLS0tLS0tLS0tLS0NCi0JaWYgKHN0ckVycm9yTWVzc2FnZSAhPSBudWxsKSB7DQotCQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCkgPT0gdHJ1ZSkNCi0JCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEX1VORE9fRkFJTEVEKTsNCi0JCWVsc2UNCi0JCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEX1VORE9fRkFJTEVEKTsNCi0NCi0JCXJldHVybiBmYWxzZTsNCi0JfQ0KLQ0KLQkvLyBTdWNjZXNzZnVsIHJldHVybg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoZ2V0U3RhdHVzKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCkgPT0gdHJ1ZSkNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERURfVU5ET19TVUNDRUVERUQpOw0KLQllbHNlDQotCQlzZXRTdGF0dXMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEX1VORE9fU1VDQ0VFREVEKTsNCi0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qKg0KLSAqDQotICogDQotICovDQotcHVibGljIGJvb2xlYW4gdW5kb1ZlcmlmeShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQkNCi0JcmVzZXRBdHRlbXB0Q291bnQoKTsNCi0JDQotCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKQ0KLQkJc2V0U3RhdHVzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRF9VTkRPX1NVQ0NFRURFRCk7DQotCWVsc2UNCi0JCXNldFN0YXR1cyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19TVUNDRUVERUQpOw0KLQ0KLQlyZXR1cm4gdHJ1ZTsNCi19DQotfQ0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJQYXJjZWwuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VNU2Vzc2lvbk1hbmFnZXJQYXJjZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjN2Q5Ny4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyUGFyY2VsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgamF2YS51dGlsLio7DQotDQotLyoqDQotICogVGhpcyBjbGFzcyByZXByZXNlbnRzIGVpdGhlciBhIGNvbXBvbmVudCBvciBhIHByb2R1Y3QuICBBIHBhcmNlbCBjYW4NCi0gKiBoYXZlIHN1YiBwYXJjZWxzLCBhbmQgY29weSBvYmplY3RzLiAgQXR0cmlidXRlcyBhcmUgYWN0aW9uIChhZGQsIGZpeCksIGlkLCBzdGF0dXMgKHBlbmRpbmcsIGNvbXBsZXRlKSwNCi0gKiB0eXBlIChjb21wb25lbnQgLyBwcm9kdWN0KS4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBleHRlbmRzIFVNU2Vzc2lvbk1hbmFnZXJFbnRyeSB7DQotCQ0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IF9hbFBhcmNlbHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCXByb3RlY3RlZCBBcnJheUxpc3QgX2FsT3BlcmF0aW9ucyAgID0gbmV3IEFycmF5TGlzdCgpOw0KLQkNCi0JcHJvdGVjdGVkIElMb2dFbnRyeVByb3BlcnR5IF9wcm9wZXJ0eUFjdGlvbiA9IG51bGw7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlJRCAgICAgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSUxvZ0VudHJ5UHJvcGVydHkgX3Byb3BlcnR5VHlwZSAgID0gbnVsbDsNCi0vKioNCi0gKiBVcGRhdGVNYW5hZ2VyUGFyY2VsIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwoIElMb2dFbnRyeSBsb2dFbnRyeSApIHsNCi0Jc3VwZXIoIGxvZ0VudHJ5ICk7DQotDQotCS8vIEFjdGlvbg0KLQkvLy0tLS0tLS0NCi0JX3Byb3BlcnR5QWN0aW9uID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FDVElPTik7DQotDQotCWlmIChfcHJvcGVydHlBY3Rpb24gPT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5QWN0aW9uID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FDVElPTiwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlBY3Rpb24gKTsNCi0JfQ0KLQ0KLQkvLyBJZA0KLQkvLy0tLQ0KLQlfcHJvcGVydHlJRCA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19JRCk7DQotDQotCWlmIChfcHJvcGVydHlJRCA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlJRCA9IG5ldyBMb2dFbnRyeVByb3BlcnR5KGxvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19JRCwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlJRCApOw0KLQl9DQotDQotCS8vIFR5cGUNCi0JLy8tLS0tLQ0KLQlfcHJvcGVydHlUeXBlID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RZUEUpOw0KLQ0KLQlpZiAoX3Byb3BlcnR5VHlwZSA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlUeXBlID0gbmV3IExvZ0VudHJ5UHJvcGVydHkobG9nRW50cnksIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RZUEUsIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotCQlsb2dFbnRyeS5hZGRQcm9wZXJ0eSggX3Byb3BlcnR5VHlwZSApOw0KLQl9DQotfQ0KLS8qKg0KLSAqIEBwYXJhbSBsb2dFbnRyeSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5Mb2dFbnRyeQ0KLSAqLw0KLXB1YmxpYyB2b2lkIGJ1aWxkVHJlZUZyb21Mb2coSUxvZ0VudHJ5IGxvZ0VudHJ5KSB7DQotDQotCXN1cGVyLmJ1aWxkVHJlZUZyb21Mb2coIGxvZ0VudHJ5ICk7DQotCQ0KLQkvLyBBY3Rpb24NCi0JLy8tLS0tLS0tDQotCUlMb2dFbnRyeVByb3BlcnR5IHByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0FDVElPTik7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlBY3Rpb24gPSBwcm9wZXJ0eTsNCi0JfQ0KLQ0KLQkvLyBJZA0KLQkvLy0tLQ0KLQlwcm9wZXJ0eSA9IF9sb2dFbnRyeS5nZXRQcm9wZXJ0eShVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19JRCk7DQotDQotCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7DQotCQlfcHJvcGVydHlJRCA9IHByb3BlcnR5Ow0KLQl9DQotDQotCS8vIFR5cGUgIA0KLQkvLy0tLS0tDQotCXByb3BlcnR5ID0gX2xvZ0VudHJ5LmdldFByb3BlcnR5KFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1RZUEUpOw0KLQ0KLQlpZiAocHJvcGVydHkgIT0gbnVsbCkgew0KLQkJX3Byb3BlcnR5VHlwZSA9IHByb3BlcnR5Ow0KLQl9DQotCQkNCi0JSUxvZ0VudHJ5W10gZW50cmllcyA9IGxvZ0VudHJ5LmdldENoaWxkRW50cmllcygpOw0KLQ0KLQkvLyBQYXJjZWxzDQotCS8vLS0tLS0tLS0JDQotCWludCBpSW5kZXggPSAwOw0KLQlVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIHBhcmNlbCA9IG51bGw7DQotCQ0KLQlmb3IoIGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyArK2kpIHsNCi0JCWlmIChlbnRyaWVzW2ldICE9IG51bGwgJiYgZW50cmllc1tpXS5nZXROYW1lKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX1BBUkNFTCkgPT0gdHJ1ZSkgew0KLQkJCXBhcmNlbCA9IG5ldyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsKCBlbnRyaWVzW2ldICk7CQkJDQotCSAgICAgICAgX2FsUGFyY2Vscy5hZGQoIHBhcmNlbCApOw0KLQ0KLQkgICAgICAgIHBhcmNlbC5idWlsZFRyZWVGcm9tTG9nKCBlbnRyaWVzW2ldICk7DQotCQl9DQotCX0NCi0NCi0JLy8gT3BlcmF0aW9ucw0KLQkvLy0tLS0tLS0tLS0tDQotCWlJbmRleCA9IDA7DQotCVVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsNCi0JDQotCWZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KLQkJaWYgKGVudHJpZXNbaV0gIT0gbnVsbCAmJiBlbnRyaWVzW2ldLmdldE5hbWUoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfT1BFUkFUSU9OKSA9PSB0cnVlKSB7DQotCQkJb3BlcmF0aW9uID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24oIGVudHJpZXNbaV0gKTsJCQkNCi0JICAgICAgICBfYWxPcGVyYXRpb25zLmFkZCggb3BlcmF0aW9uICk7DQotDQotCSAgICAgICAgb3BlcmF0aW9uLmJ1aWxkVHJlZUZyb21Mb2coIGVudHJpZXNbaV0gKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24NCi0gKiBAcGFyYW0gYWN0aW9uVHlwZSBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24gY3JlYXRlT3BlcmF0aW9uKCkgew0KLQ0KLQkvLyBDcmVhdGUgYSBuZXcgbG9nIGVudHJ5DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSUxvZ0VudHJ5IGxvZ0VudHJ5Q2hpbGQgPSBuZXcgTG9nRW50cnkoIF9sb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfT1BFUkFUSU9OICk7DQotCV9sb2dFbnRyeS5hZGRDaGlsZEVudHJ5KCBsb2dFbnRyeUNoaWxkICk7DQotDQotCS8vIENyZWF0ZSB0aGUgb3BlcmF0aW9uIG9iamVjdA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiBvcGVyYXRpb24gPSBuZXcgVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbiggbG9nRW50cnlDaGlsZCApOw0KLQlfYWxPcGVyYXRpb25zLmFkZCggb3BlcmF0aW9uICk7DQotCQ0KLQlyZXR1cm4gb3BlcmF0aW9uOw0KLX0NCi0vKioNCi0gKiBDcmVhdGVzIGEgc3ViLXBhcmNlbA0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclBhcmNlbA0KLSAqIEBwYXJhbSBhY3Rpb25UeXBlIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBjcmVhdGVQYXJjZWwoKSB7DQotDQotCS8vIENyZWF0ZSBhIG5ldyBsb2cgZW50cnkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJTG9nRW50cnkgbG9nRW50cnlDaGlsZCA9IG5ldyBMb2dFbnRyeSggX2xvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19QQVJDRUwgKTsNCi0JX2xvZ0VudHJ5LmFkZENoaWxkRW50cnkoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0NCi0JLy8gQ3JlYXRlIHRoZSBwYXJjZWwgb2JqZWN0DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVTVNlc3Npb25NYW5hZ2VyUGFyY2VsIHBhcmNlbCA9IG5ldyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsKCBsb2dFbnRyeUNoaWxkICk7DQotCV9hbFBhcmNlbHMuYWRkKCBwYXJjZWwgKTsNCi0JDQotCXJldHVybiBwYXJjZWw7DQotfQ0KLS8qKg0KLSAqIEV4ZWN1dGUgYW55IHBlbmRpbmcgb3IgZmFpbGVkIHVwZGF0ZXMuDQotICovDQotcHVibGljIGJvb2xlYW4gZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQkvLyBTdG9wIGlmIGFueSBmYWlsdXJlIG9jY3Vycw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlib29sZWFuIGJTdWNjZXNzID0gdHJ1ZTsNCi0NCi0JLy8gUGFyY2VscyBtYXkgYmUgc2VxdWVudGlhbCwgZG8gaW4gZm9yd2FyZCBvcmRlcg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSAwOyBpIDwgX2FsUGFyY2Vscy5zaXplKCk7ICsraSkgew0KLQ0KLQkJaWYgKCgoVU1TZXNzaW9uTWFuYWdlclBhcmNlbCkgX2FsUGFyY2Vscy5nZXQoaSkpLmV4ZWN1dGUocHJvZ3Jlc3NNb25pdG9yKSA9PSBmYWxzZSkgew0KLQkJCWJTdWNjZXNzID0gZmFsc2U7DQotCQkJYnJlYWs7DQotCQl9DQotCX0NCi0NCi0JLy8gT3BlcmF0aW9ucyBtYXkgYmUgc2VxdWVudGlhbCwgZG8gaW4gZm9yd2FyZCBvcmRlcg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChiU3VjY2VzcyA9PSB0cnVlKSB7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9hbE9wZXJhdGlvbnMuc2l6ZSgpOyArK2kpIHsNCi0NCi0JCQlpZiAoKChVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uKSBfYWxPcGVyYXRpb25zLmdldChpKSkuZXhlY3V0ZShwcm9ncmVzc01vbml0b3IpID09IGZhbHNlKSB7DQotCQkJCWJTdWNjZXNzID0gZmFsc2U7DQotCQkJCWJyZWFrOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQ0KLQkvLyBTdGF0dXMNCi0JLy8tLS0tLS0tDQotCXNldFN0YXR1cyhiU3VjY2VzcyA9PSB0cnVlID8gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEKTsNCi0NCi0JaW5jcmVtZW50QXR0ZW1wdENvdW50KCk7DQotDQotCXJldHVybiBiU3VjY2VzczsNCi19DQotLyoqDQotICogRXhlY3V0ZSBhbnkgcGVuZGluZyBvciBmYWlsZWQgdXBkYXRlcy4NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlVW5kbyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JLy8gVW5kbyBvbmx5IGZhaWxlZCBhdHRlbXB0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEKSA9PSBmYWxzZSkgew0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0NCi0JLy8gQXR0ZW1wdCBhbGwgZXZlbiBpZiBmYWlsdXJlIG9jY3Vycw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQ0KLQlib29sZWFuIGJTdWNjZXNzID0gdHJ1ZTsNCi0NCi0JLy8gUGFyY2VscyBtYXkgYmUgc2VxdWVudGlhbCwgdW5kbyBpbiByZXZlcnNlIG9yZGVyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gX2FsUGFyY2Vscy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KLQ0KLQkJaWYgKCgoVU1TZXNzaW9uTWFuYWdlclBhcmNlbCkgX2FsUGFyY2Vscy5nZXQoaSkpLmV4ZWN1dGVVbmRvKHByb2dyZXNzTW9uaXRvcikgPT0gZmFsc2UpIHsNCi0JCQliU3VjY2VzcyA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCS8vIE9wZXJhdGlvbnMgbWF5IGJlIHNlcXVlbnRpYWwsIHVuZG8gaW4gcmV2ZXJzZSBvcmRlcg0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JZm9yIChpbnQgaSA9IF9hbE9wZXJhdGlvbnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsNCi0NCi0JCWlmICgoKFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb24pIF9hbE9wZXJhdGlvbnMuZ2V0KGkpKS5leGVjdXRlVW5kbyhwcm9ncmVzc01vbml0b3IpID09IGZhbHNlKSB7DQotCQkJYlN1Y2Nlc3MgPSBmYWxzZTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBTdGF0dXMNCi0JLy8tLS0tLS0tDQotCXNldFN0YXR1cyhiU3VjY2VzcyA9PSB0cnVlID8gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEX1VORE9fU1VDQ0VFREVEIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfRkFJTEVEX1VORE9fRkFJTEVEKTsNCi0NCi0JcmVzZXRBdHRlbXB0Q291bnQoKTsNCi0NCi0JcmV0dXJuIGJTdWNjZXNzOw0KLX0NCi0vKioNCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgU3RyaW5nIGdldEFjdGlvbigpIHsNCi0JDQotCXJldHVybiBfcHJvcGVydHlBY3Rpb24uZ2V0VmFsdWUoKTsNCi19DQotLyoqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRJZCgpIHsNCi0JDQotCXJldHVybiBfcHJvcGVydHlJRC5nZXRWYWx1ZSgpOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGFsbCBvcGVyYXRpb25zDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uW10NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlck9wZXJhdGlvbltdIGdldE9wZXJhdGlvbnMoKSB7DQotDQotCVVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb25bXSBvcGVyYXRpb25zID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb25bX2FsT3BlcmF0aW9ucy5zaXplKCldOw0KLQlyZXR1cm4gKFVNU2Vzc2lvbk1hbmFnZXJPcGVyYXRpb25bXSlfYWxPcGVyYXRpb25zLnRvQXJyYXkoIG9wZXJhdGlvbnMgKTsNCi19DQotLyoqDQotICogUmV0dXJucyBhbGwgc3ViLXBhcmNlbHMNCi0gKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJQYXJjZWxbXQ0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyUGFyY2VsW10gZ2V0UGFyY2VscygpIHsNCi0NCi0JVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdIHBhcmNlbHMgPSBuZXcgVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtfYWxQYXJjZWxzLnNpemUoKV07DQotCXJldHVybiAoVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdKV9hbFBhcmNlbHMudG9BcnJheSggcGFyY2VscyApOw0KLX0NCi0vKioNCi0gKiBAcGFyYW0gc3RyYiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyDQotICogQHBhcmFtIGlJbmRlbnRhdGlvbiBpbnQNCi0gKi8NCi1wdWJsaWMgdm9pZCBnZXRTdGF0dXNTdHJpbmcoamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJiLCBpbnQgaUluZGVudGF0aW9uKSB7DQotDQotCWlmIChnZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKSB7DQotCQlyZXR1cm47DQotCX0NCi0NCi0JZWxzZSB7DQotCQkvLyBQYXJjZWwgbGFiZWwNCi0JCS8vLS0tLS0tLS0tLS0tLQ0KLQkJSUluc3RhbGxhYmxlIGRlc2NyaXB0b3IgPSAoSUluc3RhbGxhYmxlKSBnZXREYXRhKCk7DQotDQotCQlpbmRlbnQoc3RyYiwgaUluZGVudGF0aW9uKTsNCi0JCXN0cmIuYXBwZW5kKCBkZXNjcmlwdG9yLmdldExhYmVsKCkpOw0KLQ0KLQ0KLQkJLy8gUGFyY2VscyBtYXkgYmUgc2VxdWVudGlhbCwgZG8gaW4gZm9yd2FyZCBvcmRlcg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBfYWxQYXJjZWxzLnNpemUoKTsgKytpKSB7DQotDQotCQkJKChVTVNlc3Npb25NYW5hZ2VyUGFyY2VsKSBfYWxQYXJjZWxzLmdldChpKSkuZ2V0U3RhdHVzU3RyaW5nKHN0cmIsIGlJbmRlbnRhdGlvbiArIDIpOw0KLQkJfQ0KLQ0KLQkJLy8gT3BlcmF0aW9ucyBtYXkgYmUgc2VxdWVudGlhbCwgZG8gaW4gZm9yd2FyZCBvcmRlcg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBfYWxPcGVyYXRpb25zLnNpemUoKTsgKytpKSB7DQotDQotCQkJKChVTVNlc3Npb25NYW5hZ2VyT3BlcmF0aW9uKSBfYWxPcGVyYXRpb25zLmdldChpKSkuZ2V0U3RhdHVzU3RyaW5nKHN0cmIsIGlJbmRlbnRhdGlvbiArIDIpOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsNCi0JDQotCXJldHVybiBfcHJvcGVydHlUeXBlLmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqDQotICovDQotcHVibGljIHZvaWQgc2V0QWN0aW9uKCBTdHJpbmcgc3RyQWN0aW9uICkgew0KLQlfcHJvcGVydHlBY3Rpb24uc2V0VmFsdWUoIHN0ckFjdGlvbiAhPSBudWxsID8gc3RyQWN0aW9uIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRJZCggU3RyaW5nIHN0cklEICkgew0KLQlfcHJvcGVydHlJRC5zZXRWYWx1ZSggc3RySUQgIT0gbnVsbCA/IHN0cklEIDogVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfRU1QVFkgKTsNCi19DQotLyoqDQotICoNCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRUeXBlKCBTdHJpbmcgc3RyVHlwZSApIHsNCi0JX3Byb3BlcnR5VHlwZS5zZXRWYWx1ZSggc3RyVHlwZSAhPSBudWxsID8gc3RyVHlwZSA6IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RSSU5HX0VNUFRZICk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVU1TZXNzaW9uTWFuYWdlclNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY5ODU1YS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLio7DQotaW1wb3J0IGphdmEudXRpbC5EYXRlOw0KLWltcG9ydCBqYXZhLnV0aWwuKjsNCi0NCi0vKioNCi0gKiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzZXNzaW9uIGluIHdoaWNoIHVwZGF0ZSBtYW5hZ2VyIG9wZXJhdGlvbnMgYXJlDQotICogZXhlY3V0ZWQuICBUaGlzIGNsYXNzIGNvbnRhaW5zIHBhcmNlbCBvYmplY3RzIGFuZCBoYXMgc3RhdHVzIGFuZCB0aW1lc3RhbXANCi0gKiBhcyBpdHMgYXR0cmlidXRlcy4gIFRoZSB0aW1lc3RhbXAgYXR0cmlidXRlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHdoZW4gdGhlIHNlc3Npb24NCi0gKiBpcyBjcmVhdGVkIGZvciB0aGUgZmlyc3QgdGltZS4NCi0gKi8NCi0NCi1wdWJsaWMgY2xhc3MgVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gZXh0ZW5kcyBVTVNlc3Npb25NYW5hZ2VyRW50cnkgew0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0IF9hbFBhcmNlbHMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCXByb3RlY3RlZCBJTG9nRW50cnlQcm9wZXJ0eSBfcHJvcGVydHlUaW1lc3RhbXAgPSBudWxsOw0KLS8qKg0KLSAqIFVwZGF0ZU1hbmFnZXJTZXNzaW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uKElMb2dFbnRyeSBsb2dFbnRyeSkgew0KLQlzdXBlciggbG9nRW50cnkgKTsNCi0NCi0JLy8gVGltZXN0YW1wDQotCS8vLS0tLS0tLS0tLQ0KLQlfcHJvcGVydHlUaW1lc3RhbXAgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVElNRVNUQU1QKTsNCi0NCi0JaWYgKF9wcm9wZXJ0eVRpbWVzdGFtcCA9PSBudWxsKSB7DQotCQlfcHJvcGVydHlUaW1lc3RhbXAgPSBuZXcgTG9nRW50cnlQcm9wZXJ0eShsb2dFbnRyeSwgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVElNRVNUQU1QLCBuZXcgRGF0ZSgpLnRvU3RyaW5nKCkgKTsNCi0JCWxvZ0VudHJ5LmFkZFByb3BlcnR5KCBfcHJvcGVydHlUaW1lc3RhbXAgKTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBAcGFyYW0gbG9nRW50cnkgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuTG9nRW50cnkNCi0gKi8NCi1wdWJsaWMgdm9pZCBidWlsZFRyZWVGcm9tTG9nKElMb2dFbnRyeSBsb2dFbnRyeSkgew0KLQkNCi0Jc3VwZXIuYnVpbGRUcmVlRnJvbUxvZyggbG9nRW50cnkgKTsNCi0JDQotCS8vIFRpbWVzdGFtcA0KLQkvLy0tLS0tLS0tLS0NCi0JSUxvZ0VudHJ5UHJvcGVydHkgcHJvcGVydHkgPSBfbG9nRW50cnkuZ2V0UHJvcGVydHkoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfVElNRVNUQU1QKTsNCi0NCi0JaWYgKHByb3BlcnR5ICE9IG51bGwpIHsNCi0JCV9wcm9wZXJ0eVRpbWVzdGFtcCA9IHByb3BlcnR5Ow0KLQl9DQotDQotCQ0KLQlJTG9nRW50cnlbXSBlbnRyaWVzID0gbG9nRW50cnkuZ2V0Q2hpbGRFbnRyaWVzKCk7DQotCQ0KLQkvLyBQYXJjZWxzDQotCS8vLS0tLS0tLS0NCi0JaW50IGlJbmRleCA9IDA7DQotCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsID0gbnVsbDsNCi0JDQotCWZvciggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7ICsraSkgew0KLQkJaWYgKGVudHJpZXNbaV0gIT0gbnVsbCAmJiBlbnRyaWVzW2ldLmdldE5hbWUoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVFJJTkdfUEFSQ0VMKSA9PSB0cnVlKSB7DQotCQkJcGFyY2VsID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwoIGVudHJpZXNbaV0gKTsJCQkNCi0JICAgICAgICBfYWxQYXJjZWxzLmFkZCggcGFyY2VsICk7DQotDQotCSAgICAgICAgcGFyY2VsLmJ1aWxkVHJlZUZyb21Mb2coIGVudHJpZXNbaV0gKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVU1UYXNrTWFuYWdlclBhcmNlbA0KLSAqIEBwYXJhbSBhY3Rpb25UeXBlIGphdmEubGFuZy5TdHJpbmcNCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclBhcmNlbCBjcmVhdGVQYXJjZWwoKSB7DQotDQotCS8vIENyZWF0ZSBhIG5ldyBsb2cgZW50cnkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJTG9nRW50cnkgbG9nRW50cnlDaGlsZCA9IG5ldyBMb2dFbnRyeSggX2xvZ0VudHJ5LCBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUUklOR19QQVJDRUwgKTsNCi0JX2xvZ0VudHJ5LmFkZENoaWxkRW50cnkoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0NCi0JLy8gQ3JlYXRlIHRoZSBjb3B5IG9iamVjdA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwoIGxvZ0VudHJ5Q2hpbGQgKTsNCi0JX2FsUGFyY2Vscy5hZGQoIHBhcmNlbCApOw0KLQkNCi0JcmV0dXJuIHBhcmNlbDsNCi19DQotLyoqDQotICogRXhlY3V0ZSBhbnkgcGVuZGluZyBvciBmYWlsZWQgdXBkYXRlcy4NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7DQotDQotCS8vIEF0dGVtcHQgYWxsIGV2ZW4gaWYgZmFpbHVyZSBvY2N1cnMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkNCi0JYm9vbGVhbiBiU3VjY2VzcyA9IHRydWU7DQotDQotCS8vIFBhcmNlbHMgbWF5IGJlIHNlcXVlbnRpYWwsIGRvIGluIGZvcndhcmQgb3JkZXINCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IF9hbFBhcmNlbHMuc2l6ZSgpOyArK2kpIHsNCi0NCi0JCWlmICgoKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwpIF9hbFBhcmNlbHMuZ2V0KGkpKS5leGVjdXRlKHByb2dyZXNzTW9uaXRvcikgPT0gZmFsc2UpIHsNCi0JCQliU3VjY2VzcyA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCS8vIFN0YXR1cw0KLQkvLy0tLS0tLS0NCi0Jc2V0U3RhdHVzKGJTdWNjZXNzID09IHRydWUgPyBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19TVUNDRUVERUQgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpOw0KLQ0KLQlpbmNyZW1lbnRBdHRlbXB0Q291bnQoKTsNCi0NCi0JcmV0dXJuIGJTdWNjZXNzOw0KLX0NCi0vKioNCi0gKiBFeGVjdXRlIGFueSBwZW5kaW5nIG9yIGZhaWxlZCB1cGRhdGVzLg0KLSAqLw0KLXB1YmxpYyBib29sZWFuIGV4ZWN1dGVVbmRvKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgew0KLQ0KLQkvLyBVbmRvIG9ubHkgZmFpbGVkIGF0dGVtcHRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKGdldFN0YXR1cygpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRUQpID09IGZhbHNlKSB7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkNCi0JLy8gQXR0ZW1wdCBhbGwgZXZlbiBpZiBmYWlsdXJlIG9jY3Vycw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCQ0KLQlib29sZWFuIGJTdWNjZXNzID0gdHJ1ZTsNCi0NCi0JLy8gUGFyY2VscyBtYXkgYmUgc2VxdWVudGlhbCwgdW5kbyBpbiByZXZlcnNlIG9yZGVyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gX2FsUGFyY2Vscy5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgew0KLQ0KLQkJaWYgKCgoVU1TZXNzaW9uTWFuYWdlclBhcmNlbCkgX2FsUGFyY2Vscy5nZXQoaSkpLmV4ZWN1dGVVbmRvKHByb2dyZXNzTW9uaXRvcikgPT0gZmFsc2UpIHsNCi0JCQliU3VjY2VzcyA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotCS8vIFN0YXR1cw0KLQkvLy0tLS0tLS0NCi0Jc2V0U3RhdHVzKGJTdWNjZXNzID09IHRydWUgPyBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19TVUNDRUVERUQgOiBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19GQUlMRUQpOw0KLQ0KLQlyZXNldEF0dGVtcHRDb3VudCgpOw0KLQkNCi0JcmV0dXJuIGJTdWNjZXNzOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGFsbCBwYXJjZWxzDQotICogQHJldHVybiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwuY29yZS5VTVNlc3Npb25NYW5hZ2VyUGFyY2VsW10NCi0gKi8NCi1wdWJsaWMgVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdIGdldFBhcmNlbHMoKSB7DQotDQotCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWxbXSBwYXJjZWxzID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWxbX2FsUGFyY2Vscy5zaXplKCldOw0KLQlyZXR1cm4gKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWxbXSlfYWxQYXJjZWxzLnRvQXJyYXkoIHBhcmNlbHMgKTsNCi19DQotLyoqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRTdGF0dXNTdHJpbmcoKSB7DQotCQ0KLQlTdHJpbmdCdWZmZXIgc3RyYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0NCi0JZ2V0U3RhdHVzU3RyaW5nKCBzdHJiLCAwICk7DQotCQ0KLQlyZXR1cm4gc3RyYi50b1N0cmluZygpOw0KLX0NCi0vKioNCi0gKiBAcGFyYW0gc3RyYiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyDQotICogQHBhcmFtIGlJbmRlbnRhdGlvbiBpbnQNCi0gKi8NCi1wdWJsaWMgdm9pZCBnZXRTdGF0dXNTdHJpbmcoamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzdHJiLCBpbnQgaUluZGVudGF0aW9uKSB7DQotDQotCVN0cmluZyBzdHJTdGF0dXMgPSBnZXRTdGF0dXMoKTsNCi0NCi0JaWYgKHN0clN0YXR1cy5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKSB7DQotCQlzdHJiLmFwcGVuZChVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfSW5zdGFsbGF0aW9uc19oYXZlX2NvbXBsZXRlZF9zdWNjZXNzZnVsbHkiKSk7DQotCQlzdHJiLmFwcGVuZCgiXG4iKTsNCi0JCXN0cmIuYXBwZW5kKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19Zb3VfbXVzdF9yZXN0YXJ0X3RoZV93b3JrYmVuY2hfdG9fYWN0aXZhdGVfYW55X2NoYW5nZXMiKSk7DQotCX0NCi0NCi0JZWxzZSB7DQotCQlzdHJiLmFwcGVuZChVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfQW5faW5zdGFsbGF0aW9uX2Vycm9yX29yX2NhbmNlbGxhdGlvbl9oYXNfb2NjdXJyZWQiKSk7DQotDQotCQkvLyBQYXJjZWxzIG1heSBiZSBzZXF1ZW50aWFsLCBkbyBpbiBmb3J3YXJkIG9yZGVyDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlmb3IgKGludCBpID0gMDsgaSA8IF9hbFBhcmNlbHMuc2l6ZSgpOyArK2kpIHsNCi0NCi0JCQkoKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwpIF9hbFBhcmNlbHMuZ2V0KGkpKS5nZXRTdGF0dXNTdHJpbmcoc3RyYiwgMik7DQotCQl9DQotCX0NCi19DQotLyoqDQotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nDQotICovDQotcHVibGljIFN0cmluZyBnZXRUaW1lc3RhbXAoKSB7DQotCQ0KLQlyZXR1cm4gX3Byb3BlcnR5VGltZXN0YW1wLmdldFZhbHVlKCk7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgd2hldGhlciB0aGlzIHNlc3Npb24gaXMgY29tcGxldGUNCi0gKiBAcmV0dXJuIGJvb2xlYW4NCi0gKi8NCi1wdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgew0KLQ0KLQlyZXR1cm4gX3Byb3BlcnR5U3RhdHVzLmdldFZhbHVlKCkuZXF1YWxzKFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuU1RBVFVTX1NVQ0NFRURFRCkgfHwNCi0JCSAgIF9wcm9wZXJ0eVN0YXR1cy5nZXRWYWx1ZSgpLmVxdWFscyhVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlNUQVRVU19GQUlMRURfVU5ET19TVUNDRUVERUQpOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMSGFuZGxlci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVVJMSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGVlZDY5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VSTEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2Lmh0dHAuY2xpZW50Lio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndlYmRhdi5jbGllbnQuV2ViREFWRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud2ViZGF2LkNvbnRleHQ7DQotaW1wb3J0IGphdmEuaW8uKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0NCi1wdWJsaWMgY2xhc3MgVVJMSGFuZGxlciBleHRlbmRzIEJhc2VVUkxIYW5kbGVyIHsNCi0NCi0JcHJpdmF0ZSBzdGF0aWMgSHR0cENsaWVudCBodHRwID0gbnVsbDsNCi0JcHJpdmF0ZSBzdGF0aWMgV2ViREFWRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsNCi0JDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQID0gImh0dHAiOw0KLQkNCi0Jc3RhdGljIGNsYXNzIFJlc3BvbnNlIGV4dGVuZHMgQmFzZVVSTEhhbmRsZXIuUmVzcG9uc2Ugew0KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS53ZWJkYXYuaHR0cC5jbGllbnQuUmVzcG9uc2UgciA9IG51bGw7DQotCQlwcml2YXRlIFJlc3BvbnNlKG9yZy5lY2xpcHNlLndlYmRhdi5odHRwLmNsaWVudC5SZXNwb25zZSByKSB7DQotCQkJdGhpcy5yID0gcjsNCi0JCX0NCi0JCXB1YmxpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkJcmV0dXJuIHIuZ2V0SW5wdXRTdHJlYW0oKTsNCi0JCX0NCi0JCXB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7DQotCQkJcmV0dXJuIHIuZ2V0Q29udGVudExlbmd0aCgpOw0KLQkJfQ0KLQkJcHVibGljIGludCBnZXRSZXNwb25zZUNvZGUoKSB7DQotCQkJcmV0dXJuIHIuZ2V0U3RhdHVzQ29kZSgpOw0KLQkJfQ0KLQkJcHVibGljIFN0cmluZyBnZXRSZXNwb25zZU1lc3NhZ2UoKSB7DQotCQkJcmV0dXJuIHIuZ2V0U3RhdHVzTWVzc2FnZSgpOw0KLQkJfQ0KLQl9DQotDQotcHJpdmF0ZSBVUkxIYW5kbGVyKCkge30NCi1wdWJsaWMgc3RhdGljIEJhc2VVUkxIYW5kbGVyLlJlc3BvbnNlIG9wZW4oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0NCi0JaWYgKHVybD09bnVsbCkgcmV0dXJuIG51bGw7DQotDQotCWlmICghdXJsLmdldFByb3RvY29sKCkuZXF1YWxzKEhUVFApKSB7DQotCQlVUkxDb25uZWN0aW9uIGMgPSB1cmwub3BlbkNvbm5lY3Rpb24oKTsNCi0JCUNvbnRleHQgY3R4ID0gZmFjdG9yeS5uZXdDb250ZXh0KCk7DQotCQlpbnQgaSA9IDE7DQotCQlTdHJpbmcgbmFtZSA9IG51bGw7DQotCQl3aGlsZSAoKG5hbWUgPSBjLmdldEhlYWRlckZpZWxkS2V5KGkpKSAhPSBudWxsKSB7DQotCQkJY3R4LnB1dChuYW1lLnRvTG93ZXJDYXNlKCksIGMuZ2V0SGVhZGVyRmllbGQoaSkpOw0KLQkJCWkrKzsNCi0JCX0JDQotCQlJbnB1dFN0cmVhbSBpcyA9IGMuZ2V0SW5wdXRTdHJlYW0oKTsJDQotCQlyZXR1cm4gbmV3IFJlc3BvbnNlKG5ldyBvcmcuZWNsaXBzZS53ZWJkYXYuaHR0cC5jbGllbnQuUmVzcG9uc2UoVU5LTk9XTl9TVEFUVVMsVU5LTk9XTl9NU0csY3R4LGlzKSk7DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoaHR0cD09bnVsbCkgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfSFRUUF9jbGllbnRfbm90X3NldCIpKTsJDQotCQlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCgiR0VUIiwgdXJsLCBudWxsKTsNCi0JCXJldHVybiBuZXcgUmVzcG9uc2UoaHR0cC5pbnZva2UocmVxdWVzdCkpOw0KLQl9CQ0KLX0NCi1wcm90ZWN0ZWQgQmFzZVVSTEhhbmRsZXIuUmVzcG9uc2Ugb3BlblVSTChVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlyZXR1cm4gVVJMSGFuZGxlci5vcGVuKHVybCk7DQotfQ0KLXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRIdHRwQ2xpZW50KEh0dHBDbGllbnQgYykgew0KLQ0KLQlpZiAoaHR0cD09bnVsbCkgew0KLQkJaHR0cCA9IGM7DQotCQlmYWN0b3J5ID0gbmV3IFdlYkRBVkZhY3RvcnkoKTsNCi0NCi0JCS8vIHNldHVwIHRoaXMgaGFuZGxlciBhcyB0aGUgaGFuZGxlciBmb3IgYm9vdCBwb3J0aW9uIG9mIHVwZGF0ZSBtYW5hZ2VyDQotCQlCYXNlVVJMSGFuZGxlci5zZXRVUkxIYW5kbGVyKG5ldyBVUkxIYW5kbGVyKCkpOw0KLQl9DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvY29yZS9VcGRhdGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NTY4ODQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEuaW8uRmlsZTsNCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLm5ldC5VUkw7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QuTGF1bmNoSW5mbzsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LkxhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JQ29tcG9uZW50RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklGcmFnbWVudEVudHJ5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JSW5zdGFsbGFibGU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSVBsdWdpbkVudHJ5RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JUHJvZHVjdERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSVVNUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSVVSTE5hbWVQYWlyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLkxvZ1N0b3JlRXhjZXB0aW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLlVNRWNsaXBzZVRyZWU7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuVU1SZWdpc3RyeU1hbmFnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuVXBkYXRlTWFuYWdlckNvbnN0YW50czsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOw0KLWltcG9ydCBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkuSmFyVmVyaWZpY2F0aW9uU2VydmljZTsNCi0NCi0vKioNCi0gKiBVcGRhdGUgTWFuYWdlciB1cGRhdGVzIGEgd29ya3N0YXRpb24gaW4gb25lIG9mIHRocmVlIG1vZGVzOg0KLSAqIDxvbD4NCi0gKiA8bGk+bG9jYWw8L2xpPg0KLSAqIDxsaT5yZW1vdGU8L2xpPg0KLSAqIDxsaT5yZW1vdGUgY2FjaGVkPC9saT4NCi0gKiA8L29sPg0KLSAqIFVzYWdlOg0KLSAqIDxvbD4NCi0gKiA8bGk+Q3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3M8L2xpPg0KLSAqIDxsaT5TZXQgcGVyc2lzdGVudCBwcm9wZXJ0aWVzIGFzIHJlcXVpcmVkPC9saT4NCi0gKiA8dWw+DQotICogPGxpPm1vZGU8L2xpPg0KLSAqIDxsaT51cGRhdGUgbG9nIFVSTDwvbGk+DQotICogPGxpPmhpc3RvcnkgbG9nIFVSTDwvbGk+DQotICogPC91bD4NCi0gKiA8bGk+Q2FsbCB0aGUgaW5pdGlhbGl6ZSBmdW5jdGlvbjwvbGk+DQotICogPGxpPkNhbGwgdGhlIHVwZGF0ZSBmdW5jdGlvbjwvbGk+DQotICogPC9vbD4NCi0gKiBQZXJzaXN0ZW50IHByb3BlcnRpZXMgYXJlIGxvYWRlZCBiZWZvcmUgYW55IGFyZSBjaGFuZ2VkLCBhbmQgc2F2ZWQgYWZ0ZXIgYW55DQotICogYXJlIGNoYW5nZWQuDQotICovDQotDQotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXIgew0KLQ0KLQkvLyBQYWNrYWdlIG5hbWUgZm9yIHRoaXMgY2xhc3MNCi0JLy8gVXNlZCBieSBVcGRhdGVNYW5hZ2VyU3RyaW5ncyB0byBvYnRhaW4gaXRzIHJlc291cmNlIGJ1bmRsZSBwcm9wZXJ0aWVzIGZpbGUNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgX3N0clBhY2thZ2VOYW1lID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlIjsNCi0JcHVibGljIHN0YXRpYyBVcGRhdGVNYW5hZ2VyIF91cGRhdGVNYW5hZ2VySW5zdGFuY2UgPSBudWxsOw0KLQkNCi0JLy8gUGVyc2lzdGVudCBwcm9wZXJ0aWVzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlwcm90ZWN0ZWQgaW50ICAgIF9pTW9kZSAgICAgICAgID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5NT0RFX0xPQ0FMOw0KLQlwcm90ZWN0ZWQgU3RyaW5nIF9zdHJVcGRhdGVMb2dVUkwgID0gbnVsbDsNCi0JcHJvdGVjdGVkIFN0cmluZyBfc3RySGlzdG9yeUxvZ1VSTCA9IG51bGw7DQotDQotCS8vIEluc3RhbmNlIHN0YXRlIGRhdGENCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlwcm90ZWN0ZWQgVU1SZWdpc3RyeU1hbmFnZXIgX3JlZ2lzdHJ5TWFuYWdlciA9IG51bGw7DQotCXByb3RlY3RlZCBVTVNlc3Npb25NYW5hZ2VyICBfc2Vzc2lvbk1hbmFnZXIgID0gbnVsbDsNCi0JcHJvdGVjdGVkIFNoZWxsICAgICAgICAgICAgIF9zaGVsbCAgICAgICAgICAgPSBudWxsOw0KLQkNCi0JcHJvdGVjdGVkIEphclZlcmlmaWNhdGlvblNlcnZpY2UgX2phclZlcmlmaWVyID0gbnVsbDsNCi0vKioNCi0gKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MsIHRoZW4gaW5pdGlhbGl6ZXMgYnkgbG9hZGluZyBpdHMgcGVyc2lzdGVudCBwcm9wZXJ0aWVzDQotICovDQotcHVibGljIFVwZGF0ZU1hbmFnZXIoKSB7DQotfQ0KLS8qKg0KLSAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgdGhlbiBpbml0aWFsaXplcyBieSBsb2FkaW5nIGl0cyBwZXJzaXN0ZW50IHByb3BlcnRpZXMNCi0gKi8NCi1wdWJsaWMgVXBkYXRlTWFuYWdlciggU2hlbGwgc2hlbGwgKSB7DQotCV91cGRhdGVNYW5hZ2VySW5zdGFuY2UgPSB0aGlzOw0KLQlfc2hlbGwgPSBzaGVsbDsNCi19DQotLyoqDQotICogRGVsZXRlcyBhbGwgZmlsZXMgaW4gdGhlIHN0YWdpbmcgYXJlYS4NCi0gKi8NCi1wdWJsaWMgdm9pZCBjbGVhbnVwKCkgew0KLQlTdHJpbmcgc3RyU3RhZ2luZ0RpcmVjdG9yeSA9IFVNRWNsaXBzZVRyZWUuZ2V0RmlsZUluUGxhdGZvcm1TdHJpbmcoVU1FY2xpcHNlVHJlZS5nZXRTdGFnaW5nQXJlYSgpKTsNCi0NCi0JRmlsZSBmaWxlU3RhZ2luZ0RpcmVjdG9yeSA9IG5ldyBGaWxlKHN0clN0YWdpbmdEaXJlY3RvcnkpOw0KLQ0KLQlpZiAoZmlsZVN0YWdpbmdEaXJlY3RvcnkuZXhpc3RzKCkgPT0gdHJ1ZSkgew0KLQkJRmlsZVtdIGZpbGVzID0gZmlsZVN0YWdpbmdEaXJlY3RvcnkubGlzdEZpbGVzKCk7DQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgKytpKSB7DQotCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkgPT0gdHJ1ZSkgew0KLQkJCQljbGVhbnVwRGlyZWN0b3J5KGZpbGVzW2ldKTsNCi0JCQl9DQotCQkJYm9vbGVhbiBiU3VjY2Vzc2Z1bCA9IGZpbGVzW2ldLmRlbGV0ZSgpOw0KLQkJCQ0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbnVwRGlyZWN0b3J5KEZpbGUgZmlsZURpcmVjdG9yeSkgew0KLQ0KLQlGaWxlW10gZmlsZXMgPSBmaWxlRGlyZWN0b3J5Lmxpc3RGaWxlcygpOw0KLQkNCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7ICsraSkgew0KLQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkgPT0gdHJ1ZSkgew0KLQkJCWNsZWFudXBEaXJlY3RvcnkoZmlsZXNbaV0pOw0KLQkJfQ0KLQ0KLQkJYm9vbGVhbiBiU3VjY2Vzc2Z1bCA9IGZpbGVzW2ldLmRlbGV0ZSgpOw0KLS8vCQlpZiAoIWJTdWNjZXNzZnVsKQ0KLS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJvb29wcyEiICsgZmlsZXNbaV0pOw0KLQl9DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBjcmVhdGVTZXNzaW9uKElJbnN0YWxsYWJsZVtdIGRlc2NyaXB0b3JzLCBib29sZWFuIGJWZXJpZnlKYXJzKSB0aHJvd3MgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbiB7DQotDQotCS8vIEZPUiBOT1cgRE8gTk9UIERPIEpBUiBWRVJJRklDQVRJT04NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQliVmVyaWZ5SmFycyA9IGZhbHNlOw0KLQ0KLQkvLyBDcmVhdGUgYSBuZXcgdXBkYXRlIHNlc3Npb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCVVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24gPSBfc2Vzc2lvbk1hbmFnZXIuY3JlYXRlVXBkYXRlU2Vzc2lvbigpOw0KLQ0KLQkvLyBDcmVhdGUgYSBkZWZpbmVyIHRoYXQgY2FuIGRlZmluZSB0aGUgb3BlcmF0aW9ucyByZXF1aXJlZA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJU2Vzc2lvbkRlZmluZXIgc2Vzc2lvbkRlZmluZXIgPSBuZXcgVU1TZXNzaW9uRGVmaW5lclJlZmVyZW5jZVVwZGF0ZSgpOw0KLQkNCi0JLy8gRGVmaW5lIGEgc2V0IG9mIG9wZXJhdGlvbnMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0Jc2Vzc2lvbkRlZmluZXIuZGVmaW5lT3BlcmF0aW9ucyhzZXNzaW9uLCBkZXNjcmlwdG9ycywgYlZlcmlmeUphcnMpOw0KLQ0KLQkvLyBTYXZlIHRoZSB1cGRhdGUgbG9nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JdHJ5IHsNCi0JCV9zZXNzaW9uTWFuYWdlci5zYXZlVXBkYXRlTG9nKCk7DQotCX0NCi0JY2F0Y2ggKExvZ1N0b3JlRXhjZXB0aW9uIGV4KSB7DQotCQl0aHJvdyBuZXcgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOw0KLQl9DQotDQotCXJldHVybiBzZXNzaW9uOw0KLX0NCi0vKioNCi0gKiBVcGRhdGVzIHRoZSBsb2NhbCBtYWNoaW5lIGJ5Og0KLSAqIDxvbD4NCi0gKiA8bGk+ZGVmaW5pbmcgdGhlIG9wZXJhdGlvbnM8L2xpPg0KLSAqIDxsaT5kb3dubG9hZGluZyBhbnkgbmV3IG9iamVjdHM8L2xpPg0KLSAqIDxsaT5hcHBseWluZyBhbnkgZG93bmxvYWRlZCB1cGRhdGVzPC9saT4NCi0gKiA8bGk+ZGlzcGxheWluZyBhIHByb2dyZXNzIG1vbml0b3I8L2xpPg0KLSAqIDwvb2w+DQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIGV4ZWN1dGVTZXNzaW9uKCBVTVNlc3Npb25NYW5hZ2VyU2Vzc2lvbiBzZXNzaW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciApIHRocm93cyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHsNCi0NCi0JLy8gVGhyb3cgYW55IGV4Y2VwdGlvbiB3aGVuIGNvbXBsZXRlDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHVtRXhjZXB0aW9uID0gbnVsbDsNCi0JDQotCS8vIEV4ZWN1dGUgdGhlIHNlc3Npb24NCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlfc2Vzc2lvbk1hbmFnZXIuZXhlY3V0ZVNlc3Npb24oIHNlc3Npb24sIHByb2dyZXNzTW9uaXRvciApOw0KLQ0KLQkvLyBNb3ZlIHN1Y2Nlc3NmdWwgc2Vzc2lvbnMgZnJvbSB1cGRhdGUgbG9nIHRvIGhpc3RvcnkgbG9nDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JdHJ5IHsNCi0JCV9zZXNzaW9uTWFuYWdlci51cGRhdGVBbmRTYXZlTG9ncygpOw0KLQl9DQotCWNhdGNoIChMb2dTdG9yZUV4Y2VwdGlvbiBleCkgew0KLQkJaWYgKHVtRXhjZXB0aW9uICE9IG51bGwpIHsNCi0JCQl1bUV4Y2VwdGlvbiA9IG5ldyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uKCJTX1VuYWJsZV90b19zYXZlX3VwZGF0ZV9sb2dzIik7DQotCQl9DQotCX0NCi0NCi0JLy8gVGhyb3cgYW55IGV4Y2VwdGlvbnMgZm91bmQNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKHVtRXhjZXB0aW9uICE9IG51bGwpIHsNCi0JCXRocm93IHVtRXhjZXB0aW9uOw0KLQl9DQotDQotCXJldHVybiBzZXNzaW9uOw0KLX0NCi0vKioNCi0gKiBVcGRhdGVzIHRoZSBsb2NhbCBtYWNoaW5lIGJ5Og0KLSAqIDxvbD4NCi0gKiA8bGk+ZGVmaW5pbmcgdGhlIG9wZXJhdGlvbnM8L2xpPg0KLSAqIDxsaT5kb3dubG9hZGluZyBhbnkgbmV3IG9iamVjdHM8L2xpPg0KLSAqIDxsaT5hcHBseWluZyBhbnkgZG93bmxvYWRlZCB1cGRhdGVzPC9saT4NCi0gKiA8bGk+ZGlzcGxheWluZyBhIHByb2dyZXNzIG1vbml0b3I8L2xpPg0KLSAqIDwvb2w+DQotICovDQotcHVibGljIFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIGV4ZWN1dGVTZXNzaW9uVW5kbyggVU1TZXNzaW9uTWFuYWdlclNlc3Npb24gc2Vzc2lvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgKSB0aHJvd3MgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbiB7DQotDQotCS8vIFRocm93IGFueSBleGNlcHRpb24gd2hlbiBjb21wbGV0ZQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVXBkYXRlTWFuYWdlckV4Y2VwdGlvbiB1bUV4Y2VwdGlvbiA9IG51bGw7DQotCQ0KLQkvLyBFeGVjdXRlIHRoZSBzZXNzaW9uDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JX3Nlc3Npb25NYW5hZ2VyLmV4ZWN1dGVTZXNzaW9uVW5kbyggc2Vzc2lvbiwgcHJvZ3Jlc3NNb25pdG9yICk7DQotDQotCS8vIE1vdmUgc3VjY2Vzc2Z1bCBzZXNzaW9ucyBmcm9tIHVwZGF0ZSBsb2cgdG8gaGlzdG9yeSBsb2cNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQl0cnkgew0KLQkJX3Nlc3Npb25NYW5hZ2VyLnVwZGF0ZUFuZFNhdmVMb2dzKCk7DQotCX0NCi0JY2F0Y2ggKExvZ1N0b3JlRXhjZXB0aW9uIGV4KSB7DQotCQlpZiAodW1FeGNlcHRpb24gIT0gbnVsbCkgew0KLQkJCXVtRXhjZXB0aW9uID0gbmV3IFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24oIlMgVW5hYmxlIHRvIHNhdmUgdXBkYXRlIGxvZ3MiKTsNCi0JCX0NCi0JfQ0KLQ0KLQkvLyBUaHJvdyBhbnkgZXhjZXB0aW9ucyBmb3VuZA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAodW1FeGNlcHRpb24gIT0gbnVsbCkgew0KLQkJdGhyb3cgdW1FeGNlcHRpb247DQotCX0NCi0NCi0JcmV0dXJuIHNlc3Npb247DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgVXBkYXRlTWFuYWdlciBnZXRDdXJyZW50SW5zdGFuY2UoKSB7DQotCXJldHVybiBfdXBkYXRlTWFuYWdlckluc3RhbmNlOw0KLX0NCi0vKioNCi0gKiBUYWtlcyBhIHN0cmluZyB3aXRoIGFuIElkICsgJ18nICsgVmVyc2lvbiwgYW5kIHJldHVybnMgdGhlIElkLg0KLSAqLw0KLXByaXZhdGUgU3RyaW5nIGdldElkRnJvbUluZm9TdHJpbmcoU3RyaW5nIHN0ckluZm8pIHsNCi0NCi0JU3RyaW5nIHN0cklkID0gbnVsbDsNCi0NCi0JaW50IGlJbmRleCA9IHN0ckluZm8ubGFzdEluZGV4T2YoJ18nKTsNCi0JDQotCWlmIChpSW5kZXggPj0gMCkgew0KLQkJc3RySWQgPSBzdHJJbmZvLnN1YnN0cmluZygwLCBpSW5kZXgpOw0KLQl9DQotDQotCWVsc2Ugew0KLQkJc3RySWQgPSBzdHJJbmZvOw0KLQl9DQotDQotCXJldHVybiBzdHJJZDsNCi19DQotLy8gcmV0dXJuIHRoZSBqYXIgdmVyaWZpZXINCi0NCi1wdWJsaWMgSmFyVmVyaWZpY2F0aW9uU2VydmljZSBnZXRKYXJWZXJpZmllcigpIHsNCi0JaWYgKF9qYXJWZXJpZmllciA9PSBudWxsKQkNCi0JCV9qYXJWZXJpZmllciA9IG5ldyBKYXJWZXJpZmljYXRpb25TZXJ2aWNlKCBfc2hlbGwgKTsNCi0JcmV0dXJuIF9qYXJWZXJpZmllcjsNCi19DQotLyoqDQotICogUmV0dXJucyBhIGxpc3Qgb2YgY29tcG9uZW50cyB0aGF0IHJlcXVpcmUgdXBkYXRpbmcgYnk6DQotICo8b2w+DQotICo8bGk+TG9hZGluZyBhbGwgcHJvZHVjdC9jb21wb25lbnQgbWFuaWZlc3RzIGZyb20gLmluc3RhbGwvdHJlZSA8L2xpPg0KLSAqPGxpPkRldGVybWluaW5nIHdoaWNoIGNvbXBvbmVudHMgcmVxdWlyZSB1cGRhdGluZyBieTo8L2xpPg0KLSAqPG9sPg0KLSAqPGxpPkNvbGxlY3RpbmcgdXBkYXRlIFVSTHMgZnJvbSBlYWNoIGNvbXBvbmVudDwvbGk+DQotICo8bGk+Q29sbGVjdGluZyB1cGRhdGUgVVJMcyBmcm9tIHByb2R1Y3RzIHRoYXQgY29tcG9uZW50cyBhcmUgYSBwYXJ0IG9mPC9saT4NCi0gKjwvb2w+DQotICo8bGk+RGV0ZXJtaW5pbmcgd2hhdCB1cGRhdGVzIGFyZSBhdmFpbGFibGUgYnk6PC9saT4NCi0gKjxvbD4NCi0gKjxsaT5BY2Nlc3NpbmcgdGhlIHVwZGF0ZSBVUkw8L2xpPg0KLSAqPGxpPkRldGVybWluaW5nIGlmIHRoZSBjb21wb25lbnQgaXMgYSBuZXdlciB2ZXJzaW9uIG9mIHRoZSBleGlzdGluZyBvbmU8L2xpPg0KLSAqPC9vbD4NCi0gKjxsaT4NCi0gKjwvb2w+DQotICovDQotcHVibGljIElVUkxOYW1lUGFpcltdIGdldExvY2FsRGlzY292ZXJ5VVJMcygpIHsNCi0NCi0JSVVSTE5hbWVQYWlyW10gdXJsTlBzID0gbnVsbDsNCi0JDQotCS8vIE9idGFpbiB0aGUgbG9jYWwgcmVnaXN0cnkNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJVU1SZWdpc3RyeSByZWdpc3RyeSA9IF9yZWdpc3RyeU1hbmFnZXIuZ2V0TG9jYWxSZWdpc3RyeSgpOw0KLQ0KLQkvLyBDcmVhdGUgYSBsaXN0IG9mIGFsbCBVUkxzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JVHJlZVNldCBzZXRVUkxzID0gbmV3IFRyZWVTZXQoIG5ldyBVcGRhdGVNYW5hZ2VyVVJMQ29tcGFyYXRvcigpICk7DQotDQotCS8vIE9idGFpbiBhIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBjb21wb25lbnRzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlDb21wb25lbnREZXNjcmlwdG9yW10gY29tcG9uZW50RGVzY3JpcHRvcnMgPSByZWdpc3RyeS5nZXRDb21wb25lbnREZXNjcmlwdG9ycygpOw0KLQ0KLQkvLyBPYnRhaW4gYSBsaXN0IG9mIGRpc2NvdmVyeSBVUkxzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnREZXNjcmlwdG9ycy5sZW5ndGg7ICsraSkgew0KLQkJdXJsTlBzID0gY29tcG9uZW50RGVzY3JpcHRvcnNbaV0uZ2V0RGlzY292ZXJ5VVJMcygpOw0KLQ0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB1cmxOUHMubGVuZ3RoOyArK2opIHsNCi0JCQlzZXRVUkxzLmFkZCh1cmxOUHNbal0pOw0KLQkJfQ0KLQl9DQotDQotCS8vIE9idGFpbiBhIGxpc3Qgb2YgYWxsIGluc3RhbGxlZCBwcm9kdWN0cw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSVByb2R1Y3REZXNjcmlwdG9yW10gcHJvZHVjdERlc2NyaXB0b3JzID0gcmVnaXN0cnkuZ2V0UHJvZHVjdERlc2NyaXB0b3JzKCk7DQotDQotCS8vIE9idGFpbiBhIGxpc3Qgb2YgZGlzY292ZXJ5IFVSTHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IHByb2R1Y3REZXNjcmlwdG9ycy5sZW5ndGg7ICsraSkgew0KLQkJdXJsTlBzID0gcHJvZHVjdERlc2NyaXB0b3JzW2ldLmdldERpc2NvdmVyeVVSTHMoKTsNCi0NCi0JCWZvciAoaW50IGogPSAwOyBqIDwgdXJsTlBzLmxlbmd0aDsgKytqKSB7DQotCQkJc2V0VVJMcy5hZGQodXJsTlBzW2pdKTsNCi0JCX0NCi0JfQ0KLQ0KLQl1cmxOUHMgPSBuZXcgSVVSTE5hbWVQYWlyWyBzZXRVUkxzLnNpemUoKSBdOw0KLQlTeXN0ZW0uYXJyYXljb3B5KHNldFVSTHMudG9BcnJheSgpLCAwLCB1cmxOUHMsIDAsIHNldFVSTHMuc2l6ZSgpICk7DQotCQ0KLQlyZXR1cm4gdXJsTlBzOw0KLX0NCi0vKioNCi0gKiBSZXR1cm5zIGEgbGlzdCBvZiBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSB1cGRhdGluZyBieToNCi0gKjxvbD4NCi0gKjxsaT5Mb2FkaW5nIGFsbCBwcm9kdWN0L2NvbXBvbmVudCBtYW5pZmVzdHMgZnJvbSAuaW5zdGFsbC90cmVlIDwvbGk+DQotICo8bGk+RGV0ZXJtaW5pbmcgd2hpY2ggY29tcG9uZW50cyByZXF1aXJlIHVwZGF0aW5nIGJ5OjwvbGk+DQotICo8b2w+DQotICo8bGk+Q29sbGVjdGluZyB1cGRhdGUgVVJMcyBmcm9tIGVhY2ggY29tcG9uZW50PC9saT4NCi0gKjxsaT5Db2xsZWN0aW5nIHVwZGF0ZSBVUkxzIGZyb20gcHJvZHVjdHMgdGhhdCBjb21wb25lbnRzIGFyZSBhIHBhcnQgb2Y8L2xpPg0KLSAqPC9vbD4NCi0gKjxsaT5EZXRlcm1pbmluZyB3aGF0IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSBieTo8L2xpPg0KLSAqPG9sPg0KLSAqPGxpPkFjY2Vzc2luZyB0aGUgdXBkYXRlIFVSTDwvbGk+DQotICo8bGk+RGV0ZXJtaW5pbmcgaWYgdGhlIGNvbXBvbmVudCBpcyBhIG5ld2VyIHZlcnNpb24gb2YgdGhlIGV4aXN0aW5nIG9uZTwvbGk+DQotICo8L29sPg0KLSAqPGxpPg0KLSAqPC9vbD4NCi0gKi8NCi1wdWJsaWMgSVVSTE5hbWVQYWlyW10gZ2V0TG9jYWxVcGRhdGVVUkxzKCkgew0KLQ0KLQlJVVJMTmFtZVBhaXJbXSB1cmxOUHMgPSBudWxsOw0KLQkNCi0JLy8gT2J0YWluIHRoZSBsb2NhbCByZWdpc3RyeQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCUlVTVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gX3JlZ2lzdHJ5TWFuYWdlci5nZXRMb2NhbFJlZ2lzdHJ5KCk7DQotDQotCS8vIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIFVSTHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlUcmVlU2V0IHNldFVSTHMgPSBuZXcgVHJlZVNldCggbmV3IFVwZGF0ZU1hbmFnZXJVUkxDb21wYXJhdG9yKCkgKTsNCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIGNvbXBvbmVudHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JSUNvbXBvbmVudERlc2NyaXB0b3JbXSBjb21wb25lbnREZXNjcmlwdG9ycyA9IHJlZ2lzdHJ5LmdldENvbXBvbmVudERlc2NyaXB0b3JzKCk7DQotDQotCS8vIE9idGFpbiBhIGxpc3Qgb2YgZGlzY292ZXJ5IFVSTHMNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbXBvbmVudERlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7DQotCQl1cmxOUHMgPSBjb21wb25lbnREZXNjcmlwdG9yc1tpXS5nZXRVcGRhdGVVUkxzKCk7DQotDQotCQlmb3IgKGludCBqID0gMDsgaiA8IHVybE5Qcy5sZW5ndGg7ICsraikgew0KLQkJCXNldFVSTHMuYWRkKHVybE5Qc1tqXSk7DQotCQl9DQotCX0NCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBhbGwgaW5zdGFsbGVkIHByb2R1Y3RzDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlJUHJvZHVjdERlc2NyaXB0b3JbXSBwcm9kdWN0RGVzY3JpcHRvcnMgPSByZWdpc3RyeS5nZXRQcm9kdWN0RGVzY3JpcHRvcnMoKTsNCi0NCi0JLy8gT2J0YWluIGEgbGlzdCBvZiBkaXNjb3ZlcnkgVVJMcw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvZHVjdERlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7DQotCQl1cmxOUHMgPSBwcm9kdWN0RGVzY3JpcHRvcnNbaV0uZ2V0VXBkYXRlVVJMcygpOw0KLQ0KLQkJZm9yIChpbnQgaiA9IDA7IGogPCB1cmxOUHMubGVuZ3RoOyArK2opIHsNCi0JCQlzZXRVUkxzLmFkZCh1cmxOUHNbal0pOw0KLQkJfQ0KLQl9DQotDQotCXVybE5QcyA9IG5ldyBJVVJMTmFtZVBhaXJbIHNldFVSTHMuc2l6ZSgpIF07DQotCVN5c3RlbS5hcnJheWNvcHkoc2V0VVJMcy50b0FycmF5KCksIDAsIHVybE5QcywgMCwgc2V0VVJMcy5zaXplKCkgKTsNCi0JDQotCXJldHVybiB1cmxOUHM7DQotfQ0KLS8vIHJldHVybiB0aGUgbG9jYWwgKGN1cnJlbnQpIHJlZ2lzdHJ5DQotDQotcHVibGljIElVTVJlZ2lzdHJ5IGdldFJlZ2lzdHJ5QXQoVVJMIHVybCkgew0KLQkNCi0JcmV0dXJuIF9yZWdpc3RyeU1hbmFnZXIuZ2V0UmVnaXN0cnlBdCggdXJsICk7DQotfQ0KLS8qKg0KLSAqLw0KLXB1YmxpYyBVTVJlZ2lzdHJ5TWFuYWdlciBnZXRSZWdpc3RyeU1hbmFnZXIoKSB7DQotCXJldHVybiBfcmVnaXN0cnlNYW5hZ2VyOw0KLX0NCi0vKioNCi0gKiBJbml0aWFsaXplcyB0aGUgdXBkYXRlIGFuZCBoaXN0b3J5IGxvZyBVUkxzLGNyZWF0ZXMgYSBzZXNzaW9uIG1hbmFnZXIsDQotICogYW5kIGNyZWF0ZXMgYSByZWdpc3RyeSBtYW5hZ2VyLg0KLSAqLw0KLXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB0aHJvd3MgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbnsNCi0NCi0JLy8gT2J0YWluIGluc3RhbGwgVVJMDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlVUkwgdXJsQmFzZSA9IFVNRWNsaXBzZVRyZWUuZ2V0QmFzZUluc3RhbGxVUkwoKTsNCi0JU3RyaW5nIHN0clVybEJhc2UgPSB1cmxCYXNlLnRvRXh0ZXJuYWxGb3JtKCk7DQotCVN0cmluZyBzdHJVcmxJbnN0YWxsID0gc3RyVXJsQmFzZSArICJpbnN0YWxsLyI7DQotDQotCVN0cmluZyBzdHJVcmxVcGRhdGVMb2cgPSBzdHJVcmxJbnN0YWxsICsgInVwZGF0ZS5sb2ciOw0KLQlTdHJpbmcgc3RyVXJsSGlzdG9yeUxvZyA9IHN0clVybEluc3RhbGwgKyAiaGlzdG9yeS5sb2ciOw0KLQ0KLQlzZXRVcGRhdGVMb2dVUkwoc3RyVXJsVXBkYXRlTG9nKTsNCi0Jc2V0SGlzdG9yeUxvZ1VSTChzdHJVcmxIaXN0b3J5TG9nKTsNCi0NCi0JLy8gQ3JlYXRlIGEgc2Vzc2lvbiBtYW5hZ2VyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQl0cnkgew0KLQkJX3Nlc3Npb25NYW5hZ2VyID0gbmV3IFVNU2Vzc2lvbk1hbmFnZXIobmV3IFVSTChfc3RyVXBkYXRlTG9nVVJMKSwgbmV3IFVSTChfc3RySGlzdG9yeUxvZ1VSTCksIHRydWUpOw0KLQl9DQotCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCXRocm93IG5ldyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uKCJJbnZhbGlkIGxvZyBVUkwgc3BlY2lmaWNhdGlvbiIpOw0KLQl9DQotCWNhdGNoIChMb2dTdG9yZUV4Y2VwdGlvbiBleCkgew0KLQkJdGhyb3cgbmV3IFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsNCi0JfQ0KLQ0KLQkvLyBSZWdpc3RyeSBNYW5hZ2VyDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0NCi0JX3JlZ2lzdHJ5TWFuYWdlciA9IG5ldyBVTVJlZ2lzdHJ5TWFuYWdlcih1cmxCYXNlKTsNCi19DQotLyoqDQotICogDQotICovDQotcHVibGljIHZvaWQgcmVtb3ZlQ29tcG9uZW50KElDb21wb25lbnREZXNjcmlwdG9yIGNvbXBvbmVudERlc2NyaXB0b3IpIHsNCi0JcmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudERlc2NyaXB0b3IsIG51bGwpOw0KLX0NCi0vKioNCi0gKiANCi0gKi8NCi1wdWJsaWMgdm9pZCByZW1vdmVDb21wb25lbnQoSUNvbXBvbmVudERlc2NyaXB0b3IgY29tcG9uZW50RGVzY3JpcHRvciwgSVByb2R1Y3REZXNjcmlwdG9yIHByb2R1Y3REZXNjcmlwdG9yKSB7DQotDQotCWlmKCBjb21wb25lbnREZXNjcmlwdG9yID09IG51bGwgKQ0KLQkJcmV0dXJuOw0KLQkJDQotCUxhdW5jaEluZm8gbGF1bmNoSW5mbyA9IExhdW5jaEluZm8uZ2V0Q3VycmVudCgpOw0KLQlMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIgdmlkID0gbnVsbDsNCi0NCi0JLy8gUGx1Z2lucw0KLQkvLy0tLS0tLS0tDQotCUlQbHVnaW5FbnRyeURlc2NyaXB0b3JbXSBwbHVnaW5FbnRyaWVzID0gY29tcG9uZW50RGVzY3JpcHRvci5nZXRQbHVnaW5FbnRyaWVzKCk7DQotDQotCWZvciAoaW50IGkgPSAwOyBpIDwgcGx1Z2luRW50cmllcy5sZW5ndGg7ICsraSkgew0KLQkJdmlkID0gbmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihwbHVnaW5FbnRyaWVzW2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgcGx1Z2luRW50cmllc1tpXS5nZXRWZXJzaW9uU3RyKCkpOw0KLQkJbGF1bmNoSW5mby5yZW1vdmVQbHVnaW4odmlkKTsNCi0JfQ0KLQ0KLQkvLyBGcmFnbWVudHMNCi0JLy8tLS0tLS0tLS0tDQotCUlGcmFnbWVudEVudHJ5RGVzY3JpcHRvcltdIGZyYWdtZW50RW50cmllcyA9IGNvbXBvbmVudERlc2NyaXB0b3IuZ2V0RnJhZ21lbnRFbnRyaWVzKCk7DQotDQotCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRFbnRyaWVzLmxlbmd0aDsgKytpKSB7DQotCQl2aWQgPSBuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKGZyYWdtZW50RW50cmllc1tpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCksIHBsdWdpbkVudHJpZXNbaV0uZ2V0VmVyc2lvblN0cigpKTsNCi0JCWxhdW5jaEluZm8ucmVtb3ZlRnJhZ21lbnQodmlkKTsNCi0JfQ0KLQ0KLQkvLyBDb21wb25lbnQNCi0JLy8tLS0tLS0tLS0tDQotCXZpZCA9IG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoY29tcG9uZW50RGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksIGNvbXBvbmVudERlc2NyaXB0b3IuZ2V0VmVyc2lvblN0cigpKTsNCi0JbGF1bmNoSW5mby5yZW1vdmVDb21wb25lbnQodmlkKTsNCi0JX3JlZ2lzdHJ5TWFuYWdlci5yZW1vdmVDb21wb25lbnREZXNjcmlwdG9yRnJvbUxvY2FsKGNvbXBvbmVudERlc2NyaXB0b3IsIHByb2R1Y3REZXNjcmlwdG9yKTsNCi0JDQotCXJldHVybjsNCi19DQotLyoqDQotICogDQotICovDQotcHVibGljIHZvaWQgcmVtb3ZlUHJvZHVjdChJUHJvZHVjdERlc2NyaXB0b3IgcHJvZHVjdERlc2NyaXB0b3IpIHsNCi0NCi0JaWYoIHByb2R1Y3REZXNjcmlwdG9yID09IG51bGwgKQ0KLQkJcmV0dXJuOw0KLQkJDQotCS8vIENvbXBvbmVudHMNCi0JLy8tLS0tLS0tLS0tLQ0KLQlJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yW10gY29tcG9uZW50RW50cmllcyA9IHByb2R1Y3REZXNjcmlwdG9yLmdldENvbXBvbmVudEVudHJpZXMoKTsNCi0NCi0JZm9yIChpbnQgaSA9IDA7IGkgPCBjb21wb25lbnRFbnRyaWVzLmxlbmd0aDsgKytpKSB7DQotCQlJQ29tcG9uZW50RGVzY3JpcHRvciBjb21wb25lbnREZXNjcmlwdG9yID0gY29tcG9uZW50RW50cmllc1tpXS5nZXRDb21wb25lbnREZXNjcmlwdG9yKCk7DQotCQlpZiAoY29tcG9uZW50RGVzY3JpcHRvci5pc1JlbW92YWJsZShwcm9kdWN0RGVzY3JpcHRvcikpDQotCQkJcmVtb3ZlQ29tcG9uZW50KGNvbXBvbmVudERlc2NyaXB0b3IsIHByb2R1Y3REZXNjcmlwdG9yKTsNCi0JfQ0KLQ0KLQkvLyBQcm9kdWN0DQotCS8vLS0tLS0tLS0NCi0JTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyIHZpZCA9IG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIocHJvZHVjdERlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpLCBwcm9kdWN0RGVzY3JpcHRvci5nZXRWZXJzaW9uU3RyKCkpOw0KLQlMYXVuY2hJbmZvLmdldEN1cnJlbnQoKS5yZW1vdmVDb25maWd1cmF0aW9uKHZpZCk7DQotCV9yZWdpc3RyeU1hbmFnZXIucmVtb3ZlUHJvZHVjdERlc2NyaXB0b3JGcm9tTG9jYWwocHJvZHVjdERlc2NyaXB0b3IpOw0KLX0NCi0vKioNCi0gKiBTZXRzIHRoZSBVUkwgZm9yIHRoZSBoaXN0b3J5IGxvZy4gIFRoaXMgcHJvcGVydHkgaXMgcGVyc2lzdGVudC4NCi0gKi8NCi1wdWJsaWMgdm9pZCBzZXRIaXN0b3J5TG9nVVJMKFN0cmluZyBzdHJVUkwpIHRocm93cyBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIHsNCi0NCi0JLy8gQ2hlY2sgZm9yIHZhbGlkIFVSTA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCXRyeSB7DQotCQluZXcgVVJMKHN0clVSTCk7DQotCX0NCi0JY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgew0KLQkJdGhyb3cgbmV3IFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24oIkludmFsaWQgbG9nIFVSTCBzcGVjaWZpY2F0aW9uIik7DQotCX0NCi0NCi0JLy8gQ2hhbmdlIHRoZSBwcm9wZXJ0eQ0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCV9zdHJIaXN0b3J5TG9nVVJMID0gc3RyVVJMOw0KLX0NCi0vKioNCi0gKiBTZXRzIHRoZSBVUkwgZm9yIHRoZSB1cGRhdGUgbG9nLiAgVGhpcyBwcm9wZXJ0eSBpcyBwZXJzaXN0ZW50Lg0KLSAqLw0KLXB1YmxpYyB2b2lkIHNldFVwZGF0ZUxvZ1VSTChTdHJpbmcgc3RyVVJMKSB0aHJvd3MgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbiB7DQotCQ0KLQkvLyBDaGVjayBmb3IgdmFsaWQgVVJMDQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JdHJ5IHsNCi0JCW5ldyBVUkwoc3RyVVJMKTsNCi0JfQ0KLQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQl0aHJvdyBuZXcgVXBkYXRlTWFuYWdlckV4Y2VwdGlvbigiSW52YWxpZCBsb2cgVVJMIHNwZWNpZmljYXRpb24iKTsNCi0JfQ0KLQ0KLQkvLyBDaGFuZ2UgdGhlIHByb3BlcnR5DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JX3N0clVwZGF0ZUxvZ1VSTCA9IHN0clVSTDsNCi19DQotLyoqDQotICogVXBkYXRlcyB0aGUgYm9vdCBsb2FkZXIncyBsYXVuY2ggaW5mb3JtYXRpb24gd2l0aCB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuDQotICovDQotcHVibGljIHZvaWQgdXBkYXRlTGF1bmNoSW5mb0FuZFJlZ2lzdHJ5KFVNU2Vzc2lvbk1hbmFnZXJTZXNzaW9uIHNlc3Npb24pIHsNCi0NCi0JLy8gVXBkYXRlIGxhdW5jaCBpbmZvIGV2ZW4gaWYgdGhpcyBzZXNzaW9uIGhhZCBhIGZhaWx1cmUNCi0JLy8gT25lIG9yIG1vcmUgcGFyY2VscyBjb3VsZCBoYXZlIHN1Y2NlZWRlZA0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7DQotCQkNCi0JCUxhdW5jaEluZm8gbGF1bmNoSW5mbyA9IExhdW5jaEluZm8uZ2V0Q3VycmVudCgpOw0KLQ0KLQkJLy8gT2J0YWluIHByb2R1Y3QvY29tcG9uZW50IGluZm9ybWF0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVVNU2Vzc2lvbk1hbmFnZXJQYXJjZWxbXSBwYXJjZWxzID0gc2Vzc2lvbi5nZXRQYXJjZWxzKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmNlbHMubGVuZ3RoOyArK2kpIHsNCi0JCQl1cGRhdGVMYXVuY2hJbmZvQW5kUmVnaXN0cnlQYXJjZWwoIHBhcmNlbHNbaV0sIGxhdW5jaEluZm8gKTsNCi0JCX0NCi0JfQ0KLX0NCi0vKioNCi0gKiBSZWN1cnNpdmVseSB1cGRhdGVzIHRoZSBib290IGxvYWRlcidzIGluZm9ybWF0aW9uIGZvciB0aGlzIHBhcmNlbCBhbmQgc3ViLXBhcmNlbHMuDQotICovDQotcHJvdGVjdGVkIHZvaWQgdXBkYXRlTGF1bmNoSW5mb0FuZFJlZ2lzdHJ5UGFyY2VsKFVNU2Vzc2lvbk1hbmFnZXJQYXJjZWwgcGFyY2VsLCBMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHsNCi0NCi0JLy8gVXBkYXRlIHRoZSBwcm9maWxlIG9ubHkgaWYgdGhlIGluc3RhbGwgd2FzIHN1Y2Nlc3NmdWwNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYgKHBhcmNlbCAhPSBudWxsICYmIHBhcmNlbC5nZXRTdGF0dXMoKS5lcXVhbHMoVXBkYXRlTWFuYWdlckNvbnN0YW50cy5TVEFUVVNfU1VDQ0VFREVEKSA9PSB0cnVlKSB7DQotDQotCQlPYmplY3Qgb2JqRGF0YSA9IHBhcmNlbC5nZXREYXRhKCk7DQotDQotCQkvLyBQcm9kdWN0DQotCQkvLy0tLS0tLS0tDQotCQlpZiAob2JqRGF0YSBpbnN0YW5jZW9mIElQcm9kdWN0RGVzY3JpcHRvcikgew0KLQkJCXVwZGF0ZUxhdW5jaEluZm9Qcm9kdWN0KChJUHJvZHVjdERlc2NyaXB0b3IpIG9iakRhdGEsIGxhdW5jaEluZm8pOw0KLQkJCV9yZWdpc3RyeU1hbmFnZXIuYWRkUHJvZHVjdERlc2NyaXB0b3JUb0xvY2FsKChJUHJvZHVjdERlc2NyaXB0b3IpIG9iakRhdGEpOw0KLQkJfQ0KLQ0KLQkJLy8gQ29tcG9uZW50DQotCQkvLy0tLS0tLS0tLS0NCi0JCWVsc2UgaWYgKG9iakRhdGEgaW5zdGFuY2VvZiBJQ29tcG9uZW50RGVzY3JpcHRvcikgew0KLQkJCXVwZGF0ZUxhdW5jaEluZm9Db21wb25lbnQoKElDb21wb25lbnREZXNjcmlwdG9yKSBvYmpEYXRhLCBsYXVuY2hJbmZvKTsNCi0JCQlfcmVnaXN0cnlNYW5hZ2VyLmFkZENvbXBvbmVudERlc2NyaXB0b3JUb0xvY2FsKChJQ29tcG9uZW50RGVzY3JpcHRvcikgb2JqRGF0YSwgdHJ1ZSk7DQotCQl9DQotCQkJDQotCQkvLyBDb21wb25lbnQgRW50cnkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLQ0KLQkJZWxzZSBpZiAob2JqRGF0YSBpbnN0YW5jZW9mIElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIHsNCi0JCQlJQ29tcG9uZW50RGVzY3JpcHRvciBjb21wID0gKChJQ29tcG9uZW50RW50cnlEZXNjcmlwdG9yKW9iakRhdGEpLmdldENvbXBvbmVudERlc2NyaXB0b3IoKTsNCi0JCQl1cGRhdGVMYXVuY2hJbmZvQ29tcG9uZW50KGNvbXAsIGxhdW5jaEluZm8pOw0KLQkJCV9yZWdpc3RyeU1hbmFnZXIuYWRkQ29tcG9uZW50RGVzY3JpcHRvclRvTG9jYWwoY29tcCwgZmFsc2UpOw0KLQkJfQ0KLQ0KLQkJLy8gRG8gY2hpbGQgcGFyY2Vscw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVU1TZXNzaW9uTWFuYWdlclBhcmNlbFtdIHBhcmNlbENoaWxkcmVuID0gcGFyY2VsLmdldFBhcmNlbHMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyY2VsQ2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsNCi0JCQl1cGRhdGVMYXVuY2hJbmZvQW5kUmVnaXN0cnlQYXJjZWwocGFyY2VsQ2hpbGRyZW5baV0sIGxhdW5jaEluZm8pOw0KLQkJfQ0KLQl9DQotfQ0KLS8qKg0KLSAqIFVwZGF0ZXMgdGhlIGJvb3QgbG9hZGVyJ3MgbGF1bmNoIGluZm9ybWF0aW9uIHdpdGggd2hhdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHVwZGF0ZUxhdW5jaEluZm9Db21wb25lbnQoSUNvbXBvbmVudERlc2NyaXB0b3IgZGVzY3JpcHRvciwgTGF1bmNoSW5mbyBsYXVuY2hJbmZvKSB7DQotDQotCS8vIENvbXBvbmVudA0KLQkvLy0tLS0tLS0tLS0NCi0JbGF1bmNoSW5mby5zZXRDb21wb25lbnQobmV3IExhdW5jaEluZm8uVmVyc2lvbmVkSWRlbnRpZmllcihkZXNjcmlwdG9yLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZGVzY3JpcHRvci5nZXRWZXJzaW9uU3RyKCkpKTsNCi0NCi0JLy8gUGx1Z2lucw0KLQkvLy0tLS0tLS0tDQotCUlQbHVnaW5FbnRyeURlc2NyaXB0b3JbXSBwbHVnaW5EZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3IuZ2V0UGx1Z2luRW50cmllcygpOw0KLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IHBsdWdpbkRlc2NyaXB0b3JzLmxlbmd0aDsgKytpKSB7DQotCQl1cGRhdGVMYXVuY2hJbmZvUGx1Z2luKHBsdWdpbkRlc2NyaXB0b3JzW2ldLCBsYXVuY2hJbmZvKTsNCi0JfQ0KLQ0KLQkvLyBGcmFnbWVudHMNCi0JLy8tLS0tLS0tLS0tDQotCUlGcmFnbWVudEVudHJ5RGVzY3JpcHRvcltdIGZyYWdtZW50RGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9yLmdldEZyYWdtZW50RW50cmllcygpOw0KLQ0KLQlmb3IgKGludCBpID0gMDsgaSA8IGZyYWdtZW50RGVzY3JpcHRvcnMubGVuZ3RoOyArK2kpIHsNCi0JCXVwZGF0ZUxhdW5jaEluZm9GcmFnbWVudChmcmFnbWVudERlc2NyaXB0b3JzW2ldLCBsYXVuY2hJbmZvKTsNCi0JfQ0KLX0NCi0vKioNCi0gKiBVcGRhdGVzIHRoZSBib290IGxvYWRlcidzIGxhdW5jaCBpbmZvcm1hdGlvbiB3aXRoIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZC4NCi0gKi8NCi1wdWJsaWMgdm9pZCB1cGRhdGVMYXVuY2hJbmZvRnJhZ21lbnQoSUZyYWdtZW50RW50cnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIExhdW5jaEluZm8gbGF1bmNoSW5mbykgew0KLQ0KLQlsYXVuY2hJbmZvLnNldEZyYWdtZW50KG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksZGVzY3JpcHRvci5nZXRWZXJzaW9uU3RyKCkpKTsNCi19DQotLyoqDQotICogVXBkYXRlcyB0aGUgYm9vdCBsb2FkZXIncyBsYXVuY2ggaW5mb3JtYXRpb24gd2l0aCB3aGF0IGlzIGN1cnJlbnRseSBpbnN0YWxsZWQuDQotICovDQotcHVibGljIHZvaWQgdXBkYXRlTGF1bmNoSW5mb1BsdWdpbihJUGx1Z2luRW50cnlEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIExhdW5jaEluZm8gbGF1bmNoSW5mbykgew0KLQ0KLQlsYXVuY2hJbmZvLnNldFBsdWdpbihuZXcgTGF1bmNoSW5mby5WZXJzaW9uZWRJZGVudGlmaWVyKGRlc2NyaXB0b3IuZ2V0VW5pcXVlSWRlbnRpZmllcigpLGRlc2NyaXB0b3IuZ2V0VmVyc2lvblN0cigpKSk7DQotfQ0KLS8qKg0KLSAqIFVwZGF0ZXMgdGhlIGJvb3QgbG9hZGVyJ3MgbGF1bmNoIGluZm9ybWF0aW9uIHdpdGggd2hhdCBpcyBjdXJyZW50bHkgaW5zdGFsbGVkLg0KLSAqLw0KLXB1YmxpYyB2b2lkIHVwZGF0ZUxhdW5jaEluZm9Qcm9kdWN0KElQcm9kdWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBMYXVuY2hJbmZvIGxhdW5jaEluZm8pIHsNCi0NCi0JbGF1bmNoSW5mby5zZXRDb25maWd1cmF0aW9uKG5ldyBMYXVuY2hJbmZvLlZlcnNpb25lZElkZW50aWZpZXIoZGVzY3JpcHRvci5nZXRVbmlxdWVJZGVudGlmaWVyKCksZGVzY3JpcHRvci5nZXRWZXJzaW9uU3RyKCkpLCBkZXNjcmlwdG9yLmdldEFwcGxpY2F0aW9uKCkpOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckV4Y2VwdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjVkZTM2Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICogDQotICovDQotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24gIGV4dGVuZHMgRXhjZXB0aW9uIHsNCi0vKioNCi0gKiBVcGRhdGVNYW5hZ2VyRXhjZXB0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVwZGF0ZU1hbmFnZXJFeGNlcHRpb24oIFN0cmluZyBzdHJNZXNzYWdlICkgew0KLQlzdXBlciggc3RyTWVzc2FnZSApOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclBsdWdpbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVkMjVkLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlOw0KLS8qDQotICogKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwMS4NCi0gKiBBbGwgUmlnaHRzIFJlc2VydmVkLg0KLSAqLw0KLQ0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi0vKioNCi0gKi8NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aS4qOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndlYmRhdi5odHRwLmNsaWVudC5IdHRwQ2xpZW50Ow0KLQ0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsNCi0JcHJpdmF0ZSBzdGF0aWMgVXBkYXRlTWFuYWdlclBsdWdpbiBfcGx1Z2luSW5zdGFuY2UgPSBudWxsOw0KLQlwcml2YXRlCUh0dHBDbGllbnQgY2xpZW50ID1udWxsOw0KLS8qKg0KLSAqIFVwZGF0ZU1hbmFnZXJQbHVnaW4gY29uc3RydWN0b3IgY29tbWVudC4NCi0gKi8NCi1wdWJsaWMgVXBkYXRlTWFuYWdlclBsdWdpbiggSVBsdWdpbkRlc2NyaXB0b3IgcGx1Z2luRGVzY3JpcHRvciApIHsNCi0Jc3VwZXIoIHBsdWdpbkRlc2NyaXB0b3IgKTsNCi0NCi0JX3BsdWdpbkluc3RhbmNlID0gdGhpczsNCi19DQotLyoqDQotICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBvZiBhbiBpbWFnZSBmaWxlIHJlbGF0aXZlIHRvIHRoaXMgcGx1Z2luDQotICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3INCi0gKiBAcGFyYW0gc3RySW1hZ2UgamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgc3RySW1hZ2UpIHsNCi0NCi0JVXBkYXRlTWFuYWdlclBsdWdpbiBwbHVnaW4gPSBnZXRQbHVnaW5JbnN0YW5jZSgpOw0KLQ0KLQlpZiAocGx1Z2luICE9IG51bGwpIHsNCi0NCi0JCS8vIE9idGFpbiBteSBwbHVnaW4gZGVzY3JpcHRvcg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlJUGx1Z2luRGVzY3JpcHRvciBwbHVnaW5EZXNjcmlwdG9yID0gcGx1Z2luLmdldERlc2NyaXB0b3IoKTsNCi0NCi0JCS8vIERldGVybWluZSB3aGVyZSBJIGFtIGluc3RhbGxlZA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlVUkwgcGF0aCA9IHBsdWdpbkRlc2NyaXB0b3IuZ2V0SW5zdGFsbFVSTCgpOw0KLQ0KLQkJLy8gQWRkIHRoZSByZWxhdGl2ZSBmaWxlIGxvY2F0aW9uIHRvIHRoZSBpbnN0YWxsIGxvY2F0aW9uDQotCQkvLyBDcmVhdGUgdGhlIGltYWdlIGRlc2NyaXB0b3INCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVVJMIHVybEZ1bGxQYXRoU3RyaW5nID0gbnVsbDsNCi0NCi0JCXRyeSB7DQotCQkJdXJsRnVsbFBhdGhTdHJpbmcgPSBuZXcgVVJMKHBhdGgsIHN0ckltYWdlKTsNCi0JCQlyZXR1cm4gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21VUkwodXJsRnVsbFBhdGhTdHJpbmcpOw0KLQkJfQ0KLQ0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7DQotCQl9DQotCX0NCi0JcmV0dXJuIG51bGw7DQotfQ0KLS8qKg0KLSAqIEByZXR1cm4gb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclBsdWdpbg0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgVXBkYXRlTWFuYWdlclBsdWdpbiBnZXRQbHVnaW5JbnN0YW5jZSgpIHsNCi0JcmV0dXJuIF9wbHVnaW5JbnN0YW5jZTsNCi19DQotLyoqDQotICogU2h1dHMgZG93biB0aGlzIHBsdWctaW4gYW5kIGRpc2NhcmRzIGFsbCBwbHVnLWluIHN0YXRlLg0KLSAqIDxwPg0KLSAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSByZS1pbXBsZW1lbnRlZCBpbiBzdWJjbGFzc2VzIHRoYXQgbmVlZCB0byBkbyBzb21ldGhpbmcNCi0gKiB3aGVuIHRoZSBwbHVnLWluIGlzIHNodXQgZG93bi4gIEltcGxlbWVudG9ycyBzaG91bGQgY2FsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZA0KLSAqIHRvIGVuc3VyZSB0aGF0IGFueSBzeXN0ZW0gcmVxdWlyZW1lbnRzIGNhbiBiZSBtZXQuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIFBsdWctaW4gc2h1dGRvd24gY29kZSBzaG91bGQgYmUgcm9idXN0LiBJbiBwYXJ0aWN1bGFyLCB0aGlzIG1ldGhvZA0KLSAqIHNob3VsZCBhbHdheXMgbWFrZSBhbiBlZmZvcnQgdG8gc2h1dCBkb3duIHRoZSBwbHVnLWluLiBGdXJ0aGVybW9yZSwNCi0gKiB0aGUgY29kZSBzaG91bGQgbm90IGFzc3VtZSB0aGF0IHRoZSBwbHVnLWluIHdhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseSwNCi0gKiBhcyB0aGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgaW4gdGhlIGV2ZW50IG9mIGEgZmFpbHVyZSBkdXJpbmcgc3RhcnR1cC4NCi0gKiA8L3A+DQotICogPHA+DQotICogTm90ZSAxOiBJZiBhIHBsdWctaW4gaGFzIGJlZW4gc3RhcnRlZCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBhdXRvbWF0aWNhbGx5DQotICogaW52b2tlZCBieSB0aGUgcGxhdGZvcm0gd2hlbiB0aGUgcGxhdGZvcm0gaXMgc2h1dCBkb3duLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBOb3RlIDI6IFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIHBlcmZvcm0gc2ltcGxlIHRlcm1pbmF0aW9uDQotICogb2YgdGhlIHBsdWctaW4gZW52aXJvbm1lbnQuIFRoZSBwbGF0Zm9ybSBtYXkgdGVybWluYXRlIGludm9jYXRpb25zDQotICogdGhhdCBkbyBub3QgY29tcGxldGUgaW4gYSB0aW1lbHkgZmFzaGlvbi4NCi0gKiA8L3A+DQotICogPGI+Q2xpZW5zIG11c3QgbmV2ZXIgZXhwbGljaXRseSBjYWxsIHRoaXMgbWV0aG9kLjwvYj4NCi0gKg0KLSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBmYWlscyB0byBzaHV0IGRvd24NCi0gKiAgIHRoaXMgcGx1Zy1pbiANCi0gKi8NCi1wdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsNCi0JaWYoY2xpZW50IT1udWxsKSBjbGllbnQuY2xvc2UoKTsgDQotfQ0KLS8qKg0KLSAqIFN0YXJ0cyB1cCB0aGlzIHBsdWctaW4uDQotICogPHA+DQotICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gZG8gc29tZXRoaW5nDQotICogd2hlbiB0aGlzIHBsdWctaW4gaXMgc3RhcnRlZC4gIEltcGxlbWVudG9ycyBzaG91bGQgY2FsbCB0aGUgaW5oZXJpdGVkIG1ldGhvZA0KLSAqIHRvIGVuc3VyZSB0aGF0IGFueSBzeXN0ZW0gcmVxdWlyZW1lbnRzIGNhbiBiZSBtZXQuDQotICogPC9wPg0KLSAqIDxwPg0KLSAqIElmIHRoaXMgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIGl0IGlzIHRha2VuIGFzIGFuIGluZGljYXRpb24gdGhhdA0KLSAqIHBsdWctaW4gaW5pdGlhbGl6YXRpb24gaGFzIGZhaWxlZDsgYXMgYSByZXN1bHQsIHRoZSBwbHVnLWluIHdpbGwgbm90DQotICogYmUgYWN0aXZhdGVkOyBtb3Jlb3ZlciwgdGhlIHBsdWctaW4gd2lsbCBiZSBtYXJrZWQgYXMgZGlzYWJsZWQgYW5kIA0KLSAqIGluZWxpZ2libGUgZm9yIGFjdGl2YXRpb24gZm9yIHRoZSBkdXJhdGlvbi4NCi0gKiA8L3A+DQotICogPHA+DQotICogUGx1Zy1pbiBzdGFydHVwIGNvZGUgc2hvdWxkIGJlIHJvYnVzdC4gSW4gdGhlIGV2ZW50IG9mIGEgc3RhcnR1cCBmYWlsdXJlLA0KLSAqIHRoZSBwbHVnLWluJ3MgPGNvZGU+c2h1dGRvd248L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQgYXV0b21hdGljYWxseSwNCi0gKiBpbiBhbiBhdHRlbXB0IHRvIGNsb3NlIG9wZW4gZmlsZXMsIGV0Yy4NCi0gKiA8L3A+DQotICogPHA+DQotICogTm90ZSAxOiBUaGlzIG1ldGhvZCBpcyBhdXRvbWF0aWNhbGx5IGludm9rZWQgYnkgdGhlIHBsYXRmb3JtIA0KLSAqIHRoZSBmaXJzdCB0aW1lIGFueSBjb2RlIGluIHRoZSBwbHVnLWluIGlzIGV4ZWN1dGVkLg0KLSAqIDwvcD4NCi0gKiA8cD4NCi0gKiBOb3RlIDI6IFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIHBlcmZvcm0gc2ltcGxlIGluaXRpYWxpemF0aW9uIA0KLSAqIG9mIHRoZSBwbHVnLWluIGVudmlyb25tZW50LiBUaGUgcGxhdGZvcm0gbWF5IHRlcm1pbmF0ZSBpbml0aWFsaXplcnMgDQotICogdGhhdCBkbyBub3QgY29tcGxldGUgaW4gYSB0aW1lbHkgZmFzaGlvbi4NCi0gKiA8L3A+DQotICogPGI+Q2xpZW5zIG11c3QgbmV2ZXIgZXhwbGljaXRseSBjYWxsIHRoaXMgbWV0aG9kLjwvYj4NCi0gKg0KLSAqIEBleGNlcHRpb24gQ29yZUV4Y2VwdGlvbiBpZiB0aGlzIHBsdWctaW4gZGlkIG5vdCBzdGFydCB1cCBwcm9wZXJseQ0KLSAqLw0KLXB1YmxpYyB2b2lkIHN0YXJ0dXAoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7DQotCS8vIFNldHVwIEhUVFAgY2xpZW50DQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCWNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KCk7DQotCWNsaWVudC5zZXRBdXRoZW50aWNhdG9yKG5ldyBBdXRob3JpemF0aW9uRGF0YWJhc2UoKSk7DQotCVVSTEhhbmRsZXIuc2V0SHR0cENsaWVudChjbGllbnQpOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclN0cmluZ3MuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJTdHJpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYjdlY2QuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclN0cmluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICogVGhpcyBjbGFzcyBsb2FkcyB0cmFuc2xhdGFibGUgc3RyaW5ncyBmcm9tIGEgcmVzb3VyY2UgYnVuZGxlIHByb3BlcnRpZXMgZmlsZS4NCi0gKi8NCi1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOw0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOw0KLQ0KLXB1YmxpYyBjbGFzcyBVcGRhdGVNYW5hZ2VyU3RyaW5ncw0KLXsNCi0JcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgX3Jlc291cmNlQnVuZGxlID0gbnVsbDsNCi0vKioNCi0gKiBPYnRhaW5zIGEgTkwgdHJhbnNsYXRlZCBzdHJpbmcgZnJvbSBhIHJlc291cmNlIGJ1bmRsZQ0KLSAqIEBwYXJhbSBzdHJLZXkgamF2YS5sYW5nLlN0cmluZw0KLSAqLw0KLXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyggU3RyaW5nIHN0cktleSApIA0KLXsNCi0JU3RyaW5nIHN0clRyYW5zbGF0ZWQgPSBzdHJLZXk7DQotDQotCS8vIE9idGFpbiB0aGUgc2V0IG9mIHRyYW5zbGF0ZWQgc3RyaW5ncw0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JaWYoIF9yZXNvdXJjZUJ1bmRsZSA9PSBudWxsICkNCi0Jew0KLQkJdHJ5DQotCQl7DQotCQkJX3Jlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCBVcGRhdGVNYW5hZ2VyLl9zdHJQYWNrYWdlTmFtZSArICIudXBkYXRlbWFuYWdlcnN0cmluZ3MiICk7DQotCQl9DQotCQljYXRjaCggTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4ICkNCi0JCXsNCi0JCQlfcmVzb3VyY2VCdW5kbGUgPSBudWxsOw0KLQkJfQ0KLQl9DQotDQotCS8vIE9idGFpbiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcNCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQlpZiggX3Jlc291cmNlQnVuZGxlICE9IG51bGwgKQ0KLQl7DQotCQl0cnkNCi0JCXsNCi0JCQlzdHJUcmFuc2xhdGVkID0gX3Jlc291cmNlQnVuZGxlLmdldFN0cmluZyggc3RyS2V5ICk7DQotCQl9DQotCQljYXRjaCggTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4ICkNCi0JCXsNCi0JCQlzdHJUcmFuc2xhdGVkID0gc3RyS2V5Ow0KLQkJfQ0KLQl9DQotDQotCXJldHVybiBzdHJUcmFuc2xhdGVkOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclVSTENvbXBhcmF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL1VwZGF0ZU1hbmFnZXJVUkxDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTQ3NDQuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvVXBkYXRlTWFuYWdlclVSTENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmU7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuKjsNCi1pbXBvcnQgamF2YS5uZXQuKjsNCi0vKioNCi0gKiANCi0gKi8NCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7DQotcHVibGljIGNsYXNzIFVwZGF0ZU1hbmFnZXJVUkxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcnsNCi0vKioNCi0gKiBVcGRhdGVNYW5hZ2VyVHJlZUl0ZW1Db21wYXJhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotICovDQotcHVibGljIFVwZGF0ZU1hbmFnZXJVUkxDb21wYXJhdG9yKCkgew0KLQlzdXBlcigpOw0KLX0NCi0vKioNCi0gKiBDb21wYXJlcyB0d28gc3RyaW5ncyBpbmRlcGVuZGVudCBvZiBjYXNlLg0KLSAqIA0KLSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhlDQotICogICAgICAgICBmaXJzdCBhcmd1bWVudCBpcyBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlDQotICogICAgICAgICBzZWNvbmQuIA0KLSAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBhcmd1bWVudHMnIHR5cGVzIHByZXZlbnQgdGhlbSBmcm9tDQotICogICAgICAgICBiZWluZyBjb21wYXJlZCBieSB0aGlzIENvbXBhcmF0b3IuDQotICovDQotcHVibGljIGludCBjb21wYXJlKGphdmEubGFuZy5PYmplY3QgbzEsIGphdmEubGFuZy5PYmplY3QgbzIpIHsNCi0NCi0JaWYgKG8xIGluc3RhbmNlb2YgVVJMTmFtZVBhaXIgJiYgbzIgaW5zdGFuY2VvZiBVUkxOYW1lUGFpcikgew0KLQkJcmV0dXJuICgoVVJMTmFtZVBhaXIpIG8xKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLnRvTG93ZXJDYXNlKCkuY29tcGFyZVRvKCgoVVJMTmFtZVBhaXIpIG8yKS5nZXRVUkwoKS50b0V4dGVybmFsRm9ybSgpLnRvTG93ZXJDYXNlKCkpOw0KLQl9DQotDQotCXJldHVybiAwOw0KLX0NCi19DQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvdXBkYXRlbWFuYWdlcnN0cmluZ3MucHJvcGVydGllcyBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC9jb3JlL3VwZGF0ZW1hbmFnZXJzdHJpbmdzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZWMwMDUuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL2NvcmUvdXBkYXRlbWFuYWdlcnN0cmluZ3MucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi1TX0FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGQNCi1TX0FkZGl0aW9uYWxfTG9jYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBZGRpdGlvbmFsIExvY2F0aW9ucw0KLVNfQW5faW5zdGFsbGF0aW9uX2Vycm9yX29yX2NhbmNlbGxhdGlvbl9oYXNfb2NjdXJyZWQgICAgICA9IEFuIGluc3RhbGxhdGlvbiBlcnJvciBvciBjYW5jZWxsYXRpb24gaGFzIG9jY3VycmVkDQotU19BdF90aGVfZm9sbG93aW5nX2RvbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQXQgdGhlIGZvbGxvd2luZyBkb21haW4NCi1TX0F2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBdmFpbGFibGUNCi1TX0NhbmNlbF9jb21wb25lbnRfaW5zdGFsbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDYW5jZWwgY29tcG9uZW50IGluc3RhbGxhdGlvbg0KLVNfQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENvbXBvbmVudA0KLVNfQ29tcG9uZW50X2lkZW50aWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENvbXBvbmVudCBpZGVudGlmaWVyDQotU19Db21wb25lbnRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQ29tcG9uZW50IG5hbWUNCi1TX0NvbmZpZ3VyYXRpb25fQ2hhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDb25maWd1cmF0aW9uIENoYW5nZQ0KLVNfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IENvcHkNCi1TX0N1cnJlbnRfaW5zdGFsbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBDdXJyZW50IGluc3RhbGxhdGlvbg0KLVNfRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IERlc2NyaXB0aW9uDQotU19FbmNvdW50ZXJlZF9qYXJfZW50cnlfc2VjdXJpdHlfZXhjZXB0aW9uICAgICAgICAgICAgICAgID0gRW5jb3VudGVyZWQgamFyIGVudHJ5IHNlY3VyaXR5IGV4Y2VwdGlvbg0KLVNfRW50ZXJfYV91c2VyX25hbWVfYW5kX3Bhc3N3b3JkX2ZvciAgICAgICAgICAgICAgICAgICAgICA9IEVudGVyIGEgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBmb3INCi1TX0Vycm9yX2Nsb3Npbmdfb3V0cHV0X3N0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFcnJvciBjbG9zaW5nIG91dHB1dCBzdHJlYW0NCi1TX0Vycm9yX2luX3JlZ2lzdHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBFcnJvciBpbiByZWdpc3RyeQ0KLVNfRXJyb3Jfb2NjdXJyZWRfZHVyaW5nX2luc3RhbGxhdGlvbl9jb21wbGV0aW9uICAgICAgICAgICA9IEVycm9yIG9jY3VycmVkIGR1cmluZyBpbnN0YWxsYXRpb24gY29tcGxldGlvbg0KLVNfRXJyb3Jfb2NjdXJyZWRfZHVyaW5nX2luc3RhbGxhdGlvbl9zZXR1cCAgICAgICAgICAgICAgICA9IEVycm9yIG9jY3VycmVkIGR1cmluZyBpbnN0YWxsYXRpb24gc2V0dXANCi1TX0Vycm9yX29jY3VycmVkX2R1cmluZ192ZXJpZmljYXRpb24gICAgICAgICAgICAgICAgICAgICAgPSBFcnJvciBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uDQotU19FcnJvcl9yZWFkaW5nX2Zyb21faW5wdXRfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgID0gRXJyb3IgcmVhZGluZyBmcm9tIGlucHV0IHN0cmVhbQ0KLVNfRXJyb3Jfd3JpdGluZ190b19vdXRwdXRfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICA9IEVycm9yIHdyaXRpbmcgdG8gb3V0cHV0IHN0cmVhbQ0KLVNfRXhhbWluaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEV4YW1pbmluZw0KLVNfRmlsZV9pc19ub3RfYV92YWxpZF9KQVJfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZpbGUgaXMgbm90IGEgdmFsaWQgSkFSIGZpbGUNCi1TX0ZpbGVfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBGaWxlIG5hbWUNCi1TX0hUVFBfY2xpZW50X25vdF9zZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBIVFRQIGNsaWVudCBub3Qgc2V0DQotU19JZGVudGlmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSWRlbnRpZmllcg0KLVNfSW5mb3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEluZm9ybWF0aW9uDQotU19JbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbA0KLVNfSW5zdGFsbF9jb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEluc3RhbGwgY29tcG9uZW50DQotU19JbnN0YWxsX0NvbXBvbmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbCBDb21wb25lbnRzDQotU19JbnN0YWxsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbGF0aW9uDQotU19JbnN0YWxsYXRpb25fY2FuY2VsbGVkX2J5X3VzZXIgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbGF0aW9uIGNhbmNlbGxlZCBieSB1c2VyDQotU19JbnN0YWxsYXRpb25fY29tcGxldGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbGF0aW9uIGNvbXBsZXRlZA0KLVNfSW5zdGFsbGF0aW9uc19oYXZlX2NvbXBsZXRlZF9zdWNjZXNzZnVsbHkgICAgICAgICAgICAgICA9IEluc3RhbGxhdGlvbnMgaGF2ZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5DQotU19JbnN0YWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbGVkDQotU19JbnN0YWxsZWRfQ29tcG9uZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSW5zdGFsbGVkIENvbXBvbmVudHMNCi1TX0luc3RhbGxpbmdfdGhpc19jb21wb25lbnRfbWF5X2NvcnJ1cHRfeW91cl9pbnN0YWxsYXRpb24gPSBJbnN0YWxsaW5nIHRoaXMgY29tcG9uZW50IG1heSBjb3JydXB0IHlvdXIgaW5zdGFsbGF0aW9uDQotU19Mb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTG9jYXRpb24NCi1TX05ld19Db21wb25lbnRfVXBkYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOZXcgQ29tcG9uZW50IFVwZGF0ZXMNCi1TX05ld19Db21wb25lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBOZXcgQ29tcG9uZW50cw0KLVNfTm9faW5zdGFsbGFibGVfaXRlbXNfd2VyZV9mb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICA9IE5vIGluc3RhbGxhYmxlIGl0ZW1zIHdlcmUgZm91bmQNCi1TX25vdF9hdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBub3QgYXZhaWxhYmxlDQotU19ub3RfY29tcGF0aWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbm90IGNvbXBhdGlibGUNCi1TX25vdF9uZXdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBub3QgbmV3ZXINCi1TX25vdF91cGRhdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBub3QgdXBkYXRhYmxlDQotU19OdW1iZXJfb2ZfaW5zdGFsbGF0aW9uX2hpc3Rvcmllc190b19rZWVwICAgICAgICAgICAgICAgID0gTnVtYmVyIG9mIGluc3RhbGxhdGlvbiBoaXN0b3JpZXMgdG8ga2VlcA0KLVNfT2J0YWluaW5nX2luZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE9idGFpbmluZyBpbmZvcm1hdGlvbg0KLVNfT0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE9LDQotU19vcHRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gb3B0aW9uYWwNCi1TX1Bhc3N3b3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQYXNzd29yZA0KLVNfUGFzc3dvcmRfUmVxdWlyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFBhc3N3b3JkIFJlcXVpcmVkDQotU19QcmVkZWZpbmVkX0xvY2F0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gUHJlZGVmaW5lZCBMb2NhdGlvbnMNCi1TX1Byb3ZpZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBQcm92aWRlcg0KLVNfUmVhZGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJlYWRpbmcNCi1TX1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSZW1vdmUNCi1TX1JlbW92ZV9zZWxlY3RlZF9jb21wb25lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBSZW1vdmUgc2VsZWN0ZWQgY29tcG9uZW50cw0KLVNfUmV2ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJldmVydA0KLVNfUmV2ZXJ0X3RvX2FfUHJldmlvdXNfSW5zdGFsbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICA9IFJldmVydCB0byBhIFByZXZpb3VzIEluc3RhbGxhdGlvbg0KLVNfUmV2ZXJ0X3RvX2Fub3RoZXJfaW5zdGFsbGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICA9IFJldmVydCB0byBhbm90aGVyIGluc3RhbGxhdGlvbg0KLVNfU2VhcmNoX2Zvcl9tb3JlX3JlY2VudF92ZXJzaW9uc190b19pbnN0YWxsICAgICAgICAgICAgICA9IFNlYXJjaCBmb3IgbW9yZSByZWNlbnQgdmVyc2lvbnMgdG8gaW5zdGFsbA0KLVNfU2VhcmNoX2Zvcl9uZXdfY29tcG9uZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFNlYXJjaCBmb3IgbmV3IGNvbXBvbmVudHMNCi1TX1NlYXJjaF9mb3JfdXBkYXRlc19mb3JfYWxsX2NvbXBvbmVudHMgICAgICAgICAgICAgICAgICAgPSBTZWFyY2ggZm9yIHVwZGF0ZXMgZm9yIGFsbCBjb21wb25lbnRzDQotU19TZWFyY2hfZm9yX3VwZGF0ZXNfZm9yX3NlbGVjdGVkX2NvbXBvbmVudHMgICAgICAgICAgICAgID0gU2VhcmNoIGZvciB1cGRhdGVzIGZvciBzZWxlY3RlZCBjb21wb25lbnRzDQotU19TZWxlY3RfYV9wcmV2aW91c19pbnN0YWxsYXRpb25fdG9fcmV2ZXJ0X3RvICAgICAgICAgICAgID0gU2VsZWN0IGEgcHJldmlvdXMgaW5zdGFsbGF0aW9uIHRvIHJldmVydCB0bw0KLVNfU2VsZWN0X2FueV9vcHRpb25hbF9jb21wb25lbnRzX3RvX2luc3RhbGwgICAgICAgICAgICAgICA9IFNlbGVjdCBhbnkgb3B0aW9uYWwgY29tcG9uZW50cyB0byBpbnN0YWxsDQotU19TZWxlY3RfYXZhaWxhYmxlX3ZlcnNpb25zX3RvX2luc3RhbGwgICAgICAgICAgICAgICAgICAgID0gU2VsZWN0IGF2YWlsYWJsZSB2ZXJzaW9ucyB0byBpbnN0YWxsDQotU19TZWxlY3RfY29tcG9uZW50c190b19pbnN0YWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU2VsZWN0IGNvbXBvbmVudHMgdG8gaW5zdGFsbA0KLVNfU2VsZWN0X2xvY2F0aW9uc190b191cGRhdGVfZnJvbSAgICAgICAgICAgICAgICAgICAgICAgICA9IFNlbGVjdCBsb2NhdGlvbnMgdG8gdXBkYXRlIGZyb20NCi1TX1Nob3dfb25seV9tb3N0X3JlY2VudF92ZXJzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTaG93IG9ubHkgbW9zdCByZWNlbnQgdmVyc2lvbnMNCi1TX1NvZnR3YXJlX1VwZGF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBTb2Z0d2FyZSBVcGRhdGVzDQotU19Tb3VyY2VfbG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU291cmNlIGxvY2F0aW9uDQotU19Tb3VyY2VfVVJMX2lzX21hbGZvcm1lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU291cmNlIFVSTCBpcyBtYWxmb3JtZWQNCi1TX1NwZWNpZnlfc2VhcmNoX2xvY2F0aW9uc19mb3JfbmV3X2NvbXBvbmVudHMgICAgICAgICAgICAgPSBTcGVjaWZ5IHNlYXJjaCBsb2NhdGlvbnMgZm9yIG5ldyBjb21wb25lbnRzDQotU19TdGF0dXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gU3RhdHVzDQotU19UYXJnZXRfVVJMX2lzX21hbGZvcm1lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVGFyZ2V0IFVSTCBpcyBtYWxmb3JtZWQNCi1TX1RoZV9jZXJ0aWZpY2F0ZXNfdXNlZF90b19hdXRoZW50aWNhdGVfdGhpc19jb21wb25lbnRfYXJlX25vdF9yZWNvZ25pemVkID0gVGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGlzIGNvbXBvbmVudCBhcmUgbm90IHJlY29nbml6ZWQNCi1TX1RoZV9jb250ZW50X29mX3RoaXNfY29tcG9uZW50X2hhc19iZWVuX2NvcnJ1cHRlZCAgICAgICAgPSBUaGUgY29udGVudCBvZiB0aGlzIGNvbXBvbmVudCBoYXMgYmVlbiBjb3JydXB0ZWQNCi1TX1RoZV9mb2xsb3dpbmdfaW5zdGFsbGF0aW9uX3dpbGxfYmVjb21lX2FjdGl2ZV93aGVuX3RoZV93b3JrYmVuY2hfaXNfcmVzdGFydGVkID0gVGhlIGZvbGxvd2luZyBpbnN0YWxsYXRpb24gd2lsbCBiZWNvbWUgYWN0aXZlIHdoZW4gdGhlIHdvcmtiZW5jaCBpcyByZXN0YXJ0ZWQNCi1TX1RoZV9mb2xsb3dpbmdfaXRlbXNfd2lsbF9iZV9pbnN0YWxsZWQgICAgICAgICAgICAgICAgICAgPSBUaGUgZm9sbG93aW5nIGl0ZW1zIHdpbGwgYmUgaW5zdGFsbGVkDQotU19UaGVfZm9sbG93aW5nX2l0ZW1zX3dpbGxfYmVfdXBkYXRlZCAgICAgICAgICAgICAgICAgICAgID0gVGhlIGZvbGxvd2luZyBpdGVtcyB3aWxsIGJlIHVwZGF0ZWQNCi1TX1RoZV9pbnN0YWxsYXRpb25fcHJvY2Vzc193aWxsX2JlX2Fib3J0ZWQgICAgICAgICAgICAgICAgPSBUaGUgaW5zdGFsbGF0aW9uIHByb2Nlc3Mgd2lsbCBiZSBhYm9ydGVkDQotU19UaGVfcHJvdmlkZXJfb2ZfdGhpc19jb21wb25lbnRfY2Fubm90X2JlX3ZlcmlmaWVkICAgICAgID0gVGhlIHByb3ZpZGVyIG9mIHRoaXMgY29tcG9uZW50IGNhbm5vdCBiZSB2ZXJpZmllZA0KLVNfVGhpc19jb21wb25lbnRfaGFzX25vdF9iZWVuX2RpZ2l0YWxseV9zaWduZWQgICAgICAgICAgICA9IFRoaXMgY29tcG9uZW50IGhhcyBub3QgYmVlbiBkaWdpdGFsbHkgc2lnbmVkDQotU19UaGlzX2NvbXBvbmVudF93aWxsX25vdF9iZV9pbnN0YWxsZWQgICAgICAgICAgICAgICAgICAgID0gVGhpcyBjb21wb25lbnQgd2lsbCBub3QgYmUgaW5zdGFsbGVkDQotU19VcGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVXBkYXRlDQotU19VcGRhdGVfQWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVXBkYXRlIEFsbA0KLVNfVXBkYXRlc19jb21wbGV0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFVwZGF0ZXMgY29tcGxldGVkDQotU19VbmFibGVfdG9fYWNjZXNzX3RoZV9mb2xsb3dpbmdfbG9jYXRpb25zICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGFjY2VzcyB0aGUgZm9sbG93aW5nIGxvY2F0aW9ucw0KLVNfVW5hYmxlX3RvX2Nvbm5lY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFVuYWJsZSB0byBjb25uZWN0DQotU19VbmFibGVfdG9fY3JlYXRlX2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGNyZWF0ZSBmaWxlDQotU19VbmFibGVfdG9fY3JlYXRlX2phcl9lbnRyeV9VUkwgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGNyZWF0ZSBqYXIgZW50cnkgVVJMDQotU19VbmFibGVfdG9fY3JlYXRlX291dHB1dF9maWxlX2Zvcl9KYXJfZW50cnkgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGNyZWF0ZSBvdXRwdXQgZmlsZSBmb3IgSmFyIGVudHJ5DQotU19VbmFibGVfdG9fZGVsZXRlX2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIGRlbGV0ZSBmaWxlDQotU19VbmFibGVfdG9fZmluZF9pbnN0YWxsX21hbmlmZXN0X2ZpbGVfaW5fSmFyICAgICAgICAgICAgID0gVW5hYmxlIHRvIGZpbmQgaW5zdGFsbCBtYW5pZmVzdCBmaWxlIGluIEphcg0KLVNfVW5hYmxlX3RvX2ZpbmRfZGVmaW5lZF9jb250ZW50c19pbl9KYXIgICAgICAgICAgICAgICAgICA9IFVuYWJsZSB0byBmaW5kIGRlZmluZWQgY29udGVudHMgaW4gSmFyDQotU19VbmFibGVfdG9fb2J0YWluX3NvdXJjZV9pbnB1dF9zdHJlYW0gICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIG9idGFpbiBzb3VyY2UgaW5wdXQgc3RyZWFtDQotU19VbmFibGVfdG9fb2J0YWluX3RhcmdldF9vdXRwdXRfc3RyZWFtICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIG9idGFpbiB0YXJnZXQgb3V0cHV0IHN0cmVhbQ0KLVNfVW5hYmxlX3RvX29wZW5fZXJyb3JfbG9ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFVuYWJsZSB0byBvcGVuIGVycm9yX2xvZ3MNCi1TX1VuYWJsZV90b19vcGVuX2phcl9lbnRyeV9pbnB1dF9zdHJlYW0gICAgICAgICAgICAgICAgICAgPSBVbmFibGUgdG8gb3BlbiBqYXIgZW50cnkgaW5wdXQgc3RyZWFtDQotU19VbmFibGVfdG9fb3Blbl9KYXJfZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5hYmxlIHRvIG9wZW4gSmFyIGZpbGUNCi1TX1VuZGVmaW5lZF9jb250ZW50c19mb3VuZF9pbl9KYXIgICAgICAgICAgICAgICAgICAgICAgICAgPSBVbmRlZmluZWQgY29udGVudHMgZm91bmQgaW4gSmFyDQotU19VbmRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVW5kbw0KLVNfVXNlcl9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFVzZXIgbmFtZQ0KLVNfVmVyaWZpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZlcmlmaWNhdGlvbg0KLVNfVmVyaWZpY2F0aW9uX2NhbmNlbGxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZlcmlmaWNhdGlvbiBjYW5jZWxsZWQNCi1TX1ZlcmlmeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWZXJpZnkNCi1TX1ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWZXJzaW9uDQotU19Zb3VfYXJlX2Fib3V0X3RvX2luc3RhbGxfYV9zaWduZWRfY29tcG9uZW50ICAgICAgICAgICAgID0gWW91IGFyZSBhYm91dCB0byBpbnN0YWxsIGEgc2lnbmVkIGNvbXBvbmVudA0KLVNfWW91X2FyZV9hYm91dF90b19pbnN0YWxsX2FuX3Vuc2lnbmVkX2NvbXBvbmVudCAgICAgICAgICA9IFlvdSBhcmUgYWJvdXQgdG8gaW5zdGFsbCBhbiB1bnNpZ25lZCBjb21wb25lbnQNCi1TX1lvdV9tYXlfY2hvb3NlX3RvX2luc3RhbGxfdGhlX2NvbXBvbmVudF9vcl9jYW5jZWxfaXRzX2luc3RhbGxhdGlvbiA9IFlvdSBtYXkgY2hvb3NlIHRvIGluc3RhbGwgdGhlIGNvbXBvbmVudCBvciBjYW5jZWwgaXRzIGluc3RhbGxhdGlvbg0KLVNfWW91X211c3RfcmVzdGFydF90aGVfd29ya2JlbmNoX3RvX2FjdGl2YXRlX2FueV9jaGFuZ2VzICA9IFlvdSBtdXN0IHJlc3RhcnQgdGhlIHdvcmtiZW5jaCB0byBhY3RpdmF0ZSBhbnkgY2hhbmdlcw0KZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9BdXRob3JpemF0aW9uRGF0YWJhc2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9BdXRob3JpemF0aW9uRGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyYWYxNS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvQXV0aG9yaXphdGlvbkRhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEubmV0LlVSTDsNCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsNCi1pbXBvcnQgamF2YS51dGlsLk1hcDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5jb3JlLlVwZGF0ZU1hbmFnZXJQbHVnaW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLndlYmRhdi5odHRwLmNsaWVudC5JQXV0aGVudGljYXRvcjsNCi0NCi0vKioNCi0gKiBBIHRyYW5zaWVudCBkYXRhYmFzZSB0aGF0IHJlbWVtYmVycyBpbmZvcm1hdGlvbiwgc3VjaCBhcyB1c2VybmFtZXMgYW5kDQotICogcGFzc3dvcmRzLiAgVGhlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBtZW1vcnkgb25seSBhbmQgaXMgZGlzY2FydGVkDQotICogd2hlbiB0aGUgUGxhZm9ybSBzaHV0cyBkb3duLg0KLSAqLw0KLXB1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRGF0YWJhc2UgaW1wbGVtZW50cyBJQXV0aGVudGljYXRvciB7DQotDQotCS8qKg0KLQkgKiBUaGUgTWFwIGNvbnRhaW5pbmcgdGhlIHVzZXJpZCBhbmQgcGFzc3dvcmQNCi0JICovDQotCXByaXZhdGUgTWFwIHJlc3VsdCA9IG5ldyBIYXNodGFibGUoKTsNCi0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIHZvaWQgYWRkQXV0aGVudGljYXRpb25JbmZvKFVSTCBzZXJ2ZXJVcmwsIFN0cmluZyByZWFsbSwgU3RyaW5nIHNjaGVtZSwgTWFwIGluZm8pIHsNCi0JCXRyeSB7DQotCQkJUGxhdGZvcm0uYWRkQXV0aG9yaXphdGlvbkluZm8oc2VydmVyVXJsLCByZWFsbSwgc2NoZW1lLCBpbmZvKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVNYW5hZ2VyUGx1Z2luLmdldFBsdWdpbkluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOw0KLQkJfQ0KLQl9DQotDQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIGFkZFByb3RlY3Rpb25TcGFjZShVUkwgcmVzb3VyY2VVcmwsIFN0cmluZyByZWFsbSkgew0KLQkJdHJ5IHsNCi0JCQlQbGF0Zm9ybS5hZGRQcm90ZWN0aW9uU3BhY2UocmVzb3VyY2VVcmwsIHJlYWxtKTsNCi0JCX0NCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsNCi0JCQlVcGRhdGVNYW5hZ2VyUGx1Z2luLmdldFBsdWdpbkluc3RhbmNlKCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOw0KLQkJfQ0KLQ0KLQl9DQotCS8qKg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIE1hcCBnZXRBdXRoZW50aWNhdGlvbkluZm8oVVJMIHNlcnZlclVybCwgU3RyaW5nIHJlYWxtLCBTdHJpbmcgc2NoZW1lKSB7DQotDQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QXV0aG9yaXphdGlvbkluZm8oc2VydmVyVXJsLCByZWFsbSwgc2NoZW1lKTsNCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3RlY3Rpb25TcGFjZShVUkwgcmVzb3VyY2VVcmwpIHsNCi0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcm90ZWN0aW9uU3BhY2UocmVzb3VyY2VVcmwpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBNYXAgcmVxdWVzdEF1dGhlbnRpY2F0aW9uSW5mbyhmaW5hbCBVUkwgcmVzb3VyY2VVcmwsIGZpbmFsIFN0cmluZyByZWFsbSwgZmluYWwgU3RyaW5nIHNjaGVtZSkgew0KLQ0KLQkJcmVzdWx0ID0gbmV3IEhhc2h0YWJsZSgpOw0KLQkJaWYgKHNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKCJCYXNpYyIpKSB7DQotDQotCQkJRGlzcGxheSBkaXNwID0gRGlzcGxheS5nZXRDdXJyZW50KCk7DQotCQkJaWYgKGRpc3AgIT0gbnVsbCkgew0KLQkJCQlwcm9tcHRGb3JQYXNzd29yZChyZXNvdXJjZVVybCwgcmVhbG0sIHJlc3VsdCk7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7DQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7DQotCQkJCQkJcHJvbXB0Rm9yUGFzc3dvcmQocmVzb3VyY2VVcmwsIHJlYWxtLCByZXN1bHQpOw0KLQkJCQkJfQ0KLQkJCQl9KTsNCi0JCQl9Ow0KLQkJfQ0KLQkJcmV0dXJuIHJlc3VsdDsNCi0JfQ0KLQ0KLQkvKioNCi0JICoNCi0JICovDQotCXByaXZhdGUgdm9pZCBwcm9tcHRGb3JQYXNzd29yZChVUkwgcmVzb3VyY2VVcmwsIFN0cmluZyByZWFsbSwgTWFwIGluZm8pIHsNCi0NCi0JCVNoZWxsIHNoZWxsID0gbmV3IFNoZWxsKCk7DQotCQlVc2VyVmFsaWRhdGlvbkRpYWxvZyB1aSA9IG5ldyBVc2VyVmFsaWRhdGlvbkRpYWxvZyhzaGVsbCwgcmVzb3VyY2VVcmwsIHJlYWxtLCAiIik7DQotCQl1aS5zZXRVc2VybmFtZU11dGFibGUodHJ1ZSk7DQotCQl1aS5zZXRCbG9ja09uT3Blbih0cnVlKTsNCi0JCXVpLm9wZW4oKTsNCi0NCi0JCWlmICh1aS5nZXRSZXR1cm5Db2RlKCkgIT0gdWkuQ0FOQ0VMKSB7DQotCQkJaW5mby5wdXQoInVzZXJuYW1lIiwgdWkuZ2V0VXNlcmlkKCkpOw0KLQkJCWluZm8ucHV0KCJwYXNzd29yZCIsIHVpLmdldFBhc3N3b3JkKCkpOw0KLQkJfQ0KLQkJc2hlbGwuZGlzcG9zZSgpOw0KLQ0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9JbnN0YWxsYXRpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9JbnN0YWxsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2ZjgyMC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSW5zdGFsbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LkxhdW5jaEluZm87DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC5MYXVuY2hJbmZvLkhpc3Rvcnk7DQotLyoqDQotICovDQotcHVibGljIGNsYXNzIEluc3RhbGxhdGlvbiB7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfSUQgPSAiLWlkIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19MSVNUID0gIi1saXN0IjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19MT0NBVElPTiA9ICItbG9jYXRpb24iOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1NFVCA9ICItc2V0IjsNCi0NCi0JcHJpdmF0ZSBib29sZWFuIF9iTGlzdCA9IGZhbHNlOw0KLQlwcml2YXRlIGJvb2xlYW4gX2JTZXQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgX3N0ckxvY2F0aW9uID0gbnVsbDsNCi0JcHJpdmF0ZSBTdHJpbmcgX3N0cklkID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgX2lJZCA9IC0xOw0KLQlwcml2YXRlIExhdW5jaEluZm8gX2xhdW5jaEluZm8gPSBudWxsOw0KLQkvKioNCi0JICogSW5zdGFsbGF0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuDQotCSAqLw0KLQlwdWJsaWMgSW5zdGFsbGF0aW9uKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwcml2YXRlIFN0cmluZyBjaGVja0NvbW1hbmRMaW5lT3B0aW9ucygpIHsNCi0NCi0JCS8vIENvbW1hbmQNCi0JCS8vLS0tLS0tLS0NCi0JCWlmIChfYkxpc3QgPT0gdHJ1ZSkgew0KLQkJCWlmIChfYlNldCA9PSB0cnVlKSB7DQotCQkJCXJldHVybiAiSW52YWxpZCBvcHRpb24gc3ludGF4IjsNCi0JCQl9DQotCQl9DQotDQotCQllbHNlIGlmIChfYlNldCA9PSB0cnVlKSB7DQotCQkJaWYgKF9iTGlzdCA9PSB0cnVlKSB7DQotCQkJCXJldHVybiAiSW52YWxpZCBvcHRpb24gc3ludGF4IjsNCi0JCQl9DQotCQl9DQotDQotCQllbHNlIHsNCi0JCQlyZXR1cm4gIkNvbW1hbmQgbWlzc2luZyI7DQotCQl9DQotDQotCQkvLyBMb2NhdGlvbg0KLQkJLy8tLS0tLS0tLS0NCi0JCWlmIChfc3RyTG9jYXRpb24gPT0gbnVsbCB8fCBfc3RyTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkgew0KLQkJCXJldHVybiAiTG9jYXRpb24gbWlzc2luZyI7DQotCQl9DQotDQotCQlVUkwgdXJsTG9jYXRpb24gPSBudWxsOw0KLQ0KLQkJdHJ5IHsNCi0JCQl1cmxMb2NhdGlvbiA9IG5ldyBVUkwoX3N0ckxvY2F0aW9uKTsNCi0JCX0NCi0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsNCi0JCQlyZXR1cm4gIkludmFsaWQgbG9jYXRpb24gc3ludGF4IjsNCi0JCX0NCi0NCi0JCS8vIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCS8vCUxhdW5jaEluZm8uc3RhcnR1cCh1cmxMb2NhdGlvbik7DQotCQlfbGF1bmNoSW5mbyA9IExhdW5jaEluZm8uZ2V0Q3VycmVudCgpOw0KLQ0KLQkJLy8gU2V0DQotCQkvLy0tLS0NCi0JCWlmIChfYlNldCA9PSB0cnVlKSB7DQotCQkJaWYgKF9zdHJJZCA9PSBudWxsIHx8IF9zdHJJZC5sZW5ndGgoKSA9PSAwKSB7DQotCQkJCXJldHVybiAiSW5zdGFsbGF0aW9uIGlkZW50aWZpZXIgbnVtYmVyIG1pc3NpbmciOw0KLQkJCX0NCi0NCi0JCQl0cnkgew0KLQkJCQlfaUlkID0gbmV3IEludGVnZXIoX3N0cklkKS5pbnRWYWx1ZSgpOw0KLQkJCX0NCi0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7DQotCQkJCXJldHVybiAiSW52YWxpZCBpZGVudGlmaWVyIHN5bnRheCI7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIG51bGw7DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgU3RyaW5nIGRvTGlzdCgpIHsNCi0NCi0JCUxhdW5jaEluZm8gbGF1bmNoSW5mb0Zvcm1lciA9IG51bGw7DQotDQotCQlMYXVuY2hJbmZvLkhpc3RvcnlbXSBoaXN0b3JpZXMgPSBfbGF1bmNoSW5mby5nZXRMYXVuY2hJbmZvSGlzdG9yeSgpOw0KLQ0KLQkJaWYgKGhpc3Rvcmllcy5sZW5ndGggPT0gMCkNCi0JCQlyZXR1cm4gIk5vIGhpc3RvcmllcyBmb3VuZCI7DQotDQotCQlpZiAoaGlzdG9yaWVzLmxlbmd0aCA9PSAxICYmIGhpc3Rvcmllc1swXS5nZXRMYXVuY2hJbmZvRGF0ZSgpID09IG51bGwpDQotCQkJcmV0dXJuICJObyBoaXN0b3JpZXMgZm91bmQiOw0KLQ0KLQkJLy8gU2FtZSBvcmRlciBhcyBkb1NldCgpDQotCQkvLyBNb3N0IHJlY2VudCB0byBvbGRlc3Qgb3JkZXINCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaW50IGlJbmRleCA9IDE7DQotDQotCQlmb3IgKGludCBpID0gaGlzdG9yaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7DQotDQotCQkJRGF0ZSBkYXRlID0gaGlzdG9yaWVzW2ldLmdldExhdW5jaEluZm9EYXRlKCk7DQotDQotCQkJLy8gT2xkZXIgcHJvZmlsZQ0KLQkJCS8vLS0tLS0tLS0tLS0tLS0NCi0JCQlpZiAoZGF0ZSAhPSBudWxsKSB7DQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihJbnRlZ2VyLnRvU3RyaW5nKGlJbmRleCsrKSArICIgIiArIGhpc3Rvcmllc1tpXS5nZXRMYXVuY2hJbmZvRGF0ZSgpLnRvU3RyaW5nKCkpOw0KLQkJCX0NCi0JCX0NCi0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZG9TZXQoKSB7DQotDQotCQlMYXVuY2hJbmZvLkhpc3RvcnlbXSBoaXN0b3JpZXMgPSBfbGF1bmNoSW5mby5nZXRMYXVuY2hJbmZvSGlzdG9yeSgpOw0KLQ0KLQkJaWYgKF9pSWQgPCBoaXN0b3JpZXMubGVuZ3RoKSB7DQotDQotCQkJaW50IGlJbmRleCA9IDE7DQotDQotCQkJLy8gU2FtZSBhbGdvcml0aG0gYXMgZG9MaXN0KCkNCi0JCQkvLyBNb3N0IHJlY2VudCB0byBvbGRlc3Qgb3JkZXINCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlmb3IgKGludCBpID0gaGlzdG9yaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7DQotDQotCQkJCURhdGUgZGF0ZSA9IGhpc3Rvcmllc1tpXS5nZXRMYXVuY2hJbmZvRGF0ZSgpOw0KLQ0KLQkJCQkvLyBPbGRlciBwcm9maWxlDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKGRhdGUgIT0gbnVsbCkgew0KLQkJCQkJaWYgKGlJbmRleCA9PSBfaUlkKSB7DQotCQkJCQkJX2xhdW5jaEluZm8ucmV2ZXJ0VG8oaGlzdG9yaWVzW2ldKTsNCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZGF0ZS50b1N0cmluZygpKTsNCi0JCQkJCQlyZXR1cm4gbnVsbDsNCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWlJbmRleCsrOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuICJJZGVudGlmaWVyIG5vdCBmb3VuZCI7DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7DQotDQotCQlJbnN0YWxsYXRpb24gaW5zdGFsbGF0aW9uID0gbmV3IEluc3RhbGxhdGlvbigpOw0KLQ0KLQkJaW5zdGFsbGF0aW9uLnBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ3MpOw0KLQ0KLQkJU3RyaW5nIHN0ckVycm9yID0gaW5zdGFsbGF0aW9uLmNoZWNrQ29tbWFuZExpbmVPcHRpb25zKCk7DQotDQotCQlpZiAoc3RyRXJyb3IgPT0gbnVsbCkgew0KLQkJCWlmIChpbnN0YWxsYXRpb24uX2JMaXN0ID09IHRydWUpDQotCQkJCXN0ckVycm9yID0gaW5zdGFsbGF0aW9uLmRvTGlzdCgpOw0KLQ0KLQkJCWVsc2UgaWYgKGluc3RhbGxhdGlvbi5fYlNldCA9PSB0cnVlKQ0KLQkJCQlzdHJFcnJvciA9IGluc3RhbGxhdGlvbi5kb1NldCgpOw0KLQkJfQ0KLQ0KLQkJaWYgKHN0ckVycm9yICE9IG51bGwpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyRXJyb3IpOw0KLQkJCXByaW50VXNhZ2UoKTsNCi0JCQlTeXN0ZW0uZXhpdCgtMSk7DQotCQl9DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBwYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhTdHJpbmdbXSBzdHJhQXJncykgew0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJhQXJncy5sZW5ndGg7ICsraSkgew0KLQ0KLQkJCS8vIENvbW1hbmQ6IExpc3QNCi0JCQkvLy0tLS0tLS0tLS0tLS0tDQotCQkJaWYgKHN0cmFBcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoU1RSSU5HX0xJU1QpID09IHRydWUpIHsNCi0JCQkJX2JMaXN0ID0gdHJ1ZTsNCi0JCQl9DQotDQotCQkJLy8gQ29tbWFuZDogU2V0DQotCQkJLy8tLS0tLS0tLS0tLS0tDQotCQkJZWxzZSBpZiAoc3RyYUFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZShTVFJJTkdfU0VUKSA9PSB0cnVlKSB7DQotCQkJCV9iU2V0ID0gdHJ1ZTsNCi0JCQl9DQotDQotCQkJLy8gTG9jYXRpb24gdG8gaW5zdGFsbCBmcm9tDQotCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJZWxzZSBpZiAoc3RyYUFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZShTVFJJTkdfTE9DQVRJT04pID09IHRydWUgJiYgaSA8IHN0cmFBcmdzLmxlbmd0aCAtIDEpIHsNCi0JCQkJX3N0ckxvY2F0aW9uID0gc3RyYUFyZ3NbKytpXTsNCi0JCQl9DQotDQotCQkJLy8gSWRlbnRpZmllcg0KLQkJCS8vLS0tLS0tLS0tLS0NCi0JCQllbHNlIGlmIChzdHJhQXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNUUklOR19JRCkgPT0gdHJ1ZSAmJiBpIDwgc3RyYUFyZ3MubGVuZ3RoIC0gMSkgew0KLQkJCQlfc3RySWQgPSBzdHJhQXJnc1srK2ldOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVzYWdlKCkgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLWxpc3QgLWxvY2F0aW9uIHVybFBhdGgiKTsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXNldCAgLWxvY2F0aW9uIHVybFBhdGggLWlkIG51bWJlciIpOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmljYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ1Mzg5ZC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpY2F0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvSmFyVmVyaWZpY2F0aW9uUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTExODEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWNhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICogUmVzdWx0IG9mIHRoZSBzZXJ2aWNlDQotICovDQotcHVibGljIGNsYXNzIEphclZlcmlmaWNhdGlvblJlc3VsdCB7DQotDQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTkNFTF9JTlNUQUxMID0gMDsNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfVE9fSU5TVEFMTCA9IDE7DQotDQotCXByaXZhdGUgaW50IHJlc3VsdENvZGU7DQotCXByaXZhdGUgRXhjZXB0aW9uIHJlc3VsdEV4Y2VwdGlvbjsNCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgaW50IGdldFJlc3VsdENvZGUoKSB7DQotCQlyZXR1cm4gcmVzdWx0Q29kZTsNCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyBFeGNlcHRpb24gZ2V0UmVzdWx0RXhjZXB0aW9uKCkgew0KLQkJcmV0dXJuIHJlc3VsdEV4Y2VwdGlvbjsNCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFJlc3VsdENvZGUoaW50IG5ld1Jlc3VsdENvZGUpIHsNCi0JCXJlc3VsdENvZGUgPSBuZXdSZXN1bHRDb2RlOw0KLQl9DQotCS8qKg0KLQkgKiBjYWxsZWQgYnkgSmFyVmVyaWZpY2F0aW9uU2VydmljZSBvbmx5DQotCSAqLw0KLQl2b2lkIHNldFJlc3VsdEV4Y2VwdGlvbihFeGNlcHRpb24gbmV3UmVzdWx0RXhjZXB0aW9uKSB7DQotCQlyZXN1bHRFeGNlcHRpb24gPSBuZXdSZXN1bHRFeGNlcHRpb247DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmljYXRpb25TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5YjQzMzkuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWNhdGlvblNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9KYXJWZXJpZmllci5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYTExZDcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0phclZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvS2V5U3RvcmVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvS2V5U3RvcmVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODRlMGEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL0tleVN0b3Jlcy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL01haW4uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjAzNjcuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC51aTsNCi0vKg0KLSAqIChjKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDEuDQotICogQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCi0gKi8NCi0NCi1pbXBvcnQgamF2YS5uZXQuKjsNCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsNCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsNCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsNCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsNCi0vKioNCi0gKiBTdGFydHVwIGNsYXNzIGZvciBFY2xpcHNlLiBDcmVhdGVzIGEgY2xhc3MgbG9hZGVyIHVzaW5nDQotICogc3VwcGxpZWQgVVJMIG9mIHBsYXRmb3JtIGluc3RhbGxhdGlvbiwgbG9hZHMgYW5kIGNhbGxzDQotICogdGhlIEVjbGlwc2UgQm9vdCBMb2FkZXINCi0gKi8NCi1wdWJsaWMgY2xhc3MgTWFpbiB7DQotCXByb3RlY3RlZCBib29sZWFuIGRlYnVnID0gZmFsc2U7DQotCXByb3RlY3RlZCBib29sZWFuIHVzYWdlID0gZmFsc2U7DQotCXByb3RlY3RlZCBTdHJpbmcgYm9vdExvY2F0aW9uID0gbnVsbDsNCi0JcHJvdGVjdGVkIFN0cmluZyBhcHBsaWNhdGlvbjsNCi0JcHJvdGVjdGVkIFVSTCBwbHVnaW5QYXRoTG9jYXRpb247DQotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247DQotDQotCS8vIGNvbnN0YW50cw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT04gPSAiLWFwcGxpY2F0aW9uIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1QgPSAiLWJvb3QiOw0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUcgPSAiLWRlYnVnIjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTQUdFID0gIi0/IjsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT1RMT0FERVIgPSAib3JnLmVjbGlwc2UuY29yZS5ib290LkJvb3RMb2FkZXIiOw0KLQ0KLQkvLyBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBib290IGxvYWRlciBjb2RlLiAgVGhpcyBpcyB1c2VkIHRvIGNvbnN0cnVjdA0KLQkvLyB0aGUgY29ycmVjdCBjbGFzcyBwYXRoIGZvciBydW5uaW5nIGluIFZBSiBhbmQgVkFNRS4NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJFY2xpcHNlIENvcmUgQm9vdCI7DQotDQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5WQUo7DQotCXN0YXRpYyB7DQotCQl0cnkgew0KLQkJCUNsYXNzLmZvck5hbWUoImNvbS5pYm0udXZtLmxhbmcuUHJvamVjdENsYXNzTG9hZGVyIik7DQotCQkJaW5WQUogPSB0cnVlOw0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQlpblZBSiA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW5WQU1FOw0KLQlzdGF0aWMgew0KLQkJdHJ5IHsNCi0JCQlDbGFzcy5mb3JOYW1lKCJjb20uaWJtLmVjbGlwc2UuVkFNRSIpOw0KLQkJCWluVkFNRSA9IHRydWU7DQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgew0KLQkJCWluVkFNRSA9IGZhbHNlOw0KLQkJfQ0KLQl9DQotDQotcHJvdGVjdGVkIHZvaWQgYmFzaWNSdW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7DQotCUNsYXNzIGNsYXp6ID0gZ2V0Qm9vdExvYWRlcihib290TG9jYXRpb24pOw0KLQlNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0RGVjbGFyZWRNZXRob2QoInJ1biIsIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBVUkwuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3MgfSk7DQotCXRyeSB7DQotCQltZXRob2QuaW52b2tlKGNsYXp6LCBuZXcgT2JqZWN0W10geyBhcHBsaWNhdGlvbiwgcGx1Z2luUGF0aExvY2F0aW9uLCBsb2NhdGlvbiwgYXJncyB9KTsNCi0JfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7DQotCQlpZiAoZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIEVycm9yKQ0KLQkJCXRocm93IChFcnJvcikgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsNCi0JCWVsc2UNCi0JCQl0aHJvdyBlOw0KLQl9DQotfQ0KLXB1YmxpYyBDbGFzcyBnZXRCb290TG9hZGVyKFN0cmluZyBiYXNlKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JVVJMQ2xhc3NMb2FkZXIgbG9hZGVyID0gbmV3IFVSTENsYXNzTG9hZGVyKG5ldyBVUkxbXSB7IGdldEJvb3RVUkwoYmFzZSl9LCBudWxsKTsNCi0JcmV0dXJuIGxvYWRlci5sb2FkQ2xhc3MoQk9PVExPQURFUik7DQotfQ0KLS8qKg0KLSAqIFJldHVybnMgdGhlIDxjb2RlPlVSTDwvY29kZT4gd2hlcmUgdGhlIGJvb3QgY2xhc3NlcyBhcmUgbG9jYXRlZC4NCi0gKi8NCi1wcm90ZWN0ZWQgVVJMIGdldEJvb3RVUkwoU3RyaW5nIGJhc2UpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gew0KLQlVUkwgdXJsID0gbnVsbDsNCi0JaWYgKGJhc2UgIT0gbnVsbCkgDQotCQlyZXR1cm4gbmV3IFVSTChiYXNlKTsNCi0JLy8gQ3JlYXRlIGEgVVJMIGJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGlzIGNsYXNzJyBjb2RlLg0KLQkvLyBzdHJpcCBvZmYgamFyIGZpbGUgYW5kL29yIGxhc3QgZGlyZWN0b3J5IHRvIGdldCANCi0JLy8gdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHByb2plY3RzLg0KLQl1cmwgPSBnZXRDbGFzcygpLmdldFByb3RlY3Rpb25Eb21haW4oKS5nZXRDb2RlU291cmNlKCkuZ2V0TG9jYXRpb24oKTsNCi0JU3RyaW5nIHBhdGggPSB1cmwuZ2V0RmlsZSgpOw0KLQlpZiAocGF0aC5lbmRzV2l0aCgiLmphciIpKQ0KLQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoIi8iKSk7DQotCWlmIChwYXRoLmVuZHNXaXRoKCIvIikpDQotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpOw0KLQlpZiAoaW5WQUogfHwgaW5WQU1FKSB7DQotCQlpbnQgaXggPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7DQotCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaXggKyAxKTsNCi0JCXBhdGggPSBwYXRoICsgUFJPSkVDVF9OQU1FICsgIi8iOw0KLQl9IGVsc2UNCi0JCXBhdGggPSBwYXRoICsgIi9wbHVnaW5zL29yZy5lY2xpcHNlLmNvcmUuYm9vdC9ib290LmphciI7DQotCXJldHVybiBuZXcgVVJMKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0SG9zdCgpLCB1cmwuZ2V0UG9ydCgpLCBwYXRoKTsNCi19DQotLyoqDQotICogUHJpbnQgdGhlIHVzYWdlIG9mIHRoaXMgbGF1bmNoZXIgb24gdGhlIHN5c3RlbSBjb25zb2xlDQotICovDQotcHJvdGVjdGVkIHZvaWQgcHJpbnRVc2FnZShQcmludFdyaXRlciBvdXQpIHsNCi0Jb3V0LnByaW50bG4oIlRoZSBnZW5lcmFsIGZvcm0gb2YgdXNpbmcgdGhlIFBsYXRmb3JtIGJvb3RzdHJhcCBtYWluIGlzOiIpOw0KLQlvdXQucHJpbnRsbigiICAgICAgamF2YSA8bWFpbiBjbGFzcz4gLWFwcGxpY2F0aW9uIDxuYW1lPiBbb3B0aW9uIGxpc3RdIik7DQotCW91dC5wcmludGxuKCJ3aGVyZSB0aGUgcmVxdWlyZWQgYXJndW1lbnRzIGFyZToiKTsNCi0Jb3V0LnByaW50bG4oIiAgICAgIC1hcHBsaWNhdGlvbiA8bmFtZT4gOiB0aGUgYXBwbGljYXRpb24gdG8gcnVuICIpOw0KLQlvdXQucHJpbnRsbigiYW5kIHdoZXJlIHRoZSBvcHRpb24gbGlzdCBjYW4gYmUgYW55IG51bWJlciBvZiB0aGUgZm9sbG93aW5nOiIpOw0KLQlvdXQucHJpbnRsbigiICAgICAgLXBsYXRmb3JtIDxsb2NhdGlvbj4gOiBydW4gaW4gdGhlIGdpdmVuIGxvY2F0aW9uIik7DQotCW91dC5wcmludGxuKCIgICAgICAtZGVidWcgW2RlYnVnIG9wdGlvbnMgZmlsZV0gOiB0dXJuIG9uIGRlYnVnIG1vZGUuICBSZWFkIGRlYnVnIG9wdGlvbnMgZnJvbSAiKTsNCi0Jb3V0LnByaW50bG4oIiAgICAgICAgICB0aGUgc3BlY2lmaWVkIGZpbGUgb3IgZnJvbSAuLy5vcHRpb25zIGlmIG5vdCBzcGVjaWZpZWQuIik7DQotCW91dC5wcmludGxuKCIgICAgICAtPyA6IHByaW50IHRoaXMgbWVzc2FnZSIpOw0KLQlvdXQuZmx1c2goKTsNCi19DQotcHJvdGVjdGVkIFN0cmluZ1tdIHByb2Nlc3NDb21tYW5kTGluZShTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsNCi0JaW50W10gY29uZmlnQXJncyA9IG5ldyBpbnRbMTAwXTsNCi0JY29uZmlnQXJnc1swXSA9IC0xOyAvLyBuZWVkIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0IGVsZW1lbnQgdG8gc29tZXRoaW5nIHRoYXQgY291bGQgbm90IGJlIGFuIGluZGV4Lg0KLQlpbnQgY29uZmlnQXJnSW5kZXggPSAwOw0KLQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsNCi0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsNCi0JCS8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykNCi0JCS8vIGNoZWNrIGlmIGRlYnVnIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGUgZW50aXJlIHBsYXRmb3JtDQotCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKERFQlVHKSkgew0KLQkJCWRlYnVnID0gdHJ1ZTsNCi0JCQkvLyBwYXNzZWQgdGhydSB0aGlzIGFyZyAoaS5lLiwgZG8gbm90IHNldCBmb3VuZCA9IHRydWUNCi0JCX0NCi0NCi0JCS8vIGxvb2sgZm9yIHRoZSB1c2FnZSBmbGFnDQotCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFVTQUdFKSkgew0KLQkJCXVzYWdlID0gdHJ1ZTsNCi0JCQkvLyBwYXNzZWQgdGhydSB0aGlzIGFyZyAoaS5lLiwgZG8gbm90IHNldCBmb3VuZCA9IHRydWUNCi0JCX0NCi0NCi0JCWlmIChmb3VuZCkgew0KLQkJCWNvbmZpZ0FyZ3NbY29uZmlnQXJnSW5kZXgrK10gPSBpOw0KLQkJCWNvbnRpbnVlOw0KLQkJfQ0KLQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgaWYgdGhlIG5leHQgb25lDQotCQkvLyBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGFyZyB3aXRoIGEgcGFybSBzbyBjb250aW51ZS4NCi0JCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIHsNCi0JCQljb250aW51ZTsNCi0JCX0NCi0JCVN0cmluZyBhcmcgPSBhcmdzWysraV07DQotDQotCQkvLyBsb29rIGZvciB0aGUgbGF1Y2hlciB0byBydW4NCi0JCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEJPT1QpKSB7DQotCQkJZm91bmQgPSB0cnVlOw0KLQkJCWJvb3RMb2NhdGlvbiA9IGFyZzsNCi0JCX0NCi0NCi0JCS8vIGxvb2sgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byBydW4NCi0JCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEFQUExJQ0FUSU9OKSkgew0KLQkJCWZvdW5kID0gdHJ1ZTsNCi0JCQlhcHBsaWNhdGlvbiA9IGFyZzsNCi0JCX0NCi0NCi0JCS8vIGRvbmUgY2hlY2tpbmcgZm9yIGFyZ3MuICBSZW1lbWJlciB3aGVyZSBhbiBhcmcgd2FzIGZvdW5kIA0KLQkJaWYgKGZvdW5kKSB7DQotCQkJY29uZmlnQXJnc1tjb25maWdBcmdJbmRleCsrXSA9IGkgLSAxOw0KLQkJCWNvbmZpZ0FyZ3NbY29uZmlnQXJnSW5kZXgrK10gPSBpOw0KLQkJfQ0KLQl9DQotDQotCS8vIHJlbW92ZSBhbGwgdGhlIGFyZ3VtZW50cyBjb25zdW1lZCBieSB0aGlzIGFyZ3VtZW50IHBhcnNpbmcNCi0JaWYgKGNvbmZpZ0FyZ0luZGV4ID09IDApDQotCQlyZXR1cm4gYXJnczsNCi0JU3RyaW5nW10gcGFzc1RocnVBcmdzID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGNvbmZpZ0FyZ0luZGV4XTsNCi0JY29uZmlnQXJnSW5kZXggPSAwOw0KLQlpbnQgaiA9IDA7DQotCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgew0KLQkJaWYgKGkgPT0gY29uZmlnQXJnc1tjb25maWdBcmdJbmRleF0pDQotCQkJY29uZmlnQXJnSW5kZXgrKzsNCi0JCWVsc2UNCi0JCQlwYXNzVGhydUFyZ3NbaisrXSA9IGFyZ3NbaV07DQotCX0NCi0JcmV0dXJuIHBhc3NUaHJ1QXJnczsNCi19DQotcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gew0KLQlTdHJpbmdbXSBwYXNzVGhydUFyZ3MgPSBwcm9jZXNzQ29tbWFuZExpbmUoYXJncyk7DQotCWlmICh1c2FnZSkgew0KLQkJcHJpbnRVc2FnZShuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCkpOw0KLQkJcmV0dXJuOw0KLQl9DQotCWJhc2ljUnVuKHBhc3NUaHJ1QXJncyk7DQotfQ0KLX0NCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvbi5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiNzkyYS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyogDQotICogVXBkYXRlIE1hbmFnZXIgSW5zdGFsbCBBcHBsaWNhdGlvbg0KLSAqDQotICogQ29tbWFuZCB0byBydW4gZnJvbSBjb21tYW5kIGxpbmU6DQotICoNCi0gKi5canJlXGJpblxqYXZhIC12ZXJpZnkgLWNwIHN0YXJ0dXAuamFyIG9yZy5lY2xpcHNlLmNvcmUubGF1bmNoZXIuVUlNYWluIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWkudXBkYXRlTWFuYWdlciAtaW5zdGFsbCAtdXJsIGh0dHA6Ly9rbGljbmlrLnRvcm9sYWIuaWJtLmNvbS9lY2xpcHNlL3NpdGUvIC1pZCBvcmcuZWNsaXBzZS5zZGsgJSoNCi0gKg0KLSAqDQotICogQXJndW1lbnRzIGFyZToNCi0gKiAgIC1pbnN0YWxsICAgSW5zdGFsbCBjb21tYW5kDQotICogICAtdXJsIFt1cmxdIExvY2F0aW9uIGZyb20gd2hpY2ggdG8gaW5zdGFsbCBmcm9tDQotICogICAtaWQgIFtpZF0gIElkZW50aWZpZXIgb2YgdGhlIG1hbmlmZXN0IHRvIGluc3RhbGwNCi0gKg0KLSAqIFNhbXBsZToNCi0gKiAgIC1pbnN0YWxsIC11cmwgZmlsZTovYzovdGVtcC91cGRhdGVzaXRlLyAtaWQgb3JnLmVjbGlwc2Uuc2RrDQotICovDQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7DQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7DQotDQotcHVibGljIGNsYXNzIFVNQXBwbGljYXRpb24gZXh0ZW5kcyBNYWluIHsNCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQVBQTElDQVRJT04gPSAib3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLnVpLnVwZGF0ZU1hbmFnZXIiOw0KLQlwdWJsaWMgVU1BcHBsaWNhdGlvbigpIHsNCi0JCXN1cGVyKCk7DQotCQlhcHBsaWNhdGlvbiA9IERFRkFVTFRfQVBQTElDQVRJT047DQotCX0NCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgew0KLQ0KLQkJaW50IGlSZXR1cm5Db2RlID0gMDsNCi0NCi0JCXRyeSB7DQotCQkJbmV3IFVNQXBwbGljYXRpb24oKS5ydW4oYXJncyk7DQotCQl9DQotDQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0NCi0JCVN5c3RlbS5leGl0KDApOw0KLQl9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTUFwcGxpY2F0aW9uVXNlckludGVyZmFjZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25Vc2VySW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NDNiYzIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25Vc2VySW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2VQcm9wZXJ0aWVzLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1BcHBsaWNhdGlvblVzZXJJbnRlcmZhY2VQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjODRiMGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25Vc2VySW50ZXJmYWNlUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25XaW5kb3cuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTUFwcGxpY2F0aW9uV2luZG93LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNjM5NGIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNQXBwbGljYXRpb25XaW5kb3cuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTURpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTg5MzYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1EaWFsb2dBY3Rpb24uamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTURpYWxvZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWRkM2Q0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTURpYWxvZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNUHJlZmVyZW5jZVBhZ2VTZXR0aW5ncy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNUHJlZmVyZW5jZVBhZ2VTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWEyNzA5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVByZWZlcmVuY2VQYWdlU2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGJjMDguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlQ29tcGxldGUuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VDb21wbGV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDNhN2VjLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VDb21wbGV0ZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUluc3RhbGxhYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlSW5zdGFsbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4MDNkNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlSW5zdGFsbGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07DQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS5uZXQuVVJMOw0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOw0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0Ow0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklDb21wb25lbnREZXNjcmlwdG9yOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLklDb21wb25lbnRFbnRyeURlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSU1hbmlmZXN0RGVzY3JpcHRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5JUHJvZHVjdERlc2NyaXB0b3I7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuSVVNUmVnaXN0cnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuYm9vdC51cGRhdGUuVU1FY2xpcHNlVHJlZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5VUkxOYW1lUGFpcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC5ib290LnVwZGF0ZS5VcGRhdGVNYW5hZ2VyQ29uc3RhbnRzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmJvb3QudXBkYXRlLkJhc2VVUkxIYW5kbGVyLlJlc3BvbnNlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7DQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uVGFibGVUcmVlOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW07DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZVRyYWNrTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47DQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVVJMSGFuZGxlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmNvcmUuVXBkYXRlTWFuYWdlclN0cmluZ3M7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndlYmRhdi5odHRwLmNsaWVudC5JU3RhdHVzQ29kZXM7DQotDQotLyoqDQotICogUHJlc2VudHMgcHJvZHVjdHMgYW5kIGNvbXBvbmVudHMgdGhhdCBtYXkgYmUgc2VsZWN0ZWQgZm9yIGluc3RhbGxhdGlvbi4NCi0gKi8NCi1wdWJsaWMgY2xhc3MgVU1XaXphcmRQYWdlSW5zdGFsbGFibGUgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIsIE1vdXNlVHJhY2tMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgew0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBfYlJlZnJlc2hSZXF1aXJlZCA9IHRydWU7DQotCXByb3RlY3RlZCBVTVdpemFyZCBfd2l6YXJkID0gbnVsbDsNCi0JcHJvdGVjdGVkIFRhYmxlVHJlZSBfdGFibGVUcmVlSXRlbXMgPSBudWxsOw0KLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIF9oYXNoUmVnaXN0cnlDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsNCi0JcHJvdGVjdGVkIFRyZWVTZXQgX3RyZWVTZXRJdGVtcyA9IG51bGw7DQotCXByb3RlY3RlZCBUcmVlU2V0IF90cmVlU2V0TG9jYXRpb25zID0gbnVsbDsNCi0JcHJvdGVjdGVkIFRleHQgX3RleHREZXNjcmlwdGlvbiA9IG51bGw7DQotCXByb3RlY3RlZCBTdHJpbmcgX3N0ckRlc2NyaXB0aW9uID0gbnVsbDsNCi0JcHJvdGVjdGVkIGJvb2xlYW4gX2JVcGRhdGVNb2RlID0gZmFsc2U7DQotCXByb3RlY3RlZCBTYXNoRm9ybSBfc2FzaEZvcm1Ub3BCb3R0b20gPSBudWxsOw0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBfcHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsNCi0JcHJvdGVjdGVkIFVSTE5hbWVQYWlyW10gX3VybE5hbWVQYWlycyA9IG51bGw7DQotCXByb3RlY3RlZCBCdXR0b24gX2J1dHRvblNob3dMYXRlc3RPbmx5ID0gbnVsbDsNCi0JcHJvdGVjdGVkIGJvb2xlYW4gX2JTaG93TGF0ZXN0T25seSA9IHRydWU7DQotCS8qKg0KLQkgKg0KLQkgKi8NCi0JcHVibGljIFVNV2l6YXJkUGFnZUluc3RhbGxhYmxlKFVNV2l6YXJkIHdpemFyZCwgU3RyaW5nIHN0ck5hbWUsIGJvb2xlYW4gYlVwZGF0ZU1vZGUpIHsNCi0JCXN1cGVyKHN0ck5hbWUpOw0KLQkJX3dpemFyZCA9IHdpemFyZDsNCi0JCV9iVXBkYXRlTW9kZSA9IGJVcGRhdGVNb2RlOw0KLQ0KLQkJaWYgKGJVcGRhdGVNb2RlID09IHRydWUpIHsNCi0JCQl0aGlzLnNldFRpdGxlKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19OZXdfQ29tcG9uZW50X1VwZGF0ZXMiKSk7DQotCQkJdGhpcy5zZXREZXNjcmlwdGlvbihVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfU2VsZWN0X2F2YWlsYWJsZV92ZXJzaW9uc190b19pbnN0YWxsIikpOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJdGhpcy5zZXRUaXRsZShVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfTmV3X0NvbXBvbmVudHMiKSk7DQotCQkJdGhpcy5zZXREZXNjcmlwdGlvbihVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfU2VsZWN0X2NvbXBvbmVudHNfdG9faW5zdGFsbCIpKTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBhZGRMb2NhdGlvblRvVHJlZShJVU1SZWdpc3RyeSByZWdpc3RyeVJlbW90ZSwgSVVNUmVnaXN0cnkgcmVnaXN0cnlMb2NhbCwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsNCi0NCi0JCVVNV2l6YXJkVHJlZUl0ZW0gaXRlbVByb2R1Y3QgPSBudWxsOw0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtQ29tcG9uZW50ID0gbnVsbDsNCi0JCVVNV2l6YXJkVHJlZUl0ZW0gaXRlbUNvbXBvbmVudEVudHJ5ID0gbnVsbDsNCi0JCVVNV2l6YXJkVHJlZUl0ZW0gaXRlbUxvY2F0aW9uID0gbnVsbDsNCi0JCVVNV2l6YXJkVHJlZUl0ZW0gaXRlbUNvbXBvbmVudENhdGVnb3J5ID0gbnVsbDsNCi0JCVVNV2l6YXJkVHJlZUl0ZW0gaXRlbVByb2R1Y3RDYXRlZ29yeSA9IG51bGw7DQotDQotCQlJUHJvZHVjdERlc2NyaXB0b3IgZGVzY3JpcHRvckxvY2FsUHJvZHVjdCA9IG51bGw7DQotCQlJUHJvZHVjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9yc1Byb2R1Y3QgPSBudWxsOw0KLQkJSUNvbXBvbmVudERlc2NyaXB0b3IgZGVzY3JpcHRvckxvY2FsQ29tcG9uZW50ID0gbnVsbDsNCi0JCUlDb21wb25lbnREZXNjcmlwdG9yW10gZGVzY3JpcHRvcnNDb21wb25lbnQgPSBudWxsOw0KLQkJSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzRW50cnkgPSBudWxsOw0KLQ0KLQkJLy8gT2J0YWluIGRlc2NyaXB0b3JzDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmIChfYlNob3dMYXRlc3RPbmx5ID09IHRydWUpIHsNCi0JCQlkZXNjcmlwdG9yc1Byb2R1Y3QgPSByZWdpc3RyeVJlbW90ZS5nZXRQcm9kdWN0RGVzY3JpcHRvcnMoKTsNCi0JCQlkZXNjcmlwdG9yc0NvbXBvbmVudCA9IHJlZ2lzdHJ5UmVtb3RlLmdldENvbXBvbmVudERlc2NyaXB0b3JzKCk7DQotCQl9DQotCQllbHNlIHsNCi0JCQlkZXNjcmlwdG9yc1Byb2R1Y3QgPSByZWdpc3RyeVJlbW90ZS5nZXRBbGxQcm9kdWN0RGVzY3JpcHRvcnMoKTsNCi0JCQlkZXNjcmlwdG9yc0NvbXBvbmVudCA9IHJlZ2lzdHJ5UmVtb3RlLmdldEFsbENvbXBvbmVudERlc2NyaXB0b3JzKCk7DQotCQl9DQotDQotCQlpZiAoZGVzY3JpcHRvcnNQcm9kdWN0Lmxlbmd0aCArIGRlc2NyaXB0b3JzQ29tcG9uZW50Lmxlbmd0aCA+IDApIHsNCi0NCi0JCQlpdGVtTG9jYXRpb24gPSBuZXcgVU1XaXphcmRUcmVlSXRlbSgpOw0KLQkJCWl0ZW1Mb2NhdGlvbi5faVR5cGUgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfVVJMOw0KLQkJCWl0ZW1Mb2NhdGlvbi5fc3RyRGVzY3JpcHRpb24gPSByZWdpc3RyeVJlbW90ZS5nZXRSZWdpc3RyeUJhc2VVUkwoKS50b0V4dGVybmFsRm9ybSgpOw0KLQkJCWl0ZW1Mb2NhdGlvbi5fc3RyTmFtZSA9IGdldFVSTERlc2NyaXB0aW9uKGl0ZW1Mb2NhdGlvbi5fc3RyRGVzY3JpcHRpb24pOw0KLQkJCWl0ZW1Mb2NhdGlvbi5fc3RyVVJMVXBkYXRlID0gaXRlbUxvY2F0aW9uLl9zdHJOYW1lOw0KLQ0KLQkJCXByb2dyZXNzTW9uaXRvci5iZWdpblRhc2soVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0V4YW1pbmluZyIpICsgIjoiLCBkZXNjcmlwdG9yc1Byb2R1Y3QubGVuZ3RoICsgZGVzY3JpcHRvcnNDb21wb25lbnQubGVuZ3RoKTsNCi0JCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhpdGVtTG9jYXRpb24uX3N0ck5hbWUpOw0KLQ0KLQkJCUlNYW5pZmVzdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9yc1NlbGVjdGVkID0gX3dpemFyZC5fbWFuaWZlc3REZXNjcmlwdG9yczsNCi0NCi0JCQlib29sZWFuIGJJbmNsdWRlVGhpc09uZSA9IGZhbHNlOw0KLQ0KLQkJCS8vIFByb2R1Y3RzDQotCQkJLy8tLS0tLS0tLS0NCi0JCQlpZiAoZGVzY3JpcHRvcnNQcm9kdWN0Lmxlbmd0aCA+IDApIHsNCi0NCi0JCQkJaXRlbVByb2R1Y3RDYXRlZ29yeSA9IG5ldyBVTVdpemFyZFRyZWVJdGVtKCk7DQotCQkJCWl0ZW1Qcm9kdWN0Q2F0ZWdvcnkuX2lUeXBlID0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1RfQ0FURUdPUlk7DQotCQkJCWl0ZW1Qcm9kdWN0Q2F0ZWdvcnkuX3N0ck5hbWUgPSAicHJvZHVjdHMiOw0KLQ0KLQkJCQkvLyBBZGQgcHJvZHVjdCBjYXRlZ29yeSB0byBsb2NhdGlvbiB0cmVlIGxhdGVyDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJSVByb2R1Y3REZXNjcmlwdG9yIGRlc2NyaXB0b3JQcm9kdWN0U2VsZWN0ZWQgPSBudWxsOw0KLQ0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzUHJvZHVjdC5sZW5ndGg7ICsraSkgew0KLQ0KLQkJCQkJLy8gSW5jbHVkZSBhbGwgaWYgc2VsZWN0ZWQgZGVzY3JpcHRvcnMgaXMgbnVsbA0KLQkJCQkJLy8gT3RoZXJ3aXNlLCBpbmNsdWRlIG9ubHkgdGhvc2Ugc2VsZWN0ZWQNCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCWJJbmNsdWRlVGhpc09uZSA9IHRydWU7DQotDQotCQkJCQlpZiAoZGVzY3JpcHRvcnNTZWxlY3RlZCAhPSBudWxsKSB7DQotCQkJCQkJYkluY2x1ZGVUaGlzT25lID0gZmFsc2U7DQotDQotCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yc1NlbGVjdGVkLmxlbmd0aDsgKytqKSB7DQotCQkJCQkJCWlmIChkZXNjcmlwdG9yc1NlbGVjdGVkW2pdIGluc3RhbmNlb2YgSVByb2R1Y3REZXNjcmlwdG9yKSB7DQotCQkJCQkJCQlkZXNjcmlwdG9yUHJvZHVjdFNlbGVjdGVkID0gKElQcm9kdWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNTZWxlY3RlZFtqXTsNCi0JCQkJCQkJCWlmIChkZXNjcmlwdG9yUHJvZHVjdFNlbGVjdGVkLmdldFVuaXF1ZUlkZW50aWZpZXIoKSAhPSBudWxsKSB7DQotCQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JQcm9kdWN0U2VsZWN0ZWQuZ2V0VW5pcXVlSWRlbnRpZmllcigpLmVxdWFscyhkZXNjcmlwdG9yc1Byb2R1Y3RbaV0uZ2V0VW5pcXVlSWRlbnRpZmllcigpKSA9PSB0cnVlKSB7DQotCQkJCQkJCQkJCWJJbmNsdWRlVGhpc09uZSA9IHRydWU7DQotCQkJCQkJCQkJCWJyZWFrOw0KLQkJCQkJCQkJCX0NCi0JCQkJCQkJCX0NCi0JCQkJCQkJfQ0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCS8vIERpc3BsYXkgb25seSBub24taW5zdGFsbGVkIGl0ZW1zDQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJaWYgKF9iVXBkYXRlTW9kZSA9PSBmYWxzZSkgew0KLQkJCQkJCWlmIChyZWdpc3RyeUxvY2FsLmdldFByb2R1Y3REZXNjcmlwdG9yKGRlc2NyaXB0b3JzUHJvZHVjdFtpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpICE9IG51bGwpIHsNCi0JCQkJCQkJYkluY2x1ZGVUaGlzT25lID0gZmFsc2U7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJaWYgKGJJbmNsdWRlVGhpc09uZSA9PSB0cnVlKSB7DQotCQkJCQkJaXRlbVByb2R1Y3QgPSBuZXcgVU1XaXphcmRUcmVlSXRlbSgpOw0KLQkJCQkJCWl0ZW1Qcm9kdWN0Ll9pVHlwZSA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9QUk9EVUNUOw0KLQkJCQkJCWl0ZW1Qcm9kdWN0Ll9zdHJEZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3JzUHJvZHVjdFtpXS5nZXREZXNjcmlwdGlvbigpOw0KLQkJCQkJCWl0ZW1Qcm9kdWN0Ll9zdHJOYW1lID0gZGVzY3JpcHRvcnNQcm9kdWN0W2ldLmdldExhYmVsKCk7DQotCQkJCQkJaXRlbVByb2R1Y3QuX3N0cklkID0gZGVzY3JpcHRvcnNQcm9kdWN0W2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCQkJCQlpdGVtUHJvZHVjdC5fc3RyVmVuZG9yTmFtZSA9IGRlc2NyaXB0b3JzUHJvZHVjdFtpXS5nZXRQcm92aWRlck5hbWUoKTsNCi0JCQkJCQlpdGVtUHJvZHVjdC5fc3RyVmVyc2lvbkF2YWlsYWJsZSA9IGRlc2NyaXB0b3JzUHJvZHVjdFtpXS5nZXRWZXJzaW9uU3RyKCk7DQotCQkJCQkJaXRlbVByb2R1Y3QuX2Rlc2NyaXB0b3JBdmFpbGFibGUgPSBkZXNjcmlwdG9yc1Byb2R1Y3RbaV07DQotDQotCQkJCQkJZGVzY3JpcHRvckxvY2FsUHJvZHVjdCA9IHJlZ2lzdHJ5TG9jYWwuZ2V0UHJvZHVjdERlc2NyaXB0b3IoaXRlbVByb2R1Y3QuX3N0cklkKTsNCi0NCi0JCQkJCQlpZiAoZGVzY3JpcHRvckxvY2FsUHJvZHVjdCAhPSBudWxsKSB7DQotCQkJCQkJCWl0ZW1Qcm9kdWN0Ll9kZXNjcmlwdG9yQ3VycmVudCA9IGRlc2NyaXB0b3JMb2NhbFByb2R1Y3Q7DQotCQkJCQkJCWl0ZW1Qcm9kdWN0Ll9zdHJWZXJzaW9uQ3VycmVudCA9IGRlc2NyaXB0b3JMb2NhbFByb2R1Y3QuZ2V0VmVyc2lvblN0cigpOw0KLQkJCQkJCX0NCi0NCi0JCQkJCQlpdGVtUHJvZHVjdENhdGVnb3J5LmFkZENoaWxkSXRlbShpdGVtUHJvZHVjdCk7DQotDQotCQkJCQkJLy8gQ29tcG9uZW50IGVudHJpZXMgb2YgdGhlIHByb2R1Y3QNCi0JCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJCWRlc2NyaXB0b3JzRW50cnkgPSBkZXNjcmlwdG9yc1Byb2R1Y3RbaV0uZ2V0Q29tcG9uZW50RW50cmllcygpOw0KLQ0KLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcnNFbnRyeS5sZW5ndGg7ICsraikgew0KLQ0KLQkJCQkJCQkvLyBUdXJuIG9mZiBzZWxlY3RlZCBmbGFnDQotCQkJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCQkJZGVzY3JpcHRvcnNFbnRyeVtqXS5pc1NlbGVjdGVkKGZhbHNlKTsNCi0JCQkJCQkJaXRlbUNvbXBvbmVudEVudHJ5ID0gbmV3IFVNV2l6YXJkVHJlZUl0ZW0oKTsNCi0JCQkJCQkJaXRlbUNvbXBvbmVudEVudHJ5Ll9pVHlwZSA9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfRU5UUlk7DQotCQkJCQkJCWl0ZW1Db21wb25lbnRFbnRyeS5fc3RyTmFtZSA9IGRlc2NyaXB0b3JzRW50cnlbal0uZ2V0TGFiZWwoKTsNCi0JCQkJCQkJaXRlbUNvbXBvbmVudEVudHJ5Ll9zdHJJZCA9IGRlc2NyaXB0b3JzRW50cnlbal0uZ2V0VW5pcXVlSWRlbnRpZmllcigpOw0KLQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX3N0clZlcnNpb25BdmFpbGFibGUgPSBkZXNjcmlwdG9yc0VudHJ5W2pdLmdldFZlcnNpb25TdHIoKTsNCi0JCQkJCQkJaXRlbUNvbXBvbmVudEVudHJ5Ll9kZXNjcmlwdG9yRW50cnkgPSBkZXNjcmlwdG9yc0VudHJ5W2pdOw0KLQ0KLQkJCQkJCQlkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQgPSByZWdpc3RyeUxvY2FsLmdldENvbXBvbmVudERlc2NyaXB0b3IoaXRlbUNvbXBvbmVudEVudHJ5Ll9zdHJJZCk7DQotDQotCQkJCQkJCWlmIChkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQgIT0gbnVsbCkgew0KLQkJCQkJCQkJaXRlbUNvbXBvbmVudEVudHJ5Ll9zdHJWZXJzaW9uQ3VycmVudCA9IGRlc2NyaXB0b3JMb2NhbENvbXBvbmVudC5nZXRWZXJzaW9uU3RyKCk7DQotCQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX3N0clZlbmRvck5hbWUgPSBkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQuZ2V0UHJvdmlkZXJOYW1lKCk7DQotCQkJCQkJCQlpdGVtQ29tcG9uZW50RW50cnkuX2Rlc2NyaXB0b3JDdXJyZW50ID0gZGVzY3JpcHRvckxvY2FsQ29tcG9uZW50Ow0KLQkJCQkJCQl9DQotDQotCQkJCQkJCWl0ZW1Qcm9kdWN0LmFkZENoaWxkSXRlbShpdGVtQ29tcG9uZW50RW50cnkpOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0NCi0JCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCX0NCi0NCi0JCQkJLy8gQWRkIGNvbXBvbmVudCBjYXRlZ29yeSBpZiB0aGVyZSBhcmUgYW55IGNvbXBvbmVudHMNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKGl0ZW1Qcm9kdWN0Q2F0ZWdvcnkuX3ZlY3RvckNoaWxkcmVuICE9IG51bGwgJiYgaXRlbVByb2R1Y3RDYXRlZ29yeS5fdmVjdG9yQ2hpbGRyZW4uc2l6ZSgpID4gMCkgew0KLQkJCQkJaXRlbUxvY2F0aW9uLmFkZENoaWxkSXRlbShpdGVtUHJvZHVjdENhdGVnb3J5KTsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBDb21wb25lbnRzDQotCQkJLy8tLS0tLS0tLS0tLQ0KLQkJCWlmIChkZXNjcmlwdG9yc0NvbXBvbmVudC5sZW5ndGggPiAwKSB7DQotDQotCQkJCWl0ZW1Db21wb25lbnRDYXRlZ29yeSA9IG5ldyBVTVdpemFyZFRyZWVJdGVtKCk7DQotCQkJCWl0ZW1Db21wb25lbnRDYXRlZ29yeS5faVR5cGUgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UX0NBVEVHT1JZOw0KLQkJCQlpdGVtQ29tcG9uZW50Q2F0ZWdvcnkuX3N0ck5hbWUgPSAiY29tcG9uZW50cyI7DQotDQotCQkJCS8vIEFkZCBwcm9kdWN0IGNhdGVnb3J5IHRvIGxvY2F0aW9uIHRyZWUgbGF0ZXINCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQlJQ29tcG9uZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yQ29tcG9uZW50U2VsZWN0ZWQgPSBudWxsOw0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzQ29tcG9uZW50Lmxlbmd0aDsgKytpKSB7DQotDQotCQkJCQkvLyBJbmNsdWRlIGFsbCBpZiBzZWxlY3RlZCBkZXNjcmlwdG9ycyBpcyBudWxsDQotCQkJCQkvLyBPdGhlcndpc2UsIGluY2x1ZGUgb25seSB0aG9zZSBzZWxlY3RlZA0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJYkluY2x1ZGVUaGlzT25lID0gdHJ1ZTsNCi0JCQkJCWlmIChkZXNjcmlwdG9yc1NlbGVjdGVkICE9IG51bGwpIHsNCi0JCQkJCQliSW5jbHVkZVRoaXNPbmUgPSBmYWxzZTsNCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzU2VsZWN0ZWQubGVuZ3RoOyArK2opIHsNCi0JCQkJCQkJaWYgKGRlc2NyaXB0b3JzU2VsZWN0ZWRbal0gaW5zdGFuY2VvZiBJQ29tcG9uZW50RGVzY3JpcHRvcikgew0KLQkJCQkJCQkJZGVzY3JpcHRvckNvbXBvbmVudFNlbGVjdGVkID0gKElDb21wb25lbnREZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1NlbGVjdGVkW2pdOw0KLQkJCQkJCQkJaWYgKGRlc2NyaXB0b3JDb21wb25lbnRTZWxlY3RlZC5nZXRVbmlxdWVJZGVudGlmaWVyKCkgIT0gbnVsbCkgew0KLQkJCQkJCQkJCWlmIChkZXNjcmlwdG9yQ29tcG9uZW50U2VsZWN0ZWQuZ2V0VW5pcXVlSWRlbnRpZmllcigpLmVxdWFscyhkZXNjcmlwdG9yc0NvbXBvbmVudFtpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpID09IHRydWUpIHsNCi0JCQkJCQkJCQkJYkluY2x1ZGVUaGlzT25lID0gdHJ1ZTsNCi0JCQkJCQkJCQkJYnJlYWs7DQotCQkJCQkJCQkJfQ0KLQkJCQkJCQkJfQ0KLQkJCQkJCQl9DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJLy8gRGlzcGxheSBvbmx5IG5vbi1pbnN0YWxsZWQgaXRlbXMNCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQlpZiAoX2JVcGRhdGVNb2RlID09IGZhbHNlKSB7DQotCQkJCQkJaWYgKHJlZ2lzdHJ5TG9jYWwuZ2V0Q29tcG9uZW50RGVzY3JpcHRvcihkZXNjcmlwdG9yc0NvbXBvbmVudFtpXS5nZXRVbmlxdWVJZGVudGlmaWVyKCkpICE9IG51bGwpIHsNCi0JCQkJCQkJYkluY2x1ZGVUaGlzT25lID0gZmFsc2U7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQ0KLQkJCQkJaWYgKGJJbmNsdWRlVGhpc09uZSA9PSB0cnVlKSB7DQotCQkJCQkJaXRlbUNvbXBvbmVudCA9IG5ldyBVTVdpemFyZFRyZWVJdGVtKCk7DQotCQkJCQkJaXRlbUNvbXBvbmVudC5faVR5cGUgPSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UOw0KLQkJCQkJCWl0ZW1Db21wb25lbnQuX3N0ckRlc2NyaXB0aW9uID0gZGVzY3JpcHRvcnNDb21wb25lbnRbaV0uZ2V0RGVzY3JpcHRpb24oKTsNCi0JCQkJCQlpdGVtQ29tcG9uZW50Ll9zdHJOYW1lID0gZGVzY3JpcHRvcnNDb21wb25lbnRbaV0uZ2V0TGFiZWwoKTsNCi0JCQkJCQlpdGVtQ29tcG9uZW50Ll9zdHJJZCA9IGRlc2NyaXB0b3JzQ29tcG9uZW50W2ldLmdldFVuaXF1ZUlkZW50aWZpZXIoKTsNCi0JCQkJCQlpdGVtQ29tcG9uZW50Ll9zdHJWZW5kb3JOYW1lID0gZGVzY3JpcHRvcnNDb21wb25lbnRbaV0uZ2V0UHJvdmlkZXJOYW1lKCk7DQotCQkJCQkJaXRlbUNvbXBvbmVudC5fc3RyVmVyc2lvbkF2YWlsYWJsZSA9IGRlc2NyaXB0b3JzQ29tcG9uZW50W2ldLmdldFZlcnNpb25TdHIoKTsNCi0JCQkJCQlpdGVtQ29tcG9uZW50Ll9kZXNjcmlwdG9yQXZhaWxhYmxlID0gZGVzY3JpcHRvcnNDb21wb25lbnRbaV07DQotDQotCQkJCQkJZGVzY3JpcHRvckxvY2FsQ29tcG9uZW50ID0gcmVnaXN0cnlMb2NhbC5nZXRDb21wb25lbnREZXNjcmlwdG9yKGl0ZW1Db21wb25lbnQuX3N0cklkKTsNCi0NCi0JCQkJCQlpZiAoZGVzY3JpcHRvckxvY2FsQ29tcG9uZW50ICE9IG51bGwpIHsNCi0JCQkJCQkJaXRlbUNvbXBvbmVudC5fc3RyVmVyc2lvbkN1cnJlbnQgPSBkZXNjcmlwdG9yTG9jYWxDb21wb25lbnQuZ2V0VmVyc2lvblN0cigpOw0KLQkJCQkJCQlpdGVtQ29tcG9uZW50Ll9kZXNjcmlwdG9yQ3VycmVudCA9IGRlc2NyaXB0b3JMb2NhbENvbXBvbmVudDsNCi0JCQkJCQl9DQotDQotCQkJCQkJaXRlbUNvbXBvbmVudENhdGVnb3J5LmFkZENoaWxkSXRlbShpdGVtQ29tcG9uZW50KTsNCi0JCQkJCX0NCi0JCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCX0NCi0NCi0JCQkJLy8gQWRkIGNvbXBvbmVudCBjYXRlZ29yeSBpZiB0aGVyZSBhcmUgYW55IGNvbXBvbmVudHMNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKGl0ZW1Db21wb25lbnRDYXRlZ29yeS5fdmVjdG9yQ2hpbGRyZW4gIT0gbnVsbCAmJiBpdGVtQ29tcG9uZW50Q2F0ZWdvcnkuX3ZlY3RvckNoaWxkcmVuLnNpemUoKSA+IDApIHsNCi0JCQkJCWl0ZW1Mb2NhdGlvbi5hZGRDaGlsZEl0ZW0oaXRlbUNvbXBvbmVudENhdGVnb3J5KTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlwcm9ncmVzc01vbml0b3IuZG9uZSgpOw0KLQ0KLQkJCS8vIEFkZCBsb2NhdGlvbiBpZiB0aGVyZSBhcmUgYW55IHByb2R1Y3RzL2NvbXBvbmVudHMNCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICANCi0JCQlpZiAoaXRlbUxvY2F0aW9uLl92ZWN0b3JDaGlsZHJlbiAhPSBudWxsICYmIGl0ZW1Mb2NhdGlvbi5fdmVjdG9yQ2hpbGRyZW4uc2l6ZSgpID4gMCkgew0KLQkJCQlfdHJlZVNldEl0ZW1zLmFkZChpdGVtTG9jYXRpb24pOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQkvKioNCi0JICoNCi0JICovDQotCXB1YmxpYyB2b2lkIGNvbm5lY3RUb1RyZWUoKSB7DQotDQotCQkvLyBSZW1vdmUgYWxsIGV4aXN0aW5nIHRyZWUgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJX3RhYmxlVHJlZUl0ZW1zLnJlbW92ZUFsbCgpOw0KLQ0KLQkJVU1XaXphcmRUcmVlSXRlbSBpdGVtID0gbnVsbDsNCi0NCi0JCUl0ZXJhdG9yIGl0ZXIgPSBfdHJlZVNldEl0ZW1zLml0ZXJhdG9yKCk7DQotDQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgPT0gdHJ1ZSkgew0KLQ0KLQkJCWl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgaXRlci5uZXh0KCk7DQotDQotCQkJLy8gQ3JlYXRlIGEgbmV3IHRyZWUgaXRlbSBmb3IgdGhlIHRvcCBsZXZlbCAoVVJMKQ0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQlUYWJsZVRyZWVJdGVtIHRyZWVJdGVtID0gbmV3IFRhYmxlVHJlZUl0ZW0oX3RhYmxlVHJlZUl0ZW1zLCBTV1QuTlVMTCk7DQotDQotCQkJaWYgKGl0ZW0uX3N0ck5hbWUgIT0gbnVsbCkNCi0JCQkJdHJlZUl0ZW0uc2V0VGV4dCgwLCBpdGVtLl9zdHJOYW1lKTsNCi0NCi0JCQlpZiAoaXRlbS5fc3RyVmVuZG9yTmFtZSAhPSBudWxsKQ0KLQkJCQl0cmVlSXRlbS5zZXRUZXh0KDQsIGl0ZW0uX3N0clZlbmRvck5hbWUpOw0KLQ0KLQkJCXRyZWVJdGVtLnNldERhdGEoaXRlbSk7DQotDQotCQkJLy8gQ3JlYXRlIGNoaWxkIHRyZWUgaXRlbXMNCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCWlmIChpdGVtLl92ZWN0b3JDaGlsZHJlbiAhPSBudWxsKSB7DQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbS5fdmVjdG9yQ2hpbGRyZW4uc2l6ZSgpOyArK2kpIHsNCi0JCQkJCWNvbm5lY3RUb1RyZWUoKFVNV2l6YXJkVHJlZUl0ZW0pIGl0ZW0uX3ZlY3RvckNoaWxkcmVuLmVsZW1lbnRBdChpKSwgdHJlZUl0ZW0pOw0KLQkJCQl9DQotCQkJfQ0KLQ0KLQkJCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOw0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiBDb25uZWN0cyBpdGVtcyB0byBhIG5ldyB0cmVlIHdpZGdldC4NCi0JICovDQotCXB1YmxpYyB2b2lkIGNvbm5lY3RUb1RyZWUoVU1XaXphcmRUcmVlSXRlbSBpdGVtLCBUYWJsZVRyZWVJdGVtIHRyZWVJdGVtUGFyZW50KSB7DQotDQotCQkvLyBJZ25vcmUgcHJvZHVjdCBjYXRlZ29yeSBhbmQgY29tcG9uZW50IGNhdGVnb3J5IGl0ZW1zDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlUYWJsZVRyZWVJdGVtIHRyZWVJdGVtID0gdHJlZUl0ZW1QYXJlbnQ7DQotDQotCQkvLyBDcmVhdGUgYSBuZXcgdHJlZSBpdGVtDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAoaXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1QgfHwgaXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVCB8fCBpdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UX0VOVFJZKSB7DQotDQotCQkJdHJlZUl0ZW0gPSBuZXcgVGFibGVUcmVlSXRlbSh0cmVlSXRlbVBhcmVudCwgU1dULk5VTEwpOw0KLQkJCXRyZWVJdGVtLnNldFRleHQoMCwgaXRlbS5fc3RyTmFtZSk7DQotCQkJdHJlZUl0ZW0uc2V0RGF0YShpdGVtKTsNCi0NCi0JCQkvLyBUYWJsZSB0ZXh0DQotCQkJLy8tLS0tLS0tLS0tLQ0KLQkJCWlmIChpdGVtLl9zdHJWZXJzaW9uQ3VycmVudCAhPSBudWxsKQ0KLQkJCQl0cmVlSXRlbS5zZXRUZXh0KDEsIGl0ZW0uX3N0clZlcnNpb25DdXJyZW50KTsNCi0NCi0JCQlpZiAoaXRlbS5fc3RyVmVyc2lvbkF2YWlsYWJsZSAhPSBudWxsKQ0KLQkJCQl0cmVlSXRlbS5zZXRUZXh0KDIsIGl0ZW0uX3N0clZlcnNpb25BdmFpbGFibGUpOw0KLQ0KLQkJCWlmIChpdGVtLl9zdHJWZW5kb3JOYW1lICE9IG51bGwpDQotCQkJCXRyZWVJdGVtLnNldFRleHQoNCwgaXRlbS5fc3RyVmVuZG9yTmFtZSk7DQotDQotCQkJLy8gU3RhdHVzIHRleHQNCi0JCQkvLy0tLS0tLS0tLS0tLQ0KLQkJCWJvb2xlYW4gYkluc3RhbGxhYmxlID0gZmFsc2U7DQotDQotCQkJaWYgKGl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9QUk9EVUNUKSB7DQotCQkJCWludCBpSW5zdGFsbGFibGUgPSBpc0luc3RhbGxhYmxlUHJvZHVjdCh0cmVlSXRlbSk7DQotCQkJCXRyZWVJdGVtLnNldFRleHQoMywgY29udmVydEluc3RhbGxhYmxlVG9TdHJpbmcoaUluc3RhbGxhYmxlKSk7DQotCQkJfQ0KLQ0KLQkJCWVsc2UgaWYgKGl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlQpIHsNCi0JCQkJaW50IGlJbnN0YWxsYWJsZSA9IGlzSW5zdGFsbGFibGVDb21wb25lbnQodHJlZUl0ZW0pOw0KLQkJCQl0cmVlSXRlbS5zZXRUZXh0KDMsIGNvbnZlcnRJbnN0YWxsYWJsZVRvU3RyaW5nKGlJbnN0YWxsYWJsZSkpOw0KLQkJCX0NCi0NCi0JCQllbHNlIGlmIChpdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UX0VOVFJZKSB7DQotDQotCQkJCWludCBpSW5zdGFsbGFibGUgPSBpc0luc3RhbGxhYmxlQ29tcG9uZW50RW50cnkodHJlZUl0ZW0pOw0KLQkJCQl0cmVlSXRlbS5zZXRUZXh0KDMsIGNvbnZlcnRJbnN0YWxsYWJsZVRvU3RyaW5nKGlJbnN0YWxsYWJsZSkpOw0KLQ0KLQkJCQlpZiAoaUluc3RhbGxhYmxlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT0tfVE9fSU5TVEFMTCkgew0KLQkJCQkJLy8gT3B0aW9uYWwgaW5zdGFsbGF0aW9uDQotCQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQotCQkJCQlpZiAoaXRlbS5fZGVzY3JpcHRvckVudHJ5LmlzT3B0aW9uYWxGb3JJbnN0YWxsKCkgPT0gdHJ1ZSkgew0KLQkJCQkJCXRyZWVJdGVtLnNldFRleHQoMywgVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX29wdGlvbmFsIikpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2Ugew0KLQkJCQkJdHJlZUl0ZW0uc2V0VGV4dCgzLCBjb252ZXJ0SW5zdGFsbGFibGVUb1N0cmluZyhpSW5zdGFsbGFibGUpKTsNCi0JCQkJfQ0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIENyZWF0ZSBjaGlsZCB0cmVlIGl0ZW1zDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKGl0ZW0uX3ZlY3RvckNoaWxkcmVuICE9IG51bGwpIHsNCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW0uX3ZlY3RvckNoaWxkcmVuLnNpemUoKTsgKytpKSB7DQotCQkJCWNvbm5lY3RUb1RyZWUoKFVNV2l6YXJkVHJlZUl0ZW0pIGl0ZW0uX3ZlY3RvckNoaWxkcmVuLmVsZW1lbnRBdChpKSwgdHJlZUl0ZW0pOw0KLQkJCX0NCi0JCX0NCi0NCi0JCS8vIEV4cGFuZCBvbmx5IGFmdGVyIGNoaWxkcmVuIGhhdmUgYmVlbiBjcmVhdGVkDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKGl0ZW0uX2lUeXBlICE9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9QUk9EVUNUKQ0KLQkJCXRyZWVJdGVtLnNldEV4cGFuZGVkKHRydWUpOw0KLQ0KLQkJcmV0dXJuOw0KLQl9DQotCS8qKg0KLQkgKiBDb252ZXJ0cyBpbnN0YWxsYWJsZSBjb25zdGFudCB0byBhIGRpc3BsYXlhYmxlIHN0cmluZw0KLQkgKi8NCi0JcHVibGljIFN0cmluZyBjb252ZXJ0SW5zdGFsbGFibGVUb1N0cmluZyhpbnQgaUluc3RhbGxhYmxlKSB7DQotDQotCQlzd2l0Y2ggKGlJbnN0YWxsYWJsZSkgew0KLQkJCWNhc2UgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5OT1RfQ09NUEFUSUJMRSA6DQotCQkJCXJldHVybiBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfbm90X2NvbXBhdGlibGUiKTsNCi0JCQljYXNlIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuTk9UX05FV0VSIDoNCi0JCQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19ub3RfbmV3ZXIiKTsNCi0JCQljYXNlIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuTk9UX1VQREFUQUJMRSA6DQotCQkJCXJldHVybiBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfbm90X3VwZGF0YWJsZSIpOw0KLQkJCWNhc2UgVXBkYXRlTWFuYWdlckNvbnN0YW50cy5OT1RfQVZBSUxBQkxFIDoNCi0JCQkJcmV0dXJuIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19ub3RfYXZhaWxhYmxlIik7DQotCQkJZGVmYXVsdCA6DQotCQkJCXJldHVybiAiIjsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICogY3JlYXRlQ29udGVudHMgbWV0aG9kIGNvbW1lbnQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGVQYXJlbnQpIHsNCi0JCS8vIENvbnRlbnQNCi0JCS8vLS0tLS0tLS0NCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGVDb250ZW50ID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGVQYXJlbnQsIFNXVC5OVUxMKTsNCi0NCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsNCi0JCWNvbXBvc2l0ZUNvbnRlbnQuc2V0TGF5b3V0KGxheW91dCk7DQotDQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOw0KLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7DQotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsNCi0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsNCi0JCWNvbXBvc2l0ZUNvbnRlbnQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotCQkvLyBDaGVja2JveDogU2hvdyBtb3N0IHJlY2VudCB2ZXJzaW9ucyBvbmx5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlfYnV0dG9uU2hvd0xhdGVzdE9ubHkgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZUNvbnRlbnQsIFNXVC5DSEVDSyk7DQotCQlfYnV0dG9uU2hvd0xhdGVzdE9ubHkuc2V0VGV4dChVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfU2hvd19vbmx5X21vc3RfcmVjZW50X3ZlcnNpb25zIikpOw0KLQkJX2J1dHRvblNob3dMYXRlc3RPbmx5LnNldFNlbGVjdGlvbihfYlNob3dMYXRlc3RPbmx5KTsNCi0JCV9idXR0b25TaG93TGF0ZXN0T25seS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsNCi0NCi0JCS8vIFNhc2hQYW5lIFRvcC9Cb3R0b20NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCV9zYXNoRm9ybVRvcEJvdHRvbSA9IG5ldyBTYXNoRm9ybShjb21wb3NpdGVDb250ZW50LCBTV1QuVkVSVElDQUwpOw0KLQ0KLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsNCi0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7DQotCQlfc2FzaEZvcm1Ub3BCb3R0b20uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotCQkvLyBUcmVlOiBJbnN0YWxsYWJsZQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCV90YWJsZVRyZWVJdGVtcyA9IG5ldyBUYWJsZVRyZWUoX3Nhc2hGb3JtVG9wQm90dG9tLCBTV1QuTVVMVEkgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSIHwgU1dULkNIRUNLKTsNCi0NCi0JCVN0cmluZ1tdIGNvbHVtblRpdGxlcyA9IHsgVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX0NvbXBvbmVudCIpLCBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfSW5zdGFsbGVkIiksIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19BdmFpbGFibGUiKSwgVXBkYXRlTWFuYWdlclN0cmluZ3MuZ2V0U3RyaW5nKCJTX1N0YXR1cyIpLCBVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfUHJvdmlkZXIiKX07DQotCQlpbnRbXSBpQ29sdW1uV2VpZ2h0ID0geyA0MCwgMTUsIDE1LCAxNSwgMTUgfTsNCi0JCVRhYmxlTGF5b3V0IGxheW91dFRhYmxlID0gbmV3IFRhYmxlTGF5b3V0KCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblRpdGxlcy5sZW5ndGg7IGkrKykgew0KLQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKF90YWJsZVRyZWVJdGVtcy5nZXRUYWJsZSgpLCBTV1QuTk9ORSk7DQotCQkJdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5UaXRsZXNbaV0pOw0KLQkJCUNvbHVtbkxheW91dERhdGEgY0xheW91dCA9IG5ldyBDb2x1bW5XZWlnaHREYXRhKGlDb2x1bW5XZWlnaHRbaV0sIHRydWUpOw0KLQkJCWxheW91dFRhYmxlLmFkZENvbHVtbkRhdGEoY0xheW91dCk7DQotCQl9DQotDQotCQlfdGFibGVUcmVlSXRlbXMuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7DQotCQlfdGFibGVUcmVlSXRlbXMuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOw0KLQkJX3RhYmxlVHJlZUl0ZW1zLmdldFRhYmxlKCkuc2V0TGF5b3V0KGxheW91dFRhYmxlKTsNCi0JCV90YWJsZVRyZWVJdGVtcy5nZXRUYWJsZSgpLmFkZE1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOw0KLQkJX3RhYmxlVHJlZUl0ZW1zLmdldFRhYmxlKCkuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOw0KLQ0KLQkJX3RhYmxlVHJlZUl0ZW1zLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOw0KLQ0KLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsNCi0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7DQotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7DQotCQlfdGFibGVUcmVlSXRlbXMuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7DQotDQotCQkvLyBUZXh0OiBEZXNjcmlwdGlvbg0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCV90ZXh0RGVzY3JpcHRpb24gPSBuZXcgVGV4dChfc2FzaEZvcm1Ub3BCb3R0b20sIFNXVC5XUkFQIHwgU1dULlJFQURfT05MWSB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOw0KLQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsNCi0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOw0KLQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDUwOw0KLQkJX3RleHREZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsNCi0NCi0JCV9zYXNoRm9ybVRvcEJvdHRvbS5zZXRXZWlnaHRzKG5ldyBpbnRbXSB7IDgwLCAyMCB9KTsNCi0NCi0JCXNldENvbnRyb2woY29tcG9zaXRlQ29udGVudCk7DQotDQotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyBJVU1SZWdpc3RyeSBnZXRSZWdpc3RyeUF0KFN0cmluZyBzdHJMb2NhdGlvbikgew0KLQ0KLQkJSVVNUmVnaXN0cnkgcmVnaXN0cnkgPSAoSVVNUmVnaXN0cnkpIF9oYXNoUmVnaXN0cnlDYWNoZS5nZXQoc3RyTG9jYXRpb24pOw0KLQ0KLQkJLy8gQ3JlYXRlIG5ldyBlbnRyeSBpZiBub3QgZm91bmQNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAocmVnaXN0cnkgPT0gbnVsbCkgew0KLQkJCVVSTCB1cmwgPSBudWxsOw0KLQ0KLQkJCXRyeSB7DQotCQkJCXVybCA9IG5ldyBVUkwoc3RyTG9jYXRpb24pOw0KLQkJCX0NCi0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7DQotCQkJCXJldHVybiBudWxsOw0KLQkJCX0NCi0NCi0JCQlyZWdpc3RyeSA9IF93aXphcmQuX3VwZGF0ZU1hbmFnZXIuZ2V0UmVnaXN0cnlBdCh1cmwpOw0KLQ0KLQkJCWlmIChyZWdpc3RyeSAhPSBudWxsKSB7DQotCQkJCV9oYXNoUmVnaXN0cnlDYWNoZS5wdXQoc3RyTG9jYXRpb24sIHJlZ2lzdHJ5KTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gcmVnaXN0cnk7DQotCX0NCi0JLyoqDQotCSAqIA0KLQkgKi8NCi0JcHVibGljIFVNV2l6YXJkVHJlZUl0ZW1bXSBnZXRTZWxlY3RlZEl0ZW1zKCkgew0KLQ0KLQkJVU1XaXphcmRUcmVlSXRlbVtdIGl0ZW1zID0gbnVsbDsNCi0NCi0JCS8vIE9idGFpbiBhbGwgc2VsZWN0ZWQgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVRhYmxlVHJlZUl0ZW1bXSB0cmVlSXRlbUNoaWxkcmVuID0gX3RhYmxlVHJlZUl0ZW1zLmdldEl0ZW1zKCk7DQotDQotCQkvLyBQbGFjZSB0aGVtIGludG8gYW4gYXJyYXkNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJSGFzaHRhYmxlIGhhc2hQcm9kdWN0cyA9IG5ldyBIYXNodGFibGUoKTsNCi0JCUhhc2h0YWJsZSBoYXNoQ29tcG9uZW50cyA9IG5ldyBIYXNodGFibGUoKTsNCi0JCUhhc2h0YWJsZSBoYXNoQ29tcG9uZW50RW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1DaGlsZHJlbi5sZW5ndGg7ICsraSkgew0KLQkJCWdldFNlbGVjdGVkSXRlbXNSZWN1cnNpdmUodHJlZUl0ZW1DaGlsZHJlbltpXSwgaGFzaFByb2R1Y3RzLCBoYXNoQ29tcG9uZW50cywgaGFzaENvbXBvbmVudEVudHJpZXMpOw0KLQkJfQ0KLQ0KLQkJLy8gQ29weSBpdGVtcyB0byBhbiBhcnJheQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaXRlbXMgPSBuZXcgVU1XaXphcmRUcmVlSXRlbVtoYXNoUHJvZHVjdHMuc2l6ZSgpICsgaGFzaENvbXBvbmVudHMuc2l6ZSgpICsgaGFzaENvbXBvbmVudEVudHJpZXMuc2l6ZSgpXTsNCi0NCi0JCS8vIFByb2R1Y3RzDQotCQkvLy0tLS0tLS0tLQ0KLQkJT2JqZWN0W10gb2JqQXJyYXkgPSBoYXNoUHJvZHVjdHMudmFsdWVzKCkudG9BcnJheSgpOw0KLQkJU3lzdGVtLmFycmF5Y29weShvYmpBcnJheSwgMCwgaXRlbXMsIDAsIG9iakFycmF5Lmxlbmd0aCk7DQotDQotCQkvLyBDb21wb25lbnRzDQotCQkvLy0tLS0tLS0tLS0tDQotCQlvYmpBcnJheSA9IGhhc2hDb21wb25lbnRzLnZhbHVlcygpLnRvQXJyYXkoKTsNCi0JCVN5c3RlbS5hcnJheWNvcHkob2JqQXJyYXksIDAsIGl0ZW1zLCBoYXNoUHJvZHVjdHMuc2l6ZSgpLCBvYmpBcnJheS5sZW5ndGgpOw0KLQ0KLQkJLy8gQ29tcG9uZW50IEVudHJpZXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlvYmpBcnJheSA9IGhhc2hDb21wb25lbnRFbnRyaWVzLnZhbHVlcygpLnRvQXJyYXkoKTsNCi0JCVN5c3RlbS5hcnJheWNvcHkob2JqQXJyYXksIDAsIGl0ZW1zLCBoYXNoUHJvZHVjdHMuc2l6ZSgpICsgaGFzaENvbXBvbmVudHMuc2l6ZSgpLCBvYmpBcnJheS5sZW5ndGgpOw0KLQ0KLQkJcmV0dXJuIGl0ZW1zOw0KLQl9DQotCS8qKg0KLQkgKiANCi0JICovDQotCXB1YmxpYyB2b2lkIGdldFNlbGVjdGVkSXRlbXNSZWN1cnNpdmUoVGFibGVUcmVlSXRlbSB0cmVlSXRlbSwgSGFzaHRhYmxlIGhhc2hQcm9kdWN0cywgSGFzaHRhYmxlIGhhc2hDb21wb25lbnRzLCBIYXNodGFibGUgaGFzaENvbXBvbmVudEVudHJpZXMpIHsNCi0NCi0JCS8vIE9idGFpbiBhbGwgc2VsZWN0ZWQgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IG51bGw7DQotDQotCQlpZiAodHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpID09IHRydWUpIHsNCi0JCQl1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtLmdldERhdGEoKTsNCi0NCi0JCQlpZiAodW1UcmVlSXRlbSAhPSBudWxsKSB7DQotCQkJCWlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfUFJPRFVDVCkgew0KLQ0KLQkJCQkJLy8gUmVtb3ZlIGR1cGxpY2F0ZXMgYnkgc3RvcmluZyBuZXdlciBvbmVzIG9ubHkNCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQlpZiAoaGFzaFByb2R1Y3RzLmNvbnRhaW5zS2V5KHVtVHJlZUl0ZW0uX3N0cklkKSA9PSB0cnVlKSB7DQotCQkJCQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtUHJldmlvdXMgPSAoVU1XaXphcmRUcmVlSXRlbSkgaGFzaFByb2R1Y3RzLmdldCh1bVRyZWVJdGVtLl9zdHJJZCk7DQotCQkJCQkJaWYgKCgoSVByb2R1Y3REZXNjcmlwdG9yKSB1bVRyZWVJdGVtLl9kZXNjcmlwdG9yQXZhaWxhYmxlKS5jb21wYXJlKChJUHJvZHVjdERlc2NyaXB0b3IpIHVtVHJlZUl0ZW1QcmV2aW91cy5fZGVzY3JpcHRvckF2YWlsYWJsZSkgPiAwKSB7DQotCQkJCQkJCWhhc2hQcm9kdWN0cy5yZW1vdmUodW1UcmVlSXRlbS5fc3RySWQpOw0KLQkJCQkJCQloYXNoUHJvZHVjdHMucHV0KHVtVHJlZUl0ZW0uX3N0cklkLCB1bVRyZWVJdGVtKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQloYXNoUHJvZHVjdHMucHV0KHVtVHJlZUl0ZW0uX3N0cklkLCB1bVRyZWVJdGVtKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQ0KLQkJCQllbHNlIGlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UKSB7DQotDQotCQkJCQkvLyBSZW1vdmUgZHVwbGljYXRlcyBieSBzdG9yaW5nIG5ld2VyIG9uZXMgb25seQ0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJCWlmIChoYXNoQ29tcG9uZW50cy5jb250YWluc0tleSh1bVRyZWVJdGVtLl9zdHJJZCkgPT0gdHJ1ZSkgew0KLQkJCQkJCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbVByZXZpb3VzID0gKFVNV2l6YXJkVHJlZUl0ZW0pIGhhc2hDb21wb25lbnRzLmdldCh1bVRyZWVJdGVtLl9zdHJJZCk7DQotCQkJCQkJaWYgKCgoSUNvbXBvbmVudERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JBdmFpbGFibGUpLmNvbXBhcmUoKElDb21wb25lbnREZXNjcmlwdG9yKSB1bVRyZWVJdGVtUHJldmlvdXMuX2Rlc2NyaXB0b3JBdmFpbGFibGUpID4gMCkgew0KLQkJCQkJCQloYXNoQ29tcG9uZW50cy5yZW1vdmUodW1UcmVlSXRlbS5fc3RySWQpOw0KLQkJCQkJCQloYXNoQ29tcG9uZW50cy5wdXQodW1UcmVlSXRlbS5fc3RySWQsIHVtVHJlZUl0ZW0pOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWhhc2hDb21wb25lbnRzLnB1dCh1bVRyZWVJdGVtLl9zdHJJZCwgdW1UcmVlSXRlbSk7DQotCQkJCQl9DQotCQkJCX0NCi0NCi0JCQkJZWxzZSBpZiAodW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVF9FTlRSWSkgew0KLQ0KLQkJCQkJLy8gQWRkIG9ubHkgaWYgdGhlIHBhcmVudCBwcm9kdWN0IGhhcyBub3QgYmVlbiBzZWxlY3RlZA0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJVGFibGVUcmVlSXRlbSB0cmVlSXRlbVBhcmVudCA9IHRyZWVJdGVtLmdldFBhcmVudEl0ZW0oKTsNCi0JCQkJCWlmICh0cmVlSXRlbVBhcmVudC5nZXRDaGVja2VkKCkgPT0gZmFsc2UpIHsNCi0NCi0JCQkJCQkvLyBSZW1vdmUgZHVwbGljYXRlcyBieSBzdG9yaW5nIG5ld2VyIG9uZXMgb25seQ0KLQkJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQkJaWYgKGhhc2hDb21wb25lbnRFbnRyaWVzLmNvbnRhaW5zS2V5KHVtVHJlZUl0ZW0uX3N0cklkKSA9PSB0cnVlKSB7DQotCQkJCQkJCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbVByZXZpb3VzID0gKFVNV2l6YXJkVHJlZUl0ZW0pIGhhc2hDb21wb25lbnRFbnRyaWVzLmdldCh1bVRyZWVJdGVtLl9zdHJJZCk7DQotCQkJCQkJCWlmICgoKElDb21wb25lbnRFbnRyeURlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeSkuY29tcGFyZSgoSUNvbXBvbmVudEVudHJ5RGVzY3JpcHRvcikgdW1UcmVlSXRlbVByZXZpb3VzLl9kZXNjcmlwdG9yRW50cnkpID4gMCkgew0KLQkJCQkJCQkJaGFzaENvbXBvbmVudEVudHJpZXMucmVtb3ZlKHVtVHJlZUl0ZW0uX3N0cklkKTsNCi0JCQkJCQkJCWhhc2hDb21wb25lbnRFbnRyaWVzLnB1dCh1bVRyZWVJdGVtLl9zdHJJZCwgdW1UcmVlSXRlbSk7DQotCQkJCQkJCX0NCi0JCQkJCQl9DQotCQkJCQkJZWxzZSB7DQotCQkJCQkJCWhhc2hDb21wb25lbnRFbnRyaWVzLnB1dCh1bVRyZWVJdGVtLl9zdHJJZCwgdW1UcmVlSXRlbSk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gRG8gY2hpbGQgaXRlbXMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tDQotCQlUYWJsZVRyZWVJdGVtW10gdHJlZUl0ZW1DaGlsZHJlbiA9IHRyZWVJdGVtLmdldEl0ZW1zKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRyZWVJdGVtQ2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsNCi0JCQlnZXRTZWxlY3RlZEl0ZW1zUmVjdXJzaXZlKHRyZWVJdGVtQ2hpbGRyZW5baV0sIGhhc2hQcm9kdWN0cywgaGFzaENvbXBvbmVudHMsIGhhc2hDb21wb25lbnRFbnRyaWVzKTsNCi0JCX0NCi0NCi0JCXJldHVybjsNCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyBTdHJpbmcgZ2V0VVJMRGVzY3JpcHRpb24oU3RyaW5nIHN0clVSTCkgew0KLQ0KLQkJaWYgKF90cmVlU2V0TG9jYXRpb25zICE9IG51bGwgJiYgX3RyZWVTZXRMb2NhdGlvbnMuc2l6ZSgpID4gMCkgew0KLQkJCUl0ZXJhdG9yIGl0ZXIgPSBfdHJlZVNldExvY2F0aW9ucy5pdGVyYXRvcigpOw0KLQkJCVVSTE5hbWVQYWlyIHBhaXIgPSBudWxsOw0KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSA9PSB0cnVlKSB7DQotCQkJCXBhaXIgPSAoVVJMTmFtZVBhaXIpIGl0ZXIubmV4dCgpOw0KLQkJCQlpZiAocGFpci5fZ2V0VVJMKCkuZXF1YWxzKHN0clVSTCkgPT0gdHJ1ZSkgew0KLQkJCQkJaWYgKHBhaXIuX2dldE5hbWUoKSAhPSBudWxsICYmIHBhaXIuX2dldE5hbWUoKS5sZW5ndGgoKSA+IDApIHsNCi0JCQkJCQlyZXR1cm4gcGFpci5fZ2V0TmFtZSgpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHN0clVSTDsNCi0JfQ0KLQkvKioNCi0JICogT2J0YWlucyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjb21wb25lbnQgVVJMcyBmcm9tIHRoZSBsb2NhbCB1cGRhdGUgcmVnaXN0cnkuDQotCSAqIE9idGFpbnMgYSBsaXN0IG9mIGJvb2ttYXJrZWQgVVJMcyBmcm9tIHRoZSBwZXJzaXN0ZW50IGRhdGEuDQotCSAqIENyZWF0ZXMgYSB0cmVlIGZvciBhbGwgb2YgdGhlIFVSTHMuDQotCSAqLw0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQ29udGVudCgpIHsNCi0NCi0JCWlmIChfYlJlZnJlc2hSZXF1aXJlZCA9PSBmYWxzZSkgew0KLQkJCXJldHVybjsNCi0JCX0NCi0NCi0JCS8vIEFkZCBhbGwgc2VsZWN0ZWQgbG9jYXRpb25zIHRvIGEgc2V0DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJX3RyZWVTZXRMb2NhdGlvbnMgPSBuZXcgVHJlZVNldChuZXcgVU1XaXphcmRVUkxOYW1lUGFpckNvbXBhcmF0b3IoKSk7DQotDQotCQkvLyBPYnRhaW4gcHJlZGVmaW5lZCBsb2NhdGlvbnMgc3RyaW5ncyBmcm9tIGxvY2F0aW9uIHBhZ2UNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJVU1XaXphcmRQYWdlTG9jYXRpb25zIHBhZ2VMb2NhdGlvbnMgPSAoVU1XaXphcmRQYWdlTG9jYXRpb25zKSBfd2l6YXJkLmdldFBhZ2UoImxvY2F0aW9ucyIpOw0KLQ0KLQkJVVJMTmFtZVBhaXJbXSBwYWlycyA9IHBhZ2VMb2NhdGlvbnMuZ2V0U2VsZWN0ZWRQcmVkZWZpbmVkTG9jYXRpb25zKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgKytpKSB7DQotCQkJX3RyZWVTZXRMb2NhdGlvbnMuYWRkKHBhaXJzW2ldKTsNCi0JCX0NCi0NCi0JCS8vIE9idGFpbiBhZGRpdGlvbmFsIGxvY2F0aW9ucyBzdHJpbmdzIGZyb20gbG9jYXRpb24gcGFnZQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlwYWlycyA9IHBhZ2VMb2NhdGlvbnMuZ2V0U2VsZWN0ZWRBZGRpdGlvbmFsTG9jYXRpb25zKCk7DQotDQotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhaXJzLmxlbmd0aDsgKytpKSB7DQotCQkJX3RyZWVTZXRMb2NhdGlvbnMuYWRkKHBhaXJzW2ldKTsNCi0JCX0NCi0NCi0JCS8vIE9idGFpbiBsb2NhbCByZWdpc3RyeSBpbiBjYXNlIHRoZXJlIGFyZSBpbnN0YWxsZWQgdmVyc2lvbnMNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWZpbmFsIElVTVJlZ2lzdHJ5IHJlZ2lzdHJ5TG9jYWwgPSBfd2l6YXJkLl91cGRhdGVNYW5hZ2VyLmdldFJlZ2lzdHJ5TWFuYWdlcigpLmdldEN1cnJlbnRSZWdpc3RyeSgpOw0KLQ0KLQkJZmluYWwgVmVjdG9yIHZlY3RvclJlZ2lzdHJpZXMgPSBuZXcgVmVjdG9yKCk7DQotCQlmaW5hbCBWZWN0b3IgdmVjdG9yVVJMc0ZhaWxlZCA9IG5ldyBWZWN0b3IoKTsNCi0NCi0JCV90YWJsZVRyZWVJdGVtcy5zZXRSZWRyYXcoZmFsc2UpOw0KLQ0KLQkJLy8gQ3JlYXRlIGFuIG9wZXJhdGlvbiB0aGF0IHJlYWQgYW5kIGNyZWF0ZSBhIHJlZ2lzdHJ5IGZvciBlYWNoIGxvY2F0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCUlSdW5uYWJsZVdpdGhQcm9ncmVzcyBvcGVyYXRpb24gPSBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgew0KLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsNCi0NCi0JCQkJX3Byb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsNCi0NCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLmJlZ2luVGFzayhVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfUmVhZGluZyIpICsgIjoiLCBfdHJlZVNldExvY2F0aW9ucy5zaXplKCkpOw0KLQ0KLQkJCQlVUkxOYW1lUGFpciBwYWlyID0gbnVsbDsNCi0JCQkJSVVNUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOw0KLQ0KLQkJCQlJdGVyYXRvciBpdGVyID0gX3RyZWVTZXRMb2NhdGlvbnMuaXRlcmF0b3IoKTsNCi0NCi0JCQkJYm9vbGVhbiBiVXJsT2sgPSBmYWxzZTsNCi0NCi0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpID09IHRydWUpIHsNCi0NCi0JCQkJCWJVcmxPayA9IGZhbHNlOw0KLQ0KLQkJCQkJLy8gT2J0YWluIHRoZSByZWdpc3RyeSBmb3IgdGhlIFVSTA0KLQkJCQkJLy8gVGhpcyB3aWxsIGRvd25sb2FkIHRoZSBpbmZvcm1hdGlvbg0KLQkJCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJcGFpciA9IChVUkxOYW1lUGFpcikgaXRlci5uZXh0KCk7DQotDQotCQkJCQlwcm9ncmVzc01vbml0b3Iuc3ViVGFzayhwYWlyLl9nZXROYW1lKCkpOw0KLQ0KLQkJCQkJLy8gQXR0ZW1wdCB0byBvcGVuIHRoZSBzdHJlYW0NCi0JCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJCQl0cnkgew0KLQkJCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHBhaXIuX2dldFVSTCgpKTsNCi0JCQkJCQl1cmwgPSBVTUVjbGlwc2VUcmVlLmFwcGVuZFRyYWlsaW5nU2xhc2godXJsKTsNCi0JCQkJCQlSZXNwb25zZSByZXNwb25zZSA9IFVSTEhhbmRsZXIub3Blbih1cmwpOw0KLQkJCQkJCS8vIHdlIG9wZW4gdGhlIHVybCB0byBnZXQgYXV0aGVudGljYXRlZC4gIHJlc3BvbnNlIGNvZGUgbm90DQotCQkJCQkJLy8gaW1wb3J0YW50IGF0IHRoaXMgcG9pbnQNCi0JCQkJCS8qCWlmIChyZXNwb25zZS5nZXRSZXNwb25zZUNvZGUoKSA9PSBJU3RhdHVzQ29kZXMuSFRUUF9PSykgew0KLQkJCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSByZXNwb25zZS5nZXRJbnB1dFN0cmVhbSgpOw0KLQ0KLQkJCQkJCQlpZiAoc3RyZWFtICE9IG51bGwpIHsNCi0JCQkJCQkJCXN0cmVhbS5jbG9zZSgpOyovDQotCQkJCQkJCQliVXJsT2sgPSB0cnVlOw0KLQkJCQkJLy8JCX0NCi0JCQkJCS8vCX0NCi0JCQkJCX0NCi0JCQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsNCi0JCQkJCX0NCi0NCi0JCQkJCWlmIChiVXJsT2sgPT0gdHJ1ZSkgeyANCi0JCQkJCQlyZWdpc3RyeSA9IGdldFJlZ2lzdHJ5QXQocGFpci5fZ2V0VVJMKCkpOw0KLQ0KLQkJCQkJCS8vIEFkZCBpdCB0byB0aGUgbGlzdA0KLQkJCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCQkJCWlmIChyZWdpc3RyeSAhPSBudWxsKQ0KLQkJCQkJCQl2ZWN0b3JSZWdpc3RyaWVzLmFkZChyZWdpc3RyeSk7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQl2ZWN0b3JVUkxzRmFpbGVkLmFkZChwYWlyKTsNCi0JCQkJCX0NCi0NCi0JCQkJCXByb2dyZXNzTW9uaXRvci53b3JrZWQoMSk7DQotCQkJCX0NCi0JCQkJcHJvZ3Jlc3NNb25pdG9yLmRvbmUoKTsNCi0NCi0JCQkJX3Byb2dyZXNzTW9uaXRvciA9IG51bGw7DQotCQkJfQ0KLQkJfTsNCi0NCi0JCS8vIFJ1biB0aGUgb3BlcmF0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQlfd2l6YXJkLmdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOw0KLQkJfQ0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0JCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsNCi0JCX0NCi0NCi0JCS8vIENyZWF0ZSBhIG5ldyB0cmVlDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJX3RyZWVTZXRJdGVtcyA9IG5ldyBUcmVlU2V0KG5ldyBVTVdpemFyZFRyZWVJdGVtQ29tcGFyYXRvcigpKTsNCi0NCi0JCS8vIENyZWF0ZSBhbiBvcGVyYXRpb24gdGhhdCB3aWxsIGZpbGwgdGhlIHRyZWUgd2l0aCBpbmZvcm1hdGlvbg0KLQkJLy8gTG9jYXRpb24gVVJMIEENCi0JCS8vICAgcHJvZHVjdHMNCi0JCS8vICAgICBQcm9kdWN0IEENCi0JCS8vICAgICBQcm9kdWN0IEINCi0JCS8vICAgY29tcG9uZW50cw0KLQkJLy8gICAgIENvbXBvbmVudCBBDQotCQkvLyAgICAgQ29tcG9uZW50IEINCi0JCS8vIExvY2F0aW9uIFVSTCBCDQotCQkvLyAuLi4NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJb3BlcmF0aW9uID0gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsNCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsNCi0NCi0JCQkJSVVNUmVnaXN0cnkgcmVnaXN0cnlSZW1vdGUgPSBudWxsOw0KLQ0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZlY3RvclJlZ2lzdHJpZXMuc2l6ZSgpOyArK2kpIHsNCi0JCQkJCXJlZ2lzdHJ5UmVtb3RlID0gKElVTVJlZ2lzdHJ5KSB2ZWN0b3JSZWdpc3RyaWVzLmVsZW1lbnRBdChpKTsNCi0JCQkJCWFkZExvY2F0aW9uVG9UcmVlKHJlZ2lzdHJ5UmVtb3RlLCByZWdpc3RyeUxvY2FsLCBwcm9ncmVzc01vbml0b3IpOw0KLQkJCQl9DQotCQkJfQ0KLQkJfTsNCi0NCi0JCS8vIFJ1biB0aGUgb3BlcmF0aW9uDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJdHJ5IHsNCi0JCQlfd2l6YXJkLmdldENvbnRhaW5lcigpLnJ1bih0cnVlLCB0cnVlLCBvcGVyYXRpb24pOw0KLQkJfQ0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsNCi0JCQlyZXR1cm47DQotCQkJLy8JCVN5c3RlbS5vdXQucHJpbnRsbiggIkludGVycnVwdGVkIiApOw0KLQkJfQ0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgew0KLQkJCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oICJJbnZvY2F0aW9uIiApOw0KLQkJfQ0KLQ0KLQkJX3RhYmxlVHJlZUl0ZW1zLnNldFJlZHJhdyh0cnVlKTsNCi0NCi0JCS8vIENyZWF0ZSB0cmVlIHdpZGdldCBpdGVtcyBmb3IgZWFjaCB1cGRhdGUgbWFuYWdlciB0cmVlIGl0ZW0NCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWNvbm5lY3RUb1RyZWUoKTsNCi0NCi0JCVN0cmluZ0J1ZmZlciBzdHJiTWVzc2FnZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsNCi0NCi0JCS8vIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdXBkYXRhYmxlIGl0ZW1zDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKF90YWJsZVRyZWVJdGVtcy5nZXRJdGVtQ291bnQoKSA9PSAwKQ0KLQkJCXN0cmJNZXNzYWdlLmFwcGVuZChVcGRhdGVNYW5hZ2VyU3RyaW5ncy5nZXRTdHJpbmcoIlNfTm9faW5zdGFsbGFibGVfaXRlbXNfd2VyZV9mb3VuZCIpICsgIlxuXG4iKTsNCi0NCi0JCS8vIERldGVybWluZSBpZiBhbnkgbG9jYXRpb25zIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAodmVjdG9yVVJMc0ZhaWxlZC5zaXplKCkgPiAwKSB7DQotCQkJc3RyYk1lc3NhZ2UuYXBwZW5kKFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19VbmFibGVfdG9fYWNjZXNzX3RoZV9mb2xsb3dpbmdfbG9jYXRpb25zIikgKyAiOiIpOw0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmVjdG9yVVJMc0ZhaWxlZC5zaXplKCk7ICsraSkgew0KLQkJCQlzdHJiTWVzc2FnZS5hcHBlbmQoIlxuICAgIik7DQotCQkJCXN0cmJNZXNzYWdlLmFwcGVuZCgoKFVSTE5hbWVQYWlyKSB2ZWN0b3JVUkxzRmFpbGVkLmVsZW1lbnRBdChpKSkuX2dldE5hbWUoKSk7DQotCQkJCXN0cmJNZXNzYWdlLmFwcGVuZCgiICgiKTsNCi0JCQkJc3RyYk1lc3NhZ2UuYXBwZW5kKCgoVVJMTmFtZVBhaXIpIHZlY3RvclVSTHNGYWlsZWQuZWxlbWVudEF0KGkpKS5fZ2V0VVJMKCkpOw0KLQkJCQlzdHJiTWVzc2FnZS5hcHBlbmQoIikiKTsNCi0JCQl9DQotCQl9DQotDQotCQlpZiAoc3RyYk1lc3NhZ2UubGVuZ3RoKCkgPiAwKSB7DQotCQkJTWVzc2FnZURpYWxvZy5vcGVuSW5mb3JtYXRpb24oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIFVwZGF0ZU1hbmFnZXJTdHJpbmdzLmdldFN0cmluZygiU19JbmZvcm1hdGlvbiIpLCBzdHJiTWVzc2FnZS50b1N0cmluZygpKTsNCi0JCX0NCi0NCi0JCS8vIFJlc2V0IHJlZnJlc2ggZmxhZw0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlfYlJlZnJlc2hSZXF1aXJlZCA9IGZhbHNlOw0KLQ0KLQkJcmV0dXJuOw0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIGludCBpc0luc3RhbGxhYmxlQ29tcG9uZW50KFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1Db21wb25lbnQpIHsNCi0NCi0JCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0cmVlSXRlbUNvbXBvbmVudC5nZXREYXRhKCk7DQotDQotCQkvLyBGYWxzZSBpZiBub25lIGF2YWlsYWJsZSB0byBpbnN0YWxsDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQlpZiAodW1UcmVlSXRlbS5fZGVzY3JpcHRvckF2YWlsYWJsZSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIC0xOw0KLQkJfQ0KLQ0KLQkJLy8gVHJ1ZSBpZiBub3QgeWV0IGluc3RhbGxlZA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JDdXJyZW50ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PS19UT19JTlNUQUxMOw0KLQkJfQ0KLQ0KLQkJLy8gVHJ1ZSBpZiBpbnN0YWxsYWJsZQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJcmV0dXJuICgoSUNvbXBvbmVudERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JBdmFpbGFibGUpLmlzSW5zdGFsbGFibGUoKElDb21wb25lbnREZXNjcmlwdG9yKSB1bVRyZWVJdGVtLl9kZXNjcmlwdG9yQ3VycmVudCk7DQotCX0NCi0JLyoqDQotCSAqIEByZXR1cm4gaW50DQotCSAqIEBwYXJhbSB0cmVlSXRlbUNvbXBvbmVudCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW0NCi0JICovDQotCXB1YmxpYyBpbnQgaXNJbnN0YWxsYWJsZUNvbXBvbmVudEVudHJ5KFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1Db21wb25lbnRFbnRyeSkgew0KLQ0KLQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtQ29tcG9uZW50RW50cnkuZ2V0RGF0YSgpOw0KLQ0KLQkJLy8gRmFsc2UgaWYgbm9uZSBhdmFpbGFibGUgdG8gaW5zdGFsbA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeSA9PSBudWxsKSB7DQotCQkJcmV0dXJuIC0xOw0KLQkJfQ0KLQ0KLQkJLy8gSXMgdGhlIHByb2R1Y3QgaW5zdGFsbGFibGU/DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1Qcm9kdWN0ID0gdHJlZUl0ZW1Db21wb25lbnRFbnRyeS5nZXRQYXJlbnRJdGVtKCk7DQotDQotCQlpbnQgaVByb2R1Y3RJbnN0YWxsYWJsZSA9IGlzSW5zdGFsbGFibGVQcm9kdWN0KHRyZWVJdGVtUHJvZHVjdCk7DQotDQotCQkvLyBJZiB0aGUgcHJvZHVjdCBpcyBub3QgaW5zdGFsbGFibGUsIGRpc2FibGUgaWYgbWFuZGF0b3J5IGNvbXBvbmVudA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmIChpUHJvZHVjdEluc3RhbGxhYmxlICE9IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuT0tfVE9fSU5TVEFMTCkgew0KLQkJCWlmICh1bVRyZWVJdGVtLl9kZXNjcmlwdG9yRW50cnkuaXNPcHRpb25hbEZvckluc3RhbGwoKSA9PSBmYWxzZSkgew0KLQkJCQlyZXR1cm4gaVByb2R1Y3RJbnN0YWxsYWJsZTsNCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm4gdW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5LmlzSW5zdGFsbGFibGUoKElDb21wb25lbnREZXNjcmlwdG9yKSB1bVRyZWVJdGVtLl9kZXNjcmlwdG9yQ3VycmVudCk7DQotCX0NCi0JLyoqDQotCSAqIEByZXR1cm4gaW50DQotCSAqIEBwYXJhbSB0cmVlSXRlbUNvbXBvbmVudCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRhYmxlVHJlZUl0ZW0NCi0JICovDQotCXB1YmxpYyBpbnQgaXNJbnN0YWxsYWJsZVByb2R1Y3QoVGFibGVUcmVlSXRlbSB0cmVlSXRlbVByb2R1Y3QpIHsNCi0NCi0JCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0cmVlSXRlbVByb2R1Y3QuZ2V0RGF0YSgpOw0KLQ0KLQkJLy8gRmFsc2UgaWYgbm9uZSBhdmFpbGFibGUgdG8gaW5zdGFsbA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JBdmFpbGFibGUgPT0gbnVsbCkgew0KLQkJCXJldHVybiAtMTsNCi0JCX0NCi0NCi0JCS8vIFRydWUgaWYgbm90IHlldCBpbnN0YWxsZWQNCi0JCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWVsc2UgaWYgKHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JDdXJyZW50ID09IG51bGwpIHsNCi0JCQlyZXR1cm4gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5PS19UT19JTlNUQUxMOw0KLQkJfQ0KLQ0KLQkJLy8gVHJ1ZSBpZiBpbnN0YWxsYWJsZQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJcmV0dXJuICgoSVByb2R1Y3REZXNjcmlwdG9yKSB1bVRyZWVJdGVtLl9kZXNjcmlwdG9yQXZhaWxhYmxlKS5pc0luc3RhbGxhYmxlKChJUHJvZHVjdERlc2NyaXB0b3IpIHVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JDdXJyZW50KTsNCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBpc0luc3RhbGxhYmxlUmVjdXJzaXZlKFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW0pIHsNCi0NCi0JCWJvb2xlYW4gYkluc3RhbGxhYmxlID0gZmFsc2U7DQotDQotCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgdHJlZUl0ZW0uZ2V0RGF0YSgpOw0KLQ0KLQkJLy8gVHJ1ZSBpZiBwcm9kdWN0IG9yIGNvbXBvbmVudCBpcyBjaGVja2VkDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWlmICh0cmVlSXRlbS5nZXRDaGVja2VkKCkgPT0gdHJ1ZSkgew0KLQkJCWlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UIHx8IHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9QUk9EVUNUIHx8IHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfRU5UUlkpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJLy8gQ2hlY2sgYWxsIGNoaWxkcmVuDQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCVRhYmxlVHJlZUl0ZW1bXSB0cmVlSXRlbUNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1DaGlsZHJlbi5sZW5ndGg7ICsraSkgew0KLQkJCWlmIChpc0luc3RhbGxhYmxlUmVjdXJzaXZlKHRyZWVJdGVtQ2hpbGRyZW5baV0pID09IHRydWUpIHsNCi0JCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotCS8qKg0KLQkgKiBTZW50IHdoZW4gdGhlIG1vdXNlIHBvaW50ZXIgcGFzc2VzIGludG8gdGhlIGFyZWEgb2YNCi0JICogdGhlIHNjcmVlbiBjb3ZlcmVkIGJ5IGEgY29udHJvbC4NCi0JICovDQotCXB1YmxpYyB2b2lkIG1vdXNlRW50ZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50IGUpIHsNCi0JfQ0KLQkvKioNCi0JICogU2VudCB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIHBhc3NlcyBvdXQgb2YgdGhlIGFyZWEgb2YNCi0JICogdGhlIHNjcmVlbiBjb3ZlcmVkIGJ5IGEgY29udHJvbC4gIEVyYXNlcyB0aGUgZGVzY3JpcHRpb24gdGV4dCBhcmVhLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbW91c2VFeGl0KE1vdXNlRXZlbnQgZSkgew0KLQkJaWYgKF9zdHJEZXNjcmlwdGlvbiAhPSBfd2l6YXJkLl9zdHJFbXB0eSkgew0KLQkJCV90ZXh0RGVzY3JpcHRpb24uc2V0VGV4dChfd2l6YXJkLl9zdHJFbXB0eSk7DQotCQkJX3N0ckRlc2NyaXB0aW9uID0gX3dpemFyZC5fc3RyRW1wdHk7DQotCQl9DQotCX0NCi0JLyoqDQotCSAqIFNlbnQgd2hlbiB0aGUgbW91c2UgcG9pbnRlciBob3ZlcnMgKHRoYXQgaXMsIHN0b3BzIG1vdmluZw0KLQkgKiBmb3IgYW4gKG9wZXJhdGluZyBzeXN0ZW0gc3BlY2lmaWVkKSBwZXJpb2Qgb2YgdGltZSkgb3Zlcg0KLQkgKiBhIGNvbnRyb2wuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZSkgew0KLQl9DQotCS8qKg0KLQkgKiBEZXRlcm1pbmVzIHdoaWNoIGl0ZW0gdGhlIG1vdXNlIGlzIG92ZXIuICBTZXRzIHRoZSB0ZXh0IGluIHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGFyZWEgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpdGVtLg0KLQkgKi8NCi0JcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgew0KLQ0KLQkJLy8gVGFibGUgaXRlbQ0KLQkJLy8tLS0tLS0tLS0tLQ0KLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IF90YWJsZVRyZWVJdGVtcy5nZXRUYWJsZSgpLmdldEl0ZW0obmV3IFBvaW50KGUueCwgZS55KSk7DQotDQotCQkvLyBUYWJsZVRyZWUgaXRlbQ0KLQkJLy8tLS0tLS0tLS0tLS0tLS0NCi0JCWlmICh0YWJsZUl0ZW0gIT0gbnVsbCkgew0KLQ0KLQkJCVRhYmxlVHJlZUl0ZW0gdGFibGVUcmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKSB0YWJsZUl0ZW0uZ2V0RGF0YSgpOw0KLQ0KLQkJCS8vIFVNV2l6YXJkVHJlZUl0ZW0NCi0JCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gDQotCQkJaWYgKHRhYmxlVHJlZUl0ZW0gIT0gbnVsbCkgew0KLQ0KLQkJCQlVTVdpemFyZFRyZWVJdGVtIGl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgdGFibGVUcmVlSXRlbS5nZXREYXRhKCk7DQotDQotCQkJCS8vIERlc2NyaXB0aW9uIHN0cmluZw0KLQkJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKGl0ZW0gIT0gbnVsbCkgew0KLQkJCQkJaWYgKGl0ZW0uX3N0ckRlc2NyaXB0aW9uICE9IG51bGwpIHsNCi0JCQkJCQlpZiAoX3N0ckRlc2NyaXB0aW9uICE9IGl0ZW0uX3N0ckRlc2NyaXB0aW9uKSB7DQotCQkJCQkJCV90ZXh0RGVzY3JpcHRpb24uc2V0VGV4dChpdGVtLl9zdHJEZXNjcmlwdGlvbik7DQotCQkJCQkJCV9zdHJEZXNjcmlwdGlvbiA9IGl0ZW0uX3N0ckRlc2NyaXB0aW9uOw0KLQkJCQkJCX0NCi0JCQkJCX0NCi0JCQkJCWVsc2Ugew0KLQkJCQkJCWlmIChfc3RyRGVzY3JpcHRpb24gIT0gX3dpemFyZC5fc3RyRW1wdHkpIHsNCi0JCQkJCQkJX3RleHREZXNjcmlwdGlvbi5zZXRUZXh0KF93aXphcmQuX3N0ckVtcHR5KTsNCi0JCQkJCQkJX3N0ckRlc2NyaXB0aW9uID0gX3dpemFyZC5fc3RyRW1wdHk7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWVsc2UgaWYgKF9zdHJEZXNjcmlwdGlvbiAhPSBfd2l6YXJkLl9zdHJFbXB0eSkgew0KLQkJCQkJX3RleHREZXNjcmlwdGlvbi5zZXRUZXh0KF93aXphcmQuX3N0ckVtcHR5KTsNCi0JCQkJCV9zdHJEZXNjcmlwdGlvbiA9IF93aXphcmQuX3N0ckVtcHR5Ow0KLQkJCQl9DQotDQotCQkJfQ0KLQkJfQ0KLQkJZWxzZSBpZiAoX3N0ckRlc2NyaXB0aW9uICE9IF93aXphcmQuX3N0ckVtcHR5KSB7DQotCQkJX3RleHREZXNjcmlwdGlvbi5zZXRUZXh0KF93aXphcmQuX3N0ckVtcHR5KTsNCi0JCQlfc3RyRGVzY3JpcHRpb24gPSBfd2l6YXJkLl9zdHJFbXB0eTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICogQHJldHVybiBib29sZWFuDQotCSAqLw0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2FuY2VsKCkgew0KLQ0KLQkJaWYgKF9wcm9ncmVzc01vbml0b3IgPT0gbnVsbCkNCi0JCQlyZXR1cm4gdHJ1ZTsNCi0NCi0JCV9wcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7DQotCQlyZXR1cm4gZmFsc2U7DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDaGVja2VkQ29tcG9uZW50KFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1Db21wb25lbnQpIHsNCi0NCi0JCWlmICh0cmVlSXRlbUNvbXBvbmVudC5nZXRDaGVja2VkKCkgPT0gZmFsc2UpIHsNCi0JCQlpbnQgaUluc3RhbGxhYmxlID0gaXNJbnN0YWxsYWJsZUNvbXBvbmVudCh0cmVlSXRlbUNvbXBvbmVudCk7DQotDQotCQkJc2V0VHJlZUl0ZW1DaGVja2VkKHRyZWVJdGVtQ29tcG9uZW50LCBpSW5zdGFsbGFibGUgPT0gMCk7DQotCQkJcmV0dXJuIGlJbnN0YWxsYWJsZSA9PSAwOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDaGVja2VkQ29tcG9uZW50RW50cnkoVGFibGVUcmVlSXRlbSB0cmVlSXRlbUNvbXBvbmVudEVudHJ5KSB7DQotDQotCQlpZiAodHJlZUl0ZW1Db21wb25lbnRFbnRyeS5nZXRDaGVja2VkKCkgPT0gZmFsc2UpIHsNCi0NCi0JCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW0gPSAoVU1XaXphcmRUcmVlSXRlbSkgdHJlZUl0ZW1Db21wb25lbnRFbnRyeS5nZXREYXRhKCk7DQotDQotCQkJaW50IGlJbnN0YWxsYWJsZSA9IGlzSW5zdGFsbGFibGVDb21wb25lbnRFbnRyeSh0cmVlSXRlbUNvbXBvbmVudEVudHJ5KTsNCi0NCi0JCQlpZiAoaUluc3RhbGxhYmxlID09IDApIHsNCi0NCi0JCQkJLy8gU2V0IGNoZWNrZWQgdGhlIHByb2R1Y3QgYW5kIGFsbCBvZiBpdHMgbWFuZGF0b3J5IGNvbXBvbmVudHMNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJVGFibGVUcmVlSXRlbSB0cmVlSXRlbVByb2R1Y3QgPSB0cmVlSXRlbUNvbXBvbmVudEVudHJ5LmdldFBhcmVudEl0ZW0oKTsNCi0NCi0JCQkJYm9vbGVhbiBiSW5zdGFsbGFibGVQcm9kdWN0ID0gc2V0Q2hlY2tlZFByb2R1Y3QodHJlZUl0ZW1Qcm9kdWN0KTsNCi0NCi0JCQkJLy8gSWYgdGhlIHByb2R1Y3QgaXMgbm90IGluc3RhbGxhYmxlLCBkaXNhYmxlIGlmIG1hbmRhdG9yeSBjb21wb25lbnQNCi0JCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJaWYgKGJJbnN0YWxsYWJsZVByb2R1Y3QgPT0gZmFsc2UpIHsNCi0NCi0JCQkJCWlmICh1bVRyZWVJdGVtLl9kZXNjcmlwdG9yRW50cnkuaXNPcHRpb25hbEZvckluc3RhbGwoKSA9PSBmYWxzZSkgew0KLQkJCQkJCWlmICh0cmVlSXRlbUNvbXBvbmVudEVudHJ5LmdldENoZWNrZWQoKSA9PSB0cnVlKQ0KLQkJCQkJCQl0cmVlSXRlbUNvbXBvbmVudEVudHJ5LnNldENoZWNrZWQoZmFsc2UpOw0KLQkJCQkJCXJldHVybiBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQlzZXRUcmVlSXRlbUNoZWNrZWQodHJlZUl0ZW1Db21wb25lbnRFbnRyeSwgaUluc3RhbGxhYmxlID09IDApOw0KLQkJCXVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeS5pc1NlbGVjdGVkKGlJbnN0YWxsYWJsZSA9PSAwKTsNCi0NCi0JCQlyZXR1cm4gaUluc3RhbGxhYmxlID09IDA7DQotCQl9DQotDQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICogVGhpcyByb3V0aW5lIGFzc3VtZXMgdGhhdCB0aGUgY2hlY2tib3ggd2FzIHVuY2hlY2tlZCBhbmQgaXMgY3VycmVudGx5IGNoZWNrZWQNCi0JICovDQotCXByb3RlY3RlZCBib29sZWFuIHNldENoZWNrZWRQcm9kdWN0KFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW1Qcm9kdWN0KSB7DQotDQotCQlpZiAodHJlZUl0ZW1Qcm9kdWN0LmdldENoZWNrZWQoKSA9PSBmYWxzZSkgew0KLQ0KLQkJCWludCBpSW5zdGFsbGFibGUgPSBpc0luc3RhbGxhYmxlUHJvZHVjdCh0cmVlSXRlbVByb2R1Y3QpOw0KLQ0KLQkJCXNldFRyZWVJdGVtQ2hlY2tlZCh0cmVlSXRlbVByb2R1Y3QsIGlJbnN0YWxsYWJsZSA9PSAwKTsNCi0NCi0JCQlpZiAoaUluc3RhbGxhYmxlID09IDApIHsNCi0NCi0JCQkJVGFibGVUcmVlSXRlbVtdIHRyZWVJdGVtQ2hpbGRyZW4gPSB0cmVlSXRlbVByb2R1Y3QuZ2V0SXRlbXMoKTsNCi0NCi0JCQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gbnVsbDsNCi0NCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbUNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQotCQkJCQlzZXRDaGVja2VkQ29tcG9uZW50RW50cnkodHJlZUl0ZW1DaGlsZHJlbltpXSk7DQotCQkJCX0NCi0JCQl9DQotDQotCQkJcmV0dXJuIGlJbnN0YWxsYWJsZSA9PSAwOw0KLQkJfQ0KLQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyoqDQotCSAqIFRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIGNoZWNrYm94IHdhcyB1bmNoZWNrZWQgYW5kIGlzIGN1cnJlbnRseSBjaGVja2VkLg0KLQkgKi8NCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q2hlY2tlZFVSTChUYWJsZVRyZWVJdGVtIHRyZWVJdGVtVVJMKSB7DQotDQotCQlUYWJsZVRyZWVJdGVtW10gdHJlZUl0ZW1DaGlsZHJlbiA9IHRyZWVJdGVtVVJMLmdldEl0ZW1zKCk7DQotCQlVTVdpemFyZFRyZWVJdGVtIHVtVHJlZUl0ZW0gPSBudWxsOw0KLQ0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cmVlSXRlbUNoaWxkcmVuLmxlbmd0aDsgKytpKSB7DQotCQkJdW1UcmVlSXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0cmVlSXRlbUNoaWxkcmVuW2ldLmdldERhdGEoKTsNCi0NCi0JCQlpZiAodW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX1BST0RVQ1QpIHsNCi0JCQkJc2V0Q2hlY2tlZFByb2R1Y3QodHJlZUl0ZW1DaGlsZHJlbltpXSk7DQotCQkJfQ0KLQkJCWVsc2UgaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlQpIHsNCi0JCQkJc2V0Q2hlY2tlZENvbXBvbmVudCh0cmVlSXRlbUNoaWxkcmVuW2ldKTsNCi0JCQl9DQotCQl9DQotDQotCQkvLyBBbHdheXMgY2hlY2tlZA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0NCi0JCWlmICh0cmVlSXRlbVVSTC5nZXRDaGVja2VkKCkgPT0gZmFsc2UpDQotCQkJdHJlZUl0ZW1VUkwuc2V0Q2hlY2tlZCh0cnVlKTsNCi0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUl0ZW1DaGVja2VkKFRhYmxlVHJlZUl0ZW0gdHJlZUl0ZW0sIGJvb2xlYW4gYkNoZWNrZWQpIHsNCi0NCi0JCWlmIChiQ2hlY2tlZCA9PSB0cnVlKSB7DQotCQkJaWYgKHRyZWVJdGVtLmdldENoZWNrZWQoKSA9PSBmYWxzZSkNCi0JCQkJdHJlZUl0ZW0uc2V0Q2hlY2tlZCh0cnVlKTsNCi0JCX0NCi0JCWVsc2Ugew0KLQkJCWlmICh0cmVlSXRlbS5nZXRDaGVja2VkKCkgPT0gdHJ1ZSkNCi0JCQkJdHJlZUl0ZW0uc2V0Q2hlY2tlZChmYWxzZSk7DQotCQl9DQotCX0NCi0JLyoqDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRUcmVlSXRlbUNoZWNrZWQoYm9vbGVhbiBiQ2hlY2tlZCkgew0KLQl9DQotCS8qKg0KLQkgKi8NCi0JcHVibGljIHZvaWQgc2V0VHJlZUl0ZW1VbmNoZWNrZWRSZWN1cnNpdmVCYWNrd2FyZChUYWJsZVRyZWVJdGVtIHRyZWVJdGVtKSB7DQotDQotCQlpZiAodHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpICE9IGZhbHNlKSB7DQotCQkJdHJlZUl0ZW0uc2V0Q2hlY2tlZChmYWxzZSk7DQotCQl9DQotDQotCQlUYWJsZVRyZWVJdGVtIHRyZWVJdGVtUGFyZW50ID0gdHJlZUl0ZW0uZ2V0UGFyZW50SXRlbSgpOw0KLQ0KLQkJaWYgKHRyZWVJdGVtUGFyZW50ICE9IG51bGwpIHsNCi0JCQlzZXRUcmVlSXRlbVVuY2hlY2tlZFJlY3Vyc2l2ZUJhY2t3YXJkKHRyZWVJdGVtUGFyZW50KTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICovDQotCXB1YmxpYyB2b2lkIHNldFRyZWVJdGVtVW5jaGVja2VkUmVjdXJzaXZlRm9yd2FyZChUYWJsZVRyZWVJdGVtIHRyZWVJdGVtKSB7DQotDQotCQlpZiAodHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpICE9IGZhbHNlKSB7DQotDQotCQkJdHJlZUl0ZW0uc2V0Q2hlY2tlZChmYWxzZSk7DQotCQkJLyoNCi0JCQkJCVVNV2l6YXJkVHJlZUl0ZW0gdW1UcmVlSXRlbSA9IChVTVdpemFyZFRyZWVJdGVtKSB0cmVlSXRlbS5nZXREYXRhKCk7DQotCQkJDQotCQkJCQlpZiAodW1UcmVlSXRlbS5faVR5cGUgPT0gVXBkYXRlTWFuYWdlckNvbnN0YW50cy5UWVBFX0NPTVBPTkVOVF9FTlRSWSkgew0KLQkJCQ0KLQkJCQkJCWlmICh1bVRyZWVJdGVtLl9kZXNjcmlwdG9yRW50cnkuaXNPcHRpb25hbEZvckluc3RhbGwoKSA9PSB0cnVlKSB7DQotCQkJCQkJCXVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeS5pc1NlbGVjdGVkKGZhbHNlKTsNCi0JCQkJCQl9DQotCQkJCQl9DQotCQkJKi8NCi0JCX0NCi0NCi0JCVRhYmxlVHJlZUl0ZW1bXSB0cmVlSXRlbUNoaWxkcmVuID0gdHJlZUl0ZW0uZ2V0SXRlbXMoKTsNCi0NCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1DaGlsZHJlbi5sZW5ndGg7ICsraSkgew0KLQkJCXNldFRyZWVJdGVtVW5jaGVja2VkUmVjdXJzaXZlRm9yd2FyZCh0cmVlSXRlbUNoaWxkcmVuW2ldKTsNCi0JCX0NCi0JfQ0KLQkvKioNCi0JICogDQotCSAqLw0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gYlZpc2libGUpIHsNCi0NCi0JCXN1cGVyLnNldFZpc2libGUoYlZpc2libGUpOw0KLQ0KLQkJaWYgKGJWaXNpYmxlID09IHRydWUpIHsNCi0JCQlfc2FzaEZvcm1Ub3BCb3R0b20ubGF5b3V0KCk7DQotCQkJaW5pdGlhbGl6ZUNvbnRlbnQoKTsNCi0NCi0JCX0NCi0JfQ0KLQkvKioNCi0JICogU2VudCB3aGVuIGRlZmF1bHQgc2VsZWN0aW9uIG9jY3VycyBpbiB0aGUgY29udHJvbC4NCi0JICovDQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsNCi0JfQ0KLQkvKioNCi0JICogU2VudCB3aGVuIHNlbGVjdGlvbiBvY2N1cnMgaW4gdGhlIGNvbnRyb2wuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50IGUpIHsNCi0NCi0JCS8vIENoZWNrYm94OiBTaG93IGxhdGVzdCB2ZXJzaW9ucyBvbmx5DQotCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJaWYgKGUud2lkZ2V0ID09IF9idXR0b25TaG93TGF0ZXN0T25seSkgew0KLQkJCV9iU2hvd0xhdGVzdE9ubHkgPSBfYnV0dG9uU2hvd0xhdGVzdE9ubHkuZ2V0U2VsZWN0aW9uKCk7DQotCQkJX2JSZWZyZXNoUmVxdWlyZWQgPSB0cnVlOw0KLQkJCWluaXRpYWxpemVDb250ZW50KCk7DQotCQl9DQotDQotCQkvLyBUYWJsZVRyZWVJdGVtOiBDaGVja2JveA0KLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IF90YWJsZVRyZWVJdGVtcyAmJiBlLmRldGFpbCA9PSBTV1QuQ0hFQ0spIHsNCi0NCi0JCQkvLyBTZXQgcGFnZSBjb21wbGV0ZSB0byBmYWxzZSBpbiBjYXNlIHRoZXJlIGFyZQ0KLQkJCS8vIG5vIHNlbGVjdGVkIGl0ZW1zLCBvciB1bnRpbCBzZWxlY3Rpb24gaXMgZGV0ZXJtaW5lZCB0byBiZSB2YWxpZA0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7DQotDQotCQkJVGFibGVUcmVlSXRlbSB0cmVlSXRlbSA9IChUYWJsZVRyZWVJdGVtKSBlLml0ZW07DQotDQotCQkJVU1XaXphcmRUcmVlSXRlbSB1bVRyZWVJdGVtID0gKFVNV2l6YXJkVHJlZUl0ZW0pIHRyZWVJdGVtLmdldERhdGEoKTsNCi0NCi0JCQlib29sZWFuIGJDaGVja2VkID0gdHJlZUl0ZW0uZ2V0Q2hlY2tlZCgpOw0KLQ0KLQkJCS8vIENoZWNrDQotCQkJLy8tLS0tLS0NCi0JCQlpZiAoYkNoZWNrZWQgPT0gdHJ1ZSkgew0KLQkJCQkvLyBUZW1wb3JhcmlseSB1bmNoZWNrDQotCQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0JCQkJdHJlZUl0ZW0uc2V0Q2hlY2tlZChmYWxzZSk7DQotDQotCQkJCWlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfVVJMKQ0KLQkJCQkJc2V0Q2hlY2tlZFVSTCh0cmVlSXRlbSk7DQotDQotCQkJCWVsc2UgaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9QUk9EVUNUKQ0KLQkJCQkJc2V0Q2hlY2tlZFByb2R1Y3QodHJlZUl0ZW0pOw0KLQ0KLQkJCQllbHNlIGlmICh1bVRyZWVJdGVtLl9pVHlwZSA9PSBVcGRhdGVNYW5hZ2VyQ29uc3RhbnRzLlRZUEVfQ09NUE9ORU5UKQ0KLQkJCQkJc2V0Q2hlY2tlZENvbXBvbmVudCh0cmVlSXRlbSk7DQotDQotCQkJCWVsc2UgaWYgKHVtVHJlZUl0ZW0uX2lUeXBlID09IFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfRU5UUlkpDQotCQkJCQlzZXRDaGVja2VkQ29tcG9uZW50RW50cnkodHJlZUl0ZW0pOw0KLQkJCX0NCi0NCi0JCQkvLyBVbmNoZWNrDQotCQkJLy8tLS0tLS0tLQ0KLQkJCWVsc2Ugew0KLQkJCQlzd2l0Y2ggKHVtVHJlZUl0ZW0uX2lUeXBlKSB7DQotCQkJCQljYXNlIFVwZGF0ZU1hbmFnZXJDb25zdGFudHMuVFlQRV9DT01QT05FTlRfRU5UUlkgOg0KLQkJCQkJCXVtVHJlZUl0ZW0uX2Rlc2NyaXB0b3JFbnRyeS5pc1NlbGVjdGVkKGZhbHNlKTsNCi0JCQkJCQlpZiAodW1UcmVlSXRlbS5fZGVzY3JpcHRvckVudHJ5LmlzT3B0aW9uYWxGb3JJbnN0YWxsKCkgPT0gZmFsc2UpDQotCQkJCQkJCXNldFRyZWVJdGVtVW5jaGVja2VkUmVjdXJzaXZlQmFja3dhcmQodHJlZUl0ZW0pOw0KLQkJCQkJCWJyZWFrOw0KLQ0KLQkJCQkJZGVmYXVsdCA6DQotCQkJCQkJc2V0VHJlZUl0ZW1VbmNoZWNrZWRSZWN1cnNpdmVCYWNrd2FyZCh0cmVlSXRlbSk7DQotCQkJCQkJc2V0VHJlZUl0ZW1VbmNoZWNrZWRSZWN1cnNpdmVGb3J3YXJkKHRyZWVJdGVtKTsNCi0JCQkJCQlicmVhazsNCi0JCQkJfQ0KLQkJCX0NCi0NCi0JCQkvLyBEZXRlcm1pbmUgaWYgcGFnZSBpcyBjb21wbGV0ZQ0KLQkJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQotCQkJYm9vbGVhbiBiUGFnZUNvbXBsZXRlID0gZmFsc2U7DQotDQotCQkJVGFibGVUcmVlSXRlbVtdIHRyZWVJdGVtcyA9IF90YWJsZVRyZWVJdGVtcy5nZXRJdGVtcygpOw0KLQ0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJlZUl0ZW1zLmxlbmd0aDsgKytpKSB7DQotCQkJCWlmIChpc0luc3RhbGxhYmxlUmVjdXJzaXZlKHRyZWVJdGVtc1tpXSkgPT0gdHJ1ZSkgew0KLQkJCQkJc2V0UGFnZUNvbXBsZXRlKHRydWUpOw0KLQkJCQkJYnJlYWs7DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlyZXR1cm47DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUluc3RhbGxpbmcuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VJbnN0YWxsaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYjFiYjguLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUluc3RhbGxpbmcuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VMYXVuY2hIaXN0b3J5LmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlTGF1bmNoSGlzdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg5NjE5Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VMYXVuY2hIaXN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlTGF1bmNoSGlzdG9yeUNvbXBsZXRlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlTGF1bmNoSGlzdG9yeUNvbXBsZXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YTlkNjEuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUxhdW5jaEhpc3RvcnlDb21wbGV0ZS5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUxvY2F0aW9ucy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZUxvY2F0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjFiZmJiLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VMb2NhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxDb21wbGV0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTENvbXBsZXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MmM4NDIuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTENvbXBsZXRlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1N2ExNC4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGFnZVVSTEluc3RhbGxhYmxlLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU4N2MxOS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbGFibGUuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsaW5nLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQYWdlVVJMSW5zdGFsbGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTQ5YzM0Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFBhZ2VVUkxJbnN0YWxsaW5nLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQZXJzaXN0ZW50UHJvcGVydGllcy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUGVyc2lzdGVudFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMWFmNy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQZXJzaXN0ZW50UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudE5ldy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudE5ldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGYzYTQ3Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnROZXcuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnRSZXZlcnQuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnRSZXZlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ZDU0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50UmV2ZXJ0LmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50VVJMSW5zdGFsbC5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudFVSTEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwODk0MS4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRQcm9kdWN0Q29tcG9uZW50VVJMSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudFVwZGF0ZS5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkUHJvZHVjdENvbXBvbmVudFVwZGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg2ZDY1Li4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFByb2R1Y3RDb21wb25lbnRVcGRhdGUuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFRyZWVJdGVtLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRUcmVlSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ViZjRhLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFRyZWVJdGVtLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRUcmVlSXRlbUNvbXBhcmF0b3IuamF2YSBiL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFRyZWVJdGVtQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmMxOTgxLi4wMDAwMDAwCi0tLSBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9VTVdpemFyZFRyZWVJdGVtQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS51cGRhdGUuaW50ZXJuYWwudWk7DQotLyoNCi0gKiAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDAxLg0KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQotICovDQotDQotLyoqDQotICogDQotICovDQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOw0KLXB1YmxpYyBjbGFzcyBVTVdpemFyZFRyZWVJdGVtQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3Igew0KLQkvKioNCi0JICogVXBkYXRlTWFuYWdlclRyZWVJdGVtQ29tcGFyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50Lg0KLQkgKi8NCi0JcHVibGljIFVNV2l6YXJkVHJlZUl0ZW1Db21wYXJhdG9yKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQkvKioNCi0JICogQ29tcGFyZXMgaXRzIHR3byBhcmd1bWVudHMgZm9yIG9yZGVyLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGludGVnZXIsDQotCSAqIHplcm8sIG9yIGEgcG9zaXRpdmUgaW50ZWdlciBhcyB0aGUgZmlyc3QgYXJndW1lbnQgaXMgbGVzcyB0aGFuLCBlcXVhbA0KLQkgKiB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuPHA+DQotCSAqDQotCSAqIFRoZSBpbXBsZW1lbnRvciBtdXN0IGVuc3VyZSB0aGF0IDx0dD5zZ24oY29tcGFyZSh4LCB5KSkgPT0NCi0JICogLXNnbihjb21wYXJlKHksIHgpKTwvdHQ+IGZvciBhbGwgPHR0Png8L3R0PiBhbmQgPHR0Pnk8L3R0Pi4gIChUaGlzDQotCSAqIGltcGxpZXMgdGhhdCA8dHQ+Y29tcGFyZSh4LCB5KTwvdHQ+IG11c3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuZCBvbmx5DQotCSAqIGlmIDx0dD5jb21wYXJlKHksIHgpPC90dD4gdGhyb3dzIGFuIGV4Y2VwdGlvbi4pPHA+DQotCSAqDQotCSAqIFRoZSBpbXBsZW1lbnRvciBtdXN0IGFsc28gZW5zdXJlIHRoYXQgdGhlIHJlbGF0aW9uIGlzIHRyYW5zaXRpdmU6DQotCSAqIDx0dD4oKGNvbXBhcmUoeCwgeSkmZ3Q7MCkgJmFtcDsmYW1wOyAoY29tcGFyZSh5LCB6KSZndDswKSk8L3R0PiBpbXBsaWVzDQotCSAqIDx0dD5jb21wYXJlKHgsIHopJmd0OzA8L3R0Pi48cD4NCi0JICoNCi0JICogRmluYWxseSwgdGhlIGltcGxlbWVudGVyIG11c3QgZW5zdXJlIHRoYXQgPHR0PmNvbXBhcmUoeCwgeSk9PTA8L3R0Pg0KLQkgKiBpbXBsaWVzIHRoYXQgPHR0PnNnbihjb21wYXJlKHgsIHopKT09c2duKGNvbXBhcmUoeSwgeikpPC90dD4gZm9yIGFsbA0KLQkgKiA8dHQ+ejwvdHQ+LjxwPg0KLQkgKg0KLQkgKiBJdCBpcyBnZW5lcmFsbHkgdGhlIGNhc2UsIGJ1dCA8aT5ub3Q8L2k+IHN0cmljdGx5IHJlcXVpcmVkIHRoYXQgDQotCSAqIDx0dD4oY29tcGFyZSh4LCB5KT09MCkgPT0gKHguZXF1YWxzKHkpKTwvdHQ+LiAgR2VuZXJhbGx5IHNwZWFraW5nLA0KLQkgKiBhbnkgY29tcGFyYXRvciB0aGF0IHZpb2xhdGVzIHRoaXMgY29uZGl0aW9uIHNob3VsZCBjbGVhcmx5IGluZGljYXRlDQotCSAqIHRoaXMgZmFjdC4gIFRoZSByZWNvbW1lbmRlZCBsYW5ndWFnZSBpcyAiTm90ZTogdGhpcyBjb21wYXJhdG9yDQotCSAqIGltcG9zZXMgb3JkZXJpbmdzIHRoYXQgYXJlIGluY29uc2lzdGVudCB3aXRoIGVxdWFscy4iDQotCSAqIA0KLQkgKiBAcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciwgemVybywgb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGFzIHRoZQ0KLQkgKiAgICAgICAgIGZpcnN0IGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUNCi0JICogICAgICAgICBzZWNvbmQuIA0KLQkgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgYXJndW1lbnRzJyB0eXBlcyBwcmV2ZW50IHRoZW0gZnJvbQ0KLQkgKiAgICAgICAgIGJlaW5nIGNvbXBhcmVkIGJ5IHRoaXMgQ29tcGFyYXRvci4NCi0JICovDQotCXB1YmxpYyBpbnQgY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0IG8xLCBqYXZhLmxhbmcuT2JqZWN0IG8yKSB7DQotDQotCQlpZiAobzEgaW5zdGFuY2VvZiBVTVdpemFyZFRyZWVJdGVtICYmIG8yIGluc3RhbmNlb2YgVU1XaXphcmRUcmVlSXRlbSkgew0KLQkJCWlmICgoKFVNV2l6YXJkVHJlZUl0ZW0pIG8xKS5fc3RyTmFtZSAhPSBudWxsICYmICgoVU1XaXphcmRUcmVlSXRlbSkgbzIpLl9zdHJOYW1lICE9IG51bGwpIHsNCi0JCQkJcmV0dXJuICgoVU1XaXphcmRUcmVlSXRlbSkgbzEpLl9zdHJOYW1lLmNvbXBhcmVUbygoKFVNV2l6YXJkVHJlZUl0ZW0pIG8yKS5fc3RyTmFtZSk7DQotCQkJfQ0KLQkJfQ0KLQ0KLQkJcmV0dXJuIDA7DQotCX0NCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VNV2l6YXJkVVJMTmFtZVBhaXJDb21wYXJhdG9yLmphdmEgYi91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRVUkxOYW1lUGFpckNvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljZDMxMy4uMDAwMDAwMAotLS0gYS91cGRhdGUvb3JnLmVjbGlwc2UudXBkYXRlL3NyYy9vcmcvZWNsaXBzZS91cGRhdGUvaW50ZXJuYWwvdWkvVU1XaXphcmRVUkxOYW1lUGFpckNvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3VwZGF0ZS9vcmcuZWNsaXBzZS51cGRhdGUvc3JjL29yZy9lY2xpcHNlL3VwZGF0ZS9pbnRlcm5hbC91aS9Vc2VyVmFsaWRhdGlvbkRpYWxvZy5qYXZhIGIvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NDUyODYuLjAwMDAwMDAKLS0tIGEvdXBkYXRlL29yZy5lY2xpcHNlLnVwZGF0ZS9zcmMvb3JnL2VjbGlwc2UvdXBkYXRlL2ludGVybmFsL3VpL1VzZXJWYWxpZGF0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCg==